Zrobić modalne okno

0

Cześć, chcę pokazać użytkownikowi modalne okno. Modalne na aplikację tylko.
Pokazuje je za pomocą ShowModal, ale wcale nie robi się modalne.
Zaznaczam, że okno ma borderStyle na bsNone. Da się zrobić z tego modalne okno?

0

a może by tak sprawdzić najpierw jak okno się prezentuje przy różnych BorderStyle, a nie tylko bsNone i później zadawać głupie pytania? Zresztą, nie wiem czego ty chcesz - ShowModal zawsze tworzy okno modalne - z definicji.

0
Ranides napisał(a)

Zresztą, nie wiem czego ty chcesz - ShowModal zawsze tworzy okno modalne - z definicji.

Też tak myślałem. Jednak okazało się, że nie. Sprawdziłem też bsStyle na bsDialog. Jest to samo. Z jakiegoś powodu nie mam modalnego okna.

Teraz sposób w jaki je tworzę:
Mam unit o nazwie np. fModalMsg

W tym unicie mam formę oczywiście. Mam też 2 procedury:

procedure ShowModalMsg(Msg: string);
procedure HideModalMsg;

Jako zmienna globalna jest:

var
  form: TModalMessageForm;

TModalForm to oczywiście moja forma.

Procedury wyglądają tak:

procedure ShowModalMessage(Msg: string);
begin
  if form = nil then form:=TModalMessageForm.Create(Application);
  form.msgLabel.Caption:=Msg;
  form.ShowModal;
end;

procedure CloseModalMessage;
begin
  if form<>nil then
  begin
    form.Free;
    form:=nil;
  end;
end;
0

No skopiowałem to... uruchomiłem... działa... Nie wiem, po co ta akrobatyka z tworzeniem i niszczeniem formatki, ale skoro tak wolisz... why not. Wszystko jest dla ludzi, nawet wyłączanie auto-create dla formy, która może się pojawić na ekranie maksymalnie w ilości sztuk 1 (bo ma być podobno "modalna").

Może wytłumacz słowami, co wg ciebie oznacza słowo modalny - pomijam, że temat jest idiotyczny - zaintrygowałeś mnie. naprawdę ;-]

0
Ranides napisał(a)

No skopiowałem to... uruchomiłem... działa... Nie wiem, po co ta akrobatyka z tworzeniem i niszczeniem formatki, ale skoro tak wolisz... why not. Wszystko jest dla ludzi, nawet wyłączanie auto-create dla formy, która może się pojawić na ekranie maksymalnie w ilości sztuk 1 (bo ma być podobno "modalna").

Może wytłumacz słowami, co wg ciebie oznacza słowo modalny - pomijam, że temat jest idiotyczny - zaintrygowałeś mnie. naprawdę ;-]

Okno modalne, czyli takie, które blokuje całą aplikację - tzn. kliknięcie poza okno modalne(na aplikację) nie powoduje utraty jego focusa. Spróbuję bez tworzenia

0

Okno modalne, czyli takie, które blokuje całą aplikację - tzn. kliknięcie poza okno modalne(na aplikację) nie powoduje utraty jego focusa.

Eeee, zawiodłeś mnie, spodziewałem się czegoś ciekawszego :/
btw: wiesz, śnieg u mnie spadł, tak ładnie się zrobiło, chyba na spacer się przejdę...

0
Ranides napisał(a)

Okno modalne, czyli takie, które blokuje całą aplikację - tzn. kliknięcie poza okno modalne(na aplikację) nie powoduje utraty jego focusa.

Eeee, zawiodłeś mnie, spodziewałem się czegoś ciekawszego :/
btw: wiesz, śnieg u mnie spadł, tak ładnie się zrobiło, chyba na spacer się przejdę...

Jeszcze nie ;)
Zimno jest, jeszcze zachorujesz ;)

Dostaję błąd: System Error, code 5 - Odmowa dostępu
podczas ShowModal :/

0

Może się uwsteczniam, ale po przeczytaniu tego po raz trzeci nadal nie wiem o co chodzi.

0

@Adam:
No widzisz, też nie rozumiem, dlatego strzeliłem kilka razy w ciemno +zadałem kilka pytań w celu zrozumienia. Ale ponieważ nic nie dały praktycznie, to przyjąłem postawę uniwersalną: jak za cholerę nie wiesz, o co chodzi, to zacznij rozmowę o pogodzie ;)

0
Ranides napisał(a)

@Adam:
No widzisz, też nie rozumiem, dlatego strzeliłem kilka razy w ciemno +zadałem kilka pytań w celu zrozumienia. Ale ponieważ nic nie dały praktycznie, to przyjąłem postawę uniwersalną: jak za cholerę nie wiesz, o co chodzi, to zacznij rozmowę o pogodzie ;)

No wydaje mi się, że piszę jasno.
Chcę pokazać formę modalnie - bez żadnych przycisków z borderStyle na bsNone.

Ale podczas ShowModal dostaję ten błąd: "Code 5, odmowa dostępu"
Forma jest tworzona statycznie(przez aplikację). Gdy tworzyłem ją dynamicznie, to wtedy pokazywała się, ale nie była modalna.

0

Pytania:

  • Typ aplikacji [mdi/sdi]:
  • Jak pokazujesz formę [ShowModal()/Show()]

Okno modalne może mieć/nie musi mieć przycisków. Jeżeli delphi tworzy formę automatycznie to wystarczy wywołać poprze ShowModlal() i już.

0

albo ja zcegos nie kapuje, albo nie wiem ;]
mi zawsze dzialalo forma.showmodal; przy kazdym typie borderow
bledy? lol ;]
lepeij sprawdz zrodlo projektu czy rzeczywisci wszystko okej sie tworzy statycznie

0

Juhas pi** jak potrzaskany. Namieszałeś coś to nie działa

procedure TMainForm.btn3Click(Sender: TObject);
var
  f: TForm1;
begin
  f := TForm1.Create(Application);
  try
    f.BorderStyle := bsNone;
    f.ShowModal;
  finally
    FreeAndNil(f);
  end;
end;

i działa jak powinno - bez belki, obramowania itd. TForm1 to niezmieniana nowa forma.

Jak już pisałem czas wziąć się za podstawy bo płakać się chce...

0
Oleksy_Adam napisał(a)

Pytania:

  • Typ aplikacji [mdi/sdi]:

MDI

  • Jak pokazujesz formę [ShowModal()/Show()]

ShowModal

MisiekD. Może i o bazach danych nie wiem zbyt dużo, ale o Delphi trochę więcej ;)
Kod jest taki jak napisałeś, poza tym, że właściwości formy ustawiam w ObjectInspectorze.

Dostaję odmowę dostępu podczas ShowModal, gdy forma jest tworzona statycznie, a gdy tworzę ją dynamicznie - pojawia się, ale nie jest modalna. Kliknięcie na główne okno aplikacji powoduje schowanie jej pod spód

0
Juhas napisał(a)

MisiekD. Może i o bazach danych nie wiem zbyt dużo, ale o Delphi trochę więcej ;)

po pytaniach jakie zadajesz można wnioskować, że jest to troszeczkę więcej

A co do pytania jak pisałem wcześniej u mnie działa

0

To może chociaż ktoś wie, co to za błąd "Odmowa dostępu"?

0

To jest n i e m o ż l i w e - musisz mieć błąd w projekcie, więc olej to ShowModal i przyglądnij się reszcie kodu, coś ty tam nakombinował. Jak tworzysz program MDI, to pewnie tymi oknami MDI źle zarządzasz i stąd błędy ci się pojawiają w najmniej oczekiwanych momentach.

0
Ranides napisał(a)

To jest n i e m o ż l i w e

A jednak ;)

  • musisz mieć błąd w projekcie, więc olej to ShowModal i przyglądnij się reszcie kodu, coś ty tam nakombinował. Jak tworzysz program MDI, to pewnie tymi oknami MDI źle zarządzasz i stąd błędy ci się pojawiają w najmniej oczekiwanych momentach.

Dopóki nie dodałem tego okienka wszystko było w porządku. Gdy dodałem to okienko, testuje je tuż po uruchomieniu - czyli nawet żadne inne okno nie jest tworzone.

Może ma znaczenie, jak wywołuję je.
W metodzie onExecute komponentu IndyTCPClient. Może tu leży jakaś wina?
Po prostu odczytuję socket.readln i w zależności od tego, co tam jest wywołuję jedną(pokazanie okna) lub drugą(zamknięcie) procedurę

DOPISANE:
Sprawdziłem to i rzeczywiście problem jest przez to zdarzenie albo ten komponent. Ale nie wiem czemu.

Wrzuciłem na formę button i w onClick wpisałem mu procedurę otwierającą okno. Zadziałało. Okno było modalne. Więc zamiast wywoływać procedurę otwracia bezpośrednio z onExecute, postanowiłem wywołać procedurę onClick buttona. Jednak nie udało się. Okno pojawiło się, ale nie modalne :( Co jest z tym onExecute?

0

pewnie dlatego, że OnExecute działa w osobnym wątku

0

Nie wiem czy dobrze rozumiem temat. Autor chce mieć główną formę jako modalną tak, żeby nie dało się kliknąć na pulpit? Teoretycznie się nie da, bo główna forma to główna forma i inne JEJ formy mogą być dopiero formami modalnymi (wtedy nie da się przejść np. do formy głównej po kliknięciu na nią). Taka forma nie ma zasięgu globalnego względem innych okien.
To od strony teoretycznej...

Praktycznie można zastosować sposób domowy - uwielbiam sposoby domowe, nie - kocham sposoby domowe :D Da się zrobić rzeczy niemożliwe ;) Wystarczy napisać pętlę, która cały czas powtarza ShowModal dopóki forma nie zostanie zamknięta. Działa - klikamy na pulpit, a nam wyskakuje z powrotem okienko i nie traci focusa :) Jeśli bawisz się w Delphi, to możesz stworzyć normalną formę (nie tak jak robisz, tylko tak jak koledzy podpowiedzieli z AutoCreate), a na niej umieścić Timer z Interval powiedzmy 1, który działa tak samo jak pętla - wyrzuca okno do góry, a sam wywołuje siebie ponownie (to się chyba rekurencja nazywa...), bo cały czas zostawiamy mu wartość Enabled. Działa sprawdzałem.

Jeśli napisałem coś nie na temat to przepraszam, ale autor nie napisał wszystkiego jasno.

Swoją drogą może mi ktoś na PW albo tutaj zapodać linka do tematu o zmianie atrybutów pliku (tylko do odczytu itp.), bo za cholerę nie mogę znaleźć tego, a widziałem ten temat jakiś czas temu.

0

@BatSk8: człowieku, ty możesz mieć rację. On faktycznie może chce coś takiego, ale nigdy bym nie wpadł, że ktoś chce takie coś uczynić, szczególnie po takim tłumaczeniu, lol.

0
BatSk8 napisał(a)

Nie wiem czy dobrze rozumiem temat. Autor chce mieć główną formę jako modalną tak, żeby nie dało się kliknąć na pulpit?

Źle rozumiesz. Autor chce otworzyć formę modalną, żeby na jakiś czas zablokować aplikację

0
Misiekd napisał(a)

pewnie dlatego, że OnExecute działa w osobnym wątku

Hmmm.... Pewnie masz rację, wobec tego co mam zrobić? Coś z metodą Synchronize? Tylko za bardzo nie wiem co, bo wątkami się mało bawiłem, a książki, które mam tak średnio opisują ten problem

0

A daj głównej formie Enabled na false i sprawdź, czy cię takie coś satysfakcjonuje...

// w zdarzeniu Formy OnShow oczywiście formy, którą chcesz modalną. A w OnHide przywróć Enabled na true.

0
Ranides napisał(a)

A daj głównej formie Enabled na false i sprawdź, czy cię takie coś satysfakcjonuje...

Próbowałem już to wcześniej. To jest dobre tylko czasami. Bo gdy mam otwarte jakieś okno modalne i robię enabled głównej formy na false, to wtedy mogę robić wszystko na formie modalnej.

0

problem jest prosty, rozwiązanie też: okno jest modalne tylko w ramach wątku, który je stworzył. Jeśli chcesz mieć okno modalne w ramach całej aplikacji, musisz je stworzyć w głównym wątku, chociażby wykorzystując metodę Synchronize.

Ranides: trochę więcej cierpliwości dla innych użytkowników.

0
ŁF napisał(a)

problem jest prosty, rozwiązanie też: okno jest modalne tylko w ramach wątku, który je stworzył. Jeśli chcesz mieć okno modalne w ramach całej aplikacji, musisz je stworzyć w głównym wątku, chociażby wykorzystując metodę Synchronize.

No do tego doszedłem wyżej, tyle, że nie wiem, jak jej użyć. Gdy piszę Synchronize(MojaMetoda), to on widzi Synchronize z Windowsa - gdzie jest bez parametru. Nie wiem, jak wywołać odpowiednią.

Ale mam już częściowe rozwiązanie.
Posłużyłem się komunikatami.
Stworzyłem sobie 2 komunikaty: WM_USER+101 i WM_USER+102
Oczywiście, gdy wysyłam za pomocą Perform, nie działa, ale jak ślę komunikat za pomocą SendMessage z handlem głównej formy działa i forma pokazuje się modalna. Ale tu pojawia się kolejny problem - gdy chcę wysłać drugi komunikat mówiący o tym, że okno ma zostać zamknięte. Oczywiście procedura, która obsługuje ten komunikat nie wykonuje się...

0

@ŁF: przecież ja jestem cierpliwy, lol. Rzuć okiem na wątek ze zbiorem, nie tylko napisałem gotowca, ale go jeszcze zintegrowałem z dowodem na to, że jest poprawny. Udzielenie wskazówki rozumiem, ale namawianie kogoś, żeby z tej wskazówki skorzystał, to mistrzostwo świata, rotfl

A że zgryźliwy jestem? Taka moja podła natura :] Żeby nie było nieporozumień: jestem złośliwy, bo jestem złośliwy, a nie dlatego, że uważam się za geniusza. Ja też mam problemy, i na pewno nie raz o coś zapytam - ale wcale nie oczekuję, że ktoś będzie się ze mną cackał - życie jest ciężkie. Albo płacisz ciężkie pieniądze za szkolenie, albo znosisz uszczypliwości, lol

Aha, Synchronize nie chciałem wymieniać (i płaczę, że się pojawiło), bo na 100% dyskusja rozrośnie się o następne 10-15 postów z serii: jak korzystać z Synchronize (bo Example w pomocy jest niezrozumiały) :] Ale może się mylę, znowu moja złośliwa natura się ukazuje, sorry.

//ŁF: punkt dla ciebie, pytań o Synchronize nie było

0

OK, zrobiłem w taki sposób(jakby ktoś kiedyś potrzebował):
W OnExecute wysyłam swój komunikat poprzez SendMessage z handlem głównej formy.
Następnie w procedurze, która ten komunikat obsługuje ustawiam sobie pewnego timerka: enabled na true z odpowiednim interwałem no i pokazuje modalne okno.

W procedurze timera sprawdzam, czy mogę już okno zamknąć(w moim przypadku mówi o tym odpowiedni zapis w bazie), jeśli tak, to zamykam i daję enabled timera na false.

Trochę to może zakręcone, ale działa

0

a rozwiązanie było takie banalne, ale jak Ci je proponowałem to mnie zjeb*** ...

BTW jak ktoś nie wie jakie to brzmiało ono tak "olej INDY weź synapse lub ICS"

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