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.

[Lazarus] Funkcja EnableWindow() nie działa w przypadku głównego okna programu?

nyquist 08 Cze 2011 10:10 1836 9
  • #1 08 Cze 2011 10:10
    nyquist
    Poziom 24  

    Witam.

    Mam w swoim programie dwie formy: główną - Form1 i dodatkową - Form2.
    Chcę uzyskać następujący efekt:

    1. Wywołuję (pokazuję) okienko informacyjne (Form2).
    2. Powoduję, aby główna forma (Form1) stała się nieaktywna (i tu mam problem).
    3. Wykonuję pewną procedurę, która zabierze określony czas.
    4. Aktywuję z powrotem główną formę Form1.
    5. Zamykam okienko informacyjne Form2.

    Nie mogę użyć funkcji Form2.showModal(), ponieważ spowoduje ona zatrzymanie się programu i oczekiwanie na zamknięcie Form2, a procedura, o której napisałem w punkcie 3, wykonałaby się dopiero po zamknięciu Form2.

    Aby zdeaktywować Form1 próbowałem użyć funkcji EnableWindow(), czyli:

    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    ale nie daje ona pożądanego rezultatu. Będę wdzięczny za wszelkie pomysły i wskazówki.

    0 9
  • #2 08 Cze 2011 17:40
    Dżyszla
    Poziom 42  

    Jeśli chodzi Ci o to, aby wszystkie kontrolki stały się nieaktywne to proponuję przelecenie po nich (własność Controls, liczba w ControlCount formy) i jeśli jest określonej klasy (bodajże TWinControl) to zrzutowanie (Controls[i] as TWinControl) i ustawienie własności Enabled.
    możesz też zastosować inny fortel, a mianowicie przykryć wszystko panelem, na którym miałbyś wyświetloną informację, jeśli to Cię interesuje. Można też uzyskać ciekawy efekt poprzez pobranie obrazu formy, a następnie przykrycie panelem i wklejenie obrazu w postaci przyciemnionej ;)

    0
  • Pomocny post
    #3 08 Cze 2011 21:20
    blue_17
    Poziom 32  

    Ja to robię tak nie wiem czy pięknie ani poprawnie ale działa bez zarzutu

    W 1 formie

    Kod: delphi
    Zaloguj się, aby zobaczyć kod





    I w 2 formie


    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam

    0
  • #4 09 Cze 2011 00:39
    nyquist
    Poziom 24  

    Sposób blue_17 faktycznie działa (tzn. ogólnie, w pewnych warunkach), jednak nie w moim przypadku. Okazuje się, że mój problem ma bezpośredni związek z działającą w tle procedurą, a właściwie funkcją, o której wspomniałem w punkcie 3:

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    Funkcja kopiuje określony plik/folder, wyświetlając przy tym "windowsowe" okienko informacyjne, takie jak przy standardowym kopiowaniu wywołanym z poziomu exploratora. I prawdopodobnie tu jest cała heca, bo pojawienie się tego okienka powoduje odblokowanie zablokowanej formy. Dopóki nie wywołam w/w funkcji, Form1 jest bardzo ładnie zablokowana.
    Czy ktoś ma pomysł dlaczego tak się dzieje?

    0
  • #6 09 Cze 2011 08:22
    nyquist
    Poziom 24  

    Cytat:
    Użyj mojego sposobu

    Pomysły są ciekawe, sam w pewnym momencie stosuję podobny do opisanych przez kolegę "myk" polegający na tym, że wszystkie kontrolki umieszczone są na znajdującym się na formie panelu i tym sposobem ustawiając właściwość panelu Enabled na false uzyskuję brak dostępu do tych kontrolek, bez efektu "wyszarzania". Ale sama Forma w dalszym ciągu pozostaje aktywna i reaguje na kliknięcia i przesunięcia myszą m.in. np. na pasku tytułowym.
    W tym przypadku chciałbym uzyskać efekt taki, aby Form1 pozostawała w tle, pod Form2, nie reagując na kliknięcia.

    0
  • #8 10 Cze 2011 09:11
    nyquist
    Poziom 24  

    Cytat:
    To się nie da. Tylko w trybie modalnym Form2.
    Da się, sposób podany przez blue_17 działa i nie jest konieczne wywołanie Form2 w trybie modalnym.
    Cytat:
    przecież możesz nakazać Form2 wywołanie metody z Form1.
    Właśnie zrobiłem próbę. Z poziomu Form1 wywołuję Form2.showModal(), a następnie z poziomu Form2 wywołuję "moją" procedurę. Podobnie jak w poprzednich próbach wszystko jest ok do momentu pojawienia się okienka informującego o postępie kopiowania pliku, po czym wszystko bierze "w łeb" i Form1 ni z tego ni z owego odblokowuje się.
    Oczywiście (żeby uprzedzić pytania) Form2 znika dopiero po zakończeniu kopiowania i tu jest ok, więc odblokowanie Form1 nie jest powodowane zamknięciem okna modalnego. Dziwne, ale prawdziwe.

    Jak widać nie ma znaczenia sposób w jaki wstępnie zablokowuję Form1, tzn. czy "ręcznie" przez użycie właściwości Enabled, czy też przez wywołanie Form2 w trybie modalnym. Winowajcą wydaje się być tu użyta w "mojej" procedurze funkcja SHFileOperation(), przy pomocy której kopiuję pliki, tylko nie mam pojęcia dlaczego tak się dzieje :(

    0
  • #10 10 Cze 2011 22:20
    nyquist
    Poziom 24  

    Cytat:
    Jako, że struktura dla tej funkcji przejmuje uchwyt okna, to prawdopodobnie tutaj może coś być na rzeczy. Zmień uchwyt na nil lub aplikacji.
    Traf w 10, pomogła zmiana na uchwyt Form2, czyli
    Kod: delphi
    Zaloguj się, aby zobaczyć kod
    Nie skojarzyłem zależności. Człowiek programuje parę... naście lat i wykłada się na takich rzeczach... :oops:
    Problem uważam za rozwiązany. Dziękuję, pozdrawiam i zamykam.

    0