Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Extrem langsames Aktualisieren großer Anzahl von TLabels? (https://www.delphipraxis.net/78157-extrem-langsames-aktualisieren-grosser-anzahl-von-tlabels.html)

christian.noeding 29. Sep 2006 21:19


Extrem langsames Aktualisieren großer Anzahl von TLabels?
 
Hallo Leute :)

Ich hab irgendwie einen Knoten im Hirn... Meine Anwendung hat bislang schon recht viele Labels, Buttons, etc. Jetzt ist es aber erforderlich, über hundert einzelne Labels zur Laufzeit hinzuzufügen (das klappt) und entsprechend anzuordnen (klappt auch). Die Labels stecken alle in einer Scrollbox.

Nun müssen alle 200 Labels auf einen Schlag mit neuen Caption-Werten beschrieben werden:

Delphi-Quellcode:
  for i:=1 to 200 do
  begin
    label_name[i].Caption:=data.names[i];
    label_wert[i].Caption:=data.value[i];
  end;
Solange die Labels sichtbar sind dauert das eine Ewigkeit (man kann gemütlich verfolgen, welches Label gerade aktualisiert wird :cry: ). Erst wenn ich Visible:=False setze rennt das ganze, aber hierdurch flimmert die Ausgabe aber erheblich. Was kann ich machen, damit das Flimmern nicht mehr auftritt, bzw. kann man die langsame Aktualisierung der knapp 200 Labels beschleunigen, ohne sie Unsichtbar zu machen? Das Setzen von DoubleBuffer der Forms hat nicht wirklich was gebracht...

vielen Dank für ein paar Hinweise... die Suche spuckte nicht gerade hilfreiches aus... :roll:

Dax 29. Sep 2006 21:25

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Soweit ich weiß sind Labels Areale des Forms und keine eigenen Controls - es sind einfach... Areale, auf die gezeichnet wird. Den Updateprozess in ein
Delphi-Quellcode:
BeginUpdate;
{ ... }
EndUpdate;
zu packen sollte helfen.

christian.noeding 29. Sep 2006 21:27

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Nunja, aber ich habe "BeginUpdate" und "EndUpdate" nirgends deklariert oder eingebunden... Sind das spezielle Funktionen? Als direkten Aufruf kann ich sie jedenfalls nicht verwenden!?

Dax 29. Sep 2006 21:31

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Achje, Tatsache :shock:

Bin einfach zu verwöhnt von SuspendLayout/ResumeLayout aus .net :mrgreen:

mkinzler 29. Sep 2006 21:31

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Form.BeginUpdate; bzw. Form.EndUpdate;

christian.noeding 29. Sep 2006 21:35

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Hmm, das hatte ich schon probiert. Resultat: "Undefinierter Bezeichner: 'BeginUpdate'"

Sicher, dass ich nicht noch was spezielles Einbinden muss? Meine IDE bietet mir nur Form.BeginDrag und Form.BeginAutoDrag an !?

Hawkeye219 29. Sep 2006 21:41

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Hallo,

vielleicht hilft ein Blick in diesen Thread.

Gruß Hawkeye

christian.noeding 29. Sep 2006 21:46

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Ah :spin: ich hab nicht nach Control, sondern nur nach Label, Form und Panel gesucht...ich probier das mal aus mit dem hier:

Delphi-Quellcode:
LockWindow(MyPanel.Handle);
MyPanel.Visible := False;
CreateControls;
MyPanel.Visible := True;
UnLockWindow(MyPanel.Handle);

klingt gut ;-)


Vielen Dank!

rd5pro 29. Sep 2006 21:48

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Die Labels haben doch ein Parent, auf dem sie platziert sind, oder?

Vielleicht funzt BeginUpdate...EndUpdate mit dem Parent der Labels?

Oder probier mal, das Parent der Labels während des Updates auf visible:=false zu setzen.

Roland

christian.noeding 29. Sep 2006 22:03

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Das Parent (also die Scrollbox) bietet mir ebenfalls nicht die BeginUpdate/EndUpdate Prozeduren an :-/


also ich habs jetzt mal so probiert:

Delphi-Quellcode:
LockWindow(scrollbox.Handle);
scrollbox.Visible := False;

for i:=1 to 200 do
  begin
    label_name[i].Caption:=data.names[i];
    label_wert[i].Caption:=data.value[i];
  end;

scrollbox.Visible := True;
UnLockWindow(scrollbox.Handle);
mit

Delphi-Quellcode:
procedure LockWindow(const Handle: HWND);
begin
  SendMessage(Handle, WM_SETREDRAW, 0, 0);
end;

procedure UnlockWindow(const Handle: HWND);
begin
  SendMessage(Handle, WM_SETREDRAW, 1, 0);
  RedrawWindow(Handle, nil, 0,
    RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
Aber es flimmert immer noch, da ich die Werte z.T. mehrfach in der Sekunde ändere. Allerdings ist es subjektiv nicht mehr so schlimm wie vorher...

Ich schau mal, ob ich da noch was besseres finde... :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Seite 1 von 2  1 2      

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