![]() |
Tvalue in unterschieldiche Typen von TRemotableXS wandeln
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 :-D 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:
Die Ausgabe sieht dann aktuell so aus:
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;
Code:
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 :stupid:
name=(TXSString @ 000000000854C700)
Grüße PJM |
AW: Tvalue in unterschieldiche Typen von TRemotableXS wandeln
Delphi-Quellcode:
So funktioniert das für mich und den unteren kleinen Beispielcode.
procedure {TForm.}GetObjectProperties(AObject: TObject; AList: TStrings);
var ctx: TRttiContext; rType: TRttiType; rProp, rProp2: TRttiProperty; rInstance: TRttiInstanceType; 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 if rProp.PropertyType.TypeKind = tkClass then begin rInstance := rProp.PropertyType.AsInstance; AValue := rProp.GetValue(AObject); if AValue.IsInstanceOf(TRemotableXS) then begin sVal := TRemotableXS(AValue.AsObject).NativeToXS; end; end else 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; end; AList.Add(rProp.Name + '=' + sVal); end; end; end; type TMyPropFullClass = class private FSomeString: TXSstring; public constructor Create; property SomeString: TXSstring read FSomeString; end; constructor TMyPropFullClass.Create; begin inherited; FSomeString := TXSstring.Create; FSomeString.XSToNative('Hello World'); end; initialization var MyData: TMyPropFullClass := TMyPropFullClass.Create; var MyList: TStringList := TStringList.Create; GetObjectProperties(MyData, MyList); OutputDebugString(PChar(MyList.Text)); |
AW: Tvalue in unterschieldiche Typen von TRemotableXS wandeln
So funktioniert das auch für mich. :thumb::thumb::thumb:
Besten Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz