Перебор полей записи1
От: ky_  
Дата: 02.08.11 11:21
Оценка:
To: OlegProv

[ Есть запись:
type
TEmployee = record
cNo: integer;
cName: string;
...... // еще 20 полей разных типов
end;

Как сделать сабж в цикле ? ]

подумалось на досуге (если я правильно понял задачу)
можно в классе TEmployee первым полем сделать массив названий полей а вторым полем массив смещений и смотри себе потом названия полей их значения.
Re: Перебор полей записи1
От: Oleg A. Bachin Украина  
Дата: 02.08.11 11:33
Оценка:
Здравствуйте, 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 с детства ненавидишь?
Best regards,
Oleg A. Bachin
Re: Перебор полей записи1
От: MicSOFT  
Дата: 02.08.11 14:12
Оценка:
Здравствуйте, 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.
Re: Перебор полей записи1
От: LGB Канада  
Дата: 02.08.11 16:51
Оценка:
Здравствуйте, ky_, Вы писали:

ky_>To: OlegProv


ky_>[ Есть запись:

ky_> type
ky_> TEmployee = record
ky_> cNo: integer;
ky_> cName: string;
ky_> ...... // еще 20 полей разных типов
ky_> end;

ky_> Как сделать сабж в цикле ? ]


ky_>подумалось на досуге (если я правильно понял задачу)

ky_>можно в классе TEmployee первым полем сделать массив названий полей а вторым полем массив смещений и смотри себе потом названия полей их значения.

Если у вас поля разных типов, то чем тогда поможет их перебор в цикле? Все равно придется проверять каждое поле — какого оно типа, для чего оно, и какое значение можно туда положить или оттуда прочитать. Имхо тут что-то с дезигном не так.
Задача вообще в чем состоит?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.