Dodaje parę elementów: wpis na liście TStringList.Strings
i odpowiadający TObject
na liście TStringList.Objects
.
Pozwala to na przykład na przechowywanie listy łańcuchów, które zawierają nazwę elementu, oraz obiektu będącego klasą zawierającą pasujący element.
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;
Jest to wyraźnie wymyślny przykład, ponieważ nie jest to coś, co naprawdę mogłoby się okazać przydatne. Pokazuje jednak koncepcję.
Innym przydatnym zastosowaniem jest przechowywanie wartości całkowitych wraz z ciągiem znaków (na przykład pokazanie listy pozycji w pliku TComboBox
lub TListBox
i odpowiedniego identyfikatora do użycia w zapytaniu do bazy danych). W tym przypadku musisz tylko wpisać liczbę całkowitą (lub cokolwiek innego, co jest SizeOf (Wskaźnik)) w tablicy 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;
W przypadku przechowywania rzeczy inne niż rzeczywiste TObject
, nie trzeba uwolnić zawartość. Ponieważ nie są prawdziwymi obiektami, nie ma nic do stracenia poza samym sobą.
To jest naprawdę relikt starożytnych pre-generics Delphi. W dzisiejszych czasach nie ma sensu używać tak prymitywnych mechanizmów bezdusznych. Typowa 'TList' zastępuje tę technikę. –
@DavidHeffernan jest starożytny, ale przydatny dla użytkowników bez dostępu do nowszych wersji delphi (> = 2009). Również OP nie określa wersji Delphi, która jest używana. – RRUZ
@RRUZ Dokładnie.Używaj pre-generics, ale zatrzymaj go, kiedy już się wyniesiesz. –