サブフォームを最小化しないようにするには?

解決


勉強中  2006-01-12 07:00:10  No: 19585

いつも参考にさせて頂いています。
ひとつ質問させて下さい。

メインフォームとサブフォームを表示して、メインフォームを最小化するとサブフォームも一緒に最小化されますよね?この時、メインフォームのみ最小化し、サブフォームは表示したままにするにはどうしたらよいのでしょうか?

環境はDelphi5/WindowsXPです。
宜しくお願い致します。


Mr.XRAY  URL  2006-01-12 08:16:56  No: 19586

これはDelphiの仕様です.その方が都合のいいことが多いからです.
詳しい説明は省略します.いろいろやってみると理解することができる
のではないかと思います.

メインフォームの最小化の目的にもよりますが,最小化の操作で見えなく
することは可能です.
新規のプロジェクトでフォームを2つ作成して,各々Form1(Unit1),Form2(Unit2)
とします.以下のコードを試してみてください.

----- Unit1.pas ----
  public
    { Public 宣言 }
   procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     Form2.Show;
end;
// 最小化の操作で非表示にする
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
     case  Msg.CmdType and $FFF0 of
       SC_MINIMIZE: Hide;
     else
       inherited;
     end;
end;

end.

----  Unit2.pas ---------------
implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Form1.Show;
end;

end.


勉強中  2006-01-13 07:06:31  No: 19587

Mr.XRAYさん、レスありがとうございます。
早速試してみたのですが、MsgCmdType が未定義の識別子だと怒られてしまいます。
何かuses節に追加しないといけないんでしょうか?
ヘルプにも無い様なので教えて頂けないでしょうか。


Mr.XRAY  URL  2006-01-13 08:29:57  No: 19588

>早速試してみたのですが、MsgCmdType が未定義の識別子だと怒られてしまいます。

コピペしてやりましたか.MsgCmdTypeではありません.
WMSysCommand(var Msg: TWMSysCommand);
の引数のMsgのCmdTypeです.Msg.(ドットをつけます)までタイプしたら
[Ctrl]+[Space]を押してみて下さい.


勉強中  2006-01-15 06:24:41  No: 19589

Mr.XRAYさん、ありがとうございました。
お陰様でメインフォームのみ見えなくなりました。また、サブフォームをクローズする事によって再表示する事もできるようになりました。
ただ、タスクバーをクリックすると見えないままで最小化と復元を実行している様なのでクリックしたら再表示させようと思い、
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  case Msg.CmdType and $FFF0 of
    SC_MINIMIZE:Hide;
    SC_RESTORE:Form1.Visible:=True;
    else
      inherited;
  end;
end;
としてみましたが、旨くいきませんでした。
よろしかったら教えていただけないでしょうか?


Mr.XRAY  URL  2006-01-15 09:32:43  No: 19590

>としてみましたが、旨くいきませんでした。

(1)どのような現象が起きているのか
(2)それは,最小化で非表示にしないの時の動作とどう違っているのか
(3)どんな動作が望みなのか
が私にはわかりません.できれば箇条書きで教えて下さい.

新規でプロジェクトを作成して実行すると,タスクバーのボタンをクリック
する度に,非表示と復元を繰返すのが,Delphiというより通常のアプリの
動作ですが...
少なくとも私のWindowsXP + Delphi5 では,タスクバーのボタンクリックで
その動作をします.当然ですが,Form2を表示している時は,Form2がその動作
の対象となります.
タスクバーのクリックは,そのアプリの表示状態を変更します.Form1,Form2
も同じアプリですから.最初の質問の解決にはなっている思いますよ.


勉強中  2006-01-15 15:16:48  No: 19591

>最初の質問の解決にはなっている思いますよ.
おっしゃるとおりですね。最初の問題は解決しています。
私が後からしたのは別問題でした。質問の仕方も悪かったようです。すみませんでした。


勉強中  2006-01-15 15:23:15  No: 19592

すみません、改行を失敗しました。
後からの質問に関してはまた、別スレにて質問させていただきたいと思います。
その時はまたよろしくお願いいたします。


MONO  2006-01-17 02:30:07  No: 19593

お望みの動作はこんな感じでしょう。
procedure CreateParams(var Params: TCreateParams); override;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;


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

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






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