TForm について・・・


色即是空 空即是色  2005-04-07 20:19:30  No: 14143

メインのプログラムからDLLを呼び出します.
DLLではフォームを表示してデータ作成して
終了するとメインプログラムに作成したデータを戻すというものです。

動作的には問題ないのですが、メインプログラムは図のようになっていて
パネル1はボタン郡、パネル2は情報表示用に使っています.
┌────┬────┐  できれば、DLLで表示するフォームを呼び出し側の
│パネル1│パネル3│  フォームのパネル3だけで移動できるように
│        │        │  したいのです。
├────┤        │  DLLのフォームはダイアログにしているので、
│パネル2│        │  フォームサイズは変更できません(しません)。
└────┴────┘  
同一アプリケーション内では、パネル3を親にしてTFormを作成すると
パネル3内のみで動作できるのでしょうけど、
DLLのフォームではメインのオブジェクトを渡して指定しても動作しません。
簡単にいえば、DLLで表示するフォームの表示位置をクリッピングする
ということなのですが、何か良い方法がありませんか?


kkk  2005-04-07 20:42:22  No: 14144

表示だけなら
パネル3のハンドルをDLL側に渡してあげてDLL側では作成したフォームのParentWindowにもらったハンドルを設定してあげればどうかな?


色即是空 空即是色  2005-04-07 23:34:38  No: 14145

kkkさんどうもありがとうございます。

さっそくやってみましたけど症状がかわりませんでした.
DLL内のメニューが、パネル1、パネル2の上にも
移動できてしまいました。
どこか間違っていますでしょうか?

-----------------------------------------------------------------
呼び出し側
-----------------------------------------------------------------
function SetList(OwnerHandle: HWND): Boolean; stdcall;
external 'SetList.dll';

inplementaiton

{$R *.dfm}

procedure TForm.ButtonClick(Sender: TObject);
begin
 if SetList(PanelMain.Handle) then begin
 end;
end;
-----------------------------------------------------------------
DLL側
-----------------------------------------------------------------
function SetList(OwnerHandle: HWND): Boolean; stdcall;
begin
  FormList := TFormList.Create(Nil);
  try
    FormList.ParentWindow := OwnerHandle;
    Result := FormList.ShowModal = mrOk;
  finally
    FormList.Release;
  end;
end;

exports
  SetList;


kkk  2005-04-08 14:49:36  No: 14146

>DLL内のメニューが、パネル1、パネル2の上にも移動できてしまいました。
このメニューって何でしょう?
また、DLL内でShowModalで親Windowに埋め込むのは良くないのでは?


kkk  2005-04-08 14:53:24  No: 14147

すでにやっているとは思うけど
FormList.ParentWindow := OwnerHandle;
した後にフォームの位置を指定してあげる必要があります。
(FormList.Left,FormList.Top)


色即是空 空即是色  2005-04-11 22:31:47  No: 14148

返事が送れてすみません。

フォームを bsDialog するとエラーが出るようです.
bsSingle にすると動作しました.

また、ShowModal を使用すると動作しないので

Show の後で

while Form.Visible and (not ProgramExit) do Application.ProcessMessages;

を入れたのですが・・・

表示されるウィンドウの タイトルバー って言うのでしょうか
ウィンドウの上の部分(ドラッグしてフォームを移動できるところ)が
グレーのままで、青くなりません。

表示としては Excel の様にしたいのですが
無理なんでしょうか?


kkk  2005-04-12 13:36:21  No: 14149

当方ではうまくいってるなあ・・・
ShowModalだと上記のような症状になるけどShowなら問題出ていません。
>while Form.Visible and (not ProgramExit) do Application.ProcessMessages;
これはDLL側に入れてあるのですよね(ProgramExitが何か不明ですが)
ShowModalの様にWindowを閉じるまで戻ってこないのを期待しているのだと思いますがシステムに負荷がかかってあまりよくないのではないでしょうか?
とりあえず
while Form.Visible do Application.ProcessMessages;
をDLL側のShowの後に入れてみましたがそのフォームの移動は出来ています。
他にどこかまだ違うところがあるのかなあ。


色即是空 空即是色  2005-04-12 17:43:43  No: 14150

kkkさんお世話になります.

フォームの移動はOKなんです。

現在の問題点は2点
1.子フォームの、タイトルバーの色が青くならない。
    つまり、フォームにフォーカスがあたるとタイトルバーって
    普通、Activeな状態で青くなりますよね。それがならないんです。

2.子フォームには、ボタンが3つ、Editボックスが2つ、
    コンボボックスが1つあるんですけど、以下の処理がうまくいかないんです.
    もちろん、TabStop,TabOrder の設定は間違ってないです.

procedure TForm.KeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then begin
  if          (Sender=Btn1) or (Sender=Btn2) or (Sender=Btn3) then begin
    Edt1.Setfocus;
  end else if (Sender= Edt1) or (Sender = Edt2) or (Sender = Cbox) then begin
   SelectNext(ActiveControl, True, True);
   Key := #0;
  end;
 end;
end;


kkk  2005-04-13 20:02:38  No: 14151

なるほどフォーカスが移動しないようですね。
ちなみにBorderStyleをbsNoneにするとうまく動くようですが、タイトルバーが表示されませんので使用上の問題がでますね。(フォームをMouseDownで移動可能には出来るのですが)
詳細確認してみます。


kkk  2005-04-13 21:49:53  No: 14152

なんとか・・・
---
uses ...,Messages,...;

function SetList(OwnerHandle: HWND): Boolean; stdcall;
begin
  DllForm := TDllForm.CreateParented(OwnerHandle);
  try
    SendMessage(DllForm.Handle, WM_NCACTIVATE, Ord(True), 0);
    DllForm.Left := 0;  //適当に
    DllForm.Top  := 0;
    DllForm.Show;
    while DllForm.Visible do Application.ProcessMessages; // とりあえず
  finally
    DllForm..Release;
  end;
end;
---
こんな感じでどうでしょう?


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

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






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