17

プロシージャ/関数にファイル名パラメータを渡すとき、TFilenameまたはString.

違いがある場合、それは何Stringですか?

例えば

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

4 に答える 4

20

TFilenameIDE がプロパティ エディタを表示できるため、コンポーネントを開発するときに使用する必要があると思います(プロパティ インスペクタで省略記号をクリックすると、TOpenDialog が表示されます)。

これ以外は基本的にどちらを使っても違いはありません。使用する場合は、uses 句にTFilename追加する必要があることに注意してください。SysUtils

于 2012-05-02T14:57:58.880 に答える
10

単純なコードでのstringとの型の唯一の実質的な違いは、引数を参照渡しすることです。TFileName次のコード

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
于 2012-05-02T15:22:35.233 に答える
2

これは少し明白すぎるかもしれませんが、string型を使用しても、変数の使用目的については何も伝えられません。しかし、 として宣言された変数に遭遇すると、TFileNameより多くの詳細がすぐに伝達されます。

同じ原則が 、 などの他の基本型にも適用されます。代わりに、 、 、 などのエイリアスを使用することを検討することをお勧めします。これらIntegerCardinal変数の使用目的がより明確になるからです。DoubleTCustomerIDTHashValueTInterestRate

これにより可読性が向上し、必要に応じてベースタイプを変更することもできます。タイプを使用するコードに触れる必要はありません...再コンパイルするだけで完了です(ただし、もちろんバイナリ互換性には注意してください)。

于 2012-05-07T09:41:48.457 に答える
1

うーん、私の強い好みは、const AFilename: String; 特に大規模なプロジェクトで、別のコーダーからソース コードを追加する必要がある場合、Integer、Cardinal、Double の代わりに TCustomerID、THashValue、TInterestRate などの多くのカスタム タイプを使用している場合です。の場合、上記の E2033 を解決する必要があります。

ソース コードに組み込まれている多くの Delphi でさえ、次のように TFileName を使用しません。

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

さらに、そのようAFileName: TFileName;に定義された変数がある場合、そのファイル名は明らかであり、名前付きの型は読みやすさを追加しません。場合によっては、クリックして実際の変数を確認する必要があるため、コードが読みにくくなりますに由来する。

于 2014-07-13T16:15:13.967 に答える