Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Eine Instanz für das ganze Programm
Yoguto
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

Eine Instanz für das ganze Programm

beantworten | zitieren | melden

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();
        }
    }
}
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

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.
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Yoguto
myCSharp.de - Member



Dabei seit:
Beiträge: 25

Themenstarter:

beantworten | zitieren | melden

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();
        }
    }
}
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers