9

ドキュメントと詳細な調査のために、多くのプロジェクトのすべての DFM ファイルで「文字列の抽出」を実行して、すべての SQL ステートメントを見つけたいと考えています。これを実行できるコマンド ライン ツールはありますか? DFM ファイルはすべてテキスト形式です。

4

5 に答える 5

3

使用しているクエリ コンポーネントの種類によっては、プロジェクト フォルダーでコマンドライン grep (またはその他のテキスト検索ツール) を使用してこれを実行できると思います。DFM では、通常の TQuery に似たコンポーネントの場合、次のようなものがあります。

   SQL.Strings=( 'select * from mytable' )

またはおそらく(チェックするDelphiがありません。家にいる喜びです!)

   SQL.Text=( 'select * from mytable' )

これらの文字列が DFM 内の複数の「行」にどのように広がるかを考えると、チェックする必要があるいくつかのバリエーションがどのように存在するかを考えると、個人的にはこれを行うために Delphi の小さな部分を書きます。

基本的な考え方は次のとおりです。特定のディレクトリ内のすべてのファイル/サブフォルダーを反復処理し、すべての DFM ファイルを探し、それぞれについて、それを TStringList に読み込み、関心のある TQuery (など) SQL プロパティのいずれかをチェックし、結果 (コンポーネント名、ファイル名、実際の SQL 文字列) を結果ファイルに出力します。実際には、せいぜい 1 時間か 2 時間以上の作業ではないはずです。

TQuery タイプのコンポーネント以外のものを使用して呼び出すストアド プロシージャがある場合は、最初に DFM の内部を覗いて、SQL がどのように表示されるかを確認する必要があります。それはおそらくの線に沿っているでしょう

   CommandText=( 'exec mysproc :id, :value' )

編集: コメントでの議論に続いて、これは私の DFM の 1 つからのサンプルです。

    (その他の物件)
    SQL.文字列 = (
      'SELECT D.*, '
      「C.DESCRIPTION AS CLASS_DESCRIPTION、」
      「C.CHQ_NUM_THRESHOLD AS CLASS_CHQ_NUM_THRESHOLD」
      「C.CREDIT_LIMIT AS CLASS_CREDIT_LIMIT」
      「A.REF AS ACCOUNT_REF」
      「A.SORT_CODE AS ACCOUNT_SORT_CODE」
      「A.ACCOUNT_NUMBER AS ACCOUNT_ACCOUNT_NUMBER」
      「A.PREFERRED_ACCOUNT AS ACCOUNT_PREFERRED_ACCOUNT」
      'から '
      「DRAWER_ACCOUNTS A LEFT JOIN DRAWERS D」
      'ON D.REF=A.DRAWER_REF'
      「LEFT JOIN REF_DRAWER_CLASSES C」
      「ON D.DRAWER_CLASS = C.CLASS_ID」
      'WHERE A.SORT_CODE=:PSORT AND A.ACCOUNT_NUMBER=:PACC')
    (その他の物件)

したがって、私が本当に必要とするのは、SQL.Strings = (ビットを見つけて、行の残りと後続のすべての行を読み取り、先頭と末尾の を削除して'、終了する行に到達するまで')'です。各行の引用符内に興味深い SQL (およびコメント) が含まれていたとしても、実際には関係ありません。興味のある各行を読み、各行の最初と最後の引用の間のテキストを切り取ります。Delphiがこれを他の方法でストリーミングする方法がわからないため、これは機能する必要があります.文字列の内容を「読み取る」ことはできません-文字列リストが(おそらく)行と各行に分割されていることに基づいて動作しているだけですDFM では開始と終了で区切られます'であり、文字列リストの内容自体全体が 1 対の括弧内に含まれています。

それは理にかなっていますか、それともまだ何か不足していますか? :-)

于 2010-03-25T07:06:46.970 に答える
1

私は独自の DFM パーサーを作成し、RAD Studio と私が働いている会社の両方からの 600 個のソース ファイルでテストしました。パーサーは Go で書かれています。

https://github.com/gonutz/dfm

これを使用して DFM ファイルを解析し、メモリ内オブジェクトを再帰的に検査して、dfm.String 型のプロパティを探すことができます。

于 2020-06-21T18:30:44.077 に答える
0

DFMは基本的にname=value形式であるため、tStringlistにロードしてから、各行をループして、関心のある特定のプロパティ名を探すことができます。

var
  slDfm : tStringList;
  Item : String;
  ix : integer;
begin
  slDFM := tStringlist.create;
  try
    slDFM.LoadFromFile( filename );
    for ix := 0 to slDfm.Count-1 do
      begin
        slDfm.Strings[ix] := Trim(slDfm.Strings[ix]);
        if SameText(Trim(slDfm.Names[ix]),'CommandText') then
          memo1.Lines.Add('"'+Trim(slDfm.ValueFromIndex[ix])+'"');
      end;
  finally
    slDFM.free;
  end;
end;
于 2010-03-25T16:29:49.613 に答える
0

答えてくれてありがとう!私が試みる別の解決策は、「GNU Gettext for Delphi and C++ Builder」に含まれる「文字列の抽出」ツールです。

.po ファイルには、すべてのコンポーネント テキストだけでなく、すべてのリソース文字列 (SQL コマンドが保存される別の場所) も含まれ、オリジン (どの pas または dfm ファイル、どのコンポーネント プロパティ名) への参照も完備されています。 name=value" リストが既にあります。

.po ファイルを使用すると、.pas ファイルからすべての SQL.Text と、すべてのファイル内の「SQL_...」などの名前を持つすべてのリソース文字列を簡単に整理できます。

于 2010-03-26T17:19:33.017 に答える