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 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... :)

Hawkeye219 29. Sep 2006 22:27

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Noch was:
Zitat:

Zitat von christian.noeding
Das Setzen von DoubleBuffer der Forms hat nicht wirklich was gebracht...

In deinem Fall muß DoubleBuffered bei der ScrollBox (als Parent der Labels) gesetzt werden, nicht bei den Formularen!

Gruß Hawkeye

nailor 29. Sep 2006 22:46

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Zitat:

Zitat von Hawkeye219
Noch was:
Zitat:

Zitat von christian.noeding
Das Setzen von DoubleBuffer der Forms hat nicht wirklich was gebracht...

In deinem Fall muß DoubleBuffered bei der ScrollBox (als Parent der Labels) gesetzt werden, nicht bei den Formularen!

Gruß Hawkeye

am intelligentesten einfach bei Label.Parent setzen, dann stellt sich auch garnicht die Frage, ob das jetzt nun die ScrollBox, die Form, oder sonstwas ist...

christian.noeding 29. Sep 2006 22:59

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Tatsache, jetzt läufts... hatte das Doublebuffer nur probiert, als ich die LockWindow-Prozedur noch nicht angewandt hatte (und die WindowUnlock natürlich ohne DoubleBuffer)...

Wenn man beides auf die Scrollbox anwendet, dann rennt die GUI ;-)


Vielen Dank für Eure Hilfe! :thumb:


Ich geh jetzt erstmal :cheers: !

Gute Nacht :spin2:

semo 29. Sep 2006 23:53

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
ich würde anstatt 200 labels zu verwenden diese texte direkt auf das Form oder ein anderes control malen (muss man nur halt positionieren in einer schleife.

du könntest ja auch ein memo nehmen, diese ohen rahmen darstellen und als hintergrundfarbe die farbe des forms übernehmen.

christian.noeding 30. Sep 2006 02:15

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
Zitat:

ich würde anstatt 200 labels zu verwenden diese texte direkt auf das Form oder ein anderes control malen
Das hätte ich ja gern gemacht, aber ich möchte mit einem Klick auf einzelne Werte ein "OnMouseDown"-Ereignis aufrufen :) und somit hat sich das leider erledigt... ;-)

Mittlerweile habe ich aber ein neues Problem: wenn ich neben den Labels noch Checkboxes oder Scrollbars habe, dann funktioniert das mit dem DoubleBuffer nicht mehr. Die Forms werden partout nicht mehr aktualisiert. Erst wenn ich den DoubleBuffer-Eintrag entferne, kann ich die Komponenten wieder ansprechen... was das nu wieder ist? :gruebel:

Egal, so ein kleines flimmern könnte ich verkraften *g*


Nur erschreckend, wie schnell das GUI in die Knie geht (habe jetzt neben den 200 Wertanzeigen noch knapp 200 Scrollbars dynamisch erzeugt) und nun aktualisiert das alles noch einen Tick langsamer :-/


Gute Nacht :)

semo 30. Sep 2006 02:57

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
das mit dem mousedown ist doch auch kein problem,
im formmousedown event guckst du einfach wo der anwender hingeklickt hat und anhand der positionen der text weist du doch welcher text "angeklickt" wurde.

mit ptinrect etc. kann man sowas schnell prüfen....

christian.noeding 30. Sep 2006 10:25

Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
 
OK, aber wie umgehe ich das Problem mit den Scrollbars? Die Übersicht kann ich mit nem Memofeld oder ähnlichen machen, das sehe ich ein, aber dieses Faderpanel? Hier ist die Aktualisierung noch drastisch langsamer und DoubleBuffered:=True zieht komischerweise nicht!? Gibts dafür vielleicht noch ne Idee? *g*


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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