フォームのドッキングについて

解決


 2010-07-28 20:55:23  No: 38879  IP: 192.*.*.*

お疲れ様です。
ひとつ皆さんの案をお聞かせください。

フォームを用意し、その上にページコントロールを配置
DockSite=True とする。
このページコントロールに対して別のexe(メモ帳などや別に作成したexe)を
ドッキングさせる。

以上のようなことは出来るでしょうか?

ちなみに同一Exe内のフォームのドッキングは manualDockで動作
させることが出来、満足ゆく動作ができました。

編集 削除
D  2010-07-29 00:32:39  No: 38880  IP: 192.*.*.*

SetParent APIを使えばできます。
メモ帳などのタイトルバーが不要ならSetWindowLong APIを使ってタイトルバーを無しにします。
サイズの調整はSetWindowPos APIをSWP_NOACTIVATEオプションを指定して使います。

こんな感じで。

  private
    { Private 宣言 }
    F_hWindow: HWND;


procedure TForm1.Button1Click(Sender: TObject);
var
  li_Style: Longint;
begin
  F_hWindow := FindWindow('Notepad', nil);
  if (F_hWindow <> 0) then begin
    Windows.SetParent(F_hWindow, TabSheet1.Handle);

    //タイトルバーを無しに
    li_Style := GetWindowLong(F_hWindow, GWL_STYLE);
    if ((li_Style and WS_CAPTION)    <> 0) then Dec(li_Style, WS_CAPTION);
    if ((li_Style and WS_THICKFRAME) <> 0) then Dec(li_Style, WS_THICKFRAME);
    SetWindowLong(F_hWindow, GWL_STYLE, li_Style);

    PageControl1Resize(nil);
  end;
end;

procedure TForm1.PageControl1Resize(Sender: TObject);
begin
  if (F_hWindow <> 0) then begin
    //メモ帳のサイズをタブシートに合わせる
    SetWindowPos(F_hWindow, 0, 0, 0, TabSheet1.ClientWidth, TabSheet1.ClientHeight, SWP_NOACTIVATE);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  li_Style: Longint;
begin
  //メモ帳を元に戻す
  if (F_hWindow <> 0) then begin
    //タイトルバーを元に戻す
    li_Style := GetWindowLong(F_hWindow, GWL_STYLE);
    li_Style := li_Style or WS_CAPTION or WS_THICKFRAME;
    SetWindowLong(F_hWindow, GWL_STYLE, li_Style);

    Windows.SetParent(F_hWindow, GetDesktopWindow);
  end;

  F_hWindow := 0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if (F_hWindow <> 0) then begin
    Button2Click(nil);
  end;
end;

編集 削除
 2010-07-29 10:45:31  No: 38881  IP: 192.*.*.*

回答ありがとうございます、今は出先で環境がないので
今夜辺りになってしまいますが戻り次第ためさせていただきます。
かげで世界がぐんと広がりそうです。

ありがとうございます。

編集 削除
 2010-07-29 18:01:11  No: 38882  IP: 192.*.*.*

お疲れ様です、試してみました。
ばっちりドッキングしてくれますね、なんだか感動します。

これは直接親を指定しているので、これを元に
メモ帳>フォーム>ページコントロール の順でドッキングを目指して
見ます。

ありがとうございました。

編集 削除