Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   WSDL Dynamische Arrays als Property und Setlength ??? (https://www.delphipraxis.net/173399-wsdl-dynamische-arrays-als-property-und-setlength.html)

4dk2 22. Feb 2013 10:22

WSDL Dynamische Arrays als Property und Setlength ???
 
Hi Leute,
habe nen problem beim WSDL Importieren,
Un zwar schmeisst der sowas raus, wie das auf der wiki von emba
http://docwiki.embarcadero.com/RADSt...DL-Option_-Or-

also:
Code:
type aerie = array of string;

type
  raptorInfo = class //class(TRemotable)
  private
    FHawks: aerie;
  published
    property Hawks: aerie read FHawks write FHawks;
  end;
Das problem ist wenn man jetzt was dem Array Hawks zuweisen will geht das ja nicht, weil
es ja ein Property vom typ array ist und nicht z.b. sowas:
Code:
property Hawks[Index: Integer]: string read GetAerieStr write SetAerieStr;
Das heisst ich kann mit dem Teil aus dem emba Beispiel kann doch auch garnix anfangen,
das gleiche wie bei meinem WSDL...

Weil:

Code:
procedure TFMain.Button2Click(Sender: TObject);
var r:raptorInfo;
begin
  r:=raptorInfo.Create;
  try
    //SetLength(r.Hawks,1); //= [dcc32 Fehler] uFMain.pas(198): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
    r.Hawks[0]:='asd'; //= Exception, da die länge von Hawks = 0, ist ja nirgengs die länge gesetzt worden
  finally
    r.Free;
  end;

end;
Wie kann man auf array properties zugreifen, OHNE die Klasse zu verändern?
Ich weiss ich könnte ja die implementierung mit Getter, Setter für das Array anlegen,
aber da das nen bisl kompliziertere WSDL files sind, und evlt nochn paar mal verändert werden
will ich nix an dem WSDL import ändern, sondern möglichst alles nur duch ableiten usw.
Leider Kann man mit dem Class Helper (ich benutz xe3..) nicht auf private Felder zugreifen :(

Irgendeine Idee?

Bernhard Geyer 22. Feb 2013 10:26

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Du solltest deine Delphi-Version angeben
An WSDL/SOAP-Support wurde zwischen diversen Versionen einiges geändert so das hier die genaue Delphi-Version hilfreich wäre.

4dk2 22. Feb 2013 10:34

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Jo hast recht, sorry :) XE3 update 2

Blup 22. Feb 2013 15:48

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Also im Prinzip funktioniert es wie es soll:
Delphi-Quellcode:
procedure TFMain.Button2Click(Sender: TObject);
var
  r: raptorInfo;
  h: aerie;
begin
  r := raptorInfo.Create;
  try
    h := r.Hawks;
    SetLength(h, 1);
    h[0] := 'asd';
    r.Hawks := h;
  finally
    r.Free;
  end;
end;
Ist halt nicht wirklich schön so.

4dk2 27. Feb 2013 07:20

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Danke @Blup

Habe auch noch eine möglichkeit gefunden:
Code:
type raptorInfoHelper = class helper for raptorInfo
  published

    procedure AddEntry; inline;
end;

implementation

procedure raptorInfoHelper.AddEntry;
var a:^aerie;
begin
   a:=addr(self.FHawks);
   setlength(a^,1);
end;
//--------------------------

procedure TFMain.Button2Click(Sender: TObject);
var r:raptorInfo;
begin
  r:=raptorInfo.Create;
  try
    r.AddEntry;
    r.Hawks[0]:='asd';
  finally
    r.Free;
  end;

end;
auch nicht schön aber geht :)

und dann die schönere :
Die hatte erst nen Fehler ausgelöst...
Code:
procedure raptorInfoHelper.AddEntry2;
begin
   setlength(self.FHawks,1);
end;

Furtbichler 27. Feb 2013 07:31

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Du brauchst nur ein Element im Array?
Wieso dann nicht so:

Delphi-Quellcode:
type raptorInfoHelper = class helper for raptorInfo
   published
     procedure SetEntry (aHawk : String); inline;
 end;

 implementation

 procedure raptorInfoHelper.SetEntry (aHawk : String);
 var a: ^aerie;
 begin
    a:= addr(self.FHawks);
    setlength(a,1);
    a^[0] := aHawk;
 end;
 //--------------------------

 procedure TFMain.Button2Click(Sender: TObject);
 var r:raptorInfo;
 begin
   r:=raptorInfo.Create;
   try
     r.SetHawk('asdf');
   finally
     r.Free;
   end;
 end;
Dann ist die Logik komplett da, wo sie hingehört und kann von vielen Stellen aus so aufgerufen werden. Letzte Frage wäre aber, ob die Gegenstelle das auch so versteht. Tut sie das?

4dk2 22. Mär 2013 08:50

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Zitat:

Zitat von Furtbichler (Beitrag 1205241)
Letzte Frage wäre aber, ob die Gegenstelle das auch so versteht. Tut sie das?

Ja tut Sie.

Delphi-Quellcode:
type raptorInfoHelper = class helper for raptorInfo
  published

    procedure AddEntry;
end;

implementation

procedure raptorInfoHelper.AddEntry;
begin
 
   setlength(self.FHawks,length(self.FHawks)+1);
end;
Geht jetzt kommischerweise auch. Einfach mal den Syntax Highlighter ignorieren...
Schade das Emba, das nicht automatisch in die WSDL importierte Code Datei einbaut.
Bei den Classhelpern sollte man scheinbar sehr vorsichtig sein.
Teilweise nicht Debugbar / oder wirft mit lustigen Exceptions um sich, und hat man einen Fehler aus versehen eingebaut kanns mal wieder später werden...

Dogenik 11. Apr 2013 14:26

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Hallo Ihr,
ich habe im Prinzip das gleiche Problem wie der Threadersteller, komme aber mit den geposteten Lösungen hier nicht zum Ziel. Durch die Webrecherche bin ich auf diesen Thread aufmerksam geworden und hänge mich frech dran :/

Ich kann einfach dem "eInfoDoc.document.docs" Array keine Länge zu weisen und stehe total auf dem Schlauch.
Im Einsatz ist Delphi 7.
Mein Code:

var eInfoDoc : EditInfo;

eInfoDoc := ix.checkoutDoc(clInfo, InttoStr(EInfoDocSord.Id), '', ixKonst.EDIT_INFO.mbSordDocAtt,ixKonst.LOCK.Yes);
//-> Hier ist das Problem das es knallt wenn auf die Elemente zugegriffen werden soll:

eInfoDoc.document.docs[0].ext := 'pdf';
eInfoDoc.document.docs[0].pathId := eInfoDoc.sord.path;
eInfoDoc.document.docs[0].encryptionSet := eInfoDoc.sord.details.encryptionSet;
//<-
-----------------

Ein C# Beispiel aus der Doku (für Delphi gibts keine Dokumentation):
EditIfo ed = ix.Ix.checkoutDoc(d1.id, null, EditInfoC.mbSordDocAtt, LockC.NO);
// Datei zum hochladen
string testFile = "C:\\test.txt");
// Datensatz für die Dokumentversion vorbereiten
ed.document.docs = new DocVersion[1];
ed.document.docs[0] = new DocVersion();
ed.document.docs[0].ext = IXClient.getFileExt(testFile);
ed.document.docs[0].pathId = ed.sord.path;
ed.document.docs[0].encryptionSet = ed.sord.details.encryptionSet;

Folgende WDSL wird verwendet:

EditInfo = class(TRemotable)
private
FchangedMembers: Int64;
FdocTemplates: ArrayOfIdName;
Fdocument: Document;
Fkeywords: ArrayOfKeyword;
FmarkerNames: ArrayOfIdName;
Fmask: DocMask;
FmaskNames: ArrayOfMaskName;
Fnotes: ArrayOfNote;
FpathNames: ArrayOfIdName;
FreplNames: ArrayOfIdName;
Fsord: Sord;
FsordTypes: ArrayOfSordType;
public
destructor Destroy; override;
published
property changedMembers: Int64 read FchangedMembers write FchangedMembers;
property docTemplates: ArrayOfIdName read FdocTemplates write FdocTemplates;
property document: Document read Fdocument write Fdocument;
property keywords: ArrayOfKeyword read Fkeywords write Fkeywords;
property markerNames: ArrayOfIdName read FmarkerNames write FmarkerNames;
property mask: DocMask read Fmask write Fmask;
property maskNames: ArrayOfMaskName read FmaskNames write FmaskNames;
property notes: ArrayOfNote read Fnotes write Fnotes;
property pathNames: ArrayOfIdName read FpathNames write FpathNames;
property replNames: ArrayOfIdName read FreplNames write FreplNames;
property sord: Sord read Fsord write Fsord;
property sordTypes: ArrayOfSordType read FsordTypes write FsordTypes;
end;

------------------------------

ArrayOfDocVersion = array of DocVersion; { "http://de.elo.ix/types/IndexServer" }


// ************************************************** ********************** //
// Namespace : http://de.elo.ix/types/IndexServer
// ************************************************** ********************** //
Document = class(TRemotable)
private
FchangedMembers: Int64;
Fatts: ArrayOfDocVersion;
Fdocs: ArrayOfDocVersion;
FobjId: WideString;
public
destructor Destroy; override;
published
property changedMembers: Int64 read FchangedMembers write FchangedMembers;
property atts: ArrayOfDocVersion read Fatts write Fatts;
property docs: ArrayOfDocVersion read Fdocs write Fdocs;
property objId: WideString read FobjId write FobjId;
end;

-----------------------------

Für einen Schubs in die richtige Richtung wäre ich ewig dankbar!
Edit: vergessen habe ich das beim Versuch CLass Helper zu nutzen folgende Meldung kommt: [Fataler Fehler] ufrmMainpwEloImporter.pas(11): System-Unit veraltet oder beschädigt: 'TClassHelperBase' fehlt

Keldorn 11. Apr 2013 17:51

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Hallo,

Du solltest so vorgehen, wie Blup in Beitrag Nr. 4 geschrieben hat, das funktioniert auch ohne classhelper. Daher du kannst nicht schreiben
[delphi]
setlength(eInfoDoc.document.docs[0],1)
[delphi]

sondern
Delphi-Quellcode:
Var Adocs: ArrayOfDocVersion
...
  setlength(Adocs,1);
  Adocs:=eInfoDoc.document.docs;
  Adocs[0]:=DocVersion.create; //nicht vergessen jedes arrayelement zu erzeugen
  Adocs[0].ext:='sdjkfhjks':
  ...
Mit delphi7 hast du aber auch generell schlechte Karten. Bin mir nicht sicher, ob das überhaupt mit dyn. arrays klarkommt. Irgendwas war da ... es gab aber auch soappatches, die da einige Probleme behoben haben.

Gruß Frank

Dogenik 12. Apr 2013 08:24

AW: WSDL Dynamische Arrays als Property und Setlength ???
 
Hallo,
also die Lösung hatte ich schon ausprobiert von Keldorn.
Es knallt dann mit einer Zugriffsverletzung bei
Delphi-Quellcode:
Adocs[0]:=DocVersion.create;
Das Array muss auch im edInfo gefüllt werden weil ich danach das edInfo Objeckt wieder übergeben muss, die nächste Zeile lautet:
Delphi-Quellcode:
eInfoDoc.document := ix.checkinDocBegin(clInfo, eInfoDoc.document); // liefert URL -> eInfoDoc.document.docs[0].URl
Bin echt ratlos und mit meinem Latein am Ende. Muss ich das jetzt komplett einstampfen weil D7 das nicht leistet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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