Autor Beitrag
stefanpc81
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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:
ausblenden 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.02648.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
ausblenden 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(0154015);

            monitor_g.DrawString(t1, font9, pinsel_weiss, rect1, stringnear);

            pictureBox1.Image = monitor_b;
        }

und in der Klasse
ausblenden volle Höhe 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 user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: I- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: I- durch Quote-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 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):
ausblenden 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) // String.Equals braucht man (fast) nie
      return a;
  }

  return -1// besser ein negativer Wert als Fehlerrückgabe
}

Dadurch kannst du diese Methode (ohne Objektinstanz) aufrufen:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ausblenden 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 user profile iconTh69: Vollzitat entfernt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 user profile iconTh69: Vollzitat entfernt.
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ausblenden 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.02648.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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.04.18 14:01 
Um dieses Thema zum Abschluß zu bringen:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 10.04.18 14:33 
@Th69 Vielen Dank!

Weiterhin erscheint mittels GDI "gezeichnetem Text" in der pictureBox1 nicht. Code war
ausblenden 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(0154015);

            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



BeitragVerfasst: Di 10.04.18 15:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 10.04.18 15:48 
Darum sperre ich diesen Thread mal für 24h.