Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ? [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ? [gelöst]

Beitrag von corpsman »

Hallo Zusammen,

ich hab euch mal ne Demo gebastelt die mein Problem zeigt.

Ich fülle in einer Schleife Komponenten in eine TScrollbox ein. Die Scrollbox ist zu dem Zeitpunkt auf dem Formular sichtbar (siehe Beispiel). Das ganze Flackert dann wie sau und beruhigt sich erst zum Ende der Schleife.
Würde ich in eine TListbox Elemente einfügen könnte ich einfach schreiben

Code: Alles auswählen

  ListBox1.Items.BeginUpdate;
  for i := 0 to ganz_viel do begin
    ListBox1.Items.ad('Text');
  end;
  ListBox1.Items.EndUpdate;
und es wäre kein Flackern zu sehen. Doch bei TScrollbox scheint es das nicht zu geben :(
Habt ihr eine Idee, wie ich das Flackern abstellen kann ?
hier noch mein Reduzierter Code:

Code: Alles auswählen

Procedure TForm1.Button1Click(Sender: TObject);
Var
  i: integer;
  b: Tbitmap;
  p: TScrollBox;
  img: TImage;
  l: TLabel;
Begin
  p := ScrollBox1;
  For i := p.ComponentCount - 1 Downto 0 Do Begin
    If (p.Components[i] Is TLabel) Or (p.Components[i] Is TImage) Then Begin
      p.Components[i].Free;
    End;
  End;
  For i := 0 To 80 Do Begin
    b := TBitmap.Create;
    b.Width := 30;
    b.Height := 30;
    img := TImage.Create(p);
    img.Parent := p;
    l := TLabel.Create(p);
    l.Parent := p;
    img.Picture.Assign(b);
    img.Width := b.Width;
    img.Height := b.Height;
    img.Hint := 'Hallo welt' + inttostr(i);
    img.ShowHint := true;
    img.Transparent := true;
    b.free;
    img.Left := ((p.ComponentCount Div 2) - 1) * (img.Width + 5);
    img.Top := 2;
    l.left := img.left;
    l.top := img.top + img.Height;
    l.caption := inttostr(i);
  End;
End;
Und im Anhang das gesamte Projekt zum schnellen Testen ;)
Dateianhänge
Test.zip
(2.26 KiB) 38-mal heruntergeladen
Zuletzt geändert von corpsman am Di 1. Feb 2022, 13:09, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ?

Beitrag von fliegermichl »

Du kannst vor der Schleife DisableAlign und nachher EnableAlign aufrufen.

Dazwischen hält das Formular die Füße still.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ?

Beitrag von Winni »

Hi!

Benutze doch das:

Code: Alles auswählen

ScrollBox1.enabled := false;
...
ScrollBox1.enabled := true;

Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ?

Beitrag von fliegermichl »

Winni hat geschrieben:
Di 1. Feb 2022, 10:15
Hi!

Benutze doch das:

Code: Alles auswählen

ScrollBox1.enabled := false;
...
ScrollBox1.enabled := true;

Winni
Dann ist zwar das gezappel weg aber der Code für das Align der Controls wird trotzdem ausgeführt. (Laufzeit)

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie ein TScrollbox.BeginUpdate / EndUpdate realisieren.. ?

Beitrag von corpsman »

(y)
Cool das Disable/Enable Align kannte ich noch nicht, das macht genau was ich will.

Danke für die Hilfe.
--
Just try it

Antworten