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



BeitragVerfasst: Di 10.04.18 15:53 
Ich habe über Main() eine Klasse als Array festgelegt und über die entsprechende Klasse Werte verglichen und das Ergebnis ausgelesen (Windows Forms). Nun möchte ich über das Ergebnis (double Lat und Lon) mittels GDI einen "gezeichnetem Text" in der pictureBox1 anzeigen lassen. Leider funktioniert dies noch nicht.
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.
Code 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 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();
            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);

            int i = Class_ICAO_apt.Get_ICAO_apt_name(ICAO_apt, "EGCC");
            double i1 = Class_ICAO_apt.Get_ICAO_apt_lat(ICAO_apt, i);
            double i2 = Class_ICAO_apt.Get_ICAO_apt_lon(ICAO_apt, i);
            string t1 = Convert.ToString(i1);
            string t2 = Convert.ToString(i2);

            f1.show(t1);
            
        }

Wie muss ich das schreiben?


Moderiert von user profile iconTh69: Topic aus Multimedia / Grafik verschoben am Di 10.04.2018 um 16:15
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: Di 10.04.18 16:23 
Zitat:
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.


Nein sollte man nicht und hilft bei dem was du vorhast nicht. Dir scheint der Unterschied zwischen einer Klasse und der Instanz einer Klasse nicht klar zu sein.
Main ist ein eindeutiger Einsprungpunkt der muß also zwangsweise statisch sein (damit er zum Start der Anwendung auch eindeutig erreichbar ist). Deine angezeigte Form ist aber die Instanz irgendeiner Form Klasse und ist damit nicht statisch. Aus einer statischen Methode kannst du aber nur andere statische Dinge ansprechen die Daten einer Instanz sind dir erstmal versperrt. Du kommst an die Daten der Instanz nur über die Instanz und zwar nur an die Daten die diese Instanz auch veröffentlicht hat (das Ding mit den Sichtbarkeiten).

Dein Code gehört aber auch einfach nicht in die Main. Du hast den bei deiner letzten Frage hinter den Aufruf von Application.Run gepackt. Da ist es mehr oder weniger toter Code.
Die Form die du an Application.Run übergegeben hast ist diejenige die die Lebenszeit deiner Anwendung steuert. Die Anwendung hängt sozusagen in Application.Run und führt darin alle Events aus die der User so ausführt. Erst wenn diese Form geschlossen wird kommst du in den Code den du hinter Application.Run geschrieben hast.

Dein Code gehört in die von Application.Run angezeigte Form udn zwar in den instanz Teil nicht in irgendwas statisches. Das übliche wäre wenn du Code ausführen willst der zur Form gehört (hier ist das eindeutig so da diese Form ja deine Hauptform der Anwendung ist die die Lebenszeit steuert) das im Load Event (der wird vor dem anzeigen ausgeführt) oder im Shown Event (der wird direkt nach dem ersten anzeigen) der Form zu machen.

Das wird auch das Problem sein warum dein show() Code nicht funktioniert. Der wirkt auf die Form die du nach Application.Run erzeugst und glaubst zu sehen. Du siehst auf dem Bildschirm aber die Form die du an Application.Run übergeben hast (Das ist eine andere Instanz der Klasse) und bei der fürst du diesen Code nicht aus.

Für diesen Beitrag haben gedankt: stefanpc81
stefanpc81 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 10.04.18 17:03 
Vielen Dank, es funktioniert!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 10.04.18 17:05 
- Nachträglich durch die Entwickler-Ecke gelöscht -