Agrega un par de elementos: una entrada en la lista TStringList.Strings
, y un TObject
correspondiente en la lista TStringList.Objects
.
Esto le permite, por ejemplo, almacenar una lista de cadenas que proporcionan un nombre para el elemento y un objeto que es la clase que contiene el elemento correspondiente.
type
TPerson=class
FFirstName, FLastName: string;
FDOB: TDateTime;
FID: Integer;
private
function GetDOBAsString: string;
function GetFullName: string;
published
property FirstName: string read FFirstName write FFirstName;
property LastName: string read FLastName write FLastName;
property DOB: TDateTime read FDOB write FDOB;
property DOBString: string read GetDOBAsString;
property FullName: string read GetFullName;
property ID: Integer read FID write FID;
end;
implementation
{TPerson}
function TPerson.GetDOBAsString: string;
begin
Result := 'Unknown';
if FDOB <> 0 then
Result := DateToStr(FDOB);
end;
function TPerson.GetFullName: string;
begin
Result := FFirstName + ' ' + FLastName; // Or FLastName + ', ' + FFirstName
end;
var
PersonList: TStringList;
Person: TPerson;
i: Integer;
begin
PersonList := TStringList.Create;
try
for i := 0 to 9 do
begin
Person := TPerson.Create;
Person.FirstName := 'John';
Person.LastName := Format('Smith-%d', [i]); // Obviously, 'Smith-1' isn't a common last name.
Person.DOB := Date() - RandRange(1500, 3000); // Make up a date of birth
Person.ID := i;
PersonList.AddObject(Person.LastName, Person);
end;
// Find 'Smith-06'
i := PersonList.IndexOf('Smith-06');
if i > -1 then
begin
Person := TPerson(PersonList[i]);
ShowMessage(Format('Full Name: %s, ID: %d, DOB: %s',
[Person.FullName, Person.ID, Person.DOBString]));
end;
finally
for i := 0 to PersonList.Count - 1 do
PersonList.Objects[i].Free;
PersonList.Free;
end;
Esto es claramente un ejemplo artificial, ya que no es algo que realmente encuentre útil. Sin embargo, demuestra el concepto.
Otro uso práctico es para almacenar un valor entero junto con una cadena (por ejemplo, mostrando una lista de artículos en un TComboBox
o TListBox
y una correspondiente ID para su uso en una consulta de base de datos). En este caso, solo tiene que escribir el entero (o cualquier otra cosa que sea SizeOf (Pointer)) en la matriz Objects
.
// Assuming LBox is a TListBox on a form:
while not QryItems.Eof do
begin
LBox.Items.AddObject(QryItem.Fields[0].AsString, TObject(QryItem.Fields[1[.AsInteger));
QryItems.Next;
end;
// User makes selection from LBox
i := LBox.ItemIndex;
if i > -1 then
begin
ID := Integer(LBox.Items.Objects[i]);
QryDetails.ParamByName('ItemID').AsInteger := ID;
// Open query and get info.
end;
En el caso de almacenar las cosas que no sean un verdadero TObject
, que no es necesario para liberar el contenido. Como no son objetos reales, no hay nada que liberar, excepto el TStringList
.
Esto es realmente una reliquia de los antiguos Delphi pre-genéricos. Hoy en día no tiene sentido usar esos mecanismos crudos sin tipo. El 'TList genérico' reemplaza esta técnica. –
@DavidHeffernan es antiguo, pero útil para usuarios sin acceso a las versiones más nuevas de delphi (> = 2009). Además, el OP no especifica la versión de Delphi que está utilizando. – RRUZ
@RRUZ Exactamente.Úselo pregenéricos, pero por favor deténgalo una vez que haya ido más allá. –