Announcement

Collapse
No announcement yet.

BackColor der instanzierenden Form in new Form übernehmen?

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

  • BackColor der instanzierenden Form in new Form übernehmen?

    Hallo, als Neuling in diesem Forum, begrüsse ich alle anderen Forumsteilnehmer, und hoffe auf gute, für beide Seiten unterhaltsame und lehrreiche Zusammenarbeit.

    Dies nun, ist meine erste Frage: ;-)

    Ich habe (zu Lernzwecken) zwei WinForms erstellt. In der zweiten Form ,die als "new Form" von der BasisForm aus (kein MDI-Parent)
    instanziert wurde, möchte ich die Hintergrundfarbe der BasisForm in einem Panel (als BackColor) übernehmen, und nach der Veränderung duch den Anwender, wieder an die diese übergeben.

    Wie kann ich nun die Hintergrundfarbe der BasisForm in der zweiten Form ansprechen?

    <PRE>this.pnlOldColor.BackColor = "Hintergrundfarbe der BasisForm"</PRE>

    Irgendiwe benötige ich einen Objektverweis???

    Vielen Dank für jede Hilfe!

    Gruss, Chrisch

  • #2
    Hallo,

    &gt;Wie kann ich nun die Hintergrundfarbe der BasisForm in der zweiten Form ansprechen?

    eine Möglichkeit besteht darin, dass das 2. Formular einen überladenen Konstruktor nutzt, bei dem der Verweis auf das 1. Formular als Parameter übergeben wird. Wenn dann die Panel-Instanz im 1. Formular über die Eigenschaft <b>Modifiers</b> veröffentlicht wird (Wert <b>public</b> für diese Eigenschaft im Properties-Editor auswählen), kann das 2. Formular die Farbe direkt auslesen:
    <pre>
    <b>public</b> Form2()
    {
    <font color="#003399"><i>//</i></font>
    <font color="#003399"><i>// Required for Windows Form Designer support</i></font>
    <font color="#003399"><i>//</i></font>
    InitializeComponent();
    <font color="#003399"><i>//</i></font>
    <font color="#003399"><i>// TODO: Add any constructor code after InitializeComponent call</i></font>
    <font color="#003399"><i>//</i></font>
    }
    <br>
    <b>public</b> Form2(Form1 aParentFrm)
    {
    <font color="#003399"><i>//</i></font>
    <font color="#003399"><i>// Required for Windows Form Designer support</i></font>
    <font color="#003399"><i>//</i></font>
    InitializeComponent();
    panelChildForm.BackColor = aParentFrm.panelMainForm.BackColor;
    }
    </pre>
    Der Aufruf im 1. Formular sieht dann so aus:
    <pre>
    <b>private</b> <b>void</b> button2_Click(<b>object</b> sender, System.EventArgs e)
    {
    Form2 aFrm2 = <b>new</b> Form2(<b>this</b>);
    aFrm2.Show();
    }
    </pre&gt

    Comment


    • #3
      Hallo Andreas,

      danke für die Antwort.

      Nachdem ich zwischenzeitlich selbst "erkannt" hatte, dass schließlich auch die Form ein Objekt ist, habe ich ein ähnliches Konstrukt entwickelt:

      <PRE>
      using ...
      namespace ...
      {
      public class Form2 : System.Windows.Forms.Form
      {
      /// <summary>
      /// Erforderliche Designervariable
      /// </summary>
      private System.ComponentModel.Container components = null;
      ......
      ......
      ......
      <B>private System.Windows.Forms.Form Form1;</B>
      }


      public Form2(<B>Form1 ParentForm</B>)
      {
      //
      // Erforderlich für die Unterstützung des Windows Forms-Designer
      //
      InitializeComponent();
      <B>Form1 = ParentForm;</B>

      }


      private void <B>Form2_Load</B>(object sender, System.EventArgs e)
      {
      try
      {
      this.pnlColorNew.BackColor = Color.FromArgb((int)hscRot.Value, (int)hscGruen.Value, (int)hscBlau.Value);
      this.pnlColorOld.BackColor =<B> Form1.BackColor</B>;

      }
      catch
      {
      //Exception
      }
      }


      .............
      .............

      /*
      Der RGB-Farbwert kann durch ScrollBars bzw. TextBoxen verändert werden,
      und wird an das Panel pnlColorNew als BackColor übergeben
      */

      .............
      .............

      //
      // Durch Klicken des OK-Buttons wird der veränderte Farbwert an Form 1 übergeben
      //

      public void btnIndivColorOK_Click(object sender, System.EventArgs e)
      {
      <B>Form1.BackColor</B> = this.pnlColorNew.BackColor;
      }


      .............
      .............</PRE>

      Soweit funktioniert das Ganze recht gut ... Wenn ich jetzt aber versuche nicht die Eigenschaften von Form1 direkt, sondern z.B. von Panel pnlForm1 zu verändern, --- stehe ich vor dem gleichen Problem, wie am Anfang ;-(

      "pnlForm1 besteht nicht in der Klasse Form2" (Das gleiche gilt auch für Dein Beispiel)

      Wie also gebe ich die veränderten Werte zurück?

      Gruss und Dank, Chrisc

      Comment


      • #4
        Du kannst von deiner Form1 nicht auf die privaten Variablen deiner Form2 zugreifen, auch wenn du eine Referenz auf Form2 hast.

        Was tun ?

        1. Du kannst nun natürlich einfach die Sichtbarkeit deiner Buttons,Pannels,Textboxen auf Public ändern.

        2. Du schreibst dir eigene Get/Set Methoden bzw. Properties für die Controls deiner Wahl.
        zb.

        public Color ButtonForeColor{
        get{ return this.button1.ForeColor;}
        set{ this.button1.ForeColor = value;}}

        ---

        Falls dir übrigens die Methode mit einem überladenen Konstruktur nicht gefällt um eine Referenz auf Form2 in Form1 zu bekommen, so könntest du dir auch eine statische Methode in Form2 einbauen:

        public static Form2 GetInstance()
        {
        if(instance == null)
        {instance = new Form2();}
        return instance;
        }

        Instance definierst als Form2 , also private static Form2 instance;

        Hoffe etwas weitergeholfen zu haben

        Comment


        • #5
          Hallo zusammen,

          @ Andreas: <B>Ich muss mich korrigieren und entschuldigen! - Dein Code funktioniert doch!</B><BR><BR>Ich habe, wie gesagt, <B>vor</B> der Antwort selbst ein (teil-funktionierendes) Konstrukt erstellt - und dann beides miteinander vermischt...<BR><BR>Zukünftig heißt meine Devise: beser lesen ;-)<BR><BR>

          @ H.J.: Danke für die Antwort. Soweit bin ich zwar noch nicht, aber in meiner "Verzweiflung" bin ich dem Ganzen trotzdem nachgegangen - und habe neue Ansatzmöglichkeiten entdeckt. Im Besonderen gefällt es mir tatsächlich nicht, die Modifier der Controls als "public" zu kennzeichnen.

          Vielen Dank und Grüsse, Chrisc

          Comment

          Working...
          X