Poprawne używanie delegata do przesyłania informacji między oknami

0

Witam, do przesyłania informacji miedzy oknami używam delegatów. Konkretnie do przesyłania informacji zwrotnej, do formy rodzica. Deklaracja delegatów:

public delegate void Msg_1(string title, string message);
public event Msg_1 PrepareMessage_1;

public delegate void Msg_2(List<string> Params);
public event Msg_2 PrepareMessage_2;

Po kliknięciu w przycisk używam tych delegatów:

this.PrepareMessage("Tytuł", "Treść wiadomości");

this.PrepareMessage_2(_params);

W kodzie formy, w której wyświetlam nową formę mam:

_class = new NewForm();
_class.Owner = this;
_class.PrepareMessage += new NewForm.Msg_1(DEL_method);
_class.ShowDialog();

Widać, że w formie wywołującej tylko jeden delegat został użyty. Podczas wykonania wyskakuje błąd "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.". Oczywiście wiem, ze błąd pojawił się dlatego, że nie odwołałem się do drugiego delegata. Pytanie, czy da się w jednej klasie zdefiniować kilka delegatów a odwołać się tylko do jednego?

1

Sprawdzaj czy event nie jest null przy wywołaniu.

if (PrepareMessage != null)
    PrepareMessage("Tytuł", "Treść wiadomości");
if (PrepareMessage_2 != null)
    PrepareMessage_2(_params);

Głupie, wiem.

1

if (this.PrepareMessage != null)
this.PrepareMessage("Tytuł", "Treść wiadomości");

if (this.PrepareMessage_2 != null)
this.PrepareMessage_2(_params);

0

Właśnie w moim przypadku eventy nigdy nie będą null. Okno w którym są zdefiniowane delegaty jest wywoływane z kilku różnych okien. Jest to takie uniwersalne okno. Działa to na zasadzie, FormA wyświetla FormC, w którym są zdefiniowane delegaty. Mam również FormB, który wyświetla FormC.
W FormC mam zadeklarowane 2 delegaty a w FormA korzystam tylko z jednego, natomiast w FormB korzystam ze wszystkich delegatów.
Rzecz w tym, że chce aby w zależności która forma wywoła FormC, móc użyć różnych delegatów (a nie wszystkich zadeklarowanych w FormC). Na tą chwilę mam zrobione tak:

if (Owner.GetType().BaseType.Name == 'nazwa formy')
    this.PrepareMessage_2(_params);

Przy wywołaniu FormC dodaję właśnie _class.Owner = this; i sprawdzam skąd została wywołana forma. Tylko nie wiem czy to jest poprawny sposób ;) Wynika stąd, że jeśli w kodzie użyje jakiegoś delegata, np. this.PrepareMessage_2(_params); to muszę zdefiniować jego obsługę w formie rodzica.

0

Właśnie w moim przypadku eventy nigdy nie będą null

Skoro dostałeś Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu to znaczy, że było null.
Jeśli uważasz że nigdy nie jest null, to o co pytasz?

0

a zwalniasz (odejmujesz?) obsługę zdarzenie kiedy zamykasz formę?

0
Azarien napisał(a):

Skoro dostałeś Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu to znaczy, że było null.
Jeśli uważasz że nigdy nie jest null, to o co pytasz?

Czeski błąd :/ Właśnie sprawdziłem i faktycznie są null. Po prostu troszkę inaczej myślałem. Otóż wydawało mi się, że jeśli delegaty są zdefiniowane oraz będą przypisane do nich konkretne wartości, to nigdy nie będą null. Wydawało mi się, że problem leżał po stronie nie obsłużonej funkcji zwrotnej w formie wywołującej. Mój błąd.

abrakadaber napisał(a):

a zwalniasz (odejmujesz?) obsługę zdarzenie kiedy zamykasz formę?

Nie, nie odejmuję. Po prostu korzystałem z jednego delegata, który faktycznie był null

0

Otóż wydawało mi się, że jeśli delegaty są zdefiniowane oraz będą przypisane do nich konkretne wartości, to nigdy nie będą null.

Event jest null jeśli nie jest do niego przypisana żadna funkcja.

Poza tym, chyba trochę mylisz pojęcia.

public delegate void Msg_1(string title, string message);
public event Msg_1 PrepareMessage_1;

W powyższym, Msg_1 jest tylko definicją typu.
Natomiast PrepareMessage_1 jest polem klasy — jest to zdarzenie (event) typu Msg_1.

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