2010-04-24 9 views
6

La pregunta más o menos lo dice todo. Dada la siguiente estructura de registro:¿Debo asignar y liberar registros cuando uso TList <T> en Delphi?

type 
    TPerson = record 
     Name: string; 
     Age: Integer; 
    end; 
    PPerson = ^TPerson; 
    TPersonList = TList<TPerson>; 

¿Es válido el siguiente código?

procedure ReadPeople(DataSet: TDataSet; PersonList: TPersonList); 
begin 
    PersonList.Count := DataSet.RecordCount; 
    if DataSet.RecordCount = 0 then 
     Exit; 

    DataSet.First; 
    while not DataSet.Eof do begin 
     PersonList[DataSet.RecNo].Name := DataSet.FieldByName('Name').AsString; 
     PersonList[DataSet.RecNo].Age := DataSet.FieldByName('Age').AsInteger; 
     DataSet.Next; 
    end; 
end; 

¿Tengo que usar GetMem/FreeMem a asignar y liberar registra una instancia de TPersonList, o soy libre para acceder directamente a las entradas directamente TPersonList? Mi intuición dice que el código debería ser válido, aunque no estoy seguro de si hay arrugas relacionadas con la inicialización o finalización del registro.

Respuesta

10

Su código está bien. Cuando utiliza Tlist<T> con registros, los trata como tipos de valor, para copiarlos. No es necesario asignar punteros para ellos.

+0

Impresionante. ¡Gracias! Ahora debo decidir si los registros o las clases tendrían más sentido para mis objetos comerciales. – afrazier

1

La pregunta es: ¿Por qué declaras PPerson? Asegúrese de no accidentalmente desasignar la memoria de un TRecord de su lista a la que estaba apuntando en una variable PPerson.

+0

Es un viejo hábito malo más que cualquier otra cosa. – afrazier

Cuestiones relacionadas