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

解決


  2010-07-29 05:55:23  No: 38879

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

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

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

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


D  2010-07-29 09:32:39  No: 38880

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 19:45:31  No: 38881

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

ありがとうございます。


  2010-07-30 03:01:11  No: 38882

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

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

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


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

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






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