none
Verbergen und wieder aktivieren einer Form RRS feed

  • Frage

  • Hallo zusammen

    ich bin relativ neu in der .NET Programmierung, und hänge seit 3 Tagen an einem Problem, worüber ich bei meiner Suche nicht so richtig was gefunden habe. Ich bitte im vorraus schon mal um Entschuldigung, sollte das Problem an anderer Stelle schon beschrieben sein und ich habe es nur nicht gefunden.

    ich möcht aus einer Startform ( StartView() ) durch drücken eines bestimmten Buttons eine weitere Form öffnen.

    private void btnAddition_Click(object sender, EventArgs e)
            {
                Properties.Settings.Default.UsedOperation = "Addition";
                new Kopfrechnen().ShowDialog();
            }

    nun soll die Start - Form etweder gesperrt sein, oder nicht mehr sichtbar sein. beides bekomme ich hin. jedoch wenn das 2. Fenster geschlossen wird, soll das erste (startView) wieder sichtbar werden und benutzbar. Dies ist aber in all meinen Versuchen Fehlgeschlagen. Wie kann sowas aussehen?

    Das 2. Problem habe ich beim Schließen der 2. Form. in dem Code der Form läuft ein Timer, der nach bestimmter Zeit eine Message Box öffnet. Wenn durch ein ereignis der  Timer startet und das Form geschlossen wird ( mit schließen Button) so läuft der Timer immer weiter und giebt die Message Box aus. Wie kann man alle Funktionen des Formulars stoppen, wenn es, auch während der Laufzeit, geschlossen wird?

    Samstag, 13. Oktober 2012 08:16

Antworten

  • Hallo,

    In meinem obigen Beispiel bin ich davon ausgegangen, dass Form2 alles erledigt und Form1 einfach nur Form2 instanziiert und anzeigt. Sobald sich der Sichtbarkeitsstatus von Form2 ändert wird auch der Sichtbarkeitsstatus von Form1 verkehrt. Eine unsichtbare Form-Instanz bleibt weiterhin im Speicher solange man nicht Form.Close() aufruft, der Benutzer oder das System die Form nicht schließen. Wenn Du die Form-Instanz also nicht mehr brauchst, schließe sie. Wenn das Erstellen einer neuen Instanz jedoch Ressourcen verbraucht, die Du ersparen möchtest, verberge Form2 und mache sie aus Form1 nur sichtbar bei Bedarf. Code in Form1:

    Form2 f2;
    
    private void buttonStartView_Click(object sender, EventArgs e)
    {
        if (f2 == null) {
            f2 = new Form2();
            f2.ShowDialog(this);
        }
        else
        {
            if (!f2.Visible) {
                f2.Owner = this;
                f2.Visible = true;
            }
        }
    }
    

    Gruß
    Marcel

    • Als Antwort markiert kudlmudl Sonntag, 14. Oktober 2012 12:21
    Sonntag, 14. Oktober 2012 09:10
    Moderator

Alle Antworten

  • Hallo,

    Starte die zweite Form über f2.Show(this) oder f2.ShowDialog(this). Das übergebene this bezieht sich in diesem Fall auf den Owner des anzuzeigenden Fenster. Diesen Verweis benutzt Du dann in der zweiten Form (s. Methode ToggleState) um bequem auf die erste Form zuzugreifen. Timer.Enabled machst Du abhängig vom Sichtbarkeits-Status von Form2:

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2(){
                InitializeComponent();
            }
    
            private void Form2_Load(object sender, EventArgs e) {
                this.BringToFront();
            }
    
            private void timer1_Tick(object sender, EventArgs e) {
                MessageBox.Show("Timeout");
            }
    
            private void ToggleState(bool state) {
                timer1.Enabled = state;
                this.Owner.Visible = !state;
            }
    
            private void Form2_VisibleChanged(object sender, EventArgs e) {
                ToggleState(this.Visible);
            }
    
            private void Form2_FormClosed(object sender, FormClosedEventArgs e) {
                ToggleState(false);    
            }
    
            private void buttonMakeInvisible_Click(object sender, EventArgs e){
                this.Visible = false;
            }
        }
    }


    Nachtrag: Wenn Du die Form über den buttonMakeInvisible_Click-Handler unsichtbar machst, mußt Du die Form natürlich über die erste Form erst wieder sichtbar machen. Sonst endet das Ganze mit einer großen Anzahl von unsichtbaren Fenstern, die Ressourcen binden, was über kurz oder lang zu Speicher- und anderen Problemen führen kann.

    Gruß
    Marcel

    Samstag, 13. Oktober 2012 08:59
    Moderator
  • Hallo, ich würde an deiner Stelle das FormClosing-Event (oder FormClosed) abfangen:

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm2 = new Form2();
                frm2.FormClosing += frm2_FormClosing;
                Hide();
                frm2.Show(this);
            }
    
            void frm2_FormClosing(object sender, FormClosingEventArgs e)
            {
                //MessageBox.Show("Form2 closing");
                Show();
            }

    Damit kannst dann deine Form wieder einblenden.

    Für ein eifaches deaktivieren der Form musst du nur ShowDialog(this) aufrufen, dann wird Form2 Modal geöffnet und der Benutzer kann nichts mehr in Form1 machen, bis Form2 wieder geschlossen ist.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 13. Oktober 2012 09:08
    Moderator
  • Hi kudl,

    hatte mal ein ähnlichers Problem. Falls Dir dieser Lösungsansatz nicht genügt, einfach noch einmal melden. Ich hatte das damals dann so gelöst, dass ich mir eine staische Klasse erstellt hatte, die die aktuelle Form aufnimmt und ich zwischen den Formen frei hin- und her schalten konnte.

    Bsp.:

        internal static class cGlobal
        {
            
            static Form fm;
            static string letzteForm;
            static bool zeigeStartform;
           
    
             public static Form FM
            {
                get { return (fm); }
                set { fm = value; }
            }
             public static string LastForm
            {
                get { return (letzteForm); }
                set { letzteForm = value; }
            }         
            
           
             public static bool ZeigeStartForm
             {
                 get { return (zeigeStartform); }
                 set { zeigeStartform = value; }
             }
         }

    aufgerufen wurde die entsprechende Form jeweils über ein Toolstripmenü.

    Bsp.:

            private void hangmanToolStripMenuItem_Click(object sender, EventArgs e)
            {
                ToolStripMenuItem tmi = (ToolStripMenuItem)sender;
                Form fm = null;
                if (tmi.Name == "hangmanToolStripMenuItem")
                {
    
                        fm = new frmHangman(cGlobal.International);
                }
                else
                {
                    fm = new frmMemory(cGlobal.International);               
                }
                openForm(fm);
            }

    Den Timer solltest Du mit Timer1.Stop() anhalten können.

    Hoffe, das hilft Dir weiter.

    Gruß

    Ralf


    • Bearbeitet Ralf A Samstag, 13. Oktober 2012 09:26
    Samstag, 13. Oktober 2012 09:23
  • Nachtrag: Wenn Du die Form über den buttonMakeInvisible_Click-Handler unsichtbar machst, mußt Du die Form natürlich über die erste Form erst wieder sichtbar machen. Sonst endet das Ganze mit einer großen Anzahl von unsichtbaren Fenstern, die Ressourcen binden, was über kurz oder lang zu Speicher- und anderen Problemen führen kann.

    Gruß
    Marcel

    Danke für euere Antworten, waren alle hilfreich.

    2 Fragen an Marcel

    1. kann ich das this.Visible = true; auch in eine Form.Closed Ereignis einbinden? Somit würde sich das im ersten Form erübrigen.

    2. Wenn ich das Frm Schließe (Rotes Kreuz ) öffnen sich dann trotzdem unsichtbare Fenster? Ich dachte damit verschwindet diese Instanz aus dem Speicher.


    SisualStudio express 2012 C#

    Sonntag, 14. Oktober 2012 08:51
  • Hallo,

    In meinem obigen Beispiel bin ich davon ausgegangen, dass Form2 alles erledigt und Form1 einfach nur Form2 instanziiert und anzeigt. Sobald sich der Sichtbarkeitsstatus von Form2 ändert wird auch der Sichtbarkeitsstatus von Form1 verkehrt. Eine unsichtbare Form-Instanz bleibt weiterhin im Speicher solange man nicht Form.Close() aufruft, der Benutzer oder das System die Form nicht schließen. Wenn Du die Form-Instanz also nicht mehr brauchst, schließe sie. Wenn das Erstellen einer neuen Instanz jedoch Ressourcen verbraucht, die Du ersparen möchtest, verberge Form2 und mache sie aus Form1 nur sichtbar bei Bedarf. Code in Form1:

    Form2 f2;
    
    private void buttonStartView_Click(object sender, EventArgs e)
    {
        if (f2 == null) {
            f2 = new Form2();
            f2.ShowDialog(this);
        }
        else
        {
            if (!f2.Visible) {
                f2.Owner = this;
                f2.Visible = true;
            }
        }
    }
    

    Gruß
    Marcel

    • Als Antwort markiert kudlmudl Sonntag, 14. Oktober 2012 12:21
    Sonntag, 14. Oktober 2012 09:10
    Moderator
  • Danke, ich denke nun funktionierts.  

    SisualStudio express 2012 C#

    Sonntag, 14. Oktober 2012 12:21