Autor Beitrag
Jean-Christoph
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 01.04.10 11:03 
Ich habe einen Array

Ich habe einen Array aus einem Webservice in Visual Studio 2008 eingebunden.

ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
   Hst_Data_In = public partial class
        private 
            ;
            ;
            ;
        public 
            property db_user: System.String read get_db_user write set_db_user;
            property db_pass: System.String read get_db_pass write set_db_pass;
            property db_server: System.String read get_db_server write set_db_server;
            property dbase: System.String read get_dbase write set_dbase;
            property hst_in: array of Typ_Hst_In read get_hst_in write set_hst_in;
                             
    end;

"hst_in" ist in Php als ComplexeTyp als Arra definiert und kommt so an::

ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
   Typ_Hst_In = public partial class
        private 
            ;
            ;
            ;

        public 
            property hst_funktion: System.String read get_hst_funktion write set_hst_funktion;
            property hst_shop_id: System.Int32 read get_hst_shop_id write set_hst_shop_id;
            property hst_erp_id: System.String read get_hst_erp_id write set_hst_erp_id;
            property hst_name: System.String read get_hst_name write set_hst_name;
            property hst_bild: System.String read get_hst_bild write set_hst_bild;
            property hst_bild_dir: System.String read get_hst_bild_dir write set_hst_bild_dir;
            property hst_info_in: array of Typ_Hst_Info_In read get_hst_info_in write set_hst_info_in;
    end;

hst_info_in wieder genau so wie hst_in


Wie kann ich diesen Array hst_in bzw. Typ_Hst_In initialisieren und ansprechen?
ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
 
method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);
var   h_s_Data_In  : Hst_Data_In;
      hst_in       : array of Typ_Hst_In;
      hst_info_in  : array of Typ_Hst_Info_In;

begin

  h_s_Data_In   := new WindowsApplication4.hst_server.Hst_Data_In;


  h_s_Data_In.db_user              := 'root';
  h_s_Data_In.db_pass              := '';
  h_s_Data_In.db_server            := 'localhost';
  h_s_Data_In.dbase                := 'MyDbase';

  
  h_s_Data_In.hst_in[0].hst_funktion := 'N';

Bis hierhin geht es. 

Dann kommt nach dieser Anweisung zur Laufzeit:

Erstellen Sie eine Obektinstannz mit dem Schlüsselwort new und 
Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in WindowsApplication4.exe aufgetreten.

->  h_s_Data_In.hst_in[0].hst_shop_id  := 1;
            ;
            ;
            ;

Weiter geht es nicht. Wie kann ich diesen Array initialisieren und ansprechen?


Zuletzt bearbeitet von Jean-Christoph am Do 01.04.10 15:06, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.04.10 14:22 
Code ist zu formatieren, damit er lesbar ist: Öffne deinen Beitrag mit dem Schere-Button, öffne "Bereiche", wähle in der ComboBox Delphi-Prism aus, markiere den Code-Text, drücke den Plus-Button, benutze die Vorschau. Wenn alles sauber ist, dann "Absenden".

Ist wirklich der ganze Code nötig? Ich glaube, der verwirrt mehr. Beschränke dich auf die wichtigen Bestandteile.

Du willst Hilfe, also erleichtere sie uns und erschwere uns nicht das Mitdenken. Danke! Jürgen
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.04.10 15:46 
Danke sehr! Es ist zwar nicht ganz sauber getrennt, aber lesbar.

Dein Fehler liegt in diesem Vorgehen:

Mit der folgenden Zeile erstellst du eine Instanz von Hst_Data_In:
ausblenden Delphi-Prism-Quelltext
1:
h_s_Data_In   := new WindowsApplication4.hst_server.Hst_Data_In;					

Das hat aber keinerlei Auswirkungen darauf, was mit den darin enthaltenen Teilen passiert. Genauer: Diese werden alle auf 0 bzw. null o.ä. initialisiert. Deshalb ist hst_in noch auf null gesetzt; ein Zugriff darauf liefert die NullReferenceException.

Es muss also zuerst etwas ausgeführt werden (vermutlich eine Methode, die einen Zugriff vornimmt), damit das Array hst_in initialisiert wird. Aber auch das reicht noch nicht, sondern die einzelnen Elemente des Arrays müssen initialisiert werden. (Die Methode, die das Array erzeugt, liefert vermutlich auch gleich Elemente mit; aber das kann ich "von außen" nicht prüfen.)

Erst wenn sowohl hst_in als auch hst_in[0] mit Inhalt versehen sind, kannst du darauf zugreifen. Im Zweifelsfall muss vorher immer geprüft werden, ob es ungleich null ist.

Übrigens: Wenn du solch einen Laufzeitfehler erhältst, kann mit try-except-finally die Ursache gezielt abgefragt werden. Mit ex.ToString() erhält man in der Regel mehr und genauere Informationen als mit ex.Message.

Gruß Jürgen
Jean-Christoph Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 01.04.10 18:07 
Danke erstmal für Deine Antwort.

Ich versuche ja gerade die Werte des Arrays zu beschreiben. Dabei kommt dann die Exception. MIt der Empfehlung mit dem Schlüsselwort new zu arbeiten. Ich habe versucht für jede Struktur also hst_in und hst_info_in eine eigene Instanz zu bilden und dann dem Array zu zuweisen. Das hat nichts genutzt. Es muss doch (hoffe ich) eine Initialiesierungsmöglichkeit geben, einen Array mit mixed Strukturen als UnterArrays an den Start zu bekommen?
Könntest Du mir noch mal kurz zeige, wie ich die Exceptions aufbau mit ex.ToString()?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 01.04.10 19:21 
Hallo Jean-Christoph,

zum Initialisieren des Arrays selbst wird eine Anweisung wie folgt benötigt (die genaue Schreibweise für Prism kenne ich nicht):
ausblenden Delphi-Prism-Quelltext
1:
h_s_Data_In.hst_in = new array of Typ_Hst_In;					

Danach kannst du in hst_in[0] ein Element eintragen:
ausblenden Delphi-Prism-Quelltext
1:
hst_in[0] = new Typ_Hst_In;					

Erst danach kannst du dieses Element benutzen:
ausblenden Delphi-Prism-Quelltext
1:
  h_s_Data_In.hst_in[0].hst_funktion := 'N';					

Aber wie gesagt: hst_server könnte eine oder mehrere Methoden zur Verfügung stellen, die ein "fertiges" Array zurückgibt.

Zu den Exceptions siehe z.B. Try-Schlüsselwort.

Gruß Jürgen
Jean-Christoph Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 02.04.10 13:52 
Danke Jürgen ich habe es fertig gebracht.
Jede Zeile des Arrays muss als Objekt neu instanziert werden.
Und damit auch jede Zeile jedes Unterarrays.

Eine Funktion in der Class, die den Array fertig bereitstellt
habe ich allerdings nicht gefunden.

Aber noch mal herzlichen Dank - Du hast mir sehr geholfen.