Entwickler-Ecke
WinForms - Klasse als Array
stefanpc81 - Mo 09.04.18 16:00
Titel: Klasse als Array
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
C#-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: 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 - 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 - Mo 09.04.18 16:53
Hallo und :welcome:
ich hatte dir schon unter
myCSharp.de - Klasse als Array: Der Name (Array) ist im aktuellen Kontext nicht vorhanden [
https://www.mycsharp.de/wbb2/thread.php?threadid=120421] 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, ...
stefanpc81 - 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 - 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 - 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 - 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 - 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 - 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)
stefanpc81 - 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.
Delete - Di 10.04.18 15:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Di 10.04.18 15:48
Darum sperre ich diesen Thread mal für 24h.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!