2012-05-02 12 views
17

Podczas przekazywania parametrów pliku do procedur/funkcji, należy użyć TFilename lub String.Czy powinienem używać String zamiast nazwy TFilename?

Jeśli istnieje różnica, co to jest i jakie są potencjalne konsekwencje w przypadku korzystania z String?

np.

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

Odpowiedz

20

myślę TFilename powinny być stosowane przy opracowywaniu elementów, ponieważ w ten sposób można pokazać IDE to edytor nieruchomość (pojawi się po kliknięciu na TOpenDialog elipsy w Inspektorze właściwości).

Poza tym zasadniczo nie ma różnicy, której użyć. Pamiętaj, że jeśli używasz TFilename, musisz dodać SysUtils do swojej klauzuli uses.

10

Jedyna praktyczna różnica między typami string i TFileName w zwykłym kodzie polega na przekazywaniu argumentów przez odwołanie; następujący kod

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

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

begin 
    GetFileName(S); 
end; 

nie kompiluje się z powodu błędu

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

Może to trochę zbyt oczywiste, ale przy użyciu typu string nie wie nic o zamierzonym wykorzystaniu zmiennej komunikować. Ale gdy napotkasz zmienną zadeklarowaną jako TFileName, przekazujemy o wiele więcej szczegółów.

Ta sama zasada applys do innych podstawowych typów jak Integer, Cardinal, Double itp Zamiast tego warto rozważyć użycie aliasów dla nich jak TCustomerID, THashValue, TInterestRate itd gdyż komunikować znacznie jaśniejsze, co zamierzone korzystanie z nich zmienne to.

Poprawia to czytelność, a także pozwala na zmianę typu bazowego w razie potrzeby, bez konieczności dotykania dowolnego kodu za pomocą typu ... po prostu przekompiluj i gotowe (ale bądź ostrożny z binarną zgodnością oczywiście) .

1

Hmm, Moja silna preferencja jest dla const AFilename: String; z tego powodu, że zwłaszcza w przypadku większych projektów, jeśli kiedykolwiek trzeba dodać kod źródłowy z innego kodera, jeśli mają one wykorzystywane wiele niestandardowych typów jak TCustomerID, THashValue, TInterestRate, zamiast Integer, Cardinal, Double, to masz dużo wyżej wspomnianego E2033 do rozwiązania.

Nawet wiele Delphi budowane w kodzie źródłowym nie używa TFileName, jak:

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

Ponadto jeśli mam zmienna zdefiniowana jak AFileName: TFileName; następnie jego oczywiste, jego nazwa pliku & nazwany typ nie dodaje wszelka czytelność dla mnie, jeśli cokolwiek w niektórych przypadkach powoduje, że kod jest mniej czytelny, ponieważ trzeba kliknąć, aby sprawdzić, z której rzeczywistej zmiennej pochodzi.

Powiązane problemy