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

解決


KEI  2013-02-07 18:12:45  No: 43766

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

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

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

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


KEI  2013-02-07 18:24:28  No: 43767

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


deldel  2013-02-07 20:22:08  No: 43768

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

    { 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-08 00:51:33  No: 43769

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

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

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

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


Mr.XRAY  2013-02-08 01:46:59  No: 43770

こんにちは.

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

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


KEI  2013-02-08 02:03:32  No: 43771

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


Mr.XRAY  2013-02-08 02:22:02  No: 43772

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

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


KHE00221  2013-02-08 05:35:44  No: 43773

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

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 22:35:40  No: 43774

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

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


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

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






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