2012-06-20 7 views
17

Perché Memo.Lines utilizza la classe astratta TStrings? Perché non usa TStringList invece?Perché memo.Lines usa TStrings invece di TStringList?

E dovrei convertirlo in TStringList prima di utilizzarlo?

+2

'TMemo.Lines è TStringList = FALSE. In effetti, l'oggetto reale dietro a questo è un wrapper attorno all'API di Windows. L'archiviazione è organizzata dal controllo EDIT di Windows che implementa 'TMemo'. "Devo convertirlo in TStringList prima di utilizzarlo?" No. Perché vorresti farlo? –

+5

TStrings è un "contratto" minore che consente una maggiore flessibilità per lo sviluppatore. È possibile interagire con qualsiasi classe che implementa la classe astratta TStrings. – Simon

risposta

21

TMemo.Lines, TListBox.Items, TComboBox.Items, ecc .; tutti sono dichiarati come TStrings. Attenzione, parlando della proprietà che è! I tipi creati internamente sono TMemoStrings, TListBoxStrings e TComboBoxStrings rispettivamente, che sono tutti discendenti di TStrings e differiscono tutti in modo di archiviazione.

E perché? Per intercambiabilità e interoperabilità. Così ogni TStrings -descendant ha le stesse proprietà, e così si può fare:

Memo1.Lines := ListBox1.Items; 

Come usare? Bene, una proprietà TStrings come TMemo.Lines funziona bene. È possibile aggiungere, eliminare, modificare, rinnovare e cancellare le stringhe (e gli oggetti) sulla proprietà, perché internamente è un TMemoStrings che implementa tutta questa interazione. Dichiarazione <> implementazione.

Ma quando si desidera un trattamento speciale, ad es. come ordinare che fornisce TStringList, quindi hai bisogno di aiuto. Non si può typecast né convertire un TMemo.Lines ad un TStringList, perché non è uno, ma invece è necessario creare un oggetto intermedio per questa elaborazione speciale:

var 
    Temp: TStringList; 
begin 
    Temp := TStringList.Create; 
    try 
    Temp.Assign(Memo1.Lines); 
    Temp.Sort; 
    Memo1.Lines.Assign(Temp); 
    finally 
    Temp.Free; 
    end; 
end; 
+1

Ok, grazie, ha senso. Quindi immagino per es. Memo.Lines.Delete (0) funziona perché non utilizza internamente TStrings? – Illiou

+0

Sì. Quando si rilascia un componente memo nel modulo, non si verifica un errore del compilatore _abstract, supponiamo quindi che non sia stato creato un oggetto astratto. ;) – NGLN

+1

Sicuramente c'è un modo semplice per ordinare sul posto. –