こんにちは。 又又、ご教授お願います。
環境は、WinXp Pro Sp3, Delphi XE3 Update2です。
以下の、処理でStep実行をすると、
Edit1.Clear; → Edit1.Text:='pass1'; → exit; → eEdit1.Text:='pass3'; → Edit2.Text='pass4';
の各文ごとに停止しながら進むと思うのだが、
Finally後の文で停止せず、すぐにTForm1.Button1Clickを抜け出てしまいます。
画面の表示上は、Edit1はpass3に,Edit2はpass4に値が設定されています。
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Clear;
try
Edit1.Text := 'pass1';
exit;
Edit1.Text := 'pass2';
finally
Edit1.Text := 'pass3';
Edit2.Text := 'pass4';
end;
end;
ところが、途中のexit文がないとfinallyの各文でもStep実行がされます。
procedure proc1();
begin
sl := TStringList.Create;
try
何かの処理でEexitを実行
finally
FreeAndNil(sl);
end;
end;
としStep実行したときに、FreeAndNilで止まらず抜けてしまうので、
なんとなくStringListが廃棄されないよう思えてしょうがないです。
また、
function Func1(): boolean;
begin
try
何かの処理を実行
finally
result := foo;
end;
end;
とfinallyでresultを設定したとき、文法上finallyは必ず実行されるはずですが
コンパイルすると'戻り値が設定されていない可能性があります'の警告が表示されます。
結果的には、正しく処理されているので問題がないと思いますが、なにか気持ちが悪いです。
私の理解が間違っているのでしょうか?。
それともDelphiとしては、これでいいのでしょうか?
お分かりの方は是非教えてください。お願いいたします。
>としStep実行したときに、FreeAndNilで止まらず抜けてしまうので、
>なんとなくStringListが廃棄されないよう思えてしょうがないです。
FreeAndNil(sl);のところにブレークポイントを置いてステップ実行すればちゃんとそこで止まると思います。
またステップ実行でなくトレース実行を行えば止まると思います。
XE2スターターで確認。
ちなみにD6のプロでやってみたらトレース実行でも止まらずに抜けてしまいました。
Dさん こんにちは
当地は、今朝積雪30cmで午前中は雪の片付けでした。
Dさんに確認していただいた点はこちらでも確認しました。
確かにトレース実行で止まりますが、途中にProcedure呼び出しがあると、そのProcedureに飛んでしっまて面倒なので、とりあえずFinallyにブレークポイントを設定するしかないですね。
Programing上は問題ないですが、しっくりしませんね。
そのような仕様になっているかどうかは不明ですが、製品がそのようにできているならしょうがないんでしょうね!!!!
サトウさん、こんにちは。
(1)Button1Click について
exit;にブレークポイントを立てて、その後に「トレース実行(F7)」でfinallyの直後に来ませんか? こちらはD7,XE2で確認しました。
#私の環境では、どちらもfinally直後にブレークポイント立てて普通に止まるので何か違うのかもしれませんが...
(2)Func1 について
こちらは再現できませんでした。警告は出ません。同じくD7,XE2です。
tryの前に、exitを含む処理が入っているって事ではないですか? コンパイル可能なコードを乗せた方が、有意義なコメントが付くのではと思います。
以上、ご参考まで。
ありいさん 確認していただきましてありがとうございます。
(1)に関しては、ありいさんに確認していただいた結果と同様の結果を確認しました。
finally内にブレークポイントない場合
Step実行なら finallyでは止まらない
Trace実行なら finally内の最初の文で止まる
finally内にブレークポイントがある場合
Step実行なら finally内のブレークポイントで止まる
Trace実行なら finally内の最初の文で止まる
ということでした。ですのでStep実行ではProcedure内でもあってもfinnalyは別Procedureとして管理されていると考えればいいのかと思われます。今後、Step実行でDebugするときは、fially直後にもブレークポイントを設けるということでやっていきたいと思います。
(2)については、元のソースを修正してしまったので、あいりさんの指摘を確認することができませんでした。現ソースを見る限りあいりさんの指摘があっているかと思われます。申し訳ありませんでした。
ということで、解決とさせていただきます。
ツイート | ![]() |