Problem z formami

0

Rzekomo temat ten był omawiany, ale w każdym innym temacie znajdywałem odnośnik do kolejnej strony, aż trafiłem na taką, która nie istnieje. Nie wiem o co chodzi ale występuje u mnie dziwny błąd, a mianowicie: Form1 jest formą główną, Form2 formą "drugoplanową". Na początku programu ładowana jest Form1, a z kodu ładowania Form1 ładuję się Form2. Form1 posiada timer1 z kodem:

public void timer1_Tick(object sender, EventArgs e)
        {
            if (done)
            {
                label1.Enabled = true;
                label2.Enabled = true;
                label3.Enabled = true;
                //...
            }   
         }      
 

W Form2 znajduję się button, którego kod wygląda tak:

 
private void button1_Click(object sender, EventArgs e)
        {        
            Form1 formka = new Form1();            
            formka.done = true;
            this.Close();
        }

Jak się zapewne domyślacie, kod nie działa poprawnie. Dziwne jest to, że jeżeli do kodu timera dodam np:

MessageBox.Show("O co chodzi?"); 

to wiadomość się wyświetla, a labele nadal są zablokowane. Nie mam pojęcia o co chodzi. Jeżeli ktoś mógłby mi to wyjaśnić to byłbym naprawdę wdzięczny.
Pozdrawiam!

Pomocy?

1

W button1_Click, tworzysz sobie NOWY obiekt Form1, ustawiasz mu jakąś właściwość i nic więcej. Zgaduję, że w tym momencie chciałbyś się odwołać do już istniejącej instancji Form1, a nie tworzyć nową.
Możesz np. zrobić konstruktor Form2, który przyjmie w argumencie Form1 i zapamięta ją sobie w jakimś polu. I lepiej byłoby, aby Form1 miała metodę EnableLabels, wywolywaną w odpowiednim momencie przez Form2 niż ustawianie pola done.

0

@somekind Chyba źle mnie zrozumiałeś. Chodzi mi o to, że timer chodzi (tyka), bo jeżeli wpiszę do niego instrukcję

MessageBox.Show("");

, to ona działa. A pozostałe instrukcje w timerze nie działają. Tak samo jest jeśli w "button1_Click" po uprzedniej zmianie modyfikatora timer1 na public umieszczę:

Form1 formka = new Form1();
formka.timer1.Enabled = true;

Niby timer tyka, niby wszystko okej,

MessageBox.Show("");

działa, ale pozostałe instrukcje nie chcą się wykonywać. Raczej nie ma to nic wspólnego z instancją.

0

Somekind ma rację. formka.done i this.done to pola dwóch różnych form;

0
Anonim1024 napisał(a)

Raczej nie ma to nic wspólnego z instancją.

Pytanie pomocnicze: Czy jeśli wsiądziesz w pociąg do Białegostoku dziwisz się, że nie dojechałeś do Wrocławia?

0

Okej. Wymyśliłem coś takiego:

Form foremka;
public Form2()
{
    InitializeComponent();
}
public Form2(Form forma)
{
    foremka = forma;            
}

Potem w button1_Click:

foremka.timer1.Enabled = true;

Ale coś zpsułem. Ktoś mógłby mi powiedzieć, w którym miejscu? :)

1
Form1 foremka;

public Form2(Form1 forma)
{
    InitializeComponent();  // ta metoda generuje wszystkie elementy (przyciski, itp.) formularza, ona MUSI być wywołana
    this.foremka = forma;            
}

A konstruktor bezparametrowy jest Ci niepotrzebny w tej sytuacji.

0

Okej, miałeś rację. Pomogło. Dzięki :)

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