Entwickler-Ecke
WinForms - Delphi Prism Array ansprechen.
Jean-Christoph - Do 01.04.10 11:03
Titel: Delphi Prism Array ansprechen.
Ich habe einen Array
Ich habe einen Array aus einem Webservice in Visual Studio 2008 eingebunden.
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::
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?
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?
JüTho - 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 - 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:
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 - 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 - 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):
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:
Delphi-Prism-Quelltext
1:
| hst_in[0] = new Typ_Hst_In; |
Erst danach kannst du dieses Element benutzen:
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 [
http://prismwiki.codegear.com/de/Try_%28Schl%C3%BCsselwort%29].
Gruß Jürgen
Jean-Christoph - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!