ドッキング状態の読込み

解決


LupinⅢ  URL  2004-04-20 21:36:42  No: 8459

Form1のPanel1のDockSiteをTrueにして
Form2をドッキングさせ,Form3もドッキングさせます。

この状態で終了時にForm2とForm3のLeft,Top,UndockHeight,UndockWidth,LRDockWidth,TBDockHeightプロパティの値をファイルで保存しています。

そして再度読み込み直すとデータの設定通りに復元されません。
勝手に横並びなどになってしまいます。

正確に復元させる方法をご存知の方がいらっしゃったらおねがいします。


にしの  2004-04-21 00:42:17  No: 8460

ドックさせるとき、Dockメソッドを使ってますか?


LupinⅢ  URL  2004-04-21 01:19:08  No: 8461

DockメソッドもManualDockもやりましたが同じでした。


にしの  2004-04-21 02:01:49  No: 8462

http://forum.nifty.com/fdelphi/samples/00797.html
ここが参考になるかもしれません。


LupinⅢ  URL  2004-04-21 02:03:55  No: 8463

にしのさんのおっしゃられたURLの方は既にトライ済みで
ダメでした。


にしの  2004-04-21 02:53:16  No: 8464

UseDockManagerをFalseにしてみてください。
こちらではこれでうまく動いているようです。


にしの  2004-04-21 02:55:08  No: 8465

書き忘れました。
こちらで試したのは、
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を忘れずに。


LupinⅢ  URL  2004-04-21 02:59:08  No: 8466

にしのさんいろいろ調べて頂きありがとうございます。
もうひとつお願いがあります、出来ればソースをメールに送っていただけないでしょうか?


にしの  2004-04-21 04:55:44  No: 8467

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です。


LupinⅢ  URL  2004-04-21 18:38:06  No: 8468

にしのさんからいただいたプロジェクトを実行してみました。
たしかに場所などは保存されますがこれはUseDockManagerがFalseというのが条件ですよね。
UseDockManagerがFalseの場合でもサイズ変更、ドッキング位置、ドッキングの解除などをやりたいのですが、出来るのでしょうか?
#ドッキングの解除はボタンイベントなどでもいいと思っています


にしの  2004-04-21 20:59:29  No: 8469

DockManagerを定義してやればできそうです。

定義しなくても、FloatingDockSiteClassを用意すればタイトルバーなどを用意できます。
ただし、このままだとActiveになりません。
Activeにならないとドラッグできないので、結構難しそうです。


LupinⅢ  URL  2004-04-21 22:19:41  No: 8470

なるほどわかりました。
難しそうですがなんとかなりそうです。
にしのさんありがとうございました


  2005-06-16 03:10:13  No: 8471

私はDelphi 2005のTDockTabSetとTPanelを用いてドッキング可能なフォームを作成しています。

状態の保存と読み込みをしたいのですが、TDockTabSetの機能を生かしたまま復元する方法はないでしょうか?


  2005-06-16 08:07:23  No: 8472

新規トピックで相談しなおします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加