複数フォームのプロジェクトでフォームの上下を入れ替えるには?

解決


よしぞう  2008-08-19 21:04:36  No: 31569

delphi初心者です。
よろしくお願いします。

複数のフォームを使用するプロジェクトを作っているのですが
親フォームから子フォームを呼び出した後、親フォームをクリックしても
親フォームは子フォームの下に隠れたままです。
子フォームを表示したまま親フォームを触りたい時に非常にやりずらくて困っています。

親フォームから子フォームを開くやり方は、子フォーム中のfunctionをよんで、そのfunctionの中でshowしています。showのやり方がまずいんでしょうか?

どなたかご教示ください。
よろしくお願いします。


いい人どまり  2008-08-20 02:14:50  No: 31570

ただ単純に子フォームを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;


ttt  2008-08-20 02:58:42  No: 31571

ShowModalでなくShowで表示しているならそんなことにはならないはずですが……
Ownerが親フォームだとそうなるかと思って試してみたけど関係なさそうですね。

とりあえずプロパティをひととおり見直してみたらどうでしょう。FormStyleがfsStayOnTopになってたりしませんか?


いい人どまり  2008-08-20 18:01:52  No: 31572

>>ttt様
自分もそう思い、いろいろ試してみてふと気がついたんですが
子フォームが親よりも予想以上に大きいのでは?
と思いSetFocus案を出したんですが・・・

とりあえずよしぞう様もう少し詳細をお願い致します。


よしぞう  2008-08-22 02:22:13  No: 31573

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.
**********************************

よろしくお願いします。


ttt  2008-08-22 07:50:32  No: 31574

手元のDelphi6で試してみましたが再現しませんね。
唯一違うところといえばApplication.MainFormOnTaskbarの存在……
ふむふむ、どうやらこれと同じ現象みたいですね。
http://fdelphi.com/modules/newbb/viewtopic.php?topic_id=91&forum=3&post_id=356

おそらくTrueにするとMainForm(最初に作ったフォーム)が他のフォームのオーナーウィンドウになるということなのかな。


よしぞう  2008-08-25 19:39:46  No: 31575

返事が遅くなりまして、申し訳ありません。
Application.MainFormOnTaskbar:=true;
を消すか、Falseにすることで解決しました。

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


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

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






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