ドッキングについて

解決


ピタゴラスの定理  2008-03-02 22:08:55  No: 29991

ドッキングについて教えて下さい

あるパネルにメモコントロールを置いています。
そのパネルにフォーム1をドッキングして
両方表示したいのですが、下記のコードでは
メモコントロールの上にもフォーム1が表示されてしまいます
【環境】デルファイ6パーソナル

procedure TfrmMain.Button1Click(Sender: TObject);
var
  //lRect: TRect;
begin
  // フォームが一瞬表示されてしまうので、画面の外に表示させます。
  Form1.Left := -2000;
  // フォームの表示
  Form1.Show;
  Form1.ManualDock(DockPanel, nil, alNone);

  //lRect.TopLeft := DockPanel.ClientToScreen(Point(0, 50));
  //lRect.BottomRight := DockPanel.ClientToScreen(Point(85, DockPanel.Height));
  //Form1.DockRect := lRect;
  //Form1.ClientHandle := lRect;
  //lRect := Rect (5, 1, 20, 20);
  //InvalidateRect(Form1.Parent.Handle, @lRect, True);

end
procedure TfrmMain.DockPanelDockDrop(Sender: TObject;
          Source: TDragDockObject; X, Y: Integer);
begin
    //????
end;


KHE00221  2008-03-02 23:40:36  No: 29992

TPanel の上に TMemo が alClient として配置してあるとして

procedure TForm1.Button1Click(Sender: TObject);
begin
    Form2.ManualDock(Panel1, nil , alLeft);
    Form2.Show;
end;

procedure TForm1.Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer);
begin
    Source.Control.Align := alLeft;
    Source.Control.Width := Panel1.Width  div 2;
end;

でPanelの右半分に Form2 が表示されます


ピタゴラスの定理  2008-03-03 05:19:15  No: 29993

KHE00221様  レス有り難うございます。
"Panel1DockDrop"で制御するとは思いもよりませんでした。
確かにパネルに2つ表示されますが、
Form2のドッキングコントロールのヘッドの
×と横バーが隠れてしまい、閉じるが使えない状態になってしまいました
なにか方策が有るのでしょうか
宜しくお願いいたします。

 frmMain.Memo2.Align := alTop;
  frmMain.Memo2.Height := DockPanel.Height  div 2;
  Source.Control.Align := alCustom;
  Source.Control.Height := DockPanel.Height  div 2;


KHE00221  2008-03-03 10:29:27  No: 29994

こんな感じかな?

procedure TForm1.Button1Click(Sender: TObject);
begin
    Form2.ManualDock(Panel1, nil , alClient);
    Form2.Show;
    Memo1.ManualDock(Panel1, nil,  alRight);
end;

procedure TForm1.Panel1DockDrop(Sender: TObject; Source: TDragDockObject; X,
  Y: Integer);
begin
    //Memo の X と横バーを隠したい場合
    Memo1.Align := alRight;
end;


ピタゴラスの定理  2008-03-03 21:36:52  No: 29995

KHE00221様  レス有り難うございます。

平日になり提示のソースを検証出来ずにいます
もう少し時間を頂き報告したいと思います


ピタゴラスの定理  2008-03-08 09:12:16  No: 29996

KHE00221様  レス有り難うございました。

上記の件を検証してみました。これでOKです。
有り難う御座います。

その後動作確認をいろいろしていましたら、次の質問が出て来ましたので
どなたかお教え下さい。

■1:ドッッキングされるパネルにフォームをドッキングした状態から
そのフォームを手ではなし、再びパネルにドッキングした時
同じ位置(パネルの下側)にドッキングしません。
下記のソースの[A]をコメントアウトして、
パネルの上をドラッグすると、ドッキング場所(表現が変)が、
上下左右に枠が表示されます。
いつも[A]の位置にドッキングする対処法を教えて下さい。

■2:同じコードを会社のパソコン(XP)で走らせると、
MEMOコントロールとドッキングフォーム間に仮想(?)のスプリッターが
あります。それを上下に動かすと、MEMO及びフォームの表示範囲が
狭くなったり、大きくなったりしてしまいます。
何か対処法が有るのでしょうか、教えて下さい。
家のパソコン(2x)だとスピリッターも表示されない(なぜ?)

以上ですが、おわかりになる方の返事を気長にお待ちしています。

そのソース
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  // フォームを画面の外に表示
  Form1.Left := -2000;
  // フォームの表示
  Form1.ManualDock(DockPanel, nil, alCustom);
  Form1.Show;
  Memo2.ManualDock(DockPanel, nil,  alTop);
end;

procedure TfrmMain.DockPanelDockDrop(Sender: TObject;
          Source: TDragDockObject; X, Y: Integer);
var
  lRect: TRect;
begin
  frmMain.Memo2.Align := alNone;  //alClientから
  frmMain.Memo2.Height := DockPanel.Height div 2;
  frmMain.Memo2.Align := alTop;
end;

procedure TfrmMain.DockPanelDockOver(Sender: TObject;
          Source:TDragDockObject;X, Y: Integer; State: TDragState;
          var Accept: Boolean);
var
  lRect: TRect;
begin
  lRect.TopLeft := DockPanel.ClientToScreen
                     (Point(0,DockPanel.Height  div 2));
  lRect.BottomRight := DockPanel.ClientToScreen
                     (Point(DockPanel.Width, DockPanel.Height));
  Source.DockRect := lRect;  →→→[A]
end;

procedure TfrmMain.DockPanelUnDock(Sender: TObject; Client:TControl;
          NewTarget: TWinControl; var Allow: Boolean);
begin
  Memo2.Align := alClient;
end;

procedure TfrmMain.Splitter1Moved(Sender: TObject);
begin
  frmMain.Memo2.Height := DockPanel.Height div 2;
end;

−−−−−−−−−−−−−−−−−−−−−
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 frmMain.Memo2.Align := alClient;
end;


ピタゴラスの定理  2008-03-16 08:33:47  No: 29997

自己レスです
ずーーっと試行錯誤していました。
それで判ったのですが、
Panel1にMEMO1とPanel2を乗せて
Form1をPanel2にドッキングすることで
私のやりたかったことが出来ました。
(始まりが、難しく考えすぎていました。)
ようやく解決にチェックできます。
下記にお粗末ながらコードをアップします
KHE00221 様有り難う御座いました。

Memo1.Align := alTop;
Panel2.Align := alBottom ;
/////////////////////////////////////////////////////////////////
const
  DockPanelHeight = 150;

procedure TfrmMain.FormShow(Sender: TObject);
begin
  Panel2.Height := 0 ;
  Memo1.Align := alClient;
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  // フォームを画面外に表示
  Form1.Left := -2000;
  // フォームの表示
  Form1.Show;
  Form1.ManualDock(Panel2, nil, alClient);
  Panel2.Height := DockPanelHeight;
end;

procedure TfrmMain.Panel2DockDrop(Sender: TObject;
          Source: TDragDockObject; X, Y: Integer);
begin
    Panel2.Height := DockPanelHeight;
end;

procedure TfrmMain.Panel2DockOver(Sender: TObject;
          Source:TDragDockObject;X, Y: Integer; State: TDragState;
          var Accept: Boolean);
var
  lRect: TRect;
begin

  Memo1.Align := alNone;
  Panel2.Height := DockPanelHeight;
  lRect.TopLeft := Panel2.ClientToScreen(Point(0, 0));
  lRect.BottomRight := Panel2.ClientToScreen
                     (Point(Panel2.Width, DockPanelHeight));
  Source.DockRect := lRect;
end;

procedure TfrmMain.Panel2UnDock(Sender: TObject; Client:TControl;
          NewTarget: TWinControl; var Allow: Boolean);
begin
  Panel2.Height := 0 ;
  Memo1.Align := alClient;
end;

////////////////////////////////////////////////////////////////////
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 frmMain.Panel2.Height := 0 ;
 frmMain.Memo1.Align := alClient;
end;


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

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






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