5

Delphi 2009 の「with」の処理の違いを知っている人はいますか?

「with Datamodule、Dataset、MainForm」のように、「with」を完全な参照に分解するだけで、昨日問題を修正しました。Delphi 2006 以前では、データセットに「閉じる」が適用されていました。Delphi 2009 は MainForm に「閉じる」を適用し、アプリケーションを終了しました!

4

5 に答える 5

16

何も変わっていません。あなたの以前の観察は間違っていました。ステートメントで言及されているオブジェクトwithは「右から左」と見なされるため、この例では、最初に、次に、MainForm次に が検索されます。それがいつものやり方です。これは、次のように記述した場合と同じです。DatasetDatamodule

with Datamodule do
  with Dataset do
    with MainForm do begin
      Close;
    end;

Delphi 2006 のドキュメントを確認してください。宣言とステートメントという名前のセクションが必要です。その下に、 With ステートメントに関するセクションを含む構造化ステートメントがあります。

を使用しないでくださいwith。デバッグ時もメンテナンス時もトラブルが絶えません。前日に書いた人でもメンテナンスできてしまいます。

于 2009-07-15T09:10:25.403 に答える
11

With悪です。これを何回言う必要があるかわかりませんが、どうやら私たちはまだそこにいません。

With は、決して変更されることのないオブジェクトに対してのみ「安全に」使用できます。独自のプロジェクトで定義したオブジェクトにそれを適用すると、すべての賭けがオフになり、「if Random(50)<25」部分を使用してコードを実行する必要があると思います。少なくとも、奇妙な実行が文書化されています。

問題は、オブジェクトをいじったり、新しいメソッドやプロパティを導入したり、古いものの名前withを変更したりすると、それらのメソッドを使用するすべての既存のステートメントの意味が変わる可能性があることです。また、「警告: あいまいなメソッドの呼び出し」の変更もありません。コードは以前とは違うことをするだけです。それについてあなたに言わずに。

たとえば、あなたがこれを持っていると仮定しましょう:

with connection, file do
begin
    Close;
end;

その後、何が起こると思いますか?ファイルを閉じるのは自然なことなので、ファイルが閉じられることを期待します。さらに、このファイル変数が、Close メソッドではなく CloseFile メソッドを定義する TSomeOddFile 型のオブジェクトを保持しているとします。上記の With ステートメントは、代わりに接続を閉じます。

すべて良い、文書化されています。ファイルが閉じられると考えてこのコードを書いた人は誰もいません。結局のところ、メソッドはそのオブジェクトの CloseFile という名前です。間違っているのは私の仮定であり、私はプロジェクトに取り組んでいません。まだ。

そして、誰かがそれを修正して、CloseFile の名前を Close に変更しました。上記のコードは、接続ではなく、サイレントにファイルを閉じ始めます。警告もエラーも発生せず、メソッド名を変更する前と同じように正常にコンパイルされます。まったく問題なく動作します^h^h^h。

ええ、witha **であなたを噛みます。

于 2009-07-15T10:23:51.153 に答える
3

with A,B,C,D他のユニットに変更を加えると、コードが突然期待どおりに機能しなくなる可能性があるため、使用することはお勧めできません。詳細については、こちらを参照するか、こちら(を検索してください"with keyword")を参照してください。

于 2009-07-15T07:56:31.217 に答える
3

コンパイラは通常非常に安定しているため、他のすべてを実際に除外する前にバグや変更を想定することはありません。私がすぐに考えることができるいくつかのこと:

1) オーバーロードされた関数または演算子を使用しているかどうかを確認します。STRING (およびその他のいくつかの型) の定義が変更されたため、署名が事実上変更されるため、別のバリアントを選択できます。

2) 組み込まれている一部のユニットが、既に使用されている識別子を定義しており、別のユニットで公開されている識別子よりも優先される場合もあります。

そうでない場合は、最小限の例でコードの分離を開始し、できるだけ少ないユニットを使用します。トリックは、動作が変更されたときの最後の変更が何であったかであるため、段階的に実行します。

それ (または URL) をここに投稿してください。いつ見ても興味深いものです。

于 2009-07-15T12:28:28.660 に答える
1

With..doは注意して使用する必要があります。そうでなければ、無限の頭痛の種です.... 私はロブ・ケネディと他の人に同意します。

上記のCraig Stuntz ( with..doに関する別の投稿) とLasse V. Karlsenが述べたように、with..doは多くのトラップを作成する可能性があります。

于 2009-07-15T12:40:56.073 に答える