Form1のPanel1のDockSiteをTrueにして
Form2をドッキングさせ,Form3もドッキングさせます。
この状態で終了時にForm2とForm3のLeft,Top,UndockHeight,UndockWidth,LRDockWidth,TBDockHeightプロパティの値をファイルで保存しています。
そして再度読み込み直すとデータの設定通りに復元されません。
勝手に横並びなどになってしまいます。
正確に復元させる方法をご存知の方がいらっしゃったらおねがいします。
ドックさせるとき、Dockメソッドを使ってますか?
DockメソッドもManualDockもやりましたが同じでした。
http://forum.nifty.com/fdelphi/samples/00797.html
ここが参考になるかもしれません。
にしのさんのおっしゃられたURLの方は既にトライ済みで
ダメでした。
UseDockManagerをFalseにしてみてください。
こちらではこれでうまく動いているようです。
書き忘れました。
こちらで試したのは、
Ini.WriteInteger('General', 'Form2Left', Form2.Left);
Ini.WriteInteger('General', 'Form2Top', Form2.Top);
Ini.WriteInteger('General', 'Form2Width', Form2.Width);
Ini.WriteInteger('General', 'Form2Height', Form2.Height);
というように出力した値をそのままRectにして、Dockメソッドでドッキングしただけです。
必要な項目は、Left,Top,Width,Heightとなります。
Rectを計算するとき、
Rect.Right := Left + Width - 1;
というように、-1を忘れずに。
にしのさんいろいろ調べて頂きありがとうございます。
もうひとつお願いがあります、出来ればソースをメールに送っていただけないでしょうか?
Dockは推奨しないようなのでManualDockの場合です。
# あまり代わりありませんが
Form2.Left := Ini.ReadInteger('General', 'Form2Left', Form2.Left);
Form2.Top := Ini.ReadInteger('General', 'Form2Top', Form2.Top);
Form2.Width := Ini.ReadInteger('General', 'Form2Width', Form2.Width);
Form2.Height := Ini.ReadInteger('General', 'Form2Height', Form2.Height);
if not Ini.ReadBool('General', 'Form2Floating', Form2.Floating) then
begin
Form2.ManualDock(Panel1);
end;
表示に関しては特に注意すべき点はないと思います。
保存時に、
Ini.WriteBool('General', 'Form2Floating', Form2.Floating);
ptLT.X := Form2.Left;
ptLT.Y := Form2.Top;
if Assigned(Form2.Parent) then
begin
ptLT := Form2.Parent.ClientToScreen(ptLT);
end;
Ini.WriteInteger('General', 'Form2Left', ptLT.X);
Ini.WriteInteger('General', 'Form2Top', ptLT.Y);
Ini.WriteInteger('General', 'Form2Width', Form2.Width);
Ini.WriteInteger('General', 'Form2Height', Form2.Height);
というように、Parentの座標からScreen座標に変換しておく必要があります。
# 通常、Floatingの状態ではParentはnilです。
にしのさんからいただいたプロジェクトを実行してみました。
たしかに場所などは保存されますがこれはUseDockManagerがFalseというのが条件ですよね。
UseDockManagerがFalseの場合でもサイズ変更、ドッキング位置、ドッキングの解除などをやりたいのですが、出来るのでしょうか?
#ドッキングの解除はボタンイベントなどでもいいと思っています
DockManagerを定義してやればできそうです。
定義しなくても、FloatingDockSiteClassを用意すればタイトルバーなどを用意できます。
ただし、このままだとActiveになりません。
Activeにならないとドラッグできないので、結構難しそうです。
なるほどわかりました。
難しそうですがなんとかなりそうです。
にしのさんありがとうございました
私はDelphi 2005のTDockTabSetとTPanelを用いてドッキング可能なフォームを作成しています。
状態の保存と読み込みをしたいのですが、TDockTabSetの機能を生かしたまま復元する方法はないでしょうか?
新規トピックで相談しなおします。
ツイート | ![]() |