Vielleicht mal als Denkanstoss. Folgendermaßen hab ich es bei mir gelöst:
1. habe ich mir einen Speicherbereich mit
Delphi-Quellcode:
var
Adress: Integer;
MemoryPool: Pointer;
MemoryPool:=GetMemory(20000);
ZeroMemory(memoryPool,20000);
Adress:=Integer(MemoryPool);
angelegt, in dem die zu bearbeitenden Daten abgelegt werden. Das Problem ist, dass die TJvInspectorVarData nur auf Pointer arbeitet. Man kann zwar auch mit einem entsprechenden Data-Objekt auf ein Feld eines Objektes (published) zugreifen, aber das war für meine Problemstellung nicht möglich.
In diesem MemoryPool werden nun hintereinander die Daten abgelegt und passende Data-Objekte erzeugt.
Delphi-Quellcode:
for Dummy:=0 to fRecord.ValueCount-1 do
begin
case fRecord.Values[Dummy].ValueType of
ervtCardinal:
begin
// Data-Objekt erzeugen
NewItem := TJvInspectorVarData.New(JvInspector.Root,fRecord.GetValueProperty(Dummy,'Name'),typeInfo(Cardinal),PCardinal(Adress));
// Wert in MemoryPool übertragen
PCardinal(Adress)^:=fRecord.Values[Dummy].valueCar;
// Zeiger verschieben
inc(Adress,sizeOf(Cardinal));
end;
ervtInteger:
begin
NewItem := TJvInspectorVarData.New(JvInspector.Root,fRecord.GetValueProperty(Dummy,'Name'),typeInfo(Integer),PCardinal(Adress));
PCardinal(Adress)^:=fRecord.Values[Dummy].valueInt;
inc(Adress,sizeOf(Cardinal));
end;
ervtInteger:
begin
NewItem := TJvInspectorVarData.New(JvInspector.Root,fRecord.GetValueProperty(Dummy,'Name'),typeInfo(String),PString(Adress));
PString(Adress)^:=fRecord.Values[Dummy].valueString;
inc(Adress,sizeOf(String));
end;
end;
end;
Am Ende der Bearbeitung musst du natürlich wieder die Werte in die Quelle übertragen. Das sieht dann ähnlich aus:
Delphi-Quellcode:
Adress:=Integer(MemoryPool);
for Dummy:=0 to fRecord.ValueCount-1 do
begin
case fRecord.Values[Dummy].ValueType of
ervtCardinal:
begin
fRecord.SetCardinal(fRecord.Values[Dummy].ValueName,PInteger(Adress)^);
inc(Adress,sizeOf(Cardinal));
end;
ervtInteger:
begin
fRecord.SetInteger(fRecord.Values[Dummy].ValueName,PInteger(Adress)^);
inc(Adress,sizeOf(Integer));
end;
ervtString:
begin
fRecord.SetString(fRecord.Values[Dummy].ValueName,PString(Adress)^);
inc(Adress,sizeOf(String));
end;
end;
Wichtig ist, dass beim übernehmen die gleichen Werte genommen werden, wie beim befüllen des MemoryPools, da es sonst zu ungereimtheiten kommt.
Zugegeben eine ziemliche Frickellösung, aber wie gesagt, funktioniert klaglos. Eventuell kannst du es gebrauchen. Vielleicht gibt es aber für dein Problem eine wesentlich einfachere Lösung.