Entscheidungsfrage...Bitte um Hilfe

NReim

Grünschnabel
Hallo Liebe Forengemeinde

Ich habe momentan ein kleines Problem damit zu kapieren wie ich am besten eine Anwendung schreibe die mehrere Forms beinhaltet und wie ich diese richtig Steuern kann...

Anhand meines geplanten Programmes möchte ich euch darum bitte mir einen vorschlag zu unterbreiten wie man dies am effektivsten lösen könnte ...


Mein vorhaben:

Ich plane ein Programm welches Mehrere Module beinhalten soll ( Mehrere Forms o.ä. )
Ich habe es momentan so gelöst das ich ein SDI erstellt habe in das ich ein TabControll eingefügt habe weil ich es einfach mit meinem jetzigem Kenntnissstand nicht besser umzusetzten wusste ...

Am liebsten hätte ich aber gerne eine Anwendung die mit mehreren Formularen Arbeitet so das ich auf jedem Formular meine benötigten Steuerelemente und Funktionen unterbringen kann. Also habe ich ein MDI erstellt was ja auch soweit kein größeres Problem darstellt, nun stellen sich mir aber einige problemchen in den weg die ich momentan noch nicht zu lösen weiß .

Ich würde meine Anwendung gerne so gestallten das wenn ich über das MenüStrip ein Form aufrufe ( was soweit ja noch kein Problem darstellt ) soll aber zuerst einmal geprüft werden ob das Form bereits geöffnet wurde, wenn ja soll dieses in den Vordergrund gerufen werden ( es soll sich KEIN neues Form öffnen ), es soll somit maximal ein Form jeder Art offen sein.

Wieso würde ich BIS JETZT diese Mehr Form anwendung bevorzugen
Mein Programm soll also mehrere module enthalten welches jedes für sich eine Funktion ausführt ( Kommunikation zwischen zwei Externen Programmen ), die einzelnen Forms müssen momentan noch nicht miteinander kommunizieren.

Und da ich den ganzen Berg an Quellcode momentan nur in einem Form unterbringe wollte ich es so realisieren die einzelnen module für sich zu halten und somit bessere Code übersicht zu behalten...

Problem zusammenfassung:

1. Wie kann ich dafür sorgen das sich jedes Form innerhalb des MDI Containers nur einmal öffnet ?

2. Ist dies eine Akzeptable Programmgestaltung

3. Was könnte man Alternativ machen um eine Ähnliche Programmstruktur zu erstellen


Meine Platformbeschreibung:

Prorgammiersystem: VB2005
Programmiere seit : 2 Monaten mit VB


Habe mich für VB entschieden zwecks Makroprogrammierung der Externen Programme wie EXCEL, WORD, CATIA V5 usw .......


PS: Ich möchte wenn es irgend geht darauf verzichten unmengen an Klassen bzw. dlls zu erstellen, da mein Programm am besten einfach Per EXE Datei anwendbar sein soll..


Ich möchte euch vorab für eure Zeit und Mühe danken ...

Mfg: Nico
 
Also, ein solches Problem würde ich so lösen:

Du erstellst erst mal eine statische Klasse (bzw. eine Singleton Klasse, wie es dir eben gefällt). Die kannst du dann auch zum Datenaustausch unter deinen Forms nutzen. Dort erstellst du dann zB für jedes Form, dass es gibt, eine Boolean-Variable, in der du speicherst, ob das Fenster bereits offen ist. Soll es nun geöffnet werden, überprüfst du, ob die Variable true ist, wenn ja bringst du es in den Vordergrund, wenn nein öffnest du es.

Du kannst auch statt einer Boolean-Varaible eine andere Variable verwenden, in der du den Window-Handle speicherst, damit du das Fenster anhand diesem in den Vordergrund bringen kannst.

lg
 
Ok Das hört sich soweit ganz Logisch an mit der Boolean Variablen für jedes Fenster ...

Mit welchem VB befehl holt man sich das Fenster denn dann wieder nach vorne ?

Und was habe ich unter einer Singleton Klasse zu verstehen !!

Wäre dankbar für ein bisschen Aufklärungsarbeit von euch, da mir diese Themen noch nicht so ganz gut liegen ...

Danke

Mfg: Nico
 
Ok, ich beginnne mal mit der Singleton-Klasse.

Eine Singleton-Klasse ist eine Klasse, die zwar, im Gegensatz zu statischen Klassen, isntanziert wird, allerdings arbeiten alle mit der gleichen Instanz.

Es gibt 2 Möglichkeiten, die zu erstellen. Erstens mit dem Prinzip des Eager Creation und zweitens mit Lazy Creation. Bei Eager Creation wird die Instanz sofort erstellt, bei Lazy Creation erst, wenn sie geraucht wird. Das sieht so aus:

Eager Creation:
Code:
public class Singleton
    {
        private static Singleton instance = new Singleton();

        private Singleton()
        {
        }

        public static Singleton GetInstance()
        {
            return instance;
        }
    }

Lazy Creation:
Code:
public class Singleton
    {
        private static Singleton instance;

        private Singleton()
        {
        }

        public static Singleton GetInstance()
        {
            if (instance == null)
                instance = new Singleton();

            return instance;
        }
    }

Nun zum Fenster:

Das Form, dass das Menü hat, öffnet die anderen Forms ja, daher hast du ihre Objekte. Nun kannst du sie zB mit frmModul1.BringToFront() in den Vordergrund bringen.
 
Alles klar ! Das hilft mir schonmal wieder ein bisschen weiter

Ich werde morgen mal einige deiner Tipps Ausprobieren !

Ich Danke dir aber bis jetzt schonmal sehr für deine Zeit die du investierst !

melde mich morgen nochmal zu wort...


Mfg: Nico
 
Einen schonen guten morgen wünsche ich

Also ich habe das mit den MDI Childs nun folgendermaßen gelöst was bis jetzt auch einwandfrei funtioniert...

Also im MDI-Parent verwende ich nun folgenden Code um die Childs aufzurufen und zu Steuern...
( Hier mal der Code für eins der MDI Childs )

Code:
Public Class Mainform

    Public stl_cidres_load As Boolean
    Public stl_cidres As New stl_cidres

Private Sub ChangeIDResetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChangeIDResetToolStripMenuItem.Click

        If stl_cidres_load = False Then
            stl_cidres.MdiParent = Me
            stl_cidres.Show()
            stl_cidres_load = True
        Else
            stl_cidres.BringToFront()
        End If

    End Sub

End Class

Also wie gesagt es funktioniert soweit ganz gut, ich kann im MDI Parent schön zwischen den einzelnen fenstern hin und her Springen....

Meine Frage an euch hier ...

1. Kann man das so ohne weiteres in der Praxis anwenden oder ist das so eine Untaugliche lösung ?

2. Ich würde noch gerne in die MDI Childs eine Funktion einbauen welche beim schließen dieser die Boolsche Variable die zu dem Jeweiligem Child gehört wieder auf False setzt !

Ich habe momentan soweit gepfuscht das ich die Controls in den Childs deaktiviert habe, so das man sie einfach nicht schließen kann :rolleyes: !!

Wäre dankbar für noch ein paar Tipps von euch !

Mfg: Nico
 
1. Ich/die Firma in der ich arbeite verwendet es so ähnlich in kommerziellen Programmen, kein Problem
2. Aufgrund des wieder auf false setzens sagte ich auch, dass du die Boolean-Variablen in einer statischen Klasse erstellen, oder wenigstens die Variablen in der Klasse statisch deklarieren sollst. Ich glaube, unter VB geht das mit "Final", aber kann ich nicht garantieren, ich arbeite nicht mit VB.

Zugreiffen kannst du auf diese Elemente dann mit Klassenname.Membername

Die Definition in C# sieht so aus:

Code:
public static class Test
{
    public static bool bolTestvariable = false;
}

Zugreiffen kannst auf die dann mit Test.bolTestvariable

Dadurch kannst du dann von deinen ChildWindows aus darauf zugreifen und im FormClosing-Event die entsprechende Variable wieder auf false setzen :D
 
Zuletzt bearbeitet:
Hallo,

ich hätte das Ganze so in etwa gelöst:
Es gibt mehrere Dokumente (IDocument) , die je nach Bedarf Steuerelemente wie TextEditor oder ähnliches enthalten.
Eines dieser Dokumente ist ein Menü-Dokument (MenuDocument) was andere Dokumente über eine Fabrik (DocumentFactory) erzeugt.
In meinem Beispiel wird über Event-Handling von den 2 Dokumenten (EditorDocument / ControlPanelDocument) eine Nachricht an das Menü-Dokument geschickt,
das wiederum an einen Service geht und anschließend auf dem Menü-Dokument angezeigt wird.
Das Anzeigen der Fenster wird über einen Kontroller (DocumentController) geregelt.
Ist ein Fenster von einem bestimmten Typ schon vorhanden so wird KEIN neues Fenster erzeugt, sondern das vorhandene in den Vordergrund gebracht.
Habe ein kleines Projektbeispiel beigefügt.

Gruß Konstantin
 
Zuletzt bearbeitet von einem Moderator:
Super !

Danke euch beiden erstmal recht Herzlich für eure Mühe und Lösungsansätze !

Werde mich morgen wieder an die Arbeit geben und mir eure Beispiel ezu Herzen nehmen


Werde dann hier über meine Ergebnisse berichten !

Mfg: Nico
 
Zurück