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

解決


ねぎとろ  2008-09-10 23:12:26  No: 31911  IP: 192.*.*.*

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 01:46:33  No: 31912  IP: 192.*.*.*

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

編集 削除
ねぎとろ  2008-09-11 06:31:52  No: 31913  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  2008-09-11 07:57:35  No: 31914  IP: 192.*.*.*

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

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

編集 削除
ねぎとろ  2008-09-11 08:50:52  No: 31915  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  2008-09-11 09:15:40  No: 31916  IP: 192.*.*.*

では,以下のコードだとどうでしょう.
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 09:24:08  No: 31917  IP: 192.*.*.*

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

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

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

編集 削除
ねぎとろ  2008-09-11 21:26:18  No: 31918  IP: 192.*.*.*

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

編集 削除
ofZ  2008-09-11 22:00:40  No: 31919  IP: 192.*.*.*

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

という説明でいい?

編集 削除
ねぎとろ  2008-09-11 23:09:53  No: 31920  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  2008-09-12 18:34:08  No: 31921  IP: 192.*.*.*

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

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

編集 削除