Я пытаюсь найти наиболее эффективный способ обновления сетки (StringGrid или KGrid) из коллекции Delphi/Lazarus FreePascal.
Одна из моих коллекций приведена ниже:
{ TEntretien }
TEntretien = class(TCollectionItem)
private
{ private declarations }
FPrenom: string;
FSexe: string;
FSigneDistinctif: string;
FPays: string;
FTotale: integer;
FColumns: integer;
public
{ public declarations }
published
{ published declarations }
property Prenom: string read FPrenom write FPrenom;
property Sexe: string read FSexe write FSexe;
property SigneDistinctif: string read FSigneDistinctif write FSigneDistinctif;
property Pays: string read FPays write FPays;
property Totale: integer read FTotale write FTotale;
end;
{ TEntretiens }
TEntretiens = class(TCollection)
private
{ private declarations }
function GetItem(AIndex: integer): TEntretien;
public
{ public declarations }
constructor Create;
function Add: TEntretien;
property Items[AIndex: integer]: TEntretien read GetItem; default;
end;
У меня есть следующий фрагмент кода, который я использую для обновления одной из своих сеток:
// Fill the grid with the results of the query
for intGridRow := 0 to intNumberOfRows - 1 do
begin
for intGridCol := 0 to intNumberOfColumns - 1 do
begin
// Write the rest of the retrieved data into the grid proper USE RTTI HERE??
if intGridCol = 0 then
kgGridName.Cells[intGridCol + kgGridName.FixedCols, intGridRow + kgGridName.FixedRows] :=
AEntretiens[intGridRow].Prenom
else if intGridCol = 1 then
kgGridName.Cells[intGridCol + kgGridName.FixedCols, intGridRow + kgGridName.FixedRows] :=
AEntretiens[intGridRow].Sexe
else if intGridCol = 2 then
kgGridName.Cells[intGridCol + kgGridName.FixedCols, intGridRow + kgGridName.FixedRows] :=
AEntretiens[intGridRow].SigneDistinctif
else if intGridCol = 3 then
kgGridName.Cells[intGridCol + kgGridName.FixedCols, intGridRow + kgGridName.FixedRows] :=
AEntretiens[intGridRow].Pays
else if intGridCol = 4 then
kgGridName.Cells[intGridCol + kgGridName.FixedCols, intGridRow + kgGridName.FixedRows] := IntToStr(AEntretiens[intGridRow].Totale)
end;
end;
Это хорошо для коллекций с небольшим количеством полей/свойств, но у меня также есть коллекции до 40 полей, поэтому метод, который я использую выше, слишком громоздкий.
Есть ли более эффективный способ сделать это? Кто-то предложил RTTI, но я не знаю, как его использовать.
Большое спасибо,
JDaniel