komisches Verhalten beim Füllen einer ScrollBox [gelöst]

Rund um die LCL und andere Komponenten
Antworten
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

komisches Verhalten beim Füllen einer ScrollBox [gelöst]

Beitrag von AlterMann »

Hallo Leute

Ich befülle eine ScrollBox zur Laufzeit mit Labels um Daten tabellarisch darzustellen.

Manche Werte (Preise) möchte ich rechtsbündig anordnen.

Das geht mit diesem Code auch ganz gut: (La ist vom Typ TLabel)

Code: Alles auswählen

 
    La.Caption := '€'+FormatVierSt(FloatToStr(prs));
    La.Left := 300-La.Width;
    La.Font.Color:=Farbe;
 
Damit das auch funktioniert muß

Code: Alles auswählen

    La.Parent := ScrollBox3;
 
vor Zuweisen von La.Left := erfolgen.

Jetzt bin ich auf die (eigentlich hervorragende Idee gekommen die ScrollBox vor dem Befüllen unsichtbar zu machen und wenn sie voll ist wieder sichtbar, weil das um einiges (wirklich einiges!) schneller geht.

Das Problem ist nur, daß die Werte dadurch wieder linksbündig angeordnet sind.
Wie kann das sein?
Ist La.Width nicht gültig wenn das Parentobjekt (die ScrollBox) unsichtbar ist?
Wie kann ich mir da helfen?

Vielen Dank fürs Lesen
Christian
Zuletzt geändert von AlterMann am Mo 24. Jun 2013, 20:07, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: komisches Verhalten beim Füllen einer ScrollBox

Beitrag von Michl »

Letzte Antwort im Forum http://www.delphipraxis.net/68353-laeng ... pixel.html schreibt moe120:

unter Delphi XE2/3 Firemonkey klappt der Tipp mit dem Label auf der Form nur dann, wenn es auch visible ist. Ansonsten wird label.width nicht aktualisiert, egal was man da an Text reinpackt und was man auch probiert.

meine Lösung war dafür:
- Label auf Form packen
- visible auf true, Opacity = 0, autosize = true
- zur Laufzeit: label.Text + label.Font ändern auf das was man ermitteln möchte
- dann ganz wichtig: label.updateStyle einmal aufrufen
- erst dann kann mit label.width die Breite in Pixel abgelesen werden, vorher steht sonst noch der original width-Wert der Entwurfszeit drin


Ich habe mal folgendes probiert, ein Dummylabel auf Form1 plaziert und visible auf false, dann:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const
  LaNr:integer=0;
var
  LaDummy:TLabel;
begin
  ScrollBox3.Visible:=not ScrollBox3.Visible;
  LaDummy:=TLabel.Create(nil);
  LaDummy.Parent:=Scrollbox3;
  LaDummy.Name:='La'+inttostr(LaNr);
  LaDummy.Caption:='La'+inttostr(random(2000));  //Zum Test der unterschiedlichen Längen, ob rechtsbündig
 
  Label1.Caption:=LaDummy.Caption;
  Label1.Visible:=true;
  Label1.Refresh;
 
  LaDummy.Left:=300-Label1.Width;
  Label1.Visible:=false;
 
  LaDummy.Top:=LaNr*10;
  inc(LaNr);
end;
Funktioniert! Dies dürfte aber den Vorteil in der Geschwindigkeit bei dem verdeckten Zeichnen wieder aufheben :(

Edit: Code oben ist quatsch, war nur zum Test. Ich würde wie folgt vorgehen: Falls "Scrollbox.visible=false" wirklich so viel schneller ist, dann zeichne alle Objekte, mit denen das klappt. Dann mach deine Scrollbox visible und zeichne alle Labels bzw. Komponenten, die nur dann ordentlich gezeichnet werden können. So hast du wenigstens einen Teilgeschwindigkeitsvorteil.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: komisches Verhalten beim Füllen einer ScrollBox

Beitrag von MAC »

Wenn es nur Text ist könntest du auch versuchen eine Eigene Klasse zum anzeigen zu verwenden anstatt viele Labels.
Den bei jeden update eines label wird ne menge neu berechnet und angezeigt, sowas würde man damit geschickt sparen.
Und solange man nur Text ausgeben will ist das nochnichtmal kompliziert...

Code: Alles auswählen

Signatur := nil;

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: komisches Verhalten beim Füllen einer ScrollBox

Beitrag von AlterMann »

Danke Michl.
Deine Methode funktioniert tadellos (sogar ohne Refresh!)

Die Performance ist jedenfalls wesentlich besser als mit ScrollBox1.Visible := true;


@MAC: Danke für den Tipp, aber ich nutze wechselnd verschiedene Möglichkeiten, die TLabel einfach von sich aus bietet (Font, Font.Color, OnClick, OnMouseOver ...).
Bis ich das alles in einer neuen Klasse habe, ist sie wahrscheinlich ein fertiges TLabel :oops:
Früher war alles besser. Und aus Holz!

wp_xyz
Beiträge: 5177
Registriert: Fr 8. Apr 2011, 09:01

Re: komisches Verhalten beim Füllen einer ScrollBox [gelöst]

Beitrag von wp_xyz »

In dem Code oben verbirgt sich ein Speicherleck:

Code: Alles auswählen

 
  LaDummy:=TLabel.Create(nil);
 
Statt nil sollte "self" verwendet werden, damit sich das Formular um das Aufräumen des dynamisch erzeugten Labels LaDummy kümmern kann. Bei "nil" macht das der Programmierer, aber in der Prozedur, in der LaDummy als lokale Variable aufgeführt ist, steht nirgendwo ein "LaDummy.Free".

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: komisches Verhalten beim Füllen einer ScrollBox [gelöst]

Beitrag von AlterMann »

wp_xyz hat geschrieben:In dem Code oben verbirgt sich ein Speicherleck:

Code: Alles auswählen

 
  LaDummy:=TLabel.Create(nil);
 
Statt nil sollte "self" verwendet werden, damit sich das Formular um das Aufräumen des dynamisch erzeugten Labels LaDummy kümmern kann. Bei "nil" macht das der Programmierer, aber in der Prozedur, in der LaDummy als lokale Variable aufgeführt ist, steht nirgendwo ein "LaDummy.Free".
Danke für den Hinweis, aber bei mir steht ohnedies:

Code: Alles auswählen

 
  LaDummy:=TLabel.Create(ScrollBox1);
 
Früher war alles besser. Und aus Holz!

Antworten