Announcement

Collapse
No announcement yet.

Form ableiten und Elemente ändern

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

  • Form ableiten und Elemente ändern

    Hallo zusammen!

    Ich habe eine einfache Form erstellt, in der über TrackBars Farben eingestellt werden können und in einem Panel mit einem LinearGradient angezeigt werden.

    Nun möchte ich für eine andere Verwendung noch einen Glow Effekt farblich anpassen können. Ich dachte hierzu die Form abzuleiten, statt des Panel eine schon vorhandenes Button Element, welches schon den Glow Effekt besitzt, anzuzeigen.

    Nun habe ich einige Probleme. Das Panel habe ich nicht manuell erstellt, sondern dem Entwurf des Fensters hinzugefügt, es läßt sich also in der abgeleiteten Form nicht entfernen. Also dachte ich daran, das Panel in einer Methode zu erstellen und dann diese Methode zu überschreiben und statt des Panel den Button zu erstellen.

    Das erste Problem habe ich mit der Position und Größe des Panels. Die Anweisungen
    [highlight=c#]
    panel.Location.X = 15;
    ...
    panel.Size.Width = 200;
    ...
    [/highlight]brachten die Fehlermeldung, dass diese Rückgabewerte nicht geändert werden können, da sie keine Variablen sind.

    Das zweite Problem habe ich, dass die Value_Changed Methoden der Trackbars nun nicht mehr die Refresh Methode des Panels aufrufen können, weil das Panel nicht im Kontext vorhanden ist. Wo im Code muß ich also das Panel erstellen?

    Vielen Dank schon mal für die Hilfe!

    Das erste Problem habe ich gelöst!
    [highlight=c#]
    pnl.Width = 200;
    ...
    pnl.Location = new Point(x, y);
    [/highlight]
    Zuletzt editiert von brown78; 02.05.2009, 19:49.

  • #2
    Ich hab jetzt mal etwas rum probiert. Hab es auch soweit geschafft, das Panel in einer Methode zu erstellen so dass ich es bei bedarf überschreiben kann.
    Jedoch hab ich weiterhin das Problem, dass beim verändern der trackBar Values die pnl.Refresh() Methode nicht aufgerufen werden kann. Wo liegt hier mein Denkfehler? Das ist der Code, der trackBars:
    [highlight=c#]
    private void trkRed_Scroll(object sender, EventArgs e)
    {
    txtRedS.Text = trkRed.Value.ToString();
    redValueS = trkRed.Value;
    pnlColorSample.Refresh();
    }
    [/highlight]

    Muß ich hier dann erst wieder ein Object pnlColorSample erstellen?

    Comment


    • #3
      Also wenn ich das richtige verstehe musst Du Deiner Form ein Variable hinzufügen die Dir die Referenz auf Dein panel speichert.

      Wenn Du sowas machst:

      Code:
      public void FormErstellen()
      {
        Panel panel = new Panel();
        //Panell einstellen
        this.Controls.Add(panel);
      }
      Dann hat nur noch die Controls Auflistung der form den Zeiger auf das Panel. Da noch ein Zeiger existiert wird das Panel auch nicht gelöscht.

      So sollte das funktionieren:

      Code:
      public class MyForm: Form
      {
        Panel panel;
        public void FormErstellen() 
        {
          panel = new Panel();
          //Panell einstellen
          this.Controls.Add(panel); 
        }
      
        public void DeinEventHandler()
        {
          panel.Refresh();
        }
      }

      Comment


      • #4
        Hier mal der Code wie ich das jetzt versucht habe:
        Code:
            public partial class ColorForm : Form
            {
        
                MyPanel pnlColorSample;
        
        
                protected virtual void genPnl()
                {
                    pnlColorSample = new MyPanel();
                    this.Controls.Add(pnlColorSample);
                    pnlColorSample.Location = new Point(15, 228);
                    pnlColorSample.Width = 543;
                    pnlColorSample.Height = 51;
         
                }
        Es heißt hier MyPanel, weil ich das Panel abgeleitet habe um "DoubleBuffered" zu verwenden....

        Jetzt kann ich auch die pnl.Refresh() Methode aus den trackBarValue_Changed() Methoden aufrufen.
        Problem ist nur, dass das Panel nicht in der Form angezeigt wird. Hab die Methode genPnl() aus den Konstruktoren und dem Form_Load Ereignishandler aufgerufen, immer mit dem gleichen Ergebnis...
        Zuletzt editiert von brown78; 06.05.2009, 22:04.

        Comment


        • #5
          Ah! Das Panel ist schon da, nur ohne Farbe! Der Farbverlauf wird im Paint Ereignis erstellt, dieser ist aber noch nicht mit dem jetzt selbst erstellten Panel verknüpft....

          so geht's:

          Code:
                  protected virtual void genPnl()
                  {
                      //pnlColorSample = new MyPanel();
          
                      pnlColorSample = new MyPanel();
                      pnlColorSample.Paint += new PaintEventHandler(pnlColorSample_Paint_1);
                      pnlColorSample.Location = new Point(15, 228);
                      pnlColorSample.Width = 543;
                      pnlColorSample.Height = 51;
                      this.Controls.Add(pnlColorSample);
                  }
          Vielen Dank für die Hilfe!!!

          Comment


          • #6
            Habe noch weitere Schwierigkeiten mit der abgeleiteten Klasse.
            Habe dort eine Instanzvariable angelegt die statt des Panel einen Button mit gleichem Namen erstellt. Anschließend habe ich die Methode, die in der Vaterklasse das Panel erstellt überschrieben und den Button erstellt. Wenn ich nun das Programm im debugging modus starte, kann ich aus dem Menü die abgeleitete Klasse (also die Form) öffnen. Versuche ich aber eine Farbe an der TrackBar einzustellen, bekomme ich einen Fehler, das das Objekt nicht auf eine Objektinstanz gelegt ist. Der Fehler wird in der Vaterklasse angezeigt. Die Fehlerstelle ist rot markiert:
            Code:
                    private void txtRedE_TextChanged_1(object sender, EventArgs e)
                    {
                        NumericTextBox n = sender as NumericTextBox;
                        if (n.IntValue > 255 || n.IntValue < 0)
                        {
                            MessageBox.Show("Sie können nur Werte von 0 bis 255 eingeben.");
                            // TrackBar Position auf  Wert der letzten gespeicherten Farbe setzen
                            trkRedE.Value = redValueE;
                            // Wert in NumericTextBox anzeigen
                            txtRedE.Text = trkRedE.Value.ToString();
                        }
                        else
                        {
                            // TrackBar Position auf eingegebenen Wert setzen
                            trkRedE.Value = n.IntValue;
                            //Farbe einstellen
                            redValueE = trkRedE.Value;
                        }
                        // Panel aktualusieren
                        pnlColorSample.Refresh();
                    }
            Des weiteren kann ich für die abgeleitete Form den Designer nicht nutzen, da ich hier folgenden Fehler gezeigt bekomme:

            Der Dienst System.Windows.Forms.Design.IEventHandlerService ist bereits im Dienstcontainer vorhanden. Parametername: serviceType

            Ich hoffe mir kann hier nochmal jemand etwas Hilfestellung leisten.
            Danke schon mal.

            Comment

            Working...
            X