Anonymní profil Michal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Michal – Programujte.comAnonymní profil Michal – Programujte.com

 

Příspěvky odeslané z IP adresy 62.240.183.–

Michal
Delphi › Hra FreeFlow v Delphi
22. 4. 2013   #175375

Co vlastně čekáš, že ti bude odpovězeno?

  1. Drž se syntaxe Object Pascalu (Delphi 7 je jen IDE - nástroj pro psaní kódu)
  2. Pořádně si projdi pravidla hry, aby tě něco v půlce projektu nezaskočilo
  3. Před tím, než vytvoříš projekt, tak si ujasni jakou cestou budeš řešit herní lobby, vykreslování grafiky, jestli budeš mít generátor kol, jak budeš jednotlivé kola ukládat atd.
  4. Drž se pravidel psaní čistého kódu (formátování, jasné názvy procedur a fcí ..) - uvitáš při pozdějším pročítání kódu
  5. piš objektově, ne procedurálně
  6. Pascal nemá GarbageCollector -> hlídej si uvolňování paměti
  7. atd. atd...
  8. Výhoda projektů v Delphi je neskutečná rychlost kompilace -> při každé změně kódu si klidně hru zkompiluj a otestuj jestli jsi řešení problému implementoval správně
  9. atd...

Michal
Delphi › parametr funkce jako ukazatel
21. 4. 2013   #175287

Sniper to zmínil, Record struktura se automaticky zarovnává na daný počet bajtů pokud někdy v budoucnu budeš opět pracovat s délkou (sizeOf(); ) nějakého recordu dej si na to pozor viz http://stackoverflow.com/questions/9803124/why-isnt-the-size-of-a-record-equal-to-the-sum-of-the-sizes-of-its-fields

S_REQUEST = record
    XNumber:        string[20];
    Exp:               DWORD;
    Amt:               string[13];
    Flag:               byte;
    SNumber:       string[10];
  end;

Deklarace Recordu se stringem má skutečnou velikost 51B, ale proměnné recordu se v tomto případě zarovnávají na násobek 4B, proto se dostaneš až na 56B. (+ je dobré vědět, že Byte = Char = String[i] -> pokud za sebou je více proměných tohoto typu, zarovnání se mezi nima neuskuteční)

  1. string[20] (velikost 21B) --> se zarovná na 24B
  2. Exp: DWORD; (velikost 4B) --> se dostáváme na 28B
  3. Amt: string[13]; (velikost 14B)
  4. Flag: byte; (velikost 1B)
  5. SNumber: string[10]; (velikost 11B) -> 54B se zarovná na k*4B
  6. konečná velikost 56B

No a na závěr z toho vyplývý, že pokud dáš DWORD na začátek nebo konec datové struktury, dostaneš se na velikost 52B.

Michal
Delphi › Form help
12. 4. 2013   #174893

Mám pocit, že pro tvůj příklad by jsi mohl zkusit něco jako

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if PovolVypnuti = False then
    Action := caNone;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PovolVypnuti := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PovolVypnuti := True;
  Close;
end;

samozřejmě je to jen jeden z mnoha způsobů, jak zamezit vypnutí formuláře.

Určitě ti to neohlídá killproccess atd...

Michal
Delphi › promazani dvou Memo s hodne…
10. 4. 2013   #174791

jinak největší zabiják je samozřejmě "softwarová" grafika - překreslení TLabel, překreslení TListBox, ... další věc, kterou bych podotknul je, že Application.ProccessMessage je také velice časově náročná záležitost a navíc ani nemáš možnost zjistit, jak dlouho se vlastně ztrácí na App.ProcMsg, páč je to předání řízení Windowsům, a ty si udělají svou operaci a pak zase dají řízení tvému programu, tudíž bych ani tento krok nezahrnoval do zdrojáku.

PS pokud chceš mermomocí vidět jak droják pokračuje, kde se zrovna nachází místo toho aby jsi překresloval label v každé iteraci použij například toto:

{Jednou za 500 iterací překresli komponentu.
  
Je mnohem^2 rychlejší vypočítat matematickou úlohu tohoto typu než překresli     komponentu.}

if i mod 500 = 0 then
begin
  repaint ...
  app.procMsg
end; 

A jinak jak jsis mohl všimnout, uživatel Sniper používal vnořené funkce ... to je taky dobrý krok ke zrychlení, to je ale dáno překladem do assembleru a to asi nestojí za vysvětlování v tomto příspěvku :)

Michal
Delphi › promazani dvou Memo s hodne…
10. 4. 2013   #174789

Když koukám na vaše zdrojové kódy, zdá se mi, že jste zapoměli na funkci IndexOf.  Já osobně bych řešení problematiky implementoval následujícím způsobem, kde testovací data byla následující: seznam ve kterém se hledalo a mazalo měl 60K řádku, a druhý seznam měl 6K řádků. Výsledný čas byl 1:50 [min:sec]. 

procedure DeleteMatch(var lWhere: TStringList; const lProhibited: TStringList);
var
  I: Integer;
  iLine: Integer;
begin
  // Your prohibited list
  for I := 0 to lProhibited.Count - 1 do
  begin
    iLine := lWhere.IndexOf(lProhibited[I]);
    // Find all matches, if there is duplicite item
    while iLine <> -1 do
    begin
      lWhere.Delete(iLine);
      iLine := lWhere.IndexOf(lProhibited[I]);
    end;
  end;
end;

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý