ich versuche hier gerade dynamisch einige Radiobuttons mit Labels zu generieren. Wenn man im Objektinspektor die Caption eines Labels bearbeitet, dann passt sich die Eigenschaft Height automatisch an. Das scheint bei einer Zuweisung per Programm nicht der Fall zu sein. Kleines Beispiel:
const lines :array[1..3]ofstring=( 'Ich bin nur eine einfache Zeile', 'Ich bin dann aber schon'+ LineEnding + 'zwei Zeilen groß', 'Und ich einer der''s gleich übertreiben'+ LineEnding + 'muß und ganze drei'+ LineEnding + 'Zeilen in Beschlag nehmen muß');
procedure TForm1.FormCreate(Sender: TObject); var rb : TRadiobutton; lb : TLabel; i : integer; y : integer; begin y :=5; for i :=1to3do begin rb := TRadioButton.Create(Application); rb.Parent:=self; rb.Left:=10; rb.Top:= y; rb.Caption:= Format('Auswahlmöglichkeit %d',[i]); y += rb.Height+3; lb := TLabel.Create(Application); lb.Parent:=self; lb.top:= y; lb.Left:=20; lb.WordWrap:=True; lb.AutoSize:=True; lb.Caption:= Lines[i]; y += lb.Height+5; end; end;
Das schaut dann aber so aus:
Dynamisch generierte Labels
dynlabels.PNG (7.81 KiB) 3253 mal betrachtet
Wie kann ich nun die tatsächlich vom Label in Beschlag genommene Höhe ermitteln?
Zuletzt geändert von fliegermichl am Fr 22. Nov 2019, 09:10, insgesamt 1-mal geändert.
Du solltest trotzdem die fertigen Layouthelfer verwenden. Sonst wirst du irgendwann Probleme bekommen, wenn irgendeine Auflösung/Schriftgröße/sonstewas deine Oberfläche zerhackt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
function LabelHeight(constLabel: TLabel): Integer; begin with TCanvas.Create(nil)do try Font :=Label.Font; Result := TextHeight(Label.Caption); finally Free; end; end;
Wobei Label.Height eigentlich auch gehen müsste, eventuell musst du vorher mal das label updaten lassen via:
Für mich passiert das alles beim ersten OnActivate, dort mache ich ein Init meines Programmes, da zu diesen Zeitpunkt alles aus der LCL/FCL stabil ist. Auch das erzeugen der Frames mit meinem Layout ist hier Erfahrungsgemäß sicher. Zusätzlich erzeugt mein Hauptformular (=Main) alle weiteren Formulare bei Bedarf und Initialisiert diese auch. Damit bin ich nie von der Reihenfolge der Erstellung der Formulare in der *.lpr Datei abhängig.
Ach ja vielleicht ein weiterer Tip zu Layout in Frames, da ich die sehr stark dynamisch verwende. In einem Frame lege ich immer ein (flaches) Panel in den Hintergrund und baue auf diesen Panel mein Layout auf (Auch mit OnResize des Panel wenn nötig). Niemals Anchors auf die Seiten des Frame beziehen. Der Grund liegt darinnen, wie die LCL später die Frames in das Zielform bringt. Es gibt manchmal Seiteneffekte beim Layouten zwischen Komponenten auf/in Frames mit den Komponeten die diese Frames beinhalten, bzw. wenn Frames gegenseitig mit Anchors abhängig gemacht werden in komplexen Layouts.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Ich werde wohl nicht drum herum kommen, mich einmal näher mit den Möglichkeiten der Layouterei in Lazarus zu befassen. Mein eigentliches Problemchen ist aber gelöst.