メインのプログラムからDLLを呼び出します.
DLLではフォームを表示してデータ作成して
終了するとメインプログラムに作成したデータを戻すというものです。
動作的には問題ないのですが、メインプログラムは図のようになっていて
パネル1はボタン郡、パネル2は情報表示用に使っています.
┌────┬────┐ できれば、DLLで表示するフォームを呼び出し側の
│パネル1│パネル3│ フォームのパネル3だけで移動できるように
│ │ │ したいのです。
├────┤ │ DLLのフォームはダイアログにしているので、
│パネル2│ │ フォームサイズは変更できません(しません)。
└────┴────┘
同一アプリケーション内では、パネル3を親にしてTFormを作成すると
パネル3内のみで動作できるのでしょうけど、
DLLのフォームではメインのオブジェクトを渡して指定しても動作しません。
簡単にいえば、DLLで表示するフォームの表示位置をクリッピングする
ということなのですが、何か良い方法がありませんか?
表示だけなら
パネル3のハンドルをDLL側に渡してあげてDLL側では作成したフォームのParentWindowにもらったハンドルを設定してあげればどうかな?
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;
>DLL内のメニューが、パネル1、パネル2の上にも移動できてしまいました。
このメニューって何でしょう?
また、DLL内でShowModalで親Windowに埋め込むのは良くないのでは?
すでにやっているとは思うけど
FormList.ParentWindow := OwnerHandle;
した後にフォームの位置を指定してあげる必要があります。
(FormList.Left,FormList.Top)
返事が送れてすみません。
フォームを bsDialog するとエラーが出るようです.
bsSingle にすると動作しました.
また、ShowModal を使用すると動作しないので
Show の後で
while Form.Visible and (not ProgramExit) do Application.ProcessMessages;
を入れたのですが・・・
表示されるウィンドウの タイトルバー って言うのでしょうか
ウィンドウの上の部分(ドラッグしてフォームを移動できるところ)が
グレーのままで、青くなりません。
表示としては Excel の様にしたいのですが
無理なんでしょうか?
当方ではうまくいってるなあ・・・
ShowModalだと上記のような症状になるけどShowなら問題出ていません。
>while Form.Visible and (not ProgramExit) do Application.ProcessMessages;
これはDLL側に入れてあるのですよね(ProgramExitが何か不明ですが)
ShowModalの様にWindowを閉じるまで戻ってこないのを期待しているのだと思いますがシステムに負荷がかかってあまりよくないのではないでしょうか?
とりあえず
while Form.Visible do Application.ProcessMessages;
をDLL側のShowの後に入れてみましたがそのフォームの移動は出来ています。
他にどこかまだ違うところがあるのかなあ。
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;
なるほどフォーカスが移動しないようですね。
ちなみにBorderStyleをbsNoneにするとうまく動くようですが、タイトルバーが表示されませんので使用上の問題がでますね。(フォームをMouseDownで移動可能には出来るのですが)
詳細確認してみます。
なんとか・・・
---
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;
---
こんな感じでどうでしょう?
ツイート | ![]() |