Delphi 2009 の「with」の処理の違いを知っている人はいますか?
「with Datamodule、Dataset、MainForm」のように、「with」を完全な参照に分解するだけで、昨日問題を修正しました。Delphi 2006 以前では、データセットに「閉じる」が適用されていました。Delphi 2009 は MainForm に「閉じる」を適用し、アプリケーションを終了しました!
Delphi 2009 の「with」の処理の違いを知っている人はいますか?
「with Datamodule、Dataset、MainForm」のように、「with」を完全な参照に分解するだけで、昨日問題を修正しました。Delphi 2006 以前では、データセットに「閉じる」が適用されていました。Delphi 2009 は MainForm に「閉じる」を適用し、アプリケーションを終了しました!
何も変わっていません。あなたの以前の観察は間違っていました。ステートメントで言及されているオブジェクトwith
は「右から左」と見なされるため、この例では、最初に、次に、MainForm
次に が検索されます。それがいつものやり方です。これは、次のように記述した場合と同じです。Dataset
Datamodule
with Datamodule do
with Dataset do
with MainForm do begin
Close;
end;
Delphi 2006 のドキュメントを確認してください。宣言とステートメントという名前のセクションが必要です。その下に、 With ステートメントに関するセクションを含む構造化ステートメントがあります。
を使用しないでくださいwith
。デバッグ時もメンテナンス時もトラブルが絶えません。前日に書いた人でもメンテナンスできてしまいます。
With
悪です。これを何回言う必要があるかわかりませんが、どうやら私たちはまだそこにいません。
With は、決して変更されることのないオブジェクトに対してのみ「安全に」使用できます。独自のプロジェクトで定義したオブジェクトにそれを適用すると、すべての賭けがオフになり、「if Random(50)<25」部分を使用してコードを実行する必要があると思います。少なくとも、奇妙な実行が文書化されています。
問題は、オブジェクトをいじったり、新しいメソッドやプロパティを導入したり、古いものの名前with
を変更したりすると、それらのメソッドを使用するすべての既存のステートメントの意味が変わる可能性があることです。また、「警告: あいまいなメソッドの呼び出し」の変更もありません。コードは以前とは違うことをするだけです。それについてあなたに言わずに。
たとえば、あなたがこれを持っていると仮定しましょう:
with connection, file do
begin
Close;
end;
その後、何が起こると思いますか?ファイルを閉じるのは自然なことなので、ファイルが閉じられることを期待します。さらに、このファイル変数が、Close メソッドではなく CloseFile メソッドを定義する TSomeOddFile 型のオブジェクトを保持しているとします。上記の With ステートメントは、代わりに接続を閉じます。
すべて良い、文書化されています。ファイルが閉じられると考えてこのコードを書いた人は誰もいません。結局のところ、メソッドはそのオブジェクトの CloseFile という名前です。間違っているのは私の仮定であり、私はプロジェクトに取り組んでいません。まだ。
そして、誰かがそれを修正して、CloseFile の名前を Close に変更しました。上記のコードは、接続ではなく、サイレントにファイルを閉じ始めます。警告もエラーも発生せず、メソッド名を変更する前と同じように正常にコンパイルされます。まったく問題なく動作します^h^h^h。
ええ、with
a **であなたを噛みます。
コンパイラは通常非常に安定しているため、他のすべてを実際に除外する前にバグや変更を想定することはありません。私がすぐに考えることができるいくつかのこと:
1) オーバーロードされた関数または演算子を使用しているかどうかを確認します。STRING (およびその他のいくつかの型) の定義が変更されたため、署名が事実上変更されるため、別のバリアントを選択できます。
2) 組み込まれている一部のユニットが、既に使用されている識別子を定義しており、別のユニットで公開されている識別子よりも優先される場合もあります。
そうでない場合は、最小限の例でコードの分離を開始し、できるだけ少ないユニットを使用します。トリックは、動作が変更されたときの最後の変更が何であったかであるため、段階的に実行します。
それ (または URL) をここに投稿してください。いつ見ても興味深いものです。
With..doは注意して使用する必要があります。そうでなければ、無限の頭痛の種です.... 私はロブ・ケネディと他の人に同意します。
上記のCraig Stuntz ( with..doに関する別の投稿) とLasse V. Karlsenが述べたように、with..doは多くのトラップを作成する可能性があります。