![]() |
Delphi-Version: 10.2 Tokyo
Abgeleitete Klasse korrekt aufrufen
Hallo zusammen,
ich habe folgende Klassen aus einem wsdl-Import:
Delphi-Quellcode:
Aufrufen tue ich die abgeleiteten Klassen wie folgt:
NPKChapter = class(TRemotable)
private Fnumber: string; Fnumber_Specified: boolean; Ftitle: string; Ftitle_Specified: boolean; FreleaseYear: Integer; Fversion: Integer; Flanguage: TLanguage; Fstand: Integer; FsubNodes: ArrayOfNPKNode; FsubNodes_Specified: boolean; Fapplication_: ArrayOfNPKApplication; Fapplication__Specified: boolean; procedure Setnumber(Index: Integer; const Astring: string); function number_Specified(Index: Integer): boolean; procedure Settitle(Index: Integer; const Astring: string); function title_Specified(Index: Integer): boolean; procedure SetsubNodes(Index: Integer; const AArrayOfNPKNode: ArrayOfNPKNode); function subNodes_Specified(Index: Integer): boolean; procedure Setapplication_(Index: Integer; const AArrayOfNPKApplication: ArrayOfNPKApplication); function application__Specified(Index: Integer): boolean; public destructor Destroy; override; published property number: string Index (IS_OPTN) read Fnumber write Setnumber stored number_Specified; property title: string Index (IS_OPTN) read Ftitle write Settitle stored title_Specified; property releaseYear: Integer read FreleaseYear write FreleaseYear; property version: Integer read Fversion write Fversion; property language: TLanguage read Flanguage write Flanguage; property stand: Integer read Fstand write Fstand; property subNodes: ArrayOfNPKNode Index (IS_OPTN) read FsubNodes write SetsubNodes stored subNodes_Specified; property application_: ArrayOfNPKApplication Index (IS_OPTN) read Fapplication_ write Setapplication_ stored application__Specified; end; NPKApplication = class(TRemotable) private Fnumber: string; Fnumber_Specified: boolean; Fdescription: string; Fdescription_Specified: boolean; FcontractRelevant: Boolean; procedure Setnumber(Index: Integer; const Astring: string); function number_Specified(Index: Integer): boolean; procedure Setdescription(Index: Integer; const Astring: string); function description_Specified(Index: Integer): boolean; published property number: string Index (IS_OPTN) read Fnumber write Setnumber stored number_Specified; property description: string Index (IS_OPTN) read Fdescription write Setdescription stored description_Specified; property contractRelevant: Boolean read FcontractRelevant write FcontractRelevant; end; NPKApplicationTitle = class(NPKApplication) private FsubNodes: ArrayOfNPKApplication; FsubNodes_Specified: boolean; procedure SetsubNodes(Index: Integer; const AArrayOfNPKApplication: ArrayOfNPKApplication); function subNodes_Specified(Index: Integer): boolean; public destructor Destroy; override; published property subNodes: ArrayOfNPKApplication Index (IS_OPTN) read FsubNodes write SetsubNodes stored subNodes_Specified; end;
Delphi-Quellcode:
Ist der Aufruf korrekt so?
NPK_Chapter := NPKChapter.Create;
NPK_ApplicationTitle := NPKApplicationTitle.Create; NPK_Application := NPKApplication.Create; // funktioniert wie erwartet NPK_Chapter := soapPartner.downloadNPK(numberStr, dispLanguage, year); // hier bin ich mir nicht sicher, ob ich die abgeleteten Klassen korrekt aufrufe NPK_Application := NPKApplication(NPK_Chapter); NPK_ApplicationTitle := NPKApplicationTitle(NPK_Application); Gruss, Jörn |
AW: Abgeleitete Klasse korrekt aufrufen
Vielleicht ein Softcast statt der harten Variante.
Delphi-Quellcode:
NPK_Application :=(NPK_Chapter as NPKApplication);
|
AW: Abgeleitete Klasse korrekt aufrufen
Danke Markus
Delphi-Quellcode:
Der Softcast wirft folgende Fehlermeldung : Inkompatible Typen: 'NPKChapter' und 'NPKApplication'
NPK_Application :=(NPK_Chapter as NPKApplication);
Ich werde wohl bei der harten Variante bleiben müssen. Die sollte korrekt sein, oder? Gruss, Jörn |
AW: Abgeleitete Klasse korrekt aufrufen
Wie soll man denn das casten können?
Das funktioniert mit dem harten Cast nur nach dem Prinzip Hoffnung und damit sehr fragil. |
AW: Abgeleitete Klasse korrekt aufrufen
Eher nicht. Das bedeutet ja, dass diese beiden Typen nicht kompatibel sind.
Kann gut gehen; aber auch gehörig in die Hose. (und das ohne, dass man es merkt bzw. der Fehler an einer anderen Stelle auftritt.) |
AW: Abgeleitete Klasse korrekt aufrufen
Danke euch beiden!
Und wie wäre die Alternative zum casten? Fühle mich da nicht so wohl... Jörn |
AW: Abgeleitete Klasse korrekt aufrufen
Die Interface-Definition von soapPartner wäre noch interessant.
Auf jeden Fall ist das rumgecaste auf mehreren Ebenen falsch. Bitte so nicht machen. Das was du suchst, wir sich in den Array von NPK_Chapter.application_ verbergen. |
AW: Abgeleitete Klasse korrekt aufrufen
Danke TiGü
genau mit diesem array habe ich so meine Probleme. Obwohl subNodes da sein müssten, bekomme ich nur die root Nodes. Hier die Defintion von soapPartner:
Delphi-Quellcode:
Jörn
PartnerService17Soap = interface(IInvokable)
['{7E324DAE-629F-EDF0-B873-02F937215139}'] function loginWithLicenceUnlockInfo(const licenceUnlockInfo: string; const signature: string): Integer; stdcall; procedure logout; stdcall; procedure keepAlive; stdcall; function getBKPVersions(const language: TLanguage): ArrayOfInt; stdcall; function downloadBKP(const language: TLanguage; const year: Integer): BKPStructure; stdcall; function getSKPVersions(const language: TLanguage): ArrayOfInt; stdcall; function downloadSKP(const language: TLanguage; const year: Integer): BKPStructure; stdcall; function getMKPVersions(const language: TLanguage): ArrayOfInt; stdcall; function downloadMKP(const language: TLanguage; const year: Integer): BKPStructure; stdcall; function getEBKPVersions(const structureType: Integer; const language: TLanguage): ArrayOfInt; stdcall; function downloadEBKP(const structureType: Integer; const language: TLanguage; const year: Integer): eBKP_Structure; stdcall; function getEKGVersions(const language: TLanguage): ArrayOfInt; stdcall; function downloadEKG(const language: TLanguage; const year: Integer): EKGStructure; stdcall; function getNPKVersionYears: ArrayOfInt; stdcall; function getNPKChapters(const displayLanguage: TLanguage): ArrayOfNPKChapterShort; stdcall; function getNPKChaptersForYear(const displayLanguage: TLanguage; const year: Integer): ArrayOfNPKChapterShort; stdcall; function getNPKVersions(const chapter: string; const language: TLanguage): ArrayOfNPKVersion; stdcall; function downloadNPK(const chapter: string; const language: TLanguage; const year: Integer): NPKChapter; stdcall; function downloadDrawing(const drawingIDs: ArrayOfString): ArrayOfDrawing; stdcall; function downloadNPKGliederung(const language: TLanguage; const year: Integer): NPKGliederungStructure; stdcall; function getEAVersions(const language: TLanguage): ArrayOfInt; stdcall; function getElementArtenByNPK(const npkChapter: string; const language: TLanguage; const year: Integer): ArrayOfEA_ElementArtInfo; stdcall; function getElementArtenByBKP(const eBKPnumber: string; const language: TLanguage; const year: Integer): ArrayOfEA_ElementArtInfo; stdcall; function getElementArtenByEAG(const eBKPnumber: string; const language: TLanguage; const year: Integer): ArrayOfEA_EAGNode; stdcall; function getElementArt(const id: string; const language: TLanguage; const year: Integer): EA_ElementArt; stdcall; function getMultipleElementArt(const ids: ArrayOfString; const language: TLanguage; const year: Integer): ArrayOfEA_ElementArt; stdcall; function getAllFileNames(const language: TLanguage; const year: Integer): ArrayOfString; stdcall; function downloadFile(const filename: string; const language: TLanguage; const year: Integer): TByteDynArray; stdcall; function downloadAllFiles(const language: TLanguage; const year: Integer): ArrayOfCRBFile; stdcall; function getUnitsOfMeasure(const language: TLanguage; const year: Integer): ArrayOfUnitOfMeasure; stdcall; end; function GetPartnerService17Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): PartnerService17Soap; |
AW: Abgeleitete Klasse korrekt aufrufen
Deine Fragen und Anforderungen sind unspezifisch und unklar.
Hast du zuvor schon mit SOAP und importieren WSDLs und daraus generierten Quelltext gearbeitet? Es gibt doch sicher dazu eine offizielle Dokumentation? Bitte mal folgendes nach
Delphi-Quellcode:
einfügen und ausführen.
NPK_Chapter := soapPartner.downloadNPK(numberStr, dispLanguage, year);
Delphi-Quellcode:
if Length(NPK_Chapter.application_) > 0 then
begin ShowMessage('Es gibt: ' + IntToStr(Length(NPK_Chapter.application_)) + ' Applications-Elemente.'); ShowMessage('Erstes Element: ' + sLineBreak + NPK_Chapter.application_[0].number + ' - ' + NPK_Chapter.application_[0].description); end else ShowMessage('Dann gibt es halt kein application_-Array für deine Eingangsparameter!'); if Length(NPK_Chapter.subNodes) > 0 then begin // Hier irgendwas sinnvolles ausgeben lassen, was die Klasse NPKNode so an Properties hat, können wir ja nicht sehen! //ShowMessage(NPK_Chapter.subNodes[0].number + ' ' + NPK_Chapter.subNodes[0].description); end else ShowMessage('Dann gibt es halt keine subNodes-Array für deine Eingangsparameter!'); |
AW: Abgeleitete Klasse korrekt aufrufen
Ja, ich habe schon einiges mit dem importierten WSDL mit anderen erfolgreich gemacht.
Auch mit subNodes und deren subNodes etc Was mich verwirrt hat, ist, dass jeweils nur in NPK_Chapter.application_[0] Werte drin sind. Das mit subNodes und NPK_Application muss ich halt rausfinden. Es ging mir in erster Linie darum, ob mein Casting so in Ordnung ist. Dies scheint zu funktionieren. Einen anderen Weg sehe ich im Moment nicht. Danke erst mal für deine Hilfe TiGü! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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 by Thomas Breitkreuz