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

解決


よしぞう  2008-08-19 12:04:36  No: 31569  IP: 192.*.*.*

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

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

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

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

編集 削除
いい人どまり  2008-08-19 17:14:50  No: 31570  IP: 192.*.*.*

ただ単純に子フォームを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-19 17:58:42  No: 31571  IP: 192.*.*.*

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

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

編集 削除
いい人どまり  2008-08-20 09:01:52  No: 31572  IP: 192.*.*.*

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

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

編集 削除
よしぞう  2008-08-21 17:22:13  No: 31573  IP: 192.*.*.*

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-21 22:50:32  No: 31574  IP: 192.*.*.*

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

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

編集 削除
よしぞう  2008-08-25 10:39:46  No: 31575  IP: 192.*.*.*

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

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

編集 削除