Entwickler-Ecke
Basistechnologien - Methode von "Erzeuger" Objekt ausführen
DummyScript - Di 27.07.10 15:58
Titel: Methode von "Erzeuger" Objekt ausführen
Hi!
Ich habe ein Objekt der Klasse "Telescope". Dieses Objekt hat diverse NICHT statische Methoden. Das Objekt führt folgenden Code aus und erzeugt damit ein Fenster das parallel zum normalen Code weiterläuft (da in eigenem Thread):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public Telescope() { m_control_panel_thread = new Thread(control_panel_thread); m_control_panel_thread.Start(); }
public void control_panel_thread() { control_panel F = new control_panel(); F.ShowDialog(); }
public void test_methode() { //Only for testing purpose } |
Ok nun zu meinem Problem: Im Dialog möchte ich sobald ein Button gedrückt wird eine Methode (test_methode()) von dem Objekt der Klasse Telescope ausführen. Doch dies lässt der Compiler nicht zu: "Für das nicht statische Feld, die Methode oder die Eigenschaft "ASCOM.Tele1.Telescope.test_methode()" ist ein Objektverweis erforderlich."
Mich würde interessieren ob dies irgendwie möglich ist, ohne die Methode statisch zu machen?
Danke für eure Hilfe!
PS: Ich hoffe ich habe das richtige Forum benutzt.
Th69 - Di 27.07.10 16:12
Du schreibst zwar "Ich habe ein Objekt der Klasse "Telescope", aufrufen tust du aber die Methode mit dem Klassennamen: Telescope.test_methode().
Du mußt diese Methode selbstverständlich dann mit dem Objekt aufrufen, z.B.
C#-Quelltext
1: 2:
| Telescope telescope = new Telescope(); telescope.test_methode(); |
P.S. Mit Threads solltest du (als Anfänger) noch nicht hantieren.
Andere Threads (außer der GUI Hauptthread) dürfen weder GUI-Elemente erstellen noch darauf direkt zugreifen.
(Oder kurz gesagt: dein gezeigter Quellcode ist völliger Quatsch -)
DummyScript - Di 27.07.10 16:23
Das Problem ist, dass bereits ein Objekt erzeugt wurde da ja der Constructor aufgerufen wurde. Würde ich jetzt wieder ein Objekt erstellen, dann würde eine endlose Schleife entstehen. Leider habe ich auf das Objekt keinen Zugriff, da es automatisch vom Betriebssystem angelegt wird (es handelt sich hier um ein COM Objekt).
Du meinst ich sollte keinen Dialog verwenden, da dieser das Programm unterbricht sondern .Show() und mir so den Thread sparen? Das entstand dadurch, dass ich geglaubt habe das für jedes Fenster das parallel laufen soll ein eigener Thread erstellt werden muss. Das dies mit .Show() nicht benötigt wird wusste ich zum Zeitpunkt an dem ich das geschrieben habe nicht. Ich bin auch kein Programmieranfänger sondern nur neu in C# bzw. Winforms. Aber das ist jetzt alles nebensächlich, mein Problem ist momentan ganz ein anderes.
Trashkid2000 - Di 27.07.10 16:25
Hallo DummyScript,
ja, das ist möglich, auch wenn die Mehtode nicht statisch ist.
Also, mal angenommen, Deine Form control_panel besitzt einen Button OK, der auch das DialogResult "OK" zugewiesen bekommen hat, dann könntest Du das DialogResult abfragen, und wenn diesen eben OK ist, die Methode testMethode() ausführen.
Das würde dann so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public void control_panel_thread() { control_panel F = new control_panel(); if (F.ShowDialog() == System.Windows.Forms.DialogResult.OK) { test_methode(); } } |
Allerdings solltest Du Dich bei Deinem Code echt an Namenskonventionen halten. Unterstriche sind ganz schlecht, Methodennamen Groß, Variablen klein, und insgesamt CamelCase- Schreibweise.
MFG, Marko
DummyScript - Di 27.07.10 16:34
Wenn ich das richtig verstehe wäre danach der Dialog beendet. Bei meiner Dialogbox sind 4 Pfeiltasten deren Status ich an Telescope weitergeben möchte. Beim drücken soll MethodeSowieso und beim loslassen eine andere aufgerufen werden. Der Dialog soll dabei nicht geschlossen werden...
Trashkid2000 - Di 27.07.10 16:45
Stimmt, der Dialog wäre würde dann geschlossen werden.
Tja, wenn es so sein soll, wie Du es beschreibst, musst Du das Ganze wohl über Events lösen.
Wenn denn die Methoden, die mit den Button- Klicks aufgerufen werden sollen, wirklich in der Klasse Telescope sein müssen. Ansonsten könnnten die Methoden ja auch in der Dialog- Klasse sein.
MFG
norman2306 - Di 27.07.10 16:49
Da gibt es mehrere Möglichkeiten. Ich würde dir Empfehlen, deine Telescope-Instanz im Konstruktor des Fensters zu übergeben. Dann kannst du es direkt in deinem Fenster manipulieren.
Bsp:
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:
| public class MyTestObj { int x; int y;
public int X { get{ return x;} set{x = value;}} public int X { get{ return y;} set{y = value;}} }
public class MyTestObjManipulator : Form { MyTestObj maniItem = null public MyTestObjManipulator(MyTestObj item) { InitializeComponents(); maniItem = item; }
private void X_Scroll(object sender, EventArgs e) { maniItem.X = (double)RampTB.Value; } } |
Das Fenster kannst du ganz normal mit Show Öffnen mit der Referenz auf dein Telescope-Objekt....
DummyScript - Di 27.07.10 17:01
Jaaaa! Genau das habe ich gesucht!
Vielen Dank für eure Hilfe!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!