![]() |
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:
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?
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; Vielen Dank, Nogge |
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)...
|
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:
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.
procedure TStringList.Changed;
begin if (FUpdateCount = 0) and Assigned(FOnChange) then FOnChange(Self); end; |
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; |
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