2

Delphi アプリのデバッグ中に、ストアド プロシージャの動作のデバッグ中に使用する多くのデータベース フィールドの外部キー値を取得する必要があります。フィールドが非常に多いため、監視する必要があるフィールドごとに式を記述するのではなく、すべての値を監視ウィンドウに入力するなど、これらの値を取得するより迅速な方法があるかどうか疑問に思います。

つまり、いくつかのテーブルのすべてのフィールド値を監視する必要があります。それらすべてが必要なわけではありませんが、このようなリストから必要なものを簡単に選択できます.

現在、私は次のような時計式を書いています:

<data module>.<Table Component>.fieldbyname('Field_Name').asinteger
4

3 に答える 3

6

あまり。監視を設定するためにループする方法や、コードを設定せずに一度に複数のデータベース フィールドに監視を設定する方法はありません。

Delphi 2010 以降では、カスタム ビューを提供する独自のデバッガ ビジュアライザ( のセクションを参照External-Viewer Visualizers)を作成できますが、これはかなり大規模な作業になります。(フォルダにサンプルが用意されてい$(BDS)\Source\Visualizersます。外部ビューアーはStringListViewerです。)

永続フィールドを作成してウォッチ ウィンドウに簡単に追加できます (テーブル コンポーネントをダブルクリックして、Add Field...またはを選択しますAdd All Fields)。その後、それらを として参照できますdatamodule.tablefield.AsInteger

または、フィールドを個別のローカル変数に割り当てて、代わりにそれらを監視することもできます):

var
  AField: TField;
  AnotherField: TField;
begin
  AField := dm.TableA.FieldByName('FieldA');
  AnotherField := dm.TableA.FieldByName('FieldB');
  ...
end;

次に、AField.AsInteger代わりに時計をオンにします。これにより、時計の設定が少し速くなります。

(デバッグ以外の目的で、ローカルTField変数を宣言してループの前に設定すると、 を使用してフィールドの定数ルックアップを削除することで、コードをかなり高速化できますFieldByName。)

もう 1 つの可能性は、ループで割り当てるローカル変数を宣言して使用することです。その後、そのローカル変数を監視できます。

var
  FieldAValue: Integer;
  FieldA: TField;
begin
  FieldA := dm.TableA.FieldByName('FieldA');
  while not dm.TableA.Eof do
  begin
    FieldAValue := FieldA.AsInteger;
    // Use FieldAValue here instead of the Field.AsInteger, so the
    // compiler doesn't eliminate it. You can add a watch by right-clicking
    // FieldAValue and choosing Debug->Add watch at cursor or Ctrl+F5.
    TableA.Next;
  end;
end;
于 2013-07-05T00:19:17.207 に答える