タスクバーをクリックしても親フォームが復元されないようにしたい

解決


ねぎとろ  2008-09-11 08:12:26  No: 31911

Delphi6で作ったプログラムをVISTA対応させるため新しく
Delphi2007で作り直しているのですが以下の点がうまくいきません。

まずForm1でボタンを押すとForm1が最小化して処理が行われます。
処理を行っている間Form2が作られForm2にあるプログレスバーが
処理の進行状況を示すのですが、プログレスバーが表示されている時に
タスクバーにあるフォームをクリックすると、XPだとフォームが
復元されないのですがVistaだと復元されてしまうのです。
この部分をXPと同じような動きをするよう復元されないように
する方法を教えていただけないでしょうか。よろしくお願いします。
以下がそのソースです。

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  I: integer;
begin
  Application.Minimize;
  Form1.Refresh;
  Try
    Application.CreateForm(TForm2,Form2);
    Form2.ProgressBar1.Position:=1;
    Form2.Show;
    Form2.Repaint;
    Form2.SetFocus;
    for I := 0 to 100 do
    begin
      Application.ProcessMessages;
      Form2.Repaint;
      //ここで処理が行われる
      Sleep(100);
      Form2.ProgressBar1.Position:=I;
    end;
  Finally
    Form2.Close;
  End;
end;


んと  2008-09-11 10:46:33  No: 31912

ShowじゃなくてShowModalをつかったらいいのでは?
http://kakinotane.s7.xrea.com/delphi/d2/d034.html


ねぎとろ  2008-09-11 15:31:52  No: 31913

ShowModalを使うとForm2が閉じられるまで待ってしまい
処理が行われプログレスバーが更新される部分の処理まで
たどりつかないのでプログラムが止まってしまいます。


Mr.XRAY  2008-09-11 16:57:35  No: 31914

とりあえず,Delphi2007のプロジェクトソースに
MainFormOnTaskbarがあれば,これをFalseにしたらどうなるでしょうか.

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := False;   //ここ
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.


ねぎとろ  2008-09-11 17:50:52  No: 31915

trueだったのをfalseに変更してみましたが
動作は変わらずFormが復元されてしまいます。


Mr.XRAY  2008-09-11 18:15:40  No: 31916

では,以下のコードだとどうでしょう.
MainFormOnTaskbar := False;
のままで.
私のところではOKのようです.

//  Application.Minimize;
  Form1.Hide;          // ここ
  Form1.Refresh;
  //どちらかと言うとこうですね(動作には無関係)
  Application.CreateForm(TForm2,Form2);
  Try
    Form2.ProgressBar1.Position:=1;
    Form2.Show;
    Form2.Repaint;
    Form2.SetFocus;
    for I := 0 to 100 do
    begin
      Application.ProcessMessages;
      Form2.Repaint;
      //ここで処理が行われる
      Sleep(100);
      Form2.ProgressBar1.Position:=I;
    end;
  Finally
    Form2.Close;
  End;
  Form1.Show;    //ここ


Mr.XRAY  2008-09-11 18:24:08  No: 31917

あと,Form2ですが,自動生成からはずして,

  Finally
    Form2.Close;
    Form2.Free;
    Form2 := nil;
  End;

でしょうか.Form2自身からではないので,FreeAndNil(Form2)でもいいかも
知れません.


ねぎとろ  2008-09-12 06:26:18  No: 31918

解決しました。ほんとうにありがとうございます。
ひとつ気になることがあるのですが、
Application.CreateForm(TForm2,Form2);
をTry文の外側に出したのは何か意図が
あるのでしょうか?


ofZ  2008-09-12 07:00:40  No: 31919

Application.CreateForm(TForm2,Form2);
が、Try内にあると、Application.CreateForm で例外発生すると、
Form2のインスタンスが作成されないのに、Form2.Close; を実行しようとするから。

という説明でいい?


ねぎとろ  2008-09-12 08:09:53  No: 31920

なるほど〜。そういう意図があったんですね。
プログラムもちゃんと作れそうでうれしいです。
教えてくださった皆様、ほんとうにありがとうございます。


Mr.XRAY  2008-09-13 03:34:08  No: 31921

この  MainFormOnTaskbar ですが,TrueにするかFalseにするかは,
ケースバイケースのようです.私もよく理解というかわからないのです.
できれば,MainFormOnTaskbar Delphi 等で検索して調べてみてください.

今回の場合はMainFormを不可視にしているのでFalseと当たりをつけました.


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

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






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