Laden...

Problem beim Zugriff auf die Form von einer Klasse

Erstellt von suk3 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.558 Views
Thema geschlossen
S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren
Problem beim Zugriff auf die Form von einer Klasse

Hallo,

mein Problem besteht darin, das ich nicht von der Klasse Kurve auf die Form zugreifen kann.
Ich muss von der Kurve auf die Form zugreifen um den pen zu verändern, der in der List gespeichert wird.
(wer den Quellcode testet, wird merken, dass sobald die Form neu geladen wird alle Objekte danach die gleiche Farbe und Größe haben)

edit: Ich möchte von der Kurve spezifisch vom pen aus der Kurve auf die form zugreifen damit ich die inhalte der comboboxen einfügen kann.
von allen anderen klassen kann ich mit Object sender auf und form1 thisform = (form1)sender auf die form zugreifen, doch wenn ich dies in der Klasse Kurve eintrage bekomme ich nur Fehlermeldungen der Klassen, die auf die Kurve zugreifen.

Ich hoffe es ist relativ verständlich erklärt.

MfG
Kai

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;


namespace meinErstesCAD
{

    public partial class Form1 : Form
    {
        public List<Kurve> m_elementListe;
        public int ItemCombo;
        public string ItemComboColor;
        

        public Form1()
        {
             m_elementListe = new List<Kurve>();
        }

             private void Form1_Paint(object sender, PaintEventArgs e)
        {         
            foreach (Kurve element in m_elementListe)
            {
                element.ZeichneDich(e.Graphics);
            }
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Items.AddRange(new string[]{"red", 
      "black", "green", "yellow", "white","blue"});
            // Starteintrag der Combobox 
            comboBox1.SelectedIndex = 1;
            ItemComboColor = comboBox1.SelectedItem.ToString();

            comboBox2.Items.AddRange(new string[]{"1", 
      "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", });
            // Starteintrag der Combobox 
            comboBox2.SelectedIndex = 1;
            ItemCombo = Convert.ToInt32(comboBox2.SelectedItem.ToString());
        }

 
         private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ItemCombo = Convert.ToInt32(comboBox2.SelectedItem.ToString());
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ItemComboColor = comboBox1.SelectedItem.ToString();
        }

         }
                 

        public void clsLineRectangle_OnMouseUp(Object sender, MouseEventArgs e)
        {
            Form1 thisform = (Form1)sender;
            Graphics g = thisform.CreateGraphics();
            g.SmoothingMode = SmoothingMode.HighQuality;
            //g.Restore(transState); 
            Pen m_pen = new Pen(Color.FromName(thisform.ItemComboColor), thisform.ItemCombo);
            
        }
    }

public class Kurve
    {
        protected Pen m_pen;
    
       public Kurve()
        {
            m_pen = new Pen(Color.Blue, 2);
        }

      public virtual void ZeichneDich(Graphics g)
        {
            
        }

        public virtual void Draw(Graphics g)
        {
            g.SmoothingMode = SmoothingMode.HighQuality;         
        }

    }   
 }
B
357 Beiträge seit 2010
vor 12 Jahren

Statt eines so langen Codeabschnittes könntest du doch einfach kurz erklären, was dein Programm tun/tun soll und die dafür relevanten Codeausschnitte anhängen. So macht es keinen Spaß, sich da reinzulesen 😦

S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

Tut mir leid, ich hoffe es ist nun übersichtlicher und besser beschrieben.

F
10.010 Beiträge seit 2004
vor 12 Jahren

mein Problem besteht darin, das ich nicht von der Klasse Kurve auf die Form zugreifen kann.

Das sollte niemals nötig sein.

Auch ist hier nirgendwo erkenntlich warum Kurve da auf irgendwas zugreifen muss, da der pen ja in Kurve selber steckt.

B
357 Beiträge seit 2010
vor 12 Jahren

Nun, das liegt daran, dass deiner Klasse Kurve deine Klasse Form nicht bekannt ist. Zudem sollte nicht von anderen Klassen auf Oberflächenelemente zugegriffen werden, dasselbe Prinzip wie bei der Kommunikation zwischen zwei Forms. Das lässt sich sehr viel eleganter lösen.

Wenn überhaupt, dann holt sich Form eine Info aus einem Objekt Kurve, andersherum ist es bestenfalls sehr schlecht gemacht.

S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

In der form ändere ich die Farbe und die Dicke des Pens durch Comboboxen, was auch solange erfolgreich dargestellt wird, bis die Liste der Zeichenobjekte neu geladen wird, durch z.B. löschen einzelner Objekte.
Die Liste speichert nur den pen aus der Kurve und nicht die geänderten pens aus der form.
Deswegen möchte ich in der Kurve auf die Comboboxen zugreifen um halt die veränderten pens in der List zu speichern.

B
357 Beiträge seit 2010
vor 12 Jahren

Verstehe das Problem nicht. So wie es jetzt da steht, kann deine Klasse Kurve nicht auf Form zugreifen, da es das Objekt Form nicht kennt. Zudem ist es nicht nur schlechter Stil, sondern das wird dir im späteren Verlauf von größeren Projekten noch um die Ohren fliegen.

Greif zu einem Zeitpunkt X aus Form auf Kurve zu, hol dir dort den Pen und speichere ihn, wie auch immer, ab. Gegebenenfalls musst du dir entweder weitere Objekte erstellen, oder eine eigene Struktur in der du die Properties des Pens ablegst.

C
258 Beiträge seit 2011
vor 12 Jahren

Änder doch einfach die Liste in deiner Kurve wenn in der Oberfläche jemand an der Combobox was geändert hat

S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

Was bringt es mir, wenn ich von der form auf die Kurve zugreife, wo der pen immer gleich ist?
Der pen der Kurve soll sich ja die Werte von der form holen.

C
258 Beiträge seit 2011
vor 12 Jahren

Du kannst einfach im Form wenn das Event ausgelöst wird (wenn du deine Combobox änderst) bei deiner Liste an Kurven die Pens ändern

         
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
            foreach(Kurve kurve in kurvenListe)
            {
                  kurve.pen = new Pen(whatever)
            
             }
}

B
357 Beiträge seit 2010
vor 12 Jahren

Erstelle dir Setter und Getter für den Pen...

S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

Wird dies aber nicht alle pens der Elemente in der Liste ändern und wieder alle gleich aussehen lassen?

B
357 Beiträge seit 2010
vor 12 Jahren

Deine Liste ist wohl eine Liste von Objekten. Hier wäre so ein Verhalten ziemlich merkwürdig, also nein, wird nicht so sein.

S
suk3 Themenstarter:in
11 Beiträge seit 2012
vor 12 Jahren

Ok, danke für die Antworten.

Hinweis von herbivore vor 12 Jahren

Eine unnötig lange Diskussion um die einfache und grundlegende Tatsache, dass die Zugriffe immer vom Form zur Klasse und nie umgekehrt erfolgen sollen. Das geht immer und ist nie anders nötig. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Siehe auch [FAQ] Kommunikation von 2 Forms.

Thema geschlossen