Kolory systemowe, współdziałanie formularzy

0

Witam

Mam dwa pytanka. Jakoś nie mogę się doszukać czegoś do czego przywykłem w Delphi. Jak określić kolor kontrolki jako systemowy WindowText ? W delphi było clWindowText a w VS w klasie Color nie widzę tego typu rzeczy. Podejrzewam że trzeba tego szukać gdzieś indziej - ale gdzie pytanie tylko ?

Drugie pytanie dotyczy wzajemnej współpracy między formularzami nie modalnymi. Tak sobie studiuję książeczkę którą szanowni forumowicze mi polecili i jest taki przykład a'la notatnik. (C# i .NET str. 296). I stoi tutaj że w klasie formy głównej definiowana jest zmienna:

public static TextBox myText;

która potem jest inicjowana w metodzie Load

myText = documentText; // documentText to komponent typu TextBox

Cel tego jest taki, aby z formatki pomocniczej (niemodalnej) odwoływać się do TextBox'a na formie głównej. Ale coś mi się to nie podoba. przecieŻ skoro to zmienna statyczna klasy, to co ona ma wspólnego z konkretną instancją ? Jakim cudem to ma działać (u mnie nie działa) ?

Z góry dziękuję
Pozdrawiam

0

Jest jest :) A dokładnie to jest w klasie Colors :)

Co do komunikacji między klasami (aka formatkami) polecam te publikacje:
http://codeguru.pl/article-742.aspx
http://codeguru.pl/article-746.aspx

0

A klasa Colors jest w jakiejś konkretnej przestrzeni ?

Co do drugiego, to bardziej chodziło mi o wyjaśnienie tej sytuacji z książki niż o wskazanie jak to zrobić inaczej.

0
b0bik napisał(a)

Jak określić kolor kontrolki jako systemowy WindowText ? W delphi było clWindowText a w VS w klasie Color nie widzę tego typu rzeczy. Podejrzewam że trzeba tego szukać gdzieś indziej - ale gdzie pytanie tylko ?

Kolory systemowe znajduja sie w klasie SystemColors.

textBox1.ForeColor = SystemColors.WindowText;
b0bik napisał(a)

I stoi tutaj że w klasie formy głównej definiowana jest zmienna:

public static TextBox myText;

która potem jest inicjowana w metodzie Load

myText = documentText; // documentText to komponent typu TextBox

Cel tego jest taki, aby z formatki pomocniczej (niemodalnej) odwoływać się do TextBox'a na formie głównej. Ale coś mi się to nie podoba. przecieŻ skoro to zmienna statyczna klasy, to co ona ma wspólnego z konkretną instancją ? Jakim cudem to ma działać (u mnie nie działa) ?

Do zmiennej statycznej przekazujesz referencje TextBoxa z Form1. Dzieki temu w tym przypadku mozesz sie odwolac do tego TextBoxa z poziomu innej klasy:

    public partial class Form1 : Form
    {
        public static TextBox myText;

        public Form1()
        {
            InitializeComponent();

            myText = textBox1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 druga = new Form2();
            druga.Show();
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.myText.Text = "Tekst wpisany z innego formularza";
        }
    }

@down

Nie masz nic wartosciowego do napisania to lepiej w ogole nie pisz, zamiast zaczynac flame.

0

Co do drugiego, to bardziej chodziło mi o wyjaśnienie tej sytuacji z książki niż o wskazanie jak to zrobić inaczej.

C# i .NET? No to pytanie do osób które polecają Perrego :-/

0
Mendoza napisał(a)

SystemColors

Dokładnie o to mi chodziło.

Mendoza napisał(a)

Do zmiennej statycznej przekazujesz referencje TextBoxa z Form1. Dzieki temu w tym przypadku mozesz sie odwolac do tego TextBoxa z poziomu innej klasy:

No tego nie czaje. Skoro zmienna jest statyczna, to znaczy że jest do użytku na rzecz klasy a nie konkretnej instancji. Skoro tak, to jakim cudem zwróci ona referencje do tego TextBox'a ? A jakby były utworzone dwie instancje Form1 to do którego TextBox'a by zwróciła referencje ? No ale faktycznie ten Twój przykład tak działa.

0

Uhm, po przyjrzeniu się mojemu kodowi okazało się że też działa : ) W jednym projekcie testowałem kilka przykładów i tak wyszło : )

W każdym razie nie mogę pojąć z tym operowaniem zmiennymi statycznymi. Jeśli w Form1, pod button1_click zrobiłem sobie

Form1 test = new Form1();
test.Show();

Form2 test2 = new Form2();
test2.Show();

To kliknięcie w Form2 na button ustawiło tekst w TextBox'ie tylko w drugiej instancji Form1 a w pierwszej nie. Dlaczego tak a nie inaczej ?

0

Hmm, chyba zaczaiłem:

http://www.eggheadcafe.com/articles/20020206.asp

Czyli (poprawcie mnie proszę jeśli jestem w błędzie): generalnie zmienna statyczna żyje sobie na rzecz klasy. I jeśli jest to zmienna typu wartościowego - to ma to pewien sens bo można np ustalić jakiegoś tam int'a i będzie to np mnożnik do jakichś przeliczeń. A u mnie typ tej zmiennej statycznej jest referencyjny - może więc przechowywać wskaźnik tylko na jednego TextBox'a. Jeśli więc tworzona jest druga formatka to ona konstruktorem przesłania poprzednio przypisanego TextBox'a.
W sumie też ma to jakiś sens, ale jest chyba dość mylące i podejrzewam że produkcyjnie to się tego raczej nie stosuje ? Bo to takie niby globalne, ale przy większej ilości instancji klas, staje się to bardziej związane z instancją. Co innego może jeśli jakaś zmienna statyczna wskazuje na jakiś pojedynczy zewnętrzny obiekt - wówczas IMHO ma to sens.

0

Zmienna statyczna jest wspólna dla wszystkich instancji klasy. Pierwsze utworzenie Form1 powoduje przypisanie do zmiennej statycznej textbox pierwszego okna. Następie tworzenie drugiej instancji klasy powoduje przypisanie do zmiennej statycznej textbox drugiego okna.

Od tego momentu w zmiennej statycznej jest przechowywany tekstbox drugiego okna. Dlatego zmiana tresci tej statycznej zmiennej powoduje zmianę tekstboxa drugiego okna.

Chciałbyś zmienić tekst w wszystkich oknach na raz?

Edit: Napisałem nim napisałeś. Tak, zgadza się. Takiego rozwiązania się nie stosuje. Poczytaj artykuły które wkleiłem, one objaśniają jak zrealizować to dobrze.

0

Nie no nie chciałbym zmieniać tekstu we wszystkich oknach naraz.Ja po prostu nie rozumiałem idei tych zmiennych statycznych. Jak tam kiedyś wspomniałem C# to dla mnie taka ciekawostka, codziennie zajmuje się Delphi - a tam nie ma takiego pojęcia jak pole statyczne. Tam statyczne mogą być tylko metody - stąd moja dezorientacja.

Reasumując należało by jeszcze dodać że próba odwołania do tak zdeklarowanej zmiennej statycznej, jeśli żadna instancja klasy nie jest utworzona zakończy się błędem.

Oj coś mi się zdaje że ten przykład nie jest najlepszy jeśli chodzi o naukę. Mam na myśli że nie jest to dobry wzór do naśladowania. Ale mogę się mylić - proszę o korektę.

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