Autor |
Beitrag |
stefanpc81
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 09.04.18 16:00
Mit Javascript ist das so einfach mit den Arrays. Nun verzweifle ich an C# und weiß nicht wie es geht. Folgender Quellcode:
in Program.cs:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());
Class_ICAO_apt kl_apt = new Class_ICAO_apt("",0,0); Form1 f1 = new Form1(); int ICAO_apt_gesamt = kl_apt.Get_ICAO_apt_gesamt(); Class_ICAO_apt[] ICAO_apt = new Class_ICAO_apt[csCAO_apt_gesamt];
ICAO_apt[0] = new Class_ICAO_apt("EDDF", 50.0264, 8.5431); ICAO_apt[1] = new Class_ICAO_apt("EGCC", 53.3537, -2.27495);
int i = kl_apt.Get_ICAO_apt_name("EGCC"); double i1 = ICAO_apt[i].Lat; double i2 = ICAO_apt[i].Lon; string t1 = Convert.ToString(i1);
f1.show(t1);
} |
und in Form1.cs
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public void show(string t1) { StringFormat stringnear = new StringFormat(); stringnear.Alignment = StringAlignment.Near; stringnear.LineAlignment = StringAlignment.Near;
Bitmap monitor_b = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics monitor_g = Graphics.FromImage(monitor_b);
Font font9 = new Font("Arial", 9); SolidBrush pinsel_weiss = new SolidBrush(Color.White);
Rectangle rect1 = new Rectangle(0, 15, 40, 15);
monitor_g.DrawString(t1, font9, pinsel_weiss, rect1, stringnear);
pictureBox1.Image = monitor_b; } |
und in der Klasse
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: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| public class Class_ICAO_apt { private int ICAO_apt_gesamt = 2; private string _Name; private double _Lat; private double _Lon; public Class_ICAO_apt(string Name, double Lat, double Lon) { string _Name = Name; double _Lat = Lat; double _Lon = Lon; } public string Name { get { return _Name; } set { _Name = value; } }
public double Lat { get { return _Lat; } set { _Lat = value; } }
public double Lon { get { return _Lon; } set { _Lon = value; } }
public int Get_ICAO_apt_gesamt() { return ICAO_apt_gesamt; }
public int Get_ICAO_apt_name(string txt) { for (int a = 0; a < ICAO_apt_gesamt; a++) { if (String.Equals(txt, Name[a])) { return a; } } return 999; } } |
Ich möchte mehrere Arrays erzeugen und durch die Methode Get_ICAO_apt_name(string txt) das Array a finden, welches über einen Vergleich eines string gefunden werden soll. Danach sollen die zugehörigen Werte Lat[a] und Lon[a] ausgelesen und weiterverarbeitet werden.
Wenn ich diese Windows Forms-Anwendung starte, kommt nach dem Schließen des Fensters mit Forms die folgende Fehlermeldung in der o.g. Klasse
Zeile if (String.Equals(txt, Name[a])) mit Meldung Zitat: | System.NullReferenceException "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." Klasse_apt.Class_ICAO_apt.Name.get hat null zurückgegeben. |
Was mache ich falsch?
Vielen Dank für nützliche Antworten.
Moderiert von Th69: C#-Tags hinzugefügt
Moderiert von Th69: I- durch C#-Tags ersetzt
Moderiert von Th69: I- durch Quote-Tags ersetzt
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 09.04.18 16:33
Name ist ein string. Darauf mit dem Index Operator zuzugreifen heißt das entsprechende N.te Zeichen aus dem string auszulesen. Das ist vermutlich nicht das was du willst.
Da du kl_apt keinen Namen gibst Namen (0 Zeichen lang ist) und du da bis zu ICAO_apt_gesamt Anzahl Zeichen (also 2) auslesen willst knallt das.
Es ist mir aber nicht ersichtlich was du stattdessen willst. Darum kann ich da gerade keinen Rat aussprechen was du stattdessen tun solltest. Wenn du über die Namen in verschiedenen Class_ICAO_apt Klassen iterieren willst dann bist du in der einzelnen Klassen falsch. Die weiß nichts über das Array in dem es zufällig steckt.
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 09.04.18 16:53
Hallo und
ich hatte dir schon unter myCSharp.de - Klasse als Array: Der Name (Array) ist im aktuellen Kontext nicht vorhanden geschrieben, daß dir die Grundlagen der WinForms-Programmierung wohl noch fehlen - und daher ein Konsolenprojekt für den Anfang besser wäre.
Wie Ralf schon geschrieben hat, weiß deine Methode Get_ICAO_apt_name nichts von dem Array und daher müßtest du dieses als Parameter übergeben (und die Methode am besten static setzen):
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| static int Get_ICAO_apt_name(Class_ICAO_apt[] array, string txt) { for (int a = 0; a < array.Length; a++) { if (array[a].Name == txt) return a; }
return -1; } |
Dadurch kannst du diese Methode (ohne Objektinstanz) aufrufen:
C#-Quelltext 1:
| int i = Class_ICAO_apt.Get_ICAO_apt_name(ICAO_apt, "EGCC"); |
PS: Deine Namensgebung ist nicht gerade übersichtlich und gut lesbar: Class_ICAO_apt, kl_apt, ICAO_apt, ...
Für diesen Beitrag haben gedankt: stefanpc81
|
|
stefanpc81
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 09.04.18 18:15
Danke, jetzt habe ich es genau so wie gepostet geschrieben und es gibt trotzdem noch einen Fehler (insgesamt sieht es aber schon ganz gut aus):
für Zeile
C#-Quelltext 1:
| int i = Class_ICAO_apt.Get_ICAO_apt_name(ICAO_apt, "EGCC"); |
heißt es nun "Der Zugriff auf Class_ICAO_apt.Get_ICAO_apt_name(Class_ICAO_apt[], string) ist aufgrund des Schutzgrads nicht möglich."
Moderiert von Th69: Vollzitat entfernt.
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 09.04.18 20:10
Zitat: | heißt es nun "Der Zugriff auf Class_ICAO_apt.Get_ICAO_apt_name(Class_ICAO_apt[], string) ist aufgrund des Schutzgrads nicht möglich." |
Du mußt noch die passende Sichtbarkeit an deiner Methode vor static schreiben. Ohne Angabe ist die Default Sichtbarkeit erstmal private.
|
|
stefanpc81
Hält's aus hier
Beiträge: 14
|
Verfasst: Di 10.04.18 12:03
Habe ich gemacht. Debugge ich das Programm, kommt unten die Meldung, dass a = -1 ist und es geht deshalb auch nicht weiter mit meinen hinzugefügten Methoden, bei denen Lat und Lon ausgegeben werden sollen. Ich habe schon hin und her probiert,
mit i = a und return i
und trotzdem mit String.Equals(...)
aber es kommt immer -1 raus. Ich weiß nicht mehr weiter.
Moderiert von Th69: Vollzitat entfernt.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 10.04.18 12:23
Schau dir mal den Class_ICAO_apt-Konstruktor genauer an (bzw. debugge ihn)...
PS: Bitte keine Beiträge voll zitieren!
|
|
stefanpc81
Hält's aus hier
Beiträge: 14
|
Verfasst: Di 10.04.18 13:19
Falls du Class_ICAO_apt[] ICAO_apt = new Class_ICAO_apt[csCAO_apt_gesamt]; meinst, das war nur ein Tippfehler beim erstellen des Threads.
Wenn das nicht dein Hinweis sein sollte, habe ich beim Durchsehen des Konstruktors nichts gefunden. Aber beim Debuggen habe ich dann festgestellt, dass sowohl Array 0 als auch 1 jeweils 0 bzw. Null in den Werten haben. Dann stimmt was mit der Initialisierung nicht, oder? Den Code zu
C#-Quelltext 1: 2: 3: 4:
| Class_ICAO_apt[] ICAO_apt = new Class_ICAO_apt[2];
ICAO_apt[0] = new Class_ICAO_apt("EDDF", 50.0264, 8.5431); ICAO_apt[1] = new Class_ICAO_apt("EGCC", 53.3537, -2.27495); |
habe ich mir über das Internet zusammengeschraubt und weiß daher nicht, ob er richtig ist. Aber das ist gerade wohl der brennende Punkt...
Die Zeile Class_ICAO_apt kl_apt = new Class_ICAO_apt("",0,0); habe ich aus dem Code mit // ausgeblendet.
@Th69 Ich habe tatsächlich nur den Zitat-Button benutzt und erst jetzt nach deinem Hinweis gemerkt, dass es links auch noch eine reine Antworten-Funktion gibt... Man lernt eben nie aus.
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 10.04.18 14:01
Um dieses Thema zum Abschluß zu bringen:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| public Class_ICAO_apt(string Name, double Lat, double Lon) { _Name = Name; _Lat = Lat; _Lon = Lon; } |
(also entfernen der Datentypen, da du damit sonst nutzlos lokale Variablen angelegt hast - anstatt die Zuweisung an die Membervariablen)
Für diesen Beitrag haben gedankt: stefanpc81
|
|
stefanpc81
Hält's aus hier
Beiträge: 14
|
Verfasst: Di 10.04.18 14:33
@Th69 Vielen Dank!
Weiterhin erscheint mittels GDI "gezeichnetem Text" in der pictureBox1 nicht. Code war
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public void show(string t1) { StringFormat stringnear = new StringFormat(); stringnear.Alignment = StringAlignment.Near; stringnear.LineAlignment = StringAlignment.Near;
Bitmap monitor_b = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics monitor_g = Graphics.FromImage(monitor_b);
Font font9 = new Font("Arial", 9); SolidBrush pinsel_weiss = new SolidBrush(Color.White);
Rectangle rect1 = new Rectangle(0, 15, 40, 15);
monitor_g.DrawString(t1, font9, pinsel_weiss, rect1, stringnear);
pictureBox1.Image = monitor_b; } |
In diesem Zusammenhang frage ich mich, ob man die Main-Methode aus Program.cs in die Forms1.cs verschieben kann? Das das gehen könnte, habe ich zumindest so verstanden. Da ich später mittels der Werte von Feldern/Variablen die Bilder/GDI von Form1 verändern will, wäre dies wohl sinnvoll.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 10.04.18 15:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 10.04.18 15:48
Darum sperre ich diesen Thread mal für 24h.
|
|