フォームをモーダルで表示後、最小化、親フォームを最小化するには?

解決


KEI  2013-02-07 09:12:45  No: 43766  IP: 192.*.*.*

こんにちは。
いつも勉強させて頂いています。
ありがとうございます。
お知恵をお貸し下さい。


フォームを下記のようにモーダルで表示させ、
そのフォームを最小化した場合、
親フォームを最小化することができません。

親フォームの最小化を可能にしたいのですが、
何か方法はありますでしょうか。

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Form2) then
    Form2 := TForm2.Create(Application);
  Form2.Show;
end;f

編集 削除
KEI  2013-02-07 09:24:28  No: 43767  IP: 192.*.*.*

一部、訂正します。
Form2.Show; →  Form2.ShowModal;

編集 削除
deldel  2013-02-07 11:22:08  No: 43768  IP: 192.*.*.*

以下のようにすると一応最小化(?)しますが・・・  ・・・

    { Private 宣言 }
    procedure WM_SYSCOMMAND(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation

uses unit1;

{$R *.DFM}

procedure TForm2.WM_SYSCOMMAND(var Msg: TWMSYSCOMMAND);
begin
  if Msg.CmdType = SC_MINIMIZE then
    Form1.WindowState := wsMinimized;

  inherited;
end;

編集 削除
KEI  2013-02-07 15:51:33  No: 43769  IP: 192.*.*.*

> deldel さん
できました。
ありがとうございました。


しかし、親→モーダル(子)→モーダル(孫)とした場合に、
モーダル(孫)を最小化し、タスクバーから元に戻すと、
モーダル(子)が最前面に表示されて、操作不能っぽくなってしまうのですね。

ちからワザ(?)はやめて、モードレスの方で考えてみようと思います。

それでもこの手法は大変勉強になりました。
ありがとうございました。

編集 削除
Mr.XRAY  2013-02-07 16:46:59  No: 43770  IP: 192.*.*.*

こんにちは.

>モーダル(孫)を最小化し、タスクバーから元に戻すと、
>モーダル(子)が最前面に表示されて、操作不能っぽくなってしまうのですね。

このあたりは,Delphi のバージョンと,作成した EXE を実行する環境,
つまり,Windows のバージョンも関係するので,よく検討した方がいいですよ.

編集 削除
KEI  2013-02-07 17:03:32  No: 43771  IP: 192.*.*.*

> Mr.XRAY さん
それは未確認でした。
ありがとうございました。

編集 削除
Mr.XRAY  2013-02-07 17:22:02  No: 43772  IP: 192.*.*.*

記憶があまり確かではないのですが,
少なくても,Delphi 2007 ではアプリケーションウインドウというのがあります.
これが,ちょっと変な動きをします.というと Embarcadero さんに怒られそうですが.
このアプリケーションウインドウの表示制御は,どうもケースバイケース的なので.
Delphi のバージョンの記載がないで先のレスとなりました.
知っていて損はないですからね.

もし,Delphi 2007 よりも前のバージョンでしたら意味のないレスとなると思います.
無視してください.

編集 削除
KHE00221  2013-02-07 20:35:44  No: 43773  IP: 192.*.*.*

最小化だけでなく普通に操作できちゃうけど

uses
   Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Form2 := TForm2.Create(Self);
    Form2.WindowList := DisableTaskWindows(0);
    if Form2.ShowModal = mrOK then
    begin

    end;
    Form2.Free;

end;


///////////////

  TForm2 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
  public
    WindowList: Pointer;
  end;

procedure TForm2.FormShow(Sender: TObject);
begin
    EnableTaskWindows(WindowList);
end;


//////

if not Assigned(Form2) then
    Form2 := TForm2.Create(Application);
    Form1.Hide;
    Form2.ShowModal;
    Form1.Show;

だけでいい気もするけど・・・

編集 削除
KEI  2013-02-08 13:35:40  No: 43774  IP: 192.*.*.*

>KHE00221 さん
ありがとうございました。
想像の遙か上の手法で頭がボーッとしちゃいました(^^;


if not Assigned(Form2) then  で始まる方も面白いですね。
タスクバーから消えてしまって慌てましたが、
Form2もタスクバーに表示させるようにすれば良いですね。

編集 削除