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;
ShowじゃなくてShowModalをつかったらいいのでは?
http://kakinotane.s7.xrea.com/delphi/d2/d034.html
ShowModalを使うとForm2が閉じられるまで待ってしまい
処理が行われプログレスバーが更新される部分の処理まで
たどりつかないのでプログラムが止まってしまいます。
とりあえず,Delphi2007のプロジェクトソースに
MainFormOnTaskbarがあれば,これをFalseにしたらどうなるでしょうか.
begin
Application.Initialize;
Application.MainFormOnTaskbar := False; //ここ
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
trueだったのをfalseに変更してみましたが
動作は変わらずFormが復元されてしまいます。
では,以下のコードだとどうでしょう.
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; //ここ
あと,Form2ですが,自動生成からはずして,
Finally
Form2.Close;
Form2.Free;
Form2 := nil;
End;
でしょうか.Form2自身からではないので,FreeAndNil(Form2)でもいいかも
知れません.
解決しました。ほんとうにありがとうございます。
ひとつ気になることがあるのですが、
Application.CreateForm(TForm2,Form2);
をTry文の外側に出したのは何か意図が
あるのでしょうか?
Application.CreateForm(TForm2,Form2);
が、Try内にあると、Application.CreateForm で例外発生すると、
Form2のインスタンスが作成されないのに、Form2.Close; を実行しようとするから。
という説明でいい?
なるほど〜。そういう意図があったんですね。
プログラムもちゃんと作れそうでうれしいです。
教えてくださった皆様、ほんとうにありがとうございます。
この MainFormOnTaskbar ですが,TrueにするかFalseにするかは,
ケースバイケースのようです.私もよく理解というかわからないのです.
できれば,MainFormOnTaskbar Delphi 等で検索して調べてみてください.
今回の場合はMainFormを不可視にしているのでFalseと当たりをつけました.
ツイート | ![]() |