Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Flackern bei vielen Komponenten (https://www.delphipraxis.net/203847-flackern-bei-vielen-komponenten.html)

CeKa 31. Mär 2020 10:40

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:
(FindComponent('Button' + IntToStr(I) as TButton)
angesprochen, aber vielleicht gibt es ja hier eine bessere Lösung.

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;

himitsu 31. Mär 2020 11:01

AW: Flackern bei vielen Komponenten
 
Du könntest mit DoubleBuffered arbeiten (wenn, dann schäm dich schonmal dafür)

Ansonsten MSDN-Library durchsuchenBeginDeferWindowPos

CeKa 31. Mär 2020 11:19

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

hoika 31. Mär 2020 11:31

AW: Flackern bei vielen Komponenten
 
Hallo,
hier

https://stackoverflow.com/questions/...ot-of-controls

sind einige Vorschläge dafür.

himitsu 31. Mär 2020 11:42

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 Delphi-Referenz durchsuchenTControl.BoundsRect verwenden, um beide alle Werte gleichzeitig zu ändern.

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;

Uwe Raabe 31. Mär 2020 12:09

AW: Flackern bei vielen Komponenten
 
@Himitsu: Hast du die Douk zum Return-Value von DeferWindowPos gelesen?
Zitat:

The return value identifies the updated multiple-window – position structure. The handle returned by this function may differ from the handle passed to the function. The new handle that this function returns should be passed during the next call to the DeferWindowPos or EndDeferWindowPos function.
Müsste es demnach nicht eher so aussehen?
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;

himitsu 31. Mär 2020 12:20

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:
{ 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;
(könnte innen so aussehn, als wenn das Handle ein Pointer auf ein Array ist und die Returned-Handles dann darauf rumrutschen)

Uwe Raabe 31. Mär 2020 14:16

AW: Flackern bei vielen Komponenten
 
Zitat:

Zitat von himitsu (Beitrag 1460919)
EndDeferWindowPos müsste doch das Handle vom BeginDeferWindowPos bekommen.

Die Doku sagt aber explizit was anderes.

himitsu 31. Mär 2020 14:39

AW: Flackern bei vielen Komponenten
 
Joar, stimmt. (fast halb explizit)

Zitat:

This internal structure is returned by the BeginDeferWindowPos function or by the most recent call to the DeferWindowPos function.
OK, also nehmen wir Deines.

Und überlegen vielleicht nochmal ob das OR heißt immer vom Letzen, oder "Begin oder das lette Defer",
dann ginge mein Letztes auch. :angle:

CeKa 31. Mär 2020 21:49

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 06:40 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