Laden...

Eine Instanz für das ganze Programm

Erstellt von Yoguto vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.482 Views
Y
Yoguto Themenstarter:in
25 Beiträge seit 2004
vor 17 Jahren
Eine Instanz für das ganze Programm

Hallo!

Ich schreibe ein Programm, dass im Hintergrund läuft und Daten eines Telefonanrufs aus einem externem Fenster abruft um dann bestimmte Optionen wie z.B. das aufschalten per VNC an zu bieten.

Dazu habe ich eine Klasse (CallWatcher) geschrieben, die die Daten aus dem Fenster ausliest und einige Ereignisse zur Verfügung stellt. Wenn z.B. ein Anruf angenommen wird soll das Formular der Klasse AktualCall angezeigt werden.
Wie ist es nun möglich für das ganze Programm nur eine Instanz der Klasse AktualCall zu erstellen um dann unter bestimmten Bedingungen das Formular anzeigen zu lassen. Wenn ich die Instanz der Klasse in Main erstelle kann ich ja nicht aus CallIncoming darauf zu greifen.

Was mich ausserdem wundert ist warum das Formular einfriert wenn ich MainForm.Show anstatt MainForm.ShowDialog verwende.


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace telefontool
{
    class Program    
    {        

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);  
                     
            CallWatcher callwCallWatch = new CallWatcher();
            callwCallWatch.CallIncoming += new CallIncomingEventHandler(CallIncoming); //Verknüfung
            //MainForm.Show();
            Application.Run();            
        }

        private static void CallIncoming(object sender, CallIncomingEventArgs e)
        {
            AktualCall MainForm = new AktualCall();            
            MainForm.labPhoneNumber.Text = e.TelNumber;
            MainForm.labUserName.Text = e.Name;
            MainForm.ShowDialog();
        }
    }
}

564 Beiträge seit 2006
vor 17 Jahren

Hi!

Das Thema wurde schon mehrfach diskutiert. Folgende Links sollten dir helfen:
mehrere Programminstanzen verhindern?
Dateiassoziation
Programm on Top

Du erstellst doch gar keine Instanz MainForm.
Falls MainForm deine Form-Klasse ist, erstelle zunächst eine Instanz und rufe dann Show auf.

MainForm mf = new MainForm();
mf.Show();

der Marcel

EDIT: Sorry, habs gesehen. MainForm ist der Instanzname und die zugrundeliegende Klasse AktualCall.
Aber dennoch. in der Main-Methode erstellst du gar kein Objekt MainForm. Das fehlt dir.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

Y
Yoguto Themenstarter:in
25 Beiträge seit 2004
vor 17 Jahren

Danke für die Antwort.

Allerdings glaube ich, dass ich mich entweder nicht klar genug ausgedrückt habe oder du mich nicht richtig verstanden hast.

Mir geht es nicht darum zu verhindern, dass das Programm mehr mals gestartet wird. Ich möchte die Instanz von dem Formular AktualCall (also die MainForm) so erstellen, dass ich von der Methode CallIncoming darauf zugreifen kann.

So in etwa:


namespace telefontool
{
    class Program    
    { 
        AktualCall MainForm = new AktualCall(); //!!!!!!!!!!

        [STAThread]
        static void Main()
        {
            ...
            CallWatcher callwCallWatch = new CallWatcher();
            callwCallWatch.CallIncoming += new CallIncomingEventHandler(CallIncoming); //Verknüfung            
            Application.Run();            
        }

        private static void CallIncoming(object sender, CallIncomingEventArgs e)
        {
                       
            MainForm.labPhoneNumber.Text = e.TelNumber;
            MainForm.labUserName.Text = e.Name;
            MainForm.ShowDialog();
        }
    }
}

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Yoguto,

lass von deinem zweiten Codebeispiel das mainForm.ShowDialog(); weg und schreibe stattdessen Application.Run (mainForm). Dann ist dein Programm nicht schön, aber es sollte gehen. Schönere Varianten der Kommunikation findest du in Kommunikation von 2 Forms .

Achso, wenn es sein kann, dass CallIncoming in einem exra Thread ausgeführt wird (ich habe ja keine Ahnung, wie CallWatcher implementier ist), musst du die Zugiffe auf das MainForum per Control.(Begin)Invoke ausführen. Siehe Controls von Thread aktualisieren lassen (Invoke-/TreeView-Beispiel) .

herbivore