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.