Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
Delphi 12 Athens
|
Position von Spliter speichern/laden
26. Jan 2011, 15:52
Einige speichern ja die Größe und Position ihrer Fenster.
Wie handhabt ihr das denn mit den Splittern?
Ich hab mir da grade mal schnell was überlegt und würde gern wissen, wie "gut" das ist und ob es auch richtig funktioniert.
In diesem Fall braucht man einfach nur Splitter1.SplitSize auslesen und beim Laden wieder zurückschreiben.
Aktuell ist der Code für TSpliter, sowie TcxSplitter (Dev Express) und allen Nachfolgern ab Delphi 2006 vorhanden.
Als Class-Helper halt, aber man könnte es sich auch direkt in Nachfahren davon reinkopieren.
OK, wenn es "unkonventionelle" GUI-Layouts gibt, dann könnte es kleine Problemchen geben (so daß halt nicht alles gespeichert wird).
z.B. einen Splitter mit alLeft und in der selben Ebene eine Komponente mit alClient, aber zwei Komponenten mit alLeft, dann wird nur die erste gefundene Komponente gespeichert/geladen.
Delphi-Quellcode:
type
TcxSplitterHelper = class Helper for TcxSplitter
private
function GetSplitSize: Integer;
procedure SetSplitSize(Value: Integer);
public
property SplitSize: Integer read GetSplitSize write SetSplitSize;
end;
function TcxSplitterHelper.GetSplitSize: Integer;
const
cxAlign: array[TcxSplitterAlign] of TAlign = (alBottom, alLeft, alRight, alTop);
cxAlign2: array[TcxSplitterAlign] of TAlign = (alTop, alLeft, alLeft, alTop);
cAlign2: array[TAlign] of TAlign = (alClient, alTop, alTop, alLeft, alLeft, alClient, alClient);
var
i: Integer;
C: TControl;
begin
for i := 0 to Parent.ControlCount * 3 - 1 do begin
C := Parent.Controls[i mod Parent.ControlCount];
if (C <> Self) and C.Visible
and (((i div Parent.ControlCount = 0) and (C.Align = cxAlign[AlignSplitter]))
or ((i div Parent.ControlCount = 1) and (cAlign2[C.Align] = cxAlign2[AlignSplitter]))
or ((i div Parent.ControlCount = 2) and (cAlign2[C.Align] <> alClient))) then
case AlignSplitter of
salTop, salBottom: Exit(C.Height);
salLeft, salRight: Exit(C.Width);
else Exit(-1);
end;
end;
Result := -1;
end;
procedure TcxSplitterHelper.SetSplitSize(Value: Integer);
const
cxAlign: array[TcxSplitterAlign] of TAlign = (alBottom, alLeft, alRight, alTop);
cxAlign2: array[TcxSplitterAlign] of TAlign = (alTop, alLeft, alLeft, alTop);
cAlign2: array[TAlign] of TAlign = (alClient, alTop, alTop, alLeft, alLeft, alClient, alClient);
var
i: Integer;
C: TControl;
begin
if Value >= 0 then
for i := 0 to Parent.ControlCount * 3 - 1 do begin
C := Parent.Controls[i mod Parent.ControlCount];
if (C <> Self) and C.Visible
and (((i div Parent.ControlCount = 0) and (C.Align = cxAlign[AlignSplitter]))
or ((i div Parent.ControlCount = 1) and (cAlign2[C.Align] = cxAlign2[AlignSplitter]))
or ((i div Parent.ControlCount = 2) and (cAlign2[C.Align] <> alClient))) then
case AlignSplitter of
salTop, salBottom: C.Height := Value;
salLeft, salRight: C.Width := Value;
end;
end;
end;
Delphi-Quellcode:
type
TSplitterHelper = class Helper for TSplitter
private
function GetSplitSize: Integer;
procedure SetSplitSize(Value: Integer);
public
property SplitSize: Integer read GetSplitSize write SetSplitSize;
end;
function TSplitterHelper.GetSplitSize: Integer;
const
cAlign: array[TAlign] of TAlign = (alClient, alTop, alTop, alLeft, alLeft, alClient, alClient);
var
i: Integer;
C: TControl;
begin
if Align in [alTop, alBottom, alLeft, alRight] then
for i := 0 to Parent.ControlCount * 3 - 1 do begin
C := Parent.Controls[i mod Parent.ControlCount];
if (C <> Self) and C.Visible
and (((i div Parent.ControlCount = 0) and (C.Align = Align))
or ((i div Parent.ControlCount = 1) and (cAlign[C.Align] = cAlign[Align]))
or ((i div Parent.ControlCount = 2) and (cAlign[C.Align] <> alClient))) then
case Align of
alTop, alBottom: Exit(C.Height);
alLeft, alRight: Exit(C.Width);
else Exit(-1);
end;
end;
Result := -1;
end;
procedure TSplitterHelper.SetSplitSize(Value: Integer);
const
cAlign: array[TAlign] of TAlign = (alClient, alTop, alTop, alLeft, alLeft, alClient, alClient);
var
i: Integer;
C: TControl;
begin
if (Value >= 0) and (Align in [alTop, alBottom, alLeft, alRight]) then
for i := 0 to Parent.ControlCount * 3 - 1 do begin
C := Parent.Controls[i mod Parent.ControlCount];
if (C <> Self) and C.Visible
and (((i div Parent.ControlCount = 0) and (C.Align = Align))
or ((i div Parent.ControlCount = 1) and (cAlign[C.Align] = cAlign[Align]))
or ((i div Parent.ControlCount = 2) and (cAlign[C.Align] <> alClient))) then
case Align of
alTop, alBottom: C.Height := Value;
alLeft, alRight: C.Width := Value;
end;
end;
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
|