Zmiana właściwości komponentu na innej formie

Odpowiedz Nowy wątek
2011-09-18 19:51
0

Chcę przyciskiem z jednej formy zmienić wartość Labela na innej formie (w obrębie tego samego programu). Kompilator (Visual Studio) napisał mi, że Label musi być "static" żebym mógł mieć do niego dostęp. Poprawiłem więc deklarację Labela na static i zadziałało. Moja radość nie trwała długo, ponieważ VS ciągle sam poprawia mi typ Labela na nie-static. Co zrobić, żeby kompilator nie cofał moich poprawek w kodzie?

Pozostało 580 znaków

2011-09-18 20:01
0

takie rzeczy należy robić przez eventa.

Pozostało 580 znaków

2011-09-18 20:08
1

Twoje "static" wstawione przy deklaracji Labela usuwa designer Visual Studio. Tworzy on kod zgodnie z pewnymi zasadami, które chcesz złamać. Na szczęście, jest na tyle uparty, że poprawi wszystko to, co chcesz zepsuć.

Label nie ma prawa być static, bo jest elementem Formy. Po obiektowemu Label jest polem obiektu klasy Form.
Gdyby Label był static byłby polem wspólnym dla wszystkich obiektów klasy Form. Jaki to miałoby sens? Jak element Formy miałby być elementem wspólnym dla wszystkich formularzy? To tak, jakby wszyscy ludzie na świecie mieli jedną lewą nogę - bez sensu, prawda?

Musisz przemyśleć projekt swojej aplikacji i zamiast zmieniać coś na Labelu innej formy bezpośrednio, udostępnić w niej jakąś metodę, do której odwołasz się z innej formy. Oczywiście te dwie formy muszą być w takiej sytuacji powiązane (np. jedna przyjmować w konstruktorze drugą). (To jest oczywiście najprostsze rozwiązanie takiego problemu.)


"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-09-18 20:29
0

somekind ma racje, warto przemyśleć projekt. Natomiast żeby zrobić to, co chcesz kliknij na twój Label, potem nacisnij F4, odszukaj właściwość Modifiers i ustaw wartość tego property na public. Wtedy do tego labela z poziomu innej klasy dostaniesz się np tak : frmMyForm.Label.Text = "abc";

pzdr
squash

No można, ale tak ostro na chama, ja bym jednak zrobił metodę i nie upubliczniał kontrolek. - somekind 2011-09-18 20:53
Ja też :) Ale chciał wiec ma :) - Squash 2011-09-18 21:10

Pozostało 580 znaków

2011-09-18 21:54
0

W sumie mam tylko 1 instancję obiektu klasy Form1, więc pomyślałem, że powinno to przejść.

Squash napisał(a)

somekind ma racje, warto przemyśleć projekt. Natomiast żeby zrobić to, co chcesz kliknij na twój Label, potem nacisnij F4, odszukaj właściwość Modifiers i ustaw wartość tego property na public. Wtedy do tego labela z poziomu innej klasy dostaniesz się np tak : frmMyForm.Label.Text = "abc";

pzdr
squash

W tym problem, że Modifiers mam ustawione na public, ale i tak z innej klasy jest to niewidoczne :|
W C# robię coś dopiero od kilku dni. Wcześniej używałem Delphi (niestety z powodu nieciekawej polityki firmy Embarcadero byłem zmuszony zmienić język programowania) i tam wystarczyło dodać formę do uses i wszystko grało. A tutaj jednak jest trochę inna filozofia. Pewnie trochę czasu minie zanim to opanuję...

edytowany 1x, ostatnio: Pociech, 2011-09-18 21:55

Pozostało 580 znaków

2011-09-18 22:27
0
Pociech napisał(a)

W tym problem, że Modifiers mam ustawione na public, ale i tak z innej klasy jest to niewidoczne :|

Na pewno jest widoczne. Tylko pewno próbujesz się odwołać się przez Form1.labelJakiśTam czyli statycznie, zamiast przez nazwaObiektuForm1.labelJakiśTam.

Tu nie ma filozofii tylko programowanie obiektowe.


"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-09-18 22:28

Pozostało 580 znaków

2011-09-19 09:49
0

Racja, dopiero teraz zauważyłem, że Form1 nie ma jawnej nazwy obiektu, bo jest Application.Run(new Form1()); Czyli z tego co rozumiem nie mam się do czego odwołać. Poradziłem sobie z problemem dodając do kreatora Form2 jako parametr referencję do odpowiedniego Labela.

Pozostało 580 znaków

2011-09-19 10:34
0

To jest niechlujne, łamie chociażby zasadę hermetyzacji. Zdecydowanie lepiej by było, żeby Form2 przyjmował w konstruktorze Form1, przechowywał go w jakimś polu, a potem wywoływał metodę, która dopiero ustawi tekst na Labelu.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
No tak, tylko Pociech i tak wie lepiej. Niech tylko napisze kto będzie używał tej jego aplikacji, żebym przypadkiem nie został klientem tej firmy :D - massther 2011-09-19 14:35

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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