die componenten kannst du ja über die forms ermitteln.
die properties ist etwas schwieriger.
du musst dann die Laufzeit-Typinformationen auswerten.
vieleicht kannst du mit dem code unten was anfangen.
der bekommt ein geöffnetes dataset und eine objekt übergeben.
dieses wird dann in die
db kopiert. wichtig ist das du mit {$M+} kompilierst.
Delphi-Quellcode:
Procedure CopyToDataSet(ds: TDataset; obj: TObject);
var
Props: PPropList;
TypeData: PTypeData;
i: Integer;
begin
TypeData := GetTypeData(obj.ClassInfo);
if (TypeData =
nil)
or (TypeData^.PropCount = 0)
then Exit;
GetMem(Props, TypeData^.PropCount * sizeof(Pointer));
try
GetPropInfos(obj.ClassInfo, Props);
for i := 0
to TypeData^.PropCount-1
do
begin
with Props^[i]^
do
begin
case PropType^.Kind
of
tkInteger, tkFloat:
begin
if GetPropValue(obj,
Name, true)<0
then
ds.FieldByName(
Name).Clear
else
ds.FieldByName(
Name).Value:=GetPropValue(obj,
Name, true);
end;
tkEnumeration:
begin
if GetTypeData(PropType^)^.BaseType^ = TypeInfo(Boolean)
then
begin
if Boolean(GetOrdProp(Obj, Props^[i]))
then
ds.FieldByName(
Name).Value:=1
else
ds.FieldByName(
Name).Value:=0;
end else
raise exception.create('
speichern fuer diesen enum nicht implementiert');
end;
else
ds.FieldByName(
Name).Value:=GetPropValue(obj,
Name, true);
end;
end;
end;
finally
FreeMem(Props);
end;
end;