お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ドッキング状態の保存・復帰"



みなさんこんにちは
Iniファイルに対して、コントロールのドッキング状態を保存・復帰する
サンプルです。



unit DockUtil;

interface

uses Windows,Classes,Controls,IniFiles,Forms;

procedure DockingControl(DockSite:TWinControl; Client:TControl);
procedure FloatingControl(FloatingControl:TControl);
procedure ReadDockingInfo(Form:TForm; Client:TControl;
  IniFile:TCustomIniFile);
procedure WriteDockingInfo(Client:TControl; IniFile:TCustomIniFile);

implementation

uses RsizDock;

// ClientをDockSiteにドッキングさせる
procedure DockingControl(DockSite:TWinControl; Client:TControl);
var DockingRect:TRect;
begin
  with Client do
  begin
    DockingRect:=Bounds(Left,Top,LRDockWidth,TBDockHeight);
    DockingRect.TopLeft:=ClientToScreen(DockingRect.TopLeft);
    DockingRect.BottomRight:=ClientToScreen(DockingRect.BottomRight);
    ManualFloat(DockingRect);
    ManualDock(DockSite);
  end;
end;

// FloatingControlをフローティング状態にする
procedure FloatingControl(FloatingControl:TControl);
var FloatingRect:TRect;
begin
  with FloatingControl do
  begin
    FloatingRect:=Bounds(Left,Top,UndockWidth,UndockHeight);
    ManualFloat(FloatingRect);
  end;
end;

{
IniFileからClientの状態を復元する
Form ResizeDockSiteの乗っているTForm
}
procedure ReadDockingInfo(Form:TForm; Client:TControl;
  IniFile:TCustomIniFile);
var Section,DockSiteName:string;
    Docking:boolean;
    DockSite:TWinControl;
begin
  with Client do
  begin
    Section     :=Name;
    Visible     :=false;
    Left        :=IniFile.ReadInteger(Section,'Left',0);
    Top         :=IniFile.ReadInteger(Section,'Top' ,0);
    UndockWidth :=IniFile.ReadInteger(Section,'UndockWidth',100);
    UndockHeight:=IniFile.ReadInteger(Section,'UndockHeight',100);
    LRDockWidth :=IniFile.ReadInteger(Section,'LRDockWidth',100);
    TBDockHeight:=IniFile.ReadInteger(Section,'TBDockHeight',100);

    Docking:=IniFile.ReadBool(Section,'Docking',false);
    if Docking then
    begin
      DockSiteName:=IniFile.ReadString(Section,'DockSite','');
      if DockSiteName<>'' then
      begin
        DockSite:=Form.FindComponent(DockSiteName) as TWinControl;
        DockingControl(DockSite,Client);
      end
      else Docking:=false;
    end;

    if not Docking then FloatingControl(Client);

    Visible:=IniFile.ReadBool(Section,'Visible',true);
  end;
end;

// IniFileにClientの状態を保存する
procedure WriteDockingInfo(Client:TControl; IniFile:TCustomIniFile);
var ScreenPos:TPoint;
    Section:string;
begin
  with Client do
  begin
    Section:=Name;

    IniFile.WriteBool(Section,'Visible',Visible);
    if Floating then
    begin
      ScreenPos.x:=Left;
      ScreenPos.y:=Top;
      ScreenPos:=ClientToScreen(ScreenPos);
      IniFile.WriteInteger(Section,'Left'   ,ScreenPos.x);
      IniFile.WriteInteger(Section,'Top'    ,ScreenPos.y);
      IniFile.WriteBool(   Section,'Docking',false);
    end
    else
    begin
      IniFile.WriteInteger(Section,'Left'    ,Left);
      IniFile.WriteInteger(Section,'Top'     ,Top);
      IniFile.WriteBool(   Section,'Docking' ,true);
      IniFile.WriteString( Section,'DockSite',Parent.Name);
    end;

    IniFile.WriteInteger(Section,'UndockWidth' ,UndockWidth);
    IniFile.WriteInteger(Section,'UndockHeight',UndockHeight);
    IniFile.WriteInteger(Section,'LRDockWidth' ,LRDockWidth);
    IniFile.WriteInteger(Section,'TBDockHeight',TBDockHeight);
  end;
end;

end.

                                     99/01/10(日) 00:19 貞広 賢三(YRL00044)

Original document by 貞広 賢三   氏 ID:(YRL00044)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum