![]() |
Delphi-Version: 10.2 Tokyo
Flackern bei vielen Komponenten
Grüße,
meine Programmierkenntnisse sind nicht die besten, trotzdem versuche ich mich daran. Mein Problem ganz konkret: Ich möchte mehrere (viele) Komponenten zur Laufzeit erstellen und ebenso die Möglichkeit haben, diese zur Laufzeit gleichzeitig in Horizontalrichtung zu verschieben. Mit einer ScrollBox kein Problem, leider flackern dabei alle Komponenten etwas zu sehr. Damals habe ich die Komponenten noch über
Delphi-Quellcode:
angesprochen, aber vielleicht gibt es ja hier eine bessere Lösung.
(FindComponent('Button' + IntToStr(I) as TButton)
Danke für jedwede Hilfe, Grüße Als Anhang noch ein Beispiel:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var I, J: Byte; begin for I := 0 to 9 do for J := 0 to 9 do begin MyButton := TButton.Create(Form1); with MyButton do begin Left := J * 100; Top := I * 100; Height := 100; Width := 100; Name := 'MyButton' + IntToStr((I + 1) * 10 + J); Parent := Form1; end; end; end; procedure TForm1.ScrollBar1Change(Sender: TObject); var I, J: Byte; begin for I := 0 to 9 do for J := 0 to 9 do (FindComponent('MyButton' +IntToStr((I + 1) * 10 + J)) as TButton).Left := - ScrollBar1.Position + J * 100 end; |
AW: Flackern bei vielen Komponenten
Du könntest mit DoubleBuffered arbeiten (wenn, dann schäm dich schonmal dafür)
Ansonsten ![]() |
AW: Flackern bei vielen Komponenten
Über DoubleBuffered bin ich auch schon mal gestolpert, war aber nicht zweckbringend.
Von BeginDeferWindowPos habe ich noch nie etwas gelesen, werde ich mir aber schnellstmöglich ansehen. Grüße |
AW: Flackern bei vielen Komponenten
|
AW: Flackern bei vielen Komponenten
Es betrifft alle "Windows", also Fenster und auch die Controls darauf. (in Windows ist alles ein Window, drum heißt es ja Windows)
Statt Left+Top und/oder Width+Height einzeln zu setzen, kann man in Delphi auch ![]() Und genauso gibt es in Windows diese Methode, um das auch für mehrere Fenster/Komponenten vorzudefinieren und anschließend gemeinsam ändern zu lassen. könnte in etwa so aussehn.
Delphi-Quellcode:
var H: HDWP;
H := BeginDeferWindowPos(3); try DeferWindowPos(H, Edit1.Handle, 0, x1, y1, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); DeferWindowPos(H, Edit2.Handle, 0, x2, y2, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); DeferWindowPos(H, Edit3.Handle, 0, x3, y3, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); finally EndDeferWindowPos(H); end; |
AW: Flackern bei vielen Komponenten
@Himitsu: Hast du die Douk zum Return-Value von DeferWindowPos gelesen?
Zitat:
Delphi-Quellcode:
H := BeginDeferWindowPos(3);
try H := DeferWindowPos(H, Edit1.Handle, 0, x1, y1, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); H := DeferWindowPos(H, Edit2.Handle, 0, x2, y2, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); H := DeferWindowPos(H, Edit3.Handle, 0, x3, y3, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); finally EndDeferWindowPos(H); end; |
AW: Flackern bei vielen Komponenten
Bei deiner Variante würde ich mich fragen wer eigentlich all die vielen Handles freigibt.
Joar, aber ich glaub das klingt mehr hiernach. EndDeferWindowPos müsste doch das Handle vom BeginDeferWindowPos bekommen.
Delphi-Quellcode:
(könnte innen so aussehn, als wenn das Handle ein Pointer auf ein Array ist und die Returned-Handles dann darauf rumrutschen)
{ H := BeginDeferWindowPos(3);
try H2 := DeferWindowPos(H, Edit1.Handle, 0, x1, y1, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); H2 := DeferWindowPos(H2, Edit2.Handle, 0, x2, y2, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); DeferWindowPos(H2, Edit3.Handle, 0, x3, y3, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); finally EndDeferWindowPos(H); end; } H := BeginDeferWindowPos(3); try H2 := H; H2 := DeferWindowPos(H2, Edit1.Handle, 0, x1, y1, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); H2 := DeferWindowPos(H2, Edit2.Handle, 0, x2, y2, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); H2 := DeferWindowPos(H2, Edit3.Handle, 0, x3, y3, 0, 0, SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOSIZE); if H2 = 0 then ; // wegen Warnung, dass letztes H2 nicht genutzt wird finally EndDeferWindowPos(H); end; |
AW: Flackern bei vielen Komponenten
Zitat:
|
AW: Flackern bei vielen Komponenten
Joar, stimmt. (fast halb explizit)
Zitat:
Und überlegen vielleicht nochmal ob das OR heißt immer vom Letzen, oder "Begin oder das lette Defer", dann ginge mein Letztes auch. :angle: |
AW: Flackern bei vielen Komponenten
DeferWindowPos ist die Lösung.
Auch der Tipp mit der Message WM_SETREDRAW war hilfreich. Wieder ein Stückchen schlauer. Vielen Dank! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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