Autor Beitrag
DummyScript
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 27.07.10 15:58 
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):

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
Telescope telescope = new Telescope();
telescope.test_methode(); // nach der Namenskonvention von MS besser "TestMethode" -)


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: 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:


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:
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;}}
}

//Form mit Schieberegler:
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....

Für diesen Beitrag haben gedankt: DummyScript
DummyScript Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 27.07.10 17:01 
Jaaaa! Genau das habe ich gesucht!

Vielen Dank für eure Hilfe!