Problem z formami

2011-04-12 21:30

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

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?

Pozostało 580 znaków

2011-04-13 11:30
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
edytowany 1x, ostatnio: somekind, 2011-04-13 11:32

Pozostało 580 znaków

2011-04-13 15:49

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

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ą.

edytowany 2x, ostatnio: Anonim1024, 2011-04-13 15:57

Pozostało 580 znaków

2011-04-13 16:43

Rejestracja: 9 lat temu

Ostatnio: 7 lat temu

0

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

Pozostało 580 znaków

2011-04-13 16:53
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-04-13 17:33

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

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? :)

Pozostało 580 znaków

2011-04-13 20:36
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
edytowany 2x, ostatnio: somekind, 2011-04-13 20:37

Pozostało 580 znaków

2011-04-13 21:27

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

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

Pozostało 580 znaków

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