Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi EndUpdate: Wo soll da neugezeichnet werden? (https://www.delphipraxis.net/55531-endupdate-wo-soll-da-neugezeichnet-werden.html)

Nogge 22. Okt 2005 17:33


EndUpdate: Wo soll da neugezeichnet werden?
 
Hallo Community,
Ich habe ein wenig in den verschiedenen uses von Delphi herumgestöbert und die Procedure Begin- und EndUpdate gefunden. Allerdings sehe ich nirgendwo im Code den Punkt, der die berühmte Geschwindigkeitsverbesserung anzeigt (z.B. bei einer TList- oder TComboBox oder TStringList).
Delphi-Quellcode:
procedure TStrings.BeginUpdate;
begin
  if FUpdateCount = 0 then SetUpdateState(True);
  Inc(FUpdateCount);
end;

procedure TStrings.EndUpdate;
begin
  Dec(FUpdateCount);
  if FUpdateCount = 0 then SetUpdateState(False);
end;

procedure TStrings.SetUpdateState(Updating: Boolean);
begin
end;
Wahrscheinlich verstehe ich einfach die Zusammenhänge noch nicht. Wenn dem wirklich so ist, kann mir jemand die Code-Stellen zeigen, wo bei EndUpdate erst wieder neugezeichnet wird?

Vielen Dank, Nogge

Muetze1 22. Okt 2005 17:35

Re: EndUpdate: Wo soll da neugezeichnet werden?
 
Na z.B. wenn du eine leere ListBox hast und diese dann komplett befüllst mit einzelnen Add() anstatt einem AddStrings() (welches intern Begin- und EndUpdate benutzt)...

SirThornberry 22. Okt 2005 17:51

Re: EndUpdate: Wo soll da neugezeichnet werden?
 
wenn ein Element in eine Liste eingefügt wird dann wird überprüft ob updatecount gleich 0 ist. Wenn dem so ist wird die Liste neu gezeichnet. Wenn du jetzt 1000 Elemente einfügst ohne BeginUpdate/EndUpdate so wird die Liste 1000 mal neu gezeichnet, und das neu zeischnen verbraucht die performance.

Wenn du ein Item hinzufügst wird folgendes Funktion aufgerufen
Delphi-Quellcode:
procedure TStringList.Changed;
begin
  if (FUpdateCount = 0) and Assigned(FOnChange) then
    FOnChange(Self);
end;
Wenn also BeginUpdate aufgerufen wurde so wird das OnChange nicht ausgelöst und somit weiß das grafische Element auch nicht das es sich neu zeischnen muss und somit geht das ganze schneller.

Nogge 23. Okt 2005 19:30

Re: EndUpdate: Wo soll da neugezeichnet werden?
 
Oh, stimmt...Ich hatte die Procedure Changed vergessen, in den Thread zu schreiben. Denn das sagt mir auch nicht viel mehr, als das nichts weiter passiert...Was haben diese beiden Zeilen mit einem OnChange bzw. OnPaint o.Ä. zu tun?
Delphi-Quellcode:
FOnChange: TNotifyEvent;
TNotifyEvent = procedure(Sender: TObject) of object;

SirThornberry 23. Okt 2005 19:32

Re: EndUpdate: Wo soll da neugezeichnet werden?
 
letztendlich ist das ja nur das OnChange von zum Beispiel einer Listbox. In der Listbox ist also eine TStringlist und das OnChange von der TStringlist löst ein neu malen bei der Listbox aus. Wenn also kein OnChange von der Stringlist kommt weiß die Listbox nicht das sie sich neu malen muss und daher geht das ganze schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz