otwieranie okna w aplikacji

0

Witam,

Moje pytanie jest raczej trywialne i nie powinno sprawic wiekszych problemow. Jednak dopiero ucze sie alfabetu jezyka C# i powiedzmy, ze dluga droga przede mna. Jaki mam problem?

Udalo mi sie napisac prosta aplikacje okienkowa. Teraz chce by otwierala ona jeszcze jedno okienko. Czy ktos moze mi powiedziec jak to zrobic, ewentualnie podeslac adres gdzie moge o tym poczytac?

Pozdrawiam,
Grzegorz Wisniewski

0

Najpierw tworzymy nowe okno a jego klase nazywamy np. Form2. Następnie w obsłudze zdarzenia np. jakiegos klawisza okna pierwszego (który ma otwierac drugie okno) wstawiamy kod:

Form2^ oknoo = gcnew Form2;
this->AddOwnedForm(oknoo);
oknoo->Show();

Akurat ten kod jest w C++ ale idea jest ta sam w C#.

0

tak, ale trzeba by dodac do tego jeszcze jedną rzecz: kiedy już wykonasz Form2 a=new Form2(); to na wyświetlenie tego są 2 sposoby, między którymi jest zasadnicza różnica. Jeśli napiszesz a.Show();to dostaniesz okienko niemodalne czyli takie, z ktorego możesz się przełączyc z powrotem na inne okienko i nie możesz z niego pobierac wartości (znaczy wartosci pól klasy Form2)
Jesli użyjesz a.ShowModal(); to wtedy okienko blokuje jakakolwiek interakcję z innymi okienkami programu, dopóki nie zostanie "zniknięte", natomiast wartości pól składowych klasy Form2 można uzyskiwac (po zamknięciu tej formy, lecz przed użyciem metody Dispose(); na przykład tak
label1.Text=a.TextBox1.Text;

Swego czasu dosc długo borykałem się z tym probleme, więc jeżeli będziesz miał problem, to napisz - wyjaśnię na ile będę umiał

0

poorchava - to może wiesz jak rozwiązac inny problem zwiazany z sytuacją nowego okna wywoływanego z poprzedniego. Chodzi o to że wywołując nowe okno tworzę egzemplarz klasy nowego okna w obrębie obsługi zdarzeń starego. Mam więc dostęp z tego miejsca do operacji na nowym oknie. Jak jednak zrobic aby w miesjcu obsługi zdarzeń nowego okna( np. jakiś klawisz na nowym oknie) miec możliwośc operacji na starym oknie (np. uczynic go aktywnym lub wygasic). Problem w tym że główne okno jest uruchamiane w funkcji main() za pomocą
Application::Run(gcnew Form1());
i nie powstaje żaden egzemplarz klasy Form1 do którego można by się odwołac jak to jest w przypadku okna nowego. Myślę i myślę i nic mi nie wychodzi.

0

hmm, jest na to pewien sposób. W klasie Form2 umieszczasz pole będące odnośnikiem do form, która wywołała nowe okno. Cos takiego:

class Form2 : System.Windows.Forms.Form
{
.
.
private Form1 from;
.
.
.
}

A w konstruktorze dodajesz ten odnośnik jako argument, czyli coś takiego:

public override Form2 (Form1 sender)
{
    Form2.from=sender;
    base();
}
(nie pamietam dokladnie czy to tak wyglada, ale jakos podobnie napewno, w każdym razie musisz zrobic tak, zeby argument klasy Form1 podawany przy tworzeniu obiektu klasy Form2 byl wczytywany do odpowiedniego pola w Form2)

Wtedy możesz nowe okno (klasy Form2) wywołac w pierwszego tak:

Form2 drugie_okienko = new Form2 (this); 
drugie_okienko.Show(); // albo .ShowModal();

teraz, gdybys powiedzmy chcial z drugiego okienka zmienic np tytuł jakiegos labela na pierwszym to robisz cos takiego

(to jest kod Form2)
from.label1="haha zmienilem cos z innego okienka";

Wiem, że troche to zawile brzmi, ale jakos nie bardzo wiem jakby to mozna wytłumaczyc inaczej

0

ja tez mam pytanie co do dwóch formatek...
w klasie formatki 1 deklaruje globalnie

private Form2 frm2 = new Form2();

pod przycikiem mam:

frm2.show();

jednak gdy klikne przycisk, nastepnie wyłącze form2 i jeszcze raz klikne przycisk wyskakuje mi taki błąd:

Cannot access a disposed object.
Object name: 'Form2'.

przycisk działa dopiero wtedygdy formatke zadeklaruje lokalnie w nim, ale ja potrzebuje mieć dostęp jeszcze do tej formatki z innego miejsca.

0

zadeklaruj
private Form2 frm2;

a pod przyciskiem
frm2 = new Form2();
frm2.Show();

0

niby działa ale w tym drugim miejscu gdzie się odwołuje do drugiej formy tez musze dać:
frm2 = new Form2();
kokretnie wysylam wtedy dane do kontrolki, która znajduje się w drugiej fromie i gdy nacisce przycisk który wyświetla mi druga forme w kontrolce nie mam żadnych danych.

0

Nie wiem czy dobrze Cię zrozumiałem, ale wydaje mi się że rozwiązaniem Twoich problemów może być wzorzec Singleton.

Ja w swojej aplikacji właśnie w ten sposób otwieram okna. Mam metodę statyczną, która jeśli obiekt nie istnieje tworzy go, a jeśli już jest wykorzystuje to co ma. Oczywiście (nie wiem jakie Ty masz potrzeby), ale pewnie dobrze by było jeszcze w jakiś sposób tym zarządzać. Ja zrobiłem tak, że po odwołaniu do obiektu mam publiczne funkcje które sterują kontrolkami w oknie (wydzieliłem część odpowiedzialną za wygląd okna od obsługi zdarzeń). Nie wiem czy metoda idealna, ale mi się z nią całkiem przyjemnie pracuje.

  • Masz dostęp do obiektu okna z każdego miejsca aplikacji.
  • Musisz uważać jeśli jednocześnie chcesz używać kilka razy tego samego okna.

Pozdrawiam.

0

Na to wygląda, że trzeba użyc tego wzorca... siedziałem chwile nad tym i zbyt wiele nie rozumiem tak więc odpuściłem sobie drugą formatke...

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