AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EndUpdate: Wo soll da neugezeichnet werden?

Ein Thema von Nogge · begonnen am 22. Okt 2005 · letzter Beitrag vom 23. Okt 2005
Antwort Antwort
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

EndUpdate: Wo soll da neugezeichnet werden?

  Alt 22. Okt 2005, 18:33
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: EndUpdate: Wo soll da neugezeichnet werden?

  Alt 22. Okt 2005, 18:35
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)...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: EndUpdate: Wo soll da neugezeichnet werden?

  Alt 22. Okt 2005, 18:51
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#4

Re: EndUpdate: Wo soll da neugezeichnet werden?

  Alt 23. Okt 2005, 20:30
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;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: EndUpdate: Wo soll da neugezeichnet werden?

  Alt 23. Okt 2005, 20:32
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz