Announcement

Collapse
No announcement yet.

Mehrere Formulare

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrere Formulare

    Hallo zusammen,

    ich habe da ein kleines Problem:

    Ich habe in meinem "MainForm" eine kleine Routine zum anzeigen von ApplicationEvents. Das Ganze wir dem Benutzer in einer Listview angezeigt. Jetzt besitzt diese Anwendung mehrere Formulare. Bei Fehlern (z.B. Eingabe) erscheint zwar eine Meldung, aber dieser Fehler soll auch in der Listview-Komponenten innerhalb meines MainForm protokolliert werden. Denn diese Listview kann bei Bedarf vom User gespeichert werden. Wie stelle ich es jetzt an, dass ich die Routine Logging in meiner MainForm auch aus einem anderen Formular ansteuern kann? Ich habe diese Routine schonmal als public definiert, aber irgendwie habe ich aus dem 2. Formular keinen Zugriff auf diese Funktion. Was mache ich falsch?

    Gruß

    Sascha

  • #2
    Hi
    <P>
    Wie versuchst Du die Methode aufzurufen?
    <P>
    Wenn die Methode statisch ist kann man sie so aufrufen:
    <PRE>
    Form2.EineStatischeMethode();
    </PRE>
    Falls es eine Instanz Methode ist muss der Aufruf auf einer bestimmten Instanz erfolgen:
    <PRE>
    Form2 f2 = new Form2();
    f2.EineInstanzMethode();
    </PRE>
    Kommt drauf an was deine Methode macht, aber in 99% der Fälle ist es KEINE statische.
    Ich schreibe das, weil es häufig vorkommt, das eine Methode statisch gemacht wird, obwohl es nicht sinnvoll ist.
    <P>
    Simo

    Comment


    • #3
      Hi Simon,

      also folgendes:

      Meine Funktion in meiner MainForm Klasse:

      <pre>
      public void Logging(string Message, int ImageIndex)
      {
      ListViewItem msgRecord = new ListViewItem( DecodeTimeStamp() + " --> " + Message, ImageIndex );
      livMessages.Items.Add( msgRecord );
      livMessages.EnsureVisible( livMessages.Items.Count-1 );
      if ( livMessages.Items.Count >= 100 )
      {
      livMessages.Items.Clear();
      livMessages.Refresh();
      }
      }
      </pre>

      Und jetzt der Part aus meinem 2. Formular:

      <pre>
      private void btnLogon_Click(object sender, System.EventArgs e)
      {
      if ( txbUsername.Text.Length > 0 || (txbUsername.Text != " " && txbUsername.Text != "") )
      {
      this.Dispose(true);
      }
      else
      {
      lbaMessage.Text = "Anmeldung nicht erfolgreich";
      txbUsername.Focus();

      // Hier soll die Funktion Logging aus dem MainForm aufgerufen werden . . . ? ? ?
      }
      }

      </pre>

      Gruß

      Sasch

      Comment


      • #4
        Dann musst Du der Form2 beim Konstruktor oder so ein Referenz auf die MainForm Instanz mitgeben.
        <PRE>
        class Form2 : Form {

        private MainForm mainForm = null;

        public Form2(MainForm mainForm) {
        this.mainForm = mainForm;
        InitializeComponets();
        }

        private btnLogon_Click(object sender, EventArgs e) {
        // ...
        mainForm.Logging("ein text", 23);
        }
        }
        </PRE>
        Beim erzeuge der Form2 Instanz sieht das nun so aus falls sie in der MainForm erzeugt wird:
        <PRE>
        Form2 form2 = new Form2(this);
        </PRE>
        Simo

        Comment


        • #5
          Hallo Simon,

          erstmal vielen Dank für Deine Hilfe. Darf ich Dir mal einige Fragen stellen? Da Du mir ja nicht direkt antworten kannst, tue ich es einfach mal, und hoffe das Du antwortest.

          Also um nochmal auf das obige Problem einzugehen, ich persönlich finde es recht umständlich, immer am Konstruktor der jeweiligen Form rumzudoktern. Gibt es wirklich keine andere Möglichkeit, denn der Konstruktor könnte je nach Aufgabenstellung ziemlich viele Parameter aufnehmen usw.

          Aber jetzt mal zu meinen eigentlich Fragen:

          Woher weisst Du all diese Dinge? Welche Bücher hast Du Dir besorgt? Wie lange arbeitet Du schon mit C#? Kann man die Garbage Collector so wie bei C++ steuren, denn alle meine Anwendungen nehmen sich beim Starten locker mal 18 MB Ram, wenn ich dann mit der Anwendung arbeite bin ich locker bei 25 MB RAm und es ist kein Ende in Sicht, denn eine Freigabe erfolgt sehr selten, und auch so im Bereich von 4 - 10 KB. Um nicht mehr benötigte Teile des Programms aus dem Speicher zu entfernen, was tut man da am besten? Macht mein ein Close oder besser ein Dispose, oder gibt es eine bessere Möglichkeit?

          Und wo siehst Du persönlich die Stand der Sprache C# in der Zukunft. Lohnt es sich bei Dieser Sprache zu bleiben (generell bei .NET), oder sollte man beim Alten bleiben (C++) mit all seinen APIs und COMs usw.?

          Sorry das ich Dir so viele Fragen stelle, aber Dein Name kommt mir immer wieder entgegen, was mir sgat, dass Du hier im Forum ziemlich aktiv bist. Und bisher hatte ich wenig Probleme mit neuen Sprachen, aber bei .NET ist einiges halt anderes, wo ich auch sagen muss, dass sehr vielle Dinge einfach einfacher geworden sind als bislang.

          Danke Dir

          Gruß

          Sasch

          Comment


          • #6
            Hallo
            <P>
            >>..keine andere Möglichkeit, denn der Konstruktor könnte..
            <P>
            Doch, man könnte mit Events, bzw. Delegates arbeiten. Funktioniert im Prinzip dann ähnlich.
            <P>
            Ich habe ein allgemeines Buch über C#, ein .NET Remoting Buch (MS Press), ein .NET Networking Buch (Wrox), ein C++ Buch, eines über verteilte Objekt Systeme, eines üebr Managed Extensions (MC++ auch MS Press), usw.
            <P>
            Die meisten habe ich zu 3/4 gelesen und benütze sie jetz als Nachschlagewerk.
            <P>
            Ich befasse mich etwa seit zwei Jahren (denke ich) mit C#, MC++, VB.NET.
            <P>
            Die Garbage Collection gibt den Speicher schon wieder frei, wenn es nötig ist. Es ist nicht sinnvoll (oder nur in ganz wenigen Fällen) die Garbage Collection zu forciern. Die Garbage Collection hat eigene, optimierte Algorithmen für ihre Aufgabe.
            <P>
            >> ... Stand der Sprache C# in der Zukunft...
            <P>
            Das ist eine schwierige Frage. Ich denke, das .NET auf dem Vormarsch ist und das "Hype" Stadium überstanden hat. Aber es auch sicher so, dass es viele "alte" System gibt, und da überlegt man sich zwei mal ob man alt mit neu kombinieren soll, portieren soll oder halt eben bei alt bleibt (was auch immer "alt" ist).
            Naja, ist meine Meinung...
            <P>
            Gruss Simo

            Comment

            Working...
            X