delphi初心者です。
よろしくお願いします。
複数のフォームを使用するプロジェクトを作っているのですが
親フォームから子フォームを呼び出した後、親フォームをクリックしても
親フォームは子フォームの下に隠れたままです。
子フォームを表示したまま親フォームを触りたい時に非常にやりずらくて困っています。
親フォームから子フォームを開くやり方は、子フォーム中のfunctionをよんで、そのfunctionの中でshowしています。showのやり方がまずいんでしょうか?
どなたかご教示ください。
よろしくお願いします。
ただ単純に子フォームをShowした後に親フォームにフォーカスをあてるってのは
だめなのでしょうか?
◇親フォーム
procedure TForm_Parent.Button1Click(Sender: TObject);
begin
//子フォームのファンクションを呼び出し
Form_Child.F_Form_Child_Show();
//現在は子フォームが親フォームの上に乗っている状態
//親フォームにフォーカスを当てて一番上に
Form_Parent.SetFocus;
end;
◆子フォーム※retrunはダミー
function TForm_Child.F_Form_Child_Show(): String;
begin
//自身をSHOW!
TForm_Child.show;
end;
ShowModalでなくShowで表示しているならそんなことにはならないはずですが……
Ownerが親フォームだとそうなるかと思って試してみたけど関係なさそうですね。
とりあえずプロパティをひととおり見直してみたらどうでしょう。FormStyleがfsStayOnTopになってたりしませんか?
>>ttt様
自分もそう思い、いろいろ試してみてふと気がついたんですが
子フォームが親よりも予想以上に大きいのでは?
と思いSetFocus案を出したんですが・・・
とりあえずよしぞう様もう少し詳細をお願い致します。
ttt様 いい人どまり様
ありがとうございます。
SetFocusをしても子フォームが親フォームの上に載ったままです。。
モニタ上では親にフォーカスが移っていて、コンポーネントの操作
(文字入力やコンボボックスの操作)も出来るのですが、子フォームは
親フォームの上に載ったままです。
ですので、子フォームの下に隠れているオブジェクトの操作が出来ません。
(T_T)
FormStyleはfsNormalです。
以下サンプルコードです。。
***************project1**************
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end
**********************************
***************unit1**************
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, SpeedButtonEx, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.FormShow(self);
end;
end.
**********************************
***************unit2**************
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MemoEx;
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
procedure FormShow(Sender: TObject);
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormShow(Sender: TObject);
begin
form2.Show;
end;
end.
**********************************
よろしくお願いします。
手元のDelphi6で試してみましたが再現しませんね。
唯一違うところといえばApplication.MainFormOnTaskbarの存在……
ふむふむ、どうやらこれと同じ現象みたいですね。
http://fdelphi.com/modules/newbb/viewtopic.php?topic_id=91&forum=3&post_id=356
おそらくTrueにするとMainForm(最初に作ったフォーム)が他のフォームのオーナーウィンドウになるということなのかな。
返事が遅くなりまして、申し訳ありません。
Application.MainFormOnTaskbar:=true;
を消すか、Falseにすることで解決しました。
ありがとうございました!!
ツイート | ![]() |