2017-03-21 2 views
0

以下の例では、.dfmファイルの行数をカウントしており、.dfmが保存されているためカウントが間違っていますバイナリ形式。すべてのdfmファイルでテキストdfm値をチェックする方法/ .dfmバイナリファイルの行数をカウントする

もし私が.dfmファイルを開いて、右クリックしてテキストdfmをチェックすると、カウントが正しく来ていれば。以下のコード

function TForm1.FindNumberOfLinesInFile(FileName: String): Integer; 
var 
    contents : TStringList; 
    filestream : TFileStream; 
    outStream : TMemoryStream; 
begin 
    try 
    try 
     Result := 0; 
     contents := TStringList.Create; 
     if edtFileToSearch.Text = '.dfm' then 
     begin 
     contents.LoadFromFile(FileName); 
     //i am binary 
     if pos('OBJECT', Uppercase(contents[0])) = 0 then // Count is coming wrong with this 
     begin 
      contents.Clear; 
      fileStream := TFileStream.Create(FileName, fmShareDenyNone); 
      outStream := TMemoryStream.Create; 
      try 
      ObjectResourceToText(filestream,outStream); 
      outStream.Position := 0; 
      Contents.LoadFromStream(outStream); 
      finally 
      FreeAndNil(outStream); 
      end; 
     end 
     else 
     begin 
      fileStream := TFileStream.Create(FileName, fmShareDenyNone); 
      Contents.LoadFromStream(fileStream); 
     end; 
     end 
     else 
     begin 
      fileStream := TFileStream.Create(FileName, fmShareDenyNone); 
      Contents.LoadFromStream(filestream); 
     end; 
     Result := contents.Count; 
    finally 
     FreeAndNil(fileStream); 
     FreeAndNil(contents); 
    end; 
    except 
    on e: Exception do Result := -1; 
    end; 
end; 

は、私は2つの質問

1)すべてのDFMファイル(私は約1000のDFMファイルを持っている)で確認する方法をテキストDFM値を設定することがありますか?

2)バイナリファイルを正しく読み込んで行数をカウントするには?

+1

'Tools - > Environment Options - > Designer'の下にある 'New forms as text'チェックボックスがあります。デフォルトでは新しいフォームがテキスト形式になるようにチェックします。 – ain

答えて

2

デルファイにはコマンドラインツールが付属しています。コマンドプロンプトを開き、DelphiのbinディレクトリがPATHにあることを確認します。次に入力します。

 
Delphi Form Conversion Utility Version 5.0 
Copyright (c) 1995,99 Inprise Corporation 
Usage: convert.exe [-i] [-s] [-t | -b] 
    -i Convert files in-place (output overwrites input) 
    -s Recurse subdirectories 
    -t Convert to text 
    -b Convert to binary 

だから、あなたが書くことができるはずです::

 
C:\projects\myprocject> convert -i -s -t *.dfm 

必要な変化をもたらすために

 
C:\projects\myprocject> convert 

出力は次のようなものになります。

+0

SOの投稿には1つの質問が含まれているため、私はあなたの2つの質問のうち1つに答えることを選択しています。 –

0

デビッドの答えは、あなたの最初の質問に答えます。Delphiで提供されているコマンドラインツールを使用して、既存のバイナリDFMをすべてテキストに変換できます。

あなたの直面する問題に対処するだけでなく、バ​​ージョン管理でDFMファイルの変更を視覚的に相違させることが非常に簡単になるため、これも強くお勧めします。

何らかの理由で、何らかの理由でバイナリDFMファイルをコード内で処理したい、または処理する必要がある場合は、TestStreamFormat()関数を使用して、ストリームが有効なリソースストリームであるかどうかを判断しますObjectResourceToText()は、必要な場合にのみ機能するように、バイナリ形式またはテキスト形式です。供給TStringsは(例えばTStringListの)へ(DFMの)指定されたファイル名の内容を返すように

このヘルパー関数は、このことを実証し、あなたのために物事を単純化するかもしれません:Delphiで

procedure GetDfmIntoStrings(aFilename: String; aStrings: TStrings); 
var 
    istrm, ostrm: TStream; 
begin 
    ostrm := NIL; 
    istrm := TFileStream.Create(aFilename, fmOpenRead or fmShareDenyNone); 
    try 
    case TestStreamFormat(istrm) of 

     sofBinary : begin 
        ostrm := TStringStream.Create(''); 
        ObjectResourceToText(istrm, ostrm) 
        end; 

     sofText : ostrm := istrm; 

    else 
     raise EFilerError.Create(aFilename + ' is not a valid resource stream (DFM)'); 
    end; 

    ostrm.Position := 0; 
    aStrings.LoadFromStream(ostrm); 

    finally 
    if ostrm <> istrm then 
     ostrm.Free; 

    istrm.Free; 
    end; 
end; 
関連する問題