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();
}
}
}
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 😁 :]
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();
}
}
}
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