AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Flackern bei vielen Komponenten

Ein Thema von CeKa · begonnen am 31. Mär 2020 · letzter Beitrag vom 31. Mär 2020
Antwort Antwort
CeKa

Registriert seit: 31. Mär 2020
3 Beiträge
 
#1

Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 10:40
Delphi-Version: 10.2 Tokyo
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 (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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#2

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 11:01
Du könntest mit DoubleBuffered arbeiten (wenn, dann schäm dich schonmal dafür)

Ansonsten MSDN-Library durchsuchenBeginDeferWindowPos
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CeKa

Registriert seit: 31. Mär 2020
3 Beiträge
 
#3

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 11:19
Ü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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 11:31
Hallo,
hier

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

sind einige Vorschläge dafür.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#5

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 11:42
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 12:09
@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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#7

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 12:20
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#8

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 14:16
EndDeferWindowPos müsste doch das Handle vom BeginDeferWindowPos bekommen.
Die Doku sagt aber explizit was anderes.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#9

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 14:39
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CeKa

Registriert seit: 31. Mär 2020
3 Beiträge
 
#10

AW: Flackern bei vielen Komponenten

  Alt 31. Mär 2020, 21:49
DeferWindowPos ist die Lösung.
Auch der Tipp mit der Message WM_SETREDRAW war hilfreich.
Wieder ein Stückchen schlauer.

Vielen Dank!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 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