![]() |
Position von Spliter speichern/laden
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; |
AW: Position von Spliter speichern/laden
Hi himitsu,
ich hab mir jetzt deinen Code nicht durchgelesen. Aber um Layouts mit Splittern zu speichern, habe ich bisher immer statt der Position des Splitters die Größe des nicht alClient-ausgerichteten der beiden "Nachbarcontrols" des Splitters weggeschrieben und kann mich jetzt an keine größeren Probleme mit dem Vorgehen erinnern. |
AW: Position von Spliter speichern/laden
Im Prinzip mache ich das auch, nur daß ich mir ersparen wollte erst dieses Nachbarcontrol abzufragen.
Praktisch frage ich den Splitter nach seiner "Position", woraufhin sich dieser das Control sucht, welches für diese Position verantwortlich ist. So kann es mit egal sein welches Control das ist und ich muß überall nur noch den Splitter speichern. Wobei hier die Intention ist, daß wir in der Firma eh fast überall nur abgeleitete Komponenten verwenden, welche das Speichern dann "selber" über eine gemeinsame Schnittstelle machen. > In diesem Fall wird der Splitter nur noch mit diesem Code versehn und überall wo man nun diesen Spliter einbaut, kümmert er sich selber um das Speichern und mir kann es egal sein, welches Control wirklich dafür verantwortlich ist, bzw. ich muß nicht mehr selber geziehlt dieses Nachbarcontrol speichern. Am Schönsten wäre es ja, wenn man den Splitter direkt fragen kann, welches Control er verändert. (abgesehn von dem alClient) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz