Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Builder C++ Dwa formularz, wywolanie funkcji

karbiuch 01 Cze 2017 23:56 744 2
  • #1 01 Cze 2017 23:56
    karbiuch
    Poziom 3  

    Witam,

    Mam dwa formularze. Jeden główny, drugi pomocniczy. W formularzu głównym mam zrobioną funkcję case, która wykonuje poszczególne kroki (timer). Kolejność wykonywania kroków wyrażam za pomocą zmiennej "moje_zadania". Teraz chciałbym utworzyć dodatkowy formularz. W dodatkowym formularzu mam ProgresBar, który powinien pokazywać, w którym miejscu funkcji "case" obecnie jestem.

    Pseudo kod formularza głównego wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Chciałbym abym mógł w nowym formularzu:
    - korzystać z funkcji void UstawZmienna,
    - miec dostep do zmiennej "moje_zadania".

    Mimo, że dałem operator this podczas tworzenia formularza pomocniczego to nie mam widocznej funkcji "UstawZmienna" ani zmiennej "moje_zadania". Jak mogę uzyskać do nich dostęp? Jak mogę uzyskać zasięg zmiennych od formularza głównego w formularzu pomocniczym? Funkcja "UstawZmienna" oraz "moje_zadania" sa publiczne. Używam Borland Buildera 6 C++ do nauki.

    0 2
  • #2 02 Cze 2017 00:48
    RometFan;p
    Poziom 26  

    Zdefiniuj na początku programu funkcje "void UstawZmienna(moje_zadanie)" i wtedy będziesz mógł z niej korzystać wewnątrz otwórz nowy formularz.
    Aby w nowym formularzu korzystać z zmiennej "moje_zadania" musiałbyś ją podawać jako argument funkcji "otwórz nowy formularz", lub zrobić ją jako statyczną.

    0
  • #3 02 Cze 2017 20:44
    yamajin
    Poziom 2  

    Cytat:
    W formularzu głównym mam zrobioną funkcję case

    Case to nie funkcja, a instrukcja sterująca (konkretnie switch-case).

    Zakładam, że w tym switchu w poszczególnych case ustawiasz wartość zmiennej moje_zadania.

    Cytat:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie podawaj void w parametrze - jakkolwiek jest to dopuszczalne, jest uznawane jako zły styl programowania. Bjarne Stroustrup, twórca języka C++, za Dennisem Ritchie oraz Doug'iem McIlroy'em nazywa to abominacją - https://isocpp.org/wiki/faq/newbie#void-in-param-list.

    Cytat:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Zwróć uwagę, że teraz tworzysz okno modalne, a więc blokujesz okno je wywołujące.
    Poza tym, pamiętaj że to okno musisz zniszczyć - a tego kodu tutaj nie masz - inaczej po zamknięciu okna ProgresForm wskaźnik TFormularzPomocniczy *ProgresForm jako zadeklarowany lokalnie zniknie, zgubisz więc dostęp do zaalokowanej na to okno pamięci.

    Cytat:
    Mimo, że dałem operator this podczas tworzenia formularza pomocniczego to nie mam widocznej funkcji "UstawZmienna" ani zmiennej "moje_zadania".


    Wydaje mi się (nie pokazałeś tego kodu), że powodem jest to że parametrem w konstruktorze okna TFormularzPomocniczy jest parametr używany w konstruktorze TForm z której dziedziczysz, czyli TComponent* Owner.

    Musiałbyś jako parametr zadeklarować wskaźnik na klasę formularz głównego.
    Co prowadzi do komplikacji, bo żeby to zrobić, musiałbyś dodać plik nagłówkowy formularz głównego do pliku nagłówkowego z definicją klasy okna pomocniczego. Rezultatem byłoby tzw "circular reference".


    Rozwiązanie jest o wiele prostsze:
    Zmień podejście, i nie uruchamiaj metody UstawZmienna z okna pomocniczego, a potraktuj to okno jedynie jako informacyjne okienko z progress barem.
    Upewnij się w opcjach projektu, że obie formy są tworzone wraz z uruchomieniem programu, nie twórz okna pomocniczego w metodzie OtworzNowyFormularz().
    Pokazuj / chowaj okno pomocnicze za pomocą metod Show() i Hide().
    W oknie pomocniczym dodaj metodę UstawProgressBar(int wartosc), w ciele której będziesz ustawiał właściwość Position obiektu ProgresBar (pamiętaj o ustawieniu właściwości Max).
    W metodzie Timer w oknie głównym po wyjściu z tego switch - case uruchamiaj tą metodę ze zmienną moje_zadanie jako parametr.
    Pamiętaj, aby w tym switch - case jakoś sensownie ustawiać wartość zmiennej moje_zadanie (tzn zerować na starcie i tylko inkrementować), bo inaczej sterowanie pozycją w ProgressBar da zabawne rezultaty.
    Tak naprawdę, możesz się pozbyć tej zmiennej i wywoływać tylko metodę StepIt() - z poprawnie ustawioną właściwością Max.

    Powodzenia

    0