Ich will ja den Umgang mit FreePascal und Lazarus lernen, da ist es ganz gut, wenn ich mir ein bischen die Zähne ausbeiße. Also mach dir bitte keine zusätzliche Mühe mit Code vorschreiben.
Ich habe meinen Layouter etwas vereinfacht, da das was ich vor hatte keinen großen Sinn macht, wenn nicht jedes Control einen Autosize Wert hat. Statt dem allgemeinen Grid-Layout habe ich jetzt nur noch ein recht schlankes (aber durchaus erweiterbares) Formlayout, das nur die Edit Spalte aufnimmt und die zugehörigen Labels selbst erstellt. Wie kann ich denn das Autosize abfangen? Lasse ich die Label auf Autosize und greife die Width und Height Properties ab, bekomme ich scheinbar nicht die Autosize Werte.
Code: Alles auswählen
unit FormLayout;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, StdCtrls, Controls;
type
TRow = record
Height: Integer;
Caption: TLabel;
Item: TControl;
end;
TFormLayout = class(TObject)
private
FRows: array of TRow;
FLabelWidth: Integer;
public
Append(Item:TControl; Caption: String);
ReLayout;
end;
implementation
procedure TFormLayout.Append(Item: TControl; Caption: String);
begin
SetLength(FRows, Length(FRows) + 1);
FRows[Length(FRows)-1].Item := Item;
FRows[Length(FRows)-1].Caption := TLabel.Create(Item.Parent);
FRows[Length(FRows)-1].Caption.Caption := Caption;
FRows[Length(FRows)-1].Caption.Parent := Item.Parent;
{ Adjust the Row and/or Columm sizes, if they are
too small to store the new item }
if FRows[Length(FRows)-1].Caption.Width > FLabelWidth then
FLabelWidth := FRows[Length(FRows)-1].Caption.Width;
if FRows[Length(FRows)-1].Caption.Height > Item.Height then
FRows[Length(FRows)-1].Height := FRows[Length(FRows)-1].Caption.Height
else
FRows[Length(FRows)-1].Height := Item.Height;
end;
procedure TFormLayout.ReLayout;
var
VertPosition: Integer;
Line: Integer;
begin
VertPosition := 0;
For Line := 0 to Length(FRows)-1 do begin
FRows[Line].Caption.Top := VertPosition;
FRows[Line].Caption.Left := 0;
FRows[Line].Item.Top := VertPosition;
FRows[Line].Item.Left := FLabelWidth + 1;
Inc(VertPosition, FRows[Line].Height);
end;
end;
end.
Es fehlen natürlich noch einige Dinge, wie eine Zentrierung der Labels (oder der Controls, falls diese kleiner sind) in ihrer Zeile, Zugriff auf Caption und Design der Labels, optionales Ankern der Controls an die rechte Innenseite des Parents, typische Funktionen für Listen und Arrays wie insert und remove, oder einstellbarer Abstand zum Parent sowie zwischen Zeilen und Spalten.
Vielen Dank für die Mühe, die du dir gibst.
Was ist eine OI Komponente? Ist das die, die im ObjectInspector eingesetzt wird? Dann kann ich da mal in den Source schauen. Schön finde ich die (in der Einstellung wie in der IDE) allerdings für meine Zwecke nicht, da Teile der Controls, wie der "Listenknopf" der ComboBox, scheinbar erst sichtbar werden, wenn man das Feld anwählt.