ドッキングについて教えて下さい
あるパネルにメモコントロールを置いています。
そのパネルにフォーム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;
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 が表示されます
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;
こんな感じかな?
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;
KHE00221様 レス有り難うございます。
平日になり提示のソースを検証出来ずにいます
もう少し時間を頂き報告したいと思います
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;
自己レスです
ずーーっと試行錯誤していました。
それで判ったのですが、
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;
ツイート | ![]() |