Einzelnen Beitrag anzeigen

fisipjm

Registriert seit: 28. Okt 2013
298 Beiträge
 
#1

Tvalue in unterschieldiche Typen von TRemotableXS wandeln

  Alt 10. Mai 2022, 08:13
Hi,

ich versuche gerade eine über WSDL importierte Klasse dynamisch auszulesen.
Sagen wir ich hab die Klasse und durch die WSDL werden mir 200 Properties erzeugt die ich auslesen kann, ich hab aber 50 verschiedene WSDLs, bin aber schreibfaul deshalb will ich nicht jede einzelne property ausschreiben, sondern über die RTTI dynamisch laden lassen. Würde tasächlich auch schon klappen, wenn die Properties nicht vom Typ TRemotableXS wären (TXSstring, TXSFloat, TXSBoolean....). Ich bekomme aktuell die Pointer als String, hab aber keinen Peil wie ich die Zuweisung richtig machen kann. Folgenden Code hab ich schon. Zugegeben Copy Past aus Stackoverflow, aber ich verstehe was er tut

Delphi-Quellcode:
uses
 ...System.TypInfo, system.Rtti;

procedure TForm5.SpeedButton1Click(Sender: TObject);
var
  I: Word;
  lstringlist: TStringList;
  lExport: TMyPropFullClass;
begin
  ...
  for I := 0 to High(lExport.Data) - 1 do
  begin
    GetObjectProperties(lZeitExport.Data[I], lstringlist)
  end;
  ...
end;


procedure TForm.GetObjectProperties(AObject: TObject; AList: TStrings);
var
  ctx: TRttiContext;
  rType: TRttiType;
  rProp: TRttiProperty;
  AValue: TValue;
  sVal: string;
const
  SKIP_PROP_TYPES = [tkUnknown, tkInterface];
begin
  if not Assigned(AObject) and not Assigned(AList) then
    Exit;

  ctx := TRttiContext.create;
  rType := ctx.GetType(AObject.ClassInfo);
  for rProp in rType.GetProperties do
  begin
    if (rProp.IsReadable) and not(rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then
    begin
      AValue := rProp.GetValue(AObject);
      if AValue.IsEmpty then
      begin
        sVal := 'nil';
      end
      else
      begin
        if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then
          sVal := QuotedStr(AValue.ToString)
        else
          sVal := AValue.ToString;
      end;

      AList.Add(rProp.Name + '=' + sVal);
    end;

  end;
end;
Die Ausgabe sieht dann aktuell so aus:
Code:
name=(TXSString @ 000000000854C700)
Nicht so dolle, ist aber auch klar, weil TValue.ToString ja keinen Plan von meiner TRemotableXS Klasse hat, ich haber aber keine Idee wie ich ihm beibringen soll das es ein TRemotableXS ist. Wie ich einen String in ein TRemotableXS bekomme weis ich, aber das ist ja leider nicht was hier gerade notwendig wäre. Ich bin auch noch relativ neu in der RTTI Thematik, von dem her hoffe ich auf den ein oder anderen Kniff eines alten Hasen

Grüße
PJM
  Mit Zitat antworten Zitat