Autor Beitrag
halliba
Hält's aus hier
Beiträge: 8

Win 7
C# (VS 2010)
BeitragVerfasst: Fr 01.06.12 16:41 
Hey Leute ich hab ein einfaches Problem dessen Lösung ich als C# anfänger leider net kenne...
ja ich hab im internet geguckt und auch meine zwei Bücher durchgeguckt habs aber iwie nicht wirklich gefunden.
Das Problem ist folgendes:
Ich hab eine WinForm Anwendung.
Die Klasse der Standart Form also die die am Anfang aufgerufen wird heißt Form1.
Also wird in der main funktion das hier ausgeführt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1);
        }

Dann hab ich noch eine klasse die "server" heißt und diese Klasse hat eine Methode mit der etwas an der Form verändert werden soll die am Anfang aufgerufen werden soll.
zb:
ausblenden C#-Quelltext
1:
PosY = /*Form1*/.Location.Y;					


So Problem ist das Form1 ja kein Objekt sondern eine Klasse ist. Ich wusste also zunächst garnicht wie das Objekt der Klasse Form1 heißt das standartmäßig aufgerufen wird.

Also hab ich die main Funktion verändert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 basis = new Form1();
            basis.Show();
        }


Dementsprechen dachte ich könnte ich in der Funktion server das hier schreiben:
ausblenden C#-Quelltext
1:
PosY = basis.Location.Y;					

aber nein ich bekomme die Fehlermeldung das der Name "basis" im aktuellen Kontext nicht vorhanden ist...

ich denke mal ich mache nur einen Anfängerfehler und die Lösung ist total offensichtlich^^
grüße halliba
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 01.06.12 16:53 
basis gibt es nur innerhalb der Main Methode da du die auch dort definiert hast. Soll die auch außerhalb der Methode bekannt sein musst du die innerhalb der Klasse definieren. Dann ist sie in allen Methoden innerhalb dieser Klasse bekannt und kann dort verwendet werden. basis.Show() wird nicht funktionieren. Du musst am Anfang einer Anwendung zwingend Application.Run() verwenden. Du kannst aber natürlich einfach Application.Run(basis) aufrufen.


Zitat:
Dementsprechen dachte ich könnte ich in der Funktion server das hier schreiben:
PosY = basis.Location.Y;


Warum machst du das nicht in der Form sondern woanders?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 01.06.12 16:55 
Hallo :welcome:

wo benutzt du denn die Klasse Server? Und warum benötigt diese die Position der Form?
Du benötigst immer eine Instanz (Objekt) einer Klasse, um auf (nicht-statische) Methoden oder Eigenschaften zuzugreifen, d.h. du müßtest der Klasse diese Instanz als Referenz mitgeben (denn die Variable basis ist ja nur innerhalb der Main-Methode bekannt).
Jedoch ist es kein guter Programmierstil, auf Form-Elemente von außerhalb (d.h. aus einer anderen Klasse heraus) zuzugreifen (bzw. evtl. sogar zu verändern)!

Einen umfangreichen Artikel dazu gibt es von mir unter Kommunikation von 2 Forms.
halliba Threadstarter
Hält's aus hier
Beiträge: 8

Win 7
C# (VS 2010)
BeitragVerfasst: Fr 01.06.12 17:05 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
wo benutzt du denn die Klasse Server? Und warum benötigt diese die Position der Form?

Nunja ich hab ein Programm das eine in einer Kosnole laufende Java Anwendung als Form einbaut nur leider will die Java Konsole das iwie nicht wirklich und die Position der Form muss ich nachträglich ändern.
Das aufnehmen der Konsole geschet ja über den Setparent befehl und dafür brauch ich den handle von der Form basis.

Da ich durch das Programm mehrere verschiedene Server verwalten will hab ich eine Klasse "server" mit Eigenschaften wie Name oder Beschreibung. Diese Klasse enthält auch eine Methoder starten. Dort wird die Java anwendung gestartet und also Form integriert.

Aber ich weiß nicht wie ich den Handle von basis in die server Klasse bzw in die einzelnen Server Objekte kriege.
Das Beispiel mit den Postitionen war vllt schlecht^^ aber auch die neuausrichtung der ganzen Form geschieht in der Server Funktion.




user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
basis gibt es nur innerhalb der Main Methode da du die auch dort definiert hast. Soll die auch außerhalb der Methode bekannt sein musst du die innerhalb der Klasse definieren. Dann ist sie in allen Methoden innerhalb dieser Klasse bekannt und kann dort verwendet werden.

Gibt es eine Möglichkeit basis public zu machen? also das sie im ganzen Programm verwendet werden kann?
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Fr 01.06.12 17:09 
user profile iconhalliba hat folgendes geschrieben Zum zitierten Posting springen:
ich denke mal ich mache nur einen Anfängerfehler und die Lösung ist total offensichtlich^^


In der Tat. Meinst Du nicht, es wäre eine gute Idee, Deine "zwei Bücher" mal systematisch durchzuarbeiten? Gültigkeitsbereiche sind sehr grundlegend. Wie auch der Aufbau eines Windows-Forms-Programms.
halliba Threadstarter
Hält's aus hier
Beiträge: 8

Win 7
C# (VS 2010)
BeitragVerfasst: Fr 01.06.12 18:02 
user profile iconujr hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconhalliba hat folgendes geschrieben Zum zitierten Posting springen:
ich denke mal ich mache nur einen Anfängerfehler und die Lösung ist total offensichtlich^^


In der Tat. Meinst Du nicht, es wäre eine gute Idee, Deine "zwei Bücher" mal systematisch durchzuarbeiten? Gültigkeitsbereiche sind sehr grundlegend. Wie auch der Aufbau eines Windows-Forms-Programms.


Also das buch hier hab ich schon fast durch. Und ich hab die Erfahrung gemacht das ich mit learning by doing bzw trial an error sehr viel besser lerne als aus büchern und Anleitungen.

Aber danke für den Tipp ;)

edit:
Danke an alle die mir geholfen haben :) vor allem die tipps mit den Gültigkeitsbereichen^^ hab mir die entsprechenden Kapitel noch mal angeguckt und jetzt hab ichs verstanden :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 01.06.12 18:12 
Zitat:
Gibt es eine Möglichkeit basis public zu machen? also das sie im ganzen Programm verwendet werden kann?


Als öffentliches statisches Feld oder Property an einer öffentlichen Klasse.
halliba Threadstarter
Hält's aus hier
Beiträge: 8

Win 7
C# (VS 2010)
BeitragVerfasst: Fr 01.06.12 18:14 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Gibt es eine Möglichkeit basis public zu machen? also das sie im ganzen Programm verwendet werden kann?


Als öffentliches statisches Feld oder Property an einer öffentlichen Klasse.


ja es ist jetzt public static void Main()
ich denke so ists richtig denn es funktioniert^^
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 01.06.12 18:22 
??? :gruebel:

Dies stand doch schon vorher da und ändert auch nichts an dem besagten.
Du meintest wahrscheinlich
ausblenden C#-Quelltext
1:
public static Form1 basis;					

?
So funktioniert es zwar, ist aber trotzdem kein guter Weg - auch wenn dir das jetzt als Anfänger wahrscheinlich ziemlich egal ist. :wink:
halliba Threadstarter
Hält's aus hier
Beiträge: 8

Win 7
C# (VS 2010)
BeitragVerfasst: Fr 01.06.12 18:38 
ja sry ich hab das falsche kopiert :D

ja es ist ja eins meiner ersten projekte...
Ist ja kein Großprojekt und ich denke mal den Quellcode wird sowieso niemals jmd anders sehen^^
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 01.06.12 20:02 
Ob der Vorschlag auf deine Frage passt, kann ich leider nicht so genau sagen, da ich sie nur teilweise verstanden habe und ob das so viel besser ist, kann ich auch nicht sagen.

Aber ein Tipp, für den Fall, dass du das im Buch überlesen hast (steht glaube in der 2010-Version nicht so direkt drin, da wird es in der 2008-Version nicht besonders besser sein)

Du kannst die Form auch als Parameter übergeben. Da die Klasse, die die Form bereit stellt, einen Referenz-Typ darstellt, wird die Form die Änderungen, die sie in der Methode "erfahren" hat, auch danach bei behalten.
Du übergibst also einfach die betroffene Referenz, in der Methode wird sie verändert und nach dem AUfruf der Methode wirst du ganz normal weiter arbeiten können, bloß mit der geänderten Referenz.