Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Abgeleitete Klasse korrekt aufrufen (https://www.delphipraxis.net/198319-abgeleitete-klasse-korrekt-aufrufen.html)

jsp 24. Okt 2018 08:04

Delphi-Version: 10.2 Tokyo

Abgeleitete Klasse korrekt aufrufen
 
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

mkinzler 24. Okt 2018 08:08

AW: Abgeleitete Klasse korrekt aufrufen
 
Vielleicht ein Softcast statt der harten Variante.

Delphi-Quellcode:
NPK_Application :=(NPK_Chapter as NPKApplication);

jsp 24. Okt 2018 08:14

AW: Abgeleitete Klasse korrekt aufrufen
 
Danke Markus

Delphi-Quellcode:
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

Schokohase 24. Okt 2018 08:23

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.

mkinzler 24. Okt 2018 08:25

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.)

jsp 24. Okt 2018 08:44

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

TiGü 24. Okt 2018 08:44

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.

jsp 24. Okt 2018 08:53

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:
  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

TiGü 24. Okt 2018 09:23

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:
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!');

jsp 24. Okt 2018 10:11

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 05:35 Uhr.
Seite 1 von 2  1 2      

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