![]() |
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:
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...
for i:=1 to 200 do
begin label_name[i].Caption:=data.names[i]; label_wert[i].Caption:=data.value[i]; end; vielen Dank für ein paar Hinweise... die Suche spuckte nicht gerade hilfreiches aus... :roll: |
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:
zu packen sollte helfen.
BeginUpdate;
{ ... } EndUpdate; |
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!?
|
Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
Achje, Tatsache :shock:
Bin einfach zu verwöhnt von SuspendLayout/ResumeLayout aus .net :mrgreen: |
Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
Form.BeginUpdate; bzw. Form.EndUpdate;
|
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 !? |
Re: Extrem langsames Aktualisieren großer Anzahl von TLabels
|
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! |
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 |
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:
mit
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);
Delphi-Quellcode:
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...
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; Ich schau mal, ob ich da noch was besseres finde... :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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