AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Position von Spliter speichern/laden

Ein Thema von himitsu · begonnen am 26. Jan 2011 · letzter Beitrag vom 26. Jan 2011
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.293 Beiträge
 
Delphi 12 Athens
 
#1

Position von Spliter speichern/laden

  Alt 26. Jan 2011, 14: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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz