2013-04-02 14 views
7

Ho appena visto un po 'di codice (D5) dove hanno usato ...Utilizzo di .AsString o .Text?

aStr:=tblAcct.FieldByName('Name').Text; 

Sembra funzionare bene, ma ho sempre usato ...

aStr:=tblAcct.FieldByName('Name').AsString; 

Ho usato sia quando si carica un TMemo e di nuovo non sembra esserci differenza.

aMemo.Lines.Text:=tblAcct.FieldByName('History').Text; 
aMemo.Lines.Text:=tblAcct.FieldByName('History').AsString; 

C'è una ragione per cui dovrei usare l'una sull'altra? Se sì, quale?

in realtà per TMemo, io di solito uso ...

aMemo.Lines.Assign(tblAcct.FieldByName('History')) 

che sembra funzionare troppo fine.

Grazie

risposta

19

La proprietà Text è pensato per essere utilizzato per ottenere la rappresentazione testuale di un campo in fase di modifica in un controllo DataAware, in contrasto con la proprietà DisplayText che ti dà una stringa per rappresentare il valore per l'utente (che può contenere punteggiatura o altro decorazione al valore normale).

Contiene la stringa da visualizzare in un controllo data-sa quando il campo è in modalità di modifica

Un esempio tipico è una TFloatField con la Currency struttura impostata True. Lo DisplayText fornisce una stringa con il numero contenente le virgole (se necessario), il separatore decimale e un simbolo di valuta. La proprietà Text ti fornisce una stringa senza virgole o simbolo di valuta.

begin 
    MyFloatField.Currency := True; 
    MyFloatField.AsFloat := 1234.56; 
    A := MyFloatField.Text; //'1234.56' 
    B := MyFloatField.DisplayText; //'$1,234.56', depends on your locale 
end; 

Entrambe le proprietà di cui sopra possono essere personalizzati a scrivere un gestore di OnGetText evento in cui è possibile scrivere logica personalizzata per convertire il valore a una rappresentazione di stringa. Il parametro DisplayText indica se la stringa desiderata è destinata a rappresentare il valore per la modifica o meno.

D'altra parte, la proprietà AsString utilizza una conversione più semplice tra il tipo di dati di base e la stringa. Ogni discendente di TField implementa il metodo virtuale GetAsString utilizzando le funzioni di RTL per eseguire quella rappresentazione. Seguendo l'esempio TFloatField, questa classe chiama lo FloatToStr() a tale scopo.

Tutto questo detto, la risposta alla tua domanda è: AsString restituisce la stessa stringa come la proprietà Text se non c'è un gestore di eventi OnGetText, ma potrebbe essere diverso se c'è un gestore di eventi o di un discendente TField non standard .

Non riesco a dire cosa è più appropriato per te, perché dipende da quale è l'uso previsto per il valore restituito, ma se lo stai usando per visualizzare i valori per l'utente nell'interfaccia utente (come il tuo codice esempio), ti consiglio di utilizzare la proprietà DisplayText.

+3

+1 Risposta molto completa –

+0

@jachguate Grazie per una risposta molto dettagliata. OK, ora so che c'è una differenza significativa che potrebbe spiegare perché ho avuto un problema con una chiamata Locate che mi ha dato risultati apparentemente errati. Non perché ho fatto la domanda, ma i tuoi dettagli mi riportano al problema di Locate e ripensano a questo approccio. È un vento malato ... – user2175495

+0

Felice di aiutare;) – jachguate

2

AsString contiene il valore di campo come stringa.

Text contiene la stringa da visualizzare in un controllo sensibile ai dati quando il campo è in modalità di modifica.

Quindi nel tuo caso penso che dovresti usare AsString.

+0

Grazie a @Riho, che semplifica un altro problema che stavo avendo, anche non correlato a questa domanda, ma il tuo commento ha chiarito anche le cose. – user2175495