2012-05-02 8 views
17

Quando si passano i parametri del nome file alle procedure/funzioni, dovrei usare TFilename o String.Dovrei usare String invece di TFilename?

Se c'è una differenza, che cos'è e quali sono quindi potenziali conseguenze se si utilizza un String?

ad es.

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

risposta

20

Penso TFilename dovrebbero essere utilizzati nello sviluppo di componenti perché in questo modo IDE può mostrare gli editor di proprietà (TOpenDialog verrà mostrato quando si fa clic sul puntini di sospensione nella finestra di ispezione Proprietà).

Oltre a questo non c'è praticamente nessuna differenza da usare. Ricorda che se usi TFilename devi aggiungere SysUtils alla clausola uses.

10

L'unica differenza pratica tra i tipi string e TFileName in un codice semplice è passare un argomento per riferimento; il seguente codice

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

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

begin 
    GetFileName(S); 
end; 

non viene compilato con l'errore

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

Forse questo è un po 'troppo ovvio, ma utilizzando il tipo di string non comunica nulla circa l'utilizzo previsto di una variabile. Ma quando incontri una variabile dichiarata come TFileName, ci sono molti più dettagli comunicati lì.

Lo stesso principio applys ad altri tipi di base come Integer, Cardinal, Double ecc, invece si potrebbe desiderare di considerare l'utilizzo di alias per questi come TCustomerID, THashValue, TInterestRate, ecc come questi comunicano molto più chiaro ciò che l'utilizzo previsto di questi le variabili lo sono.

questo migliora readablility, e permette anche di cambiare la base-tipo, quando necessario, senza dover toccare alcun codice utilizzando il tipo ... solo una ricompilazione e il gioco è fatto (ma fate attenzione con la compatibilità binaria naturalmente) .

1

Hmm, mio ​​forte preferenza è per const AFilename: String; Per la ragione che soprattutto per i progetti più grandi, se mai bisogno di aggiungere il codice sorgente da un altro programmatore, se non ha mai un sacco di tipi personalizzati come TCustomerID, THashValue, TInterestRate, invece di Integer, Cardinal, Double, quindi hai un sacco di E2033 da risolvere.

Anche un sacco di Delphi costruito nel codice sorgente non usa TFileName, come:

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

Inoltre se ho una variabile definita come AFileName: TFileName; allora la sua evidente il suo nome di un file & il tipo di nome non aggiunge qualsiasi leggibilità per me, se mai, in alcuni casi, rende il codice meno leggibile, perché è necessario fare clic per verificare da quale variabile è derivata.