2012-06-20 16 views
17

¿Por qué Memo.Lines utiliza la clase abstracta TStrings? ¿Por qué no usa TStringList en su lugar?¿Por qué memo.Lines utiliza TStrings en lugar de TStringList?

¿Y debería convertirlo a TStringList antes de trabajar con él?

+2

'TMemo.Lines es TStringList = FALSE. De hecho, el objeto real que está detrás de esto es un envoltorio alrededor de la API de Windows. El almacenamiento está organizado por el control EDIT de Windows que implementa 'TMemo'. "¿Debería convertirlo a TStringList antes de trabajar con él?" No. ¿Por qué querrías hacer eso? –

+5

TStrings es un "contrato" menor que permite una mayor flexibilidad para el desarrollador. Puede interactuar con cualquier clase que implemente la clase abstracta TStrings. – Simon

Respuesta

21

TMemo.Lines, TListBox.Items, TComboBox.Items, etc. todos están declarados como TStrings. ¡Cuidado, hablando de la propiedad que es! Los tipos internos creados son TMemoStrings, TListBoxStrings y TComboBoxStrings, respectivamente, que son todos descendientes de TStrings y difieren todos en el modo de almacenamiento.

¿Y por qué? Para intercambiabilidad e interoperabilidad. Así que cada TStrings -descendant tiene las mismas propiedades, y por lo que se puede hacer:

Memo1.Lines := ListBox1.Items; 

Cómo utilizar? Bueno, una propiedad TStrings como TMemo.Lines funciona bien. Puede agregar, eliminar, cambiar, renovar y borrar las cadenas (y objetos) en la propiedad, porque internamente es un TMemoStrings que implementa toda esta interacción. Declaración <> implementación.

Pero si desea un manejo especial, p. como la ordenación que proporciona TStringList, entonces necesita ayuda. No se puede encasillar ni convertir un TMemo.Lines a un TStringList, ya que no es uno, sino que se necesita para crear un objeto intermedio para este proceso especial:

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

Bien gracias, eso tiene sentido. Entonces, supongo, por ejemplo Memo.Lines.Delete (0) funciona porque no usa internamente TStrings? – Illiou

+0

Sí. Cuando colocar un componente memo en su formulario no da como resultado un _abstract compilador error_, supongamos que no hay un objeto abstracto que se está instanciando. ;) – NGLN

+1

Seguramente hay una manera más inteligente de ordenar en el lugar. –

Cuestiones relacionadas