Przesuwanie okien przy unieaktywnieniu aplikacji

0

Mam taki problem.Używam Buildera 6 (choć to może nie jest ut ważne). Chce aby program wykonywał obliczenia i podczas tych obliczeń wszystkie kontrolki w jakichkolwiek otwartych oknach nie były aktywne-czyli żeby nie można było je kliknąć, ale jednocześnie żeby można było okna przesuwać po ekranie łapiąc myszką pasek, minimalizować program itd. Ogólnie żeby działały paski okien przy jednoczesnym uniektywnieniu kontrolek i nie chodzi tu bynajmniej o własność 'Enable=false'.Mam nadzieję że to jest jasne.Pomóżcie.Dzięki z góry.

0

nie chodzi tu bynajmniej o własność 'Enable=false'

A o co? innej mozliwosci nie masz.

0

Chodzi o to żeby wszystkie formy otwarte (a może ich być mnóstwo jak wiadomo) były nieaktywne (nie przyjmowały zdarzeń), kiedy wciska się przycisk uruchamiający zadanie obliczeniowe.Ale chcę żeby je można było przesuwać normalnie po ekranie lub sprowadzć całą aplikację do paska zadań.Przykładowo: mamy program który ma mnóstwo ustawień i liczy iteracyjnie dużo czasu.W trakcie obliczeń użytkownik programu nie może zmieniać ustawień dopóki obliczenia się nie zakończą,natomiast nic nie stoi na przeszkodzie żeby minimalizować do paska zadań aplikację albo ją przesuwać po ekranie-żeby tak było musi być pasek aktywny.

0

Nie czaje o co ci chodzi, chcesz zeby dalo sie klikac w kontrolki ale po kliknieciu nic sie nie dzialo? Po co?
Jezeli jednak koniecznie upierasz sie zeby to tak wygladalo, to przykladowo w OnClik przycisku:

if(inProgress) return;

/*tu inne instrukcje */

Zmienna inProgress pokazuje czy aktualnie trwaja obliczenia czy nie.

Czy chcesz zeby nie dalo sie kliknac (bardziej rozsadne), a w takim wypadku daj im enable na false i juz.

A jezeli nie chcesz zeby program sie zawieszal podczas obliczen (czyli wlasnie swobodne przesuwanie/minimalizowanie w czasie obliczen) to daj obliczenia w wątku i juz, nie wiem w czym masz problem. Nawet w tym serwisie jest co najmniej jeden dobry opis jak uzywac watkow w VCL.
Ewentualnie łatwiejszy sposob to ProcessMessages, ale nie zawsze to ma sens - zalezy jakie operacje wykonujesz.

0

Hmmm, moooże twój tok myślenia jest taki:

Enabled dla formy odpada, bo nie można wtedy zwijać etc
Enabled dla wszystkich kontrolek na formie odpada, bo w ciul roboty, a poza tym szare i paskudne się robią.

Innego toku nie potrafię sobie wyobrazić.
Jeśli dobrze idę, to spróbuj wsadzić kontrolki na TPanel, TScrollBox, albo inne TFrame, a następnie na czas obliczeń ustaw Enabled dla Panelu. Wtedy wszystkie kontrolki w nim nie będą reagować, a jednocześnie:
z aplikacją/okienkiem będzie można kombinować
kontrolki nie będą się robić szare.

@down
othello, ja to wszystko wiem, też wolę szare - po prostu kombinuję na miarę umiejętności swych, co też ZK chce ;)

0

Moim zdaniem lepiej jak sa szare, bo jezeli nie sa a mimo to nie mozna do nich sie dostac to jest mylące dla użytkownika. Niedostępne to szare i już, tak powinno być. Po prostu nie robi sie tak - ja przynajmniej nigdzie nie widzialem takiego patentu - albo szare, albo informacja ze operacja w danej chwili niedozwolona.

A że na panelu sie nie robią nieaktywne to akurat wada a nie zaleta.

0

Do Ranides: Wlasnie o to chodzilo zeby nie dostawac efektu szarych kontrolek, ale zeby nie byly aktywne jednoczesnie. Ze tez na to nie wpadlem a przeciez to jest takie proste. Genialne rozwiazania sa najprostsze. Z drugiej strony mysle ze na pewno jest jakis prostszy sposob niz wsadzanie do wszystkich form TPanele-tylko jeszcze nie wiem jaki :-) . Ale na te chwile bede to stosowal.
Do othello: chcialem wyjasnic przyczyne. Programy komercyjne obliczeniowe np. do roznego rodzaju modelowania przeplywow dzialaja na takiej zasadzie, ze ustawiasz ustawienia i puszczasz obliczenia iteracyjnie-wyskakuje okno, ktore informuje ze aplikacja jest w trakcie obliczen i okienka nie zmienia wygladu ale jest nieaktywna w obsludze. Unieaktywnienie okna lub nawet calej aplikacji mozna osiagnac stawiajac windowsowa komende 'EnableWindow(Application->Handle,FALSE/TRUE);' I to jest najprostszy sposob, ale okna rowniez nie daja sie przesuwac ani minimalizowac. Tu mozna jedna komenda unieaktywnic okna a wowczas za pomoca 'while(Kiedy_dzialaja_obliczenia(Name)) { Application->ProcessMessages(); }' uzyskuje aktywne okno to ktore konczy obliczenia w srodku (o ktorym pisalem ze wyskakuje po uruchomieniu obliczen). Dzieki Application->ProcessMessages() jest ono aktywne i przyjmuje komunikaty myszy.
Ja kombinuje taki wielki program obliczenowy i chcialem tak zrobic jak opisalem-stawianie paneli na te chwile mi rozwiazuje problem, choc powinien byc prostszy sposob. Troche dlugo ale chcialem wyjasnic.
Dzieki dla Was dwoch za zainteresowanie.
Pozdrawiam
ZK

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