AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abgeleitete Klasse korrekt aufrufen

Ein Thema von jsp · begonnen am 24. Okt 2018 · letzter Beitrag vom 24. Okt 2018
Antwort Antwort
Seite 1 von 2  1 2      
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#1

Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:04
Delphi-Version: 10.2 Tokyo
Hallo zusammen,

ich habe folgende Klassen aus einem wsdl-Import:
Delphi-Quellcode:
  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;
Aufrufen tue ich die abgeleiteten Klassen wie folgt:

Delphi-Quellcode:
  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);
Ist der Aufruf korrekt so?

Gruss, Jörn
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:08
Vielleicht ein Softcast statt der harten Variante.

NPK_Application :=(NPK_Chapter as NPKApplication);
Markus Kinzler
  Mit Zitat antworten Zitat
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#3

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:14
Danke Markus

NPK_Application :=(NPK_Chapter as NPKApplication); Der Softcast wirft folgende Fehlermeldung : Inkompatible Typen: 'NPKChapter' und 'NPKApplication'
Ich werde wohl bei der harten Variante bleiben müssen. Die sollte korrekt sein, oder?

Gruss, Jörn
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:23
Wie soll man denn das casten können?

Das funktioniert mit dem harten Cast nur nach dem Prinzip Hoffnung und damit sehr fragil.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:25
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.)
Markus Kinzler
  Mit Zitat antworten Zitat
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#6

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:44
Danke euch beiden!

Und wie wäre die Alternative zum casten?
Fühle mich da nicht so wohl...

Jörn
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:44
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.
  Mit Zitat antworten Zitat
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#8

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 09:53
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:
  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;
Jörn
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 10:23
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 NPK_Chapter := soapPartner.downloadNPK(numberStr, dispLanguage, year); einfügen und ausführen.

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!');
  Mit Zitat antworten Zitat
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#10

AW: Abgeleitete Klasse korrekt aufrufen

  Alt 24. Okt 2018, 11:11
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ü!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz