Własna kontrolka raz działa raz nie działa.

0

Witam.
Mam Formę, w niej Panel. Na panelu kliknięciami myszy rysuje kontrolki typów BlokT1 i BlokT2 (oba dziedziczone z abstrakcyjnej klasy Blok, a ta z Control), te rysują się poprawnie. Drugi typ kontrolek Wire ma za zadanie być linią łączącą dwa wybrane bloki (klikam na odpowiedni button na innym panelu, potem na pierwszą kontrolkę, potem na drugą). W klasie Form1 mam funkcje

public void AddNewWire()
        {
            //NewWire to pole klasy o typie Wire
            if (NewWire == null) return;
            drawPanel.Controls.Add(NewWire); //drawPanel - panel na ktorym rysowane sa kontrolki, pole klasy
            NewWire.BringToFront();
            NewWire.Invalidate();
            creatingWireState = false;
            creatingWire = false;
        }
        public void CreateWire(Blok start, Blok end)
        {
            NewWire = new Wire(new Point(start.Location.X + start.Width/2, start.Location.Y + start.Height/2), new Point(end.Location.X + end.Width/2, end.Location.Y + end.Height/2));
            AddNewWire();
        }

CreateWire tworzy nowe połącznie, AddNewWire dodaje połączenie do listy kontrolek panelu.

Metoda obsługująca kliknięcia obiektów klasy Blok:

 if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                Form1 parentForm = this.FindForm() as Form1;
                if (parentForm != null && parentForm.creatingWire)
                {
                    if (!parentForm.creatingWireState) //creatingWireState mowi o tym, czy blok ma byc poczatkiem czy koncem polaczenia
                    {
                        if (this.CanAddWireOut())
                        {
                            parentForm.tempBlok = this;
                            parentForm.creatingWireState = true;
                        }
                    }
                    else
                    {
                        if (this.CanAddWireIn() && parentForm.tempBlok != this)
                        {
                            parentForm.CreateWire(parentForm.tempBlok, this);
                        }
                    }
                }
            }

Tak napisany kod nie powoduje wyświetlenia się kontrolki. Po drugim kliknięciu wywoływane są wszystkie funkcje, ale kontrolki nie widać(jest na liście kontrolek panelu) i nie wywołuje się jej funkcja odpowiedzialna za rysowanie (dodawana w konstruktorze kontrolki do eventu Paint).
Jednak po wykonaniu takiego kodu:

                    BlokT1 s = new BlokT1(10, 10, 60, 70);//pozycja x, pozycja y, szerokosc, wysokosc
                    BlokT2 e = new BlokT2(100, 100, 20, 30);
                    Form1 f = this.FindForm() as Form1;
                    f.CreateWire(s, e);

Kontrolka pokazuje się i funkcja odpowiedzialna za rysowanie jest wywoływana. Co jest przyczyną takiego zachowania?

0

trochę z innej bajki - po kiego grzyba używasz pola w klasie do przekazania parametru publicznej metodzie? przecież to aż prosi się o trudne do znalezienia błędy.

        private void AddWire(Wire wire)
        {
            if (wire == null)
                throw new ArgumentNullException();
            drawPanel.Controls.Add(wire); //drawPanel - panel na ktorym rysowane sa kontrolki, pole klasy
            wire.BringToFront();
            wire.Invalidate();
            creatingWireState = false;
            creatingWire = false;
        }

        public void CreateWire(Blok start, Blok end)
        {
            AddWire(new Wire(
                new Point(start.Location.X + start.Width/2, start.Location.Y + start.Height/2), 
                new Point(end.Location.X + end.Width/2, end.Location.Y + end.Height/2)
            ));
        }

gdzie ustawiasz rozmiar i położenie Wire? pokaż kod. jaka jest wartość visible?
przejedź debuggerem po kodzie i sprawdź wartości creatingWireState oraz creatingWire. taka sytuacja, że raz zmieniasz je w klasie, a raz na zewnątrz, jest kolejnym błędem projektowym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1