2012-05-02 35 views
17

プロシージャ/ファンクションにファイル名パラメータを渡す場合は、TFilenameまたはStringを使用する必要があります。TFilenameの代わりにStringを使用する必要がありますか?

違いがある場合、それは何ですか、Stringを使用した場合の潜在的な影響は何ですか?

procedure TForm1.OpenFile(const AFilename : String); 
begin 
    //Open the file if it exists 
    ... 
end; 

答えて

20

私はコンポーネントを開発する際にその方法のIDEは、それがプロパティエディタ(プロパティインスペクターの省略記号をクリックしたときTOpenDialogが表示されます)です表示することができますので、TFilenameが使用されるべきだと思います。

これ以外は、基本的にどちらを使用するかは違いありません。 TFilenameを使用する場合は、uses節にSysUtilsを追加する必要があります。

10

プレーンコードのstringTFileNameタイプの唯一の実用的な違いは、参照によって引数を渡すことです。次のコード

procedure GetFileName(var FileName: TFileName); 
begin 
    FileName:= 'abcd.abc'; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    S: string; 

begin 
    GetFileName(S); 
end; 

がエラー

[DCC Error] E2033 Types of actual and formal var parameters must be identical 
2

でコンパイルされません。たぶん、これは少しあまりにも明白ですが、stringタイプを使用すると、変数の使用目的については何も通信しません。しかし、TFileNameと宣言された変数に遭遇したときには、もっと詳細が伝えられています。

同じ原理がIntegerCardinalDoubleなどのような他の基本的なタイプにapplysこれらは、これらのどのような使用目的より明確に通信するよう代わりに、などTCustomerIDTHashValueTInterestRate、同様にこれらのエイリアスを使用して検討する必要があります変数はです。

これは読みやすさを向上させ、必要に応じてタイプを使用してコードに触れることなくベースタイプを変更することができます。ちょうど再コンパイルと完了です(ただし、バイナリ互換性は注意してください) 。

1

あなたは、彼らが代わりにTCustomerID、THashValue、TInterestRate、などのカスタムタイプの多くを使用している場合は、別のコーダからソースコードを追加する必要がある場合はうーん、私の強い好みは、特に大規模なプロジェクトのための理由const AFilename: String; のためでありますInteger、Cardinal、Doubleの場合、上記のE2033を解決するにはたくさんの方法があります。私はAFileName: TFileName;のように定義された変数を持っている場合は、その明らかにそのファイル名&という名前の種類が追加されることはありません

function MatchesMask(const Filename, Mask: string): Boolean; 

さらに:でも

ソースコードに建てられたデルファイはたくさんのように、TFileNameを使用していません実際の変数がどのようなものかを確認するためにクリックする必要があるため、私にはわかりやすいものがあります。

関連する問題