Einzelnen Beitrag anzeigen

Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: Tutorial für JVInspector gesucht

  Alt 20. Apr 2006, 18:54
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat