Здравствуйте, ky_, Вы писали:
ky_> Как сделать сабж в цикле ? ]
см. system.pas
TypeInfo(trecord)
TTypeInfo = packed record
Kind: Byte;
Name: ShortString;
{TypeData: TTypeData}
end;
TFieldTable = packed record
X: Word;
Size: Cardinal;
Count: Cardinal;
Fields: array [0..0] of TFieldInfo;
end;
TFieldInfo = packed record
TypeInfo: PPTypeInfo;
case Integer of
0: ( Offset: Cardinal );
1: ( _Dummy: NativeUInt );
end;
ky_>подумалось на досуге (если я правильно понял задачу)
ky_>можно в классе TEmployee первым полем сделать массив названий полей а вторым полем массив смещений и смотри себе потом названия полей их значения.
TStringList с детства ненавидишь?
Здравствуйте, ky_, Вы писали:
ky_>To: OlegProv
ky_>[ Есть запись:
ky_> type
ky_> TEmployee = record
ky_> cNo: integer;
ky_> cName: string;
ky_> ...... // еще 20 полей разных типов
ky_> end;
ky_> Как сделать сабж в цикле ? ]
ky_>подумалось на досуге (если я правильно понял задачу)
ky_>можно в классе TEmployee первым полем сделать массив названий полей а вторым полем массив смещений и смотри себе потом названия полей их значения.
Через запись (тип record) не получится, но если использовать class (тип TObject), тогда:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
TestButton: TButton;
procedure TestButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
TypInfo;
type
TEmployee = class
private
FNo: Integer;
FName: AnsiString;
FFlag: Boolean;
published
property No: Integer read FNo write FNo;
property Name: AnsiString read FName write FName;
property Flag: Boolean read FFlag write FFlag;
end;
procedure WriteData(Instance: TObject; const Values: array of Variant);
var
PropCount: Integer;
PropList: PPropList;
Index: Integer;
begin
if not Assigned(Instance) then
raise Exception.Create('WriteData: Invalid Instance param was passed');
PropCount := GetPropList(Instance, PropList);
if PropCount = 0 then
raise Exception.Create('WriteData: Invalid Instance of class ' + Instance.ClassName);
if PropCount <> Length(Values) then
raise Exception.Create('WriteData: Invalid Values list was passed');
for Index := 0 to PropCount - 1 do
SetPropValue(Instance, PropList[Index].Name, Values[Index]);
end;
procedure TForm1.TestButtonClick(Sender: TObject);
var
Employee: TEmployee;
DebugInfo: TStringBuilder;
begin
Employee := TEmployee.Create;
WriteData(Employee, [1, 'Employee 1', True]);
ShowMessage(
TStringBuilder.Create('Debug info:')
.AppendLine('Employee.No = ' + IntToStr(Employee.No))
.AppendLine('Employee.Name = ' + Employee.Name)
.AppendLine('Employee.Flag = ' + BoolToStr(Employee.Flag, True))
.ToString);
end;
end.