Windows Forms Dialog starten

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

ich möchte einen Dialog aus der Hauptklasse heraus starten.
Die Hauptklasse ist wiederum von einem Dialog eines anderen Prozesse gestartet worden.

Das ist mir auch gelungen.
Hier die Dialogklasse die in der Hauptklasse deklariert habe.
C#:
private FmsInterfaceDlg clFmsIfMainDlg;
Dann wird in der Hauptklasse über eine Funktionsaufruf die Dialogklasse initialisiert und geöffnet.
C#:
public int OpenMainDlg(string strWinState)
        {
            int iRet = 0;

            System.Windows.Forms.Application.EnableVisualStyles();
            clFmsIfMainDlg = new FmsInterfaceDlg(BWindowMode); //Standardkonstruktor wird aufgerufen
            clFmsIfMainDlg.RpcIfMain = this;
            clFmsIfMainDlg.WindowMode = BWindowMode; //Gibt an ob die Anwendung als Windows Anwendung oder als Dll gestartet wurde
            clFmsIfMainDlg.WinState = strWinState;
            clFmsIfMainDlg.ShowDlg = BShowDlg;
            clFmsIfMainDlg.DlgTitel = strDlgTitel;
            clFmsIfMainDlg.Trace = clTrace;
            clFmsIfMainDlg.ShowDialog(); //LoadDialog wird aufgerufen

            return iRet;
        }
Was mir nicht gefällt ist, dass das Dialogfenster die dahinterliegenden Dialogfenster sperrt.
Das sollte nicht so sein.
Ich kenne aus meiner MFC Zeit, dass man Dialogfenster im Modus "Modal" oder "Nicht Modal" aufrufen kann.
Gibt es diese Option bei C# auch?

Vielen Dank für eure Hilfe.
Grüße von CopWorker
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

vielen Dank für den Tipp.
Das war einfach. Fast zu einfach um drauf zu kommen.

Grüße von CopWorker
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

dann kann man doch nach dem Öffnen oder vor dem Schließen des Dialogfensters, je nachdem aus welchem Winkel man das betrachtet, nochmal nachfragen mit welcher Methode das Dialogfenster geöffnet wurde.
Oder muss ich das in der Anwendung merken?

Grüße von CopWorker
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

das habe ich bereits verwendet.
Sorry, habe ich versäumt zu erwähnen.

C#:
if (clRpcIfMain.RpcIfMainDlg.Modal)
                clQueHdl.TransmitMsg2Dialog = false;

Mein Problem hierbei ist, dass der Dialog in einer Dll liegt.
Je nach Dll Version kann das Dialogfenster mit .Show() oder .ShowDialog() aufgerufen werden.
Das weiß der übergeordnete Prozess nicht. Dadurch kann sich der das nicht merken.

Grüße von CopWorker
 

Zvoni

Erfahrenes Mitglied
Ähhh pfui bääähhhhh.....
Dialoge/Fenster in einer DLL.....
Kann ich leiden wie Bauchweh......

OK, ich bin kein .NET-ler, und war auch definitiv nie ein C-ler (C, C++, C# egal welches C), deshalb kann ich dir konkret dazu nix sagen.

Ich kann dir nur sagen, wie ich es machen würde (in meinem Fall in FreePascal/Lazarus), oder wie du es machen könntest, falls du der Autor der DLL bist:
Ich würde wahrscheinlich eine Public Methode (bzw. den Constructor) erzeugen, mit welcher ich einen optionalen Parent mitschicke: Ist ein Parent vorhanden, ist es modal, kein Parent vorhanden modeless.
In der aufrufenden Klasse/Form würde ich eine Property machen "ModalCall" oder sowas, welches ich je nach Aufruf True oder False setze.
Gibt's mehrere Wege sowas zu machen
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

deine ersten Zeilen zu interpretieren fällt mir nicht schwer.
Da habe ich aber gut im Griff.
Ich benutze keine Windows Forms Vorlage zum Erstellen des Projekts sondern `ne Windows Konsolenanwendung. Zu der Main Klasse packe ich die Dialogklasse obendrauf. Wie in guten alten Zeiten mit C-WinApi oder C++.

Mein Lösung:
C#:
clRpcIfMain.DlgOpenModal = false;
            iRet = clRpcIfMain.OpenMainDlg(strWinState);

            //Nur wenn der Dialog mit .ShowDialog() geöffnet wurde
            if(clRpcIfMain.DlgOpenModal)
                clQueHdl.TransmitMsg2Dialog = false;

Da ich der Autor der Dll jetzt bin, denn die Dll habe ich jetzt selber geschrieben,
gebe ich der Main Klasse mit wie sich die Dialogklasse bzw. der Dialog verhalten soll.

So geht´s auch.
Trotzdem vielen Dank.
Grüße von CopWorker
 

Neue Beiträge