none
Schaltflächen deaktivieren RRS feed

  • Frage

  • Hi c# Community,

    ich bin relativ neu in der c# Programmierung...

    Ich übe zur Zeit an einem Programm das dem Office Word ähnelt. Ich versuche es weiter auszubauen indem ich "Speichern" und "Speichern unter" Menüeinträge deaktivieren lassen möchte sobald kein Dokument geöffnet oder erstellt wurde. Dazu habe ich einen counter angelegt der jedes Mal hochgezählt wird sobald ein Dokument geöffnet oder erstellt wurde.

    Das klappt soweit gut dass die Menüeinträge aktiviert werden sobald ein Dokument erstellt oder geöffnet wurde. Wenn die Dokumente aber wieder geschlossen werden hab ich den Salat. Ich weiß nicht wie ich da den counter runterzählen soll geschweige denn wo dann die Überprüfung stattfinden soll...ich dachte mir dass ich den counter mit Hilfe des Destruktors runterzählen kann..aber wo soll dann die Überprüfung hin?

    Mein Hauptcode sieht wie folgt aus:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Word
    {
        public partial class frmMain : Form
        {
            private int counterDokument = 0;
            private int counter = 0;
    
            public frmMain()
            {
                InitializeComponent();
            }
    
            private void menuFileNew_Click(object sender, EventArgs e)
            {
                newDoc();
            }
    
            private void btnNew_Click(object sender, EventArgs e)
            {
                newDoc();
            }
    
            private void newDoc() 
            {
                frmDocument doc = new frmDocument();
                ++counter;
                checker();
                doc.MdiParent = this;
    
                ++counterDokument;
                doc.Text = "Dokument " + counterDokument;
                doc.Show();            
            }
    
            private void MenuArrangeWindow(object sender, EventArgs e) 
            {
                if(sender == menuWindowCascade)
                {
                    this.LayoutMdi(MdiLayout.Cascade);
                }
                else if (sender == menuWindowHorizontal)
                {
                    this.LayoutMdi(MdiLayout.TileHorizontal);
                }
                else
                {
                    this.LayoutMdi(MdiLayout.TileVertical);
                }
            }
    
            private void menuFileClose_Click(object sender, EventArgs e)
            {
                Application.Exit();            
            }
    
            private void OpenDoc(object sender, EventArgs e) 
            {
                DialogResult result = dlgOpen.ShowDialog();
                if(result == System.Windows.Forms.DialogResult.OK && dlgOpen.FileName.Length > 0)
                {
                    frmDocument doc = new frmDocument();
                    ++counter;
                    checker();
    
                    doc.MdiParent = this;
                    doc.Show();
    
                    doc.richTextBox1.LoadFile(dlgOpen.FileName);
                    doc.Text = dlgOpen.FileName;
    
                    doc.Path = dlgOpen.FileName;
                    doc.Content = doc.richTextBox1.Text;
                }
            }
    
            private void SaveDoc(object sender, EventArgs e) 
            {
                frmDocument doc = (frmDocument)this.ActiveMdiChild;
                doc.Save();          
            }
    
            private void menuFileSaveUnder_Click(object sender, EventArgs e)
            {
                frmDocument doc = (frmDocument)this.ActiveMdiChild;
                doc.SaveUnder();
            }
    
            private void toolStripButton4_Click(object sender, EventArgs e)
            {
                //MessageBox.Show("Jetzt wird gedruckt!");
                if (this.ActiveMdiChild == null)
                {
                    MessageBox.Show("Kein Unterfenster da!");
                }
                else 
                {
                    MessageBox.Show("Unterfenster vorhanden!");
                }
                
            }
    
            private void infoToolStripMenuItem1_Click(object sender, EventArgs e)
            {
                MessageBox.Show("© by Christian");
            }
    
            private void checker()
            {
                if (counter > 0)
                {
                    menuFileSave.Enabled = true;
                    menuFileSaveUnder.Enabled = true;
                }
                else
                {
                    menuFileSave.Enabled = false;
                    menuFileSaveUnder.Enabled = false;
                }
            }
        }
    }

    und mein "Dokument"-Code sieht so aus:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Word
    {
        public partial class frmDocument : Form
        {
            public string Path { get; set; }
    
            public string Content { get; set; }
    
            
            public frmDocument()
            {
                InitializeComponent();
            }
    
            ~frmDocument()  
            {
                // counter irgendwie runterzählen
            }
    
    
            public void Save() 
            {
                if(Content != richTextBox1.Text)
                {
                    if (Path == "" || Path == null)
                    {
                        SaveUnder();
                    }
                    else 
                    {
                        richTextBox1.SaveFile(Path);
                        Content = richTextBox1.Text;
                    }
                }
            }
    
            public void SaveUnder() 
            {
                SaveFileDialog dlgSave = new SaveFileDialog();
    
                dlgSave.DefaultExt = "*.rtf";
                dlgSave.Filter = "RTF Dateien|*.rtf";
    
                if(dlgSave.ShowDialog() == System.Windows.Forms.DialogResult.OK && dlgSave.Filter.Length > 0)
                {
                    richTextBox1.SaveFile(dlgSave.FileName);
                    Content = richTextBox1.Text;
                }            
            }
    
            private void frmDocument_FormClosing(object sender, FormClosingEventArgs e)
            {
                if(Content != richTextBox1.Text && MessageBox.Show("Möchten Sie die Änderung speichern?", "Speichern", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Save();
                }
            }
        }
    }


    • Bearbeitet mx5500 Dienstag, 28. Februar 2012 18:11
    Dienstag, 28. Februar 2012 18:11

Antworten

  • Bsp:

    in neuer Datei:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Word
    {
        class YOURCLASS
        {
            public static int counter;
        }
    }

    dann könntest du mit YOURCLASS.counter von ÜBERALL auf ihn zugreifen.

    mit z.b.

    YOURCLASS.counter = 2;

    oder in if satz

    if(YOURCLASS.counter == 2)
    {
    }

    Ich hoffe es geht damit. Ich mache es meistens so benutze aber die WPF, da diese praktischer ist.

    LG

    Tea Time


    • Bearbeitet tea time Dienstag, 28. Februar 2012 20:16
    • Als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 20:16
    • Nicht als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 20:30
    • Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 29. Februar 2012 16:50
    • Als Antwort markiert Marcel RomaModerator Dienstag, 6. März 2012 07:34
    Dienstag, 28. Februar 2012 20:15
  • Hallo mx5500,

    am einfachsten wird es wohl sein, du deklarierst in frmMain einen Eventhandler für das FormClose-Event von frmDocument, in dem du den Counter runterzählst und überprüfst:

            private void frmDocument_Closed(object sender, FormClosedEventArgs e) {
                --counter;
                checker();
            }

    Diesen Eventhandler weist du dem FormClose-Event beim Erzeugen eines neuen frmDocument zu:

                    frmDocument doc = new frmDocument();
                    doc.FormClosed += new FormClosedEventHandler(frmDocument_Closed);
                    ++counter;
                    checker();
    // usw....

    Beim Schließen eines frmDocument wird dein Event-Handler im frmMain aufgerufen, wo du einfach runterzählen kannst.

    Im Destruktor wird in .NET eigentlich fast nie Code geschrieben (zumindest nicht für Sachen wie Zähler runterzählen, etc.), weil man nicht weiss, wann der Destruktor aufgerufen wird (siehe auch Destruktoren (C#-Programmierhandbuch)).

    Gruß

    Peter

    Dienstag, 28. Februar 2012 23:51

Alle Antworten

  • Hallo,

    Entschuldige, habe Code nur überflogen....

    LG

    Tea Time

    • Als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 19:04
    • Nicht als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 19:20
    • Bearbeitet tea time Dienstag, 28. Februar 2012 19:22
    Dienstag, 28. Februar 2012 19:02
  • Das ist nicht das Problem..wenn du dir den checker()-Block anguckst siehst du ja schon dass ich damit arbeite..mein Problem beschränkt sich darauf wie ich es wieder deaktivieren kann sobald kein Dokument mehr geöffnet(wie man nen Button deaktivieren weiß ich..).

    Dienstag, 28. Februar 2012 19:16
  • Hallo,

    Theoretisch könntest du die Variable in eine neue Klasse auslagern, welche public ist.

    Darauf könntest du aus jedem Dokument zugreifen, und überall runterzählen :)

    Wenn du ein Beispiel brauchst, sags mir.

    LG

    Tea Time

    Ps: Hoffe, ich habe nicht schon wieder das Thema verfehlt...


    • Bearbeitet tea time Dienstag, 28. Februar 2012 19:27
    Dienstag, 28. Februar 2012 19:25
  • Das klingt diesmal plausibel!

    Ein kleines Beispiel wäre ganz nett!

    Elegant wäre es natürlich wenn man den Konstruktor und den Destruktor wie folgt anpassen würde:

    public frmDocument()
            {
                InitializeComponent();
                ++counter;
                if (counter > 0)
                {
                    menuFileSave.Enabled = true;
                    menuFileSaveUnder.Enabled = true;
                }
                else
                {
                    menuFileSave.Enabled = false;
                    menuFileSaveUnder.Enabled = false;
                }
            }
    
            ~frmDocument()  
            {
    
                --counter;
                if (counter > 0)
                {
                    menuFileSave.Enabled = true;
                    menuFileSaveUnder.Enabled = true;
                }
                else
                {
                    menuFileSave.Enabled = false;
                    menuFileSaveUnder.Enabled = false;
                }
            }

    Allerdings wüsste ich nicht wie ich den Button aus der anderen Form (liegt nicht in frmDocument sondern frmMain) ansprechen könnnte?
    Gruß

    Christian

    Dienstag, 28. Februar 2012 20:01
  • Bsp:

    in neuer Datei:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Word
    {
        class YOURCLASS
        {
            public static int counter;
        }
    }

    dann könntest du mit YOURCLASS.counter von ÜBERALL auf ihn zugreifen.

    mit z.b.

    YOURCLASS.counter = 2;

    oder in if satz

    if(YOURCLASS.counter == 2)
    {
    }

    Ich hoffe es geht damit. Ich mache es meistens so benutze aber die WPF, da diese praktischer ist.

    LG

    Tea Time


    • Bearbeitet tea time Dienstag, 28. Februar 2012 20:16
    • Als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 20:16
    • Nicht als Antwort vorgeschlagen tea time Dienstag, 28. Februar 2012 20:30
    • Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 29. Februar 2012 16:50
    • Als Antwort markiert Marcel RomaModerator Dienstag, 6. März 2012 07:34
    Dienstag, 28. Februar 2012 20:15
  • Jetzt hätten wir somit das Problem mit dem Counter behoben. Bleibt noch das Problem das ich den Button aus der frmMain aus der frmDocument ansprechen kann?
    Dienstag, 28. Februar 2012 20:57
  • Hallo mx5500,

    am einfachsten wird es wohl sein, du deklarierst in frmMain einen Eventhandler für das FormClose-Event von frmDocument, in dem du den Counter runterzählst und überprüfst:

            private void frmDocument_Closed(object sender, FormClosedEventArgs e) {
                --counter;
                checker();
            }

    Diesen Eventhandler weist du dem FormClose-Event beim Erzeugen eines neuen frmDocument zu:

                    frmDocument doc = new frmDocument();
                    doc.FormClosed += new FormClosedEventHandler(frmDocument_Closed);
                    ++counter;
                    checker();
    // usw....

    Beim Schließen eines frmDocument wird dein Event-Handler im frmMain aufgerufen, wo du einfach runterzählen kannst.

    Im Destruktor wird in .NET eigentlich fast nie Code geschrieben (zumindest nicht für Sachen wie Zähler runterzählen, etc.), weil man nicht weiss, wann der Destruktor aufgerufen wird (siehe auch Destruktoren (C#-Programmierhandbuch)).

    Gruß

    Peter

    Dienstag, 28. Februar 2012 23:51
  • Vielen Dank Peter jetzt funktioniert es einwandfrei!
    Mittwoch, 29. Februar 2012 13:15