Witam.
wydaje mi sie ze widzialem gdzies poruszany moj problem ale nie moge go teraz znaleźć a rozwiazania nie znam , stad nowy temat.
Chodzi o to, że nie pozwalam zamknac programu krzyzykiem dajac w onclosequery false na canclose a zamykam program wylacznie "ręcznie" przez application.terminate wtedy kiedy chcę. No i problem jest kiedy program jest uruchomiony a chce zamknac system. Program poporstu nie pozala zamknac systemu. Nie wiem jak i gdzie przechwycic komunikat z windy ze program ma byc zamkniety. Probowalem w onclose i canclosequery dopisywac jakies cody w oparciu o help z delphi, oraz dopisywac wlasna procedure application.onmessage ale bez powodzenia. Prosilbym o rozwiazanie, mam nadzieje ze jest ono proste tylko ja go zwyczajnie nie znam i nie moge na nie wpaść.
Z góry wielkie dzięki , pozdrawiam.
Nie wiem jakie 'rzeczy' dawałeś w OnClose i OnCloseQuery, ale wystarczy dać w OnClose:
Action:=CaNone;
a te inne 'rzeczy' ktore miales w OnCloseQuery i OnClose wywal i bedzie dobrze
Hmm... chyba mnie nie zrozumiałeś. Mi chodzi o to żeby program zamykał się wtedy gdy system jest zamykany, zeby moc stwierdzic ze system jest zamykany i wykonac wtedy niezbedne do prawidlowego zamlkniecia programu procedury i zamknac go. Problem w tym ze on sie nie zamyka i system sie nie zamyka. Dopiero kiedy zamkne program moge zamknac system. A te rzeczy o kitorych wspmnialem to wlasnie proby uchwycenia informacji o tym ze system probuje zamknac program by mogl sie sam zamknac; to jest odczytanie zmiennej application.terminated ktora wg helpu powinna przyjac wartosc true no a nie przyjmuje oraz procedura application.onmessage, ktora wg. mojego jak widac blednego rozmienai powinna w zmiennej Tmsg.message dawac wartosc WM_QUIT wtedy gdy system probuje zamknac program no a niestety tego tez nie potrafie stwierdzic.
Heh, a moze to ja nie zrozumialem Twojej dosc oszczednej wypowiedzi :) Co wdług Ciebie mialoby dac to caNone?
Jak już wiesz że winda się zamyka a twój program to blokuje to zamknij windę przez swój program i daj terminate dla swojej aplikacji
Tak abj, wiem , bo to na ogol ja to robie wybierajac start->wylacz komputer :)
Ale chyba nie o to chodzi, a o to żeby w programie móc stwierdzic ze sie winda chce zamknąc.
//.....
type
TMainForm = class(TForm)
//......
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure WndProc(var Message: TMessage);override;
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
CanExit : Boolean;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if CanExit then
CanClose := True
else CanClose := False ;
end;
procedure TMainForm.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_QUERYENDSESSION then
CanExit := True ;
inherited WndProc(Message);
end;
Heh, a moze to ja nie zrozumialem Twojej dosc oszczednej wypowiedzi :-)
Co wdług Ciebie mialoby dac to caNone?
no to może rozwine swoją myśl :-) być może Dominik rozwiązał już Twój problem, ale wydaje mi sie że nie trzeba aż tak kombinować jak on :) twój drugi post wyjaśnił mi co chcesz osiagnąć, czyli, w OnClose formy dajesz:
//próba zamknięcia programu:
{tutaj dajesz te niezbędne rzeczy do prawidłowego zamknięcia programu, o ktorych pisaleś w swoim drugim poście, domyślam sie że są to rzeczy w stylu zapisania ustawień programu}
Action:=CaNone; //Nie dopuszczamy do zamknięcia programu, ale windows sie bez problemu zamknie, gdy jest odpalony Twój program
a nie wiem po co przechwytywać to że użytkownik chce wyłączyć kompa ? procedura OnClose wykonuje sie zarówno wtedy gdy użytkownik probuje wyłączyć program (obojetnie w jaki sposób, np poprzez 'x', lub przez alt+f4), no a także gdy użytkownik próbuje wyłączyć kompa, bo wtedy też zamyka sie najpierw program. No chyba że wykonujesz inne rzeczy w przypadku wyłączenia programu, a inne w przypadku wyłączenia kompa, wtedy pomocny będzie kod Dominika (tak mi sie zdaje przynajmniej :-) )
Jak wykryć zamykanie Windows
{nadpisanie procedury przechwytujacej komunikaty}
private
procedure WndProc(var Message: TMessage);override;
end;
var Form1: TForm1;
implementation
procedure TForm1.WndProc(var Message: TMessage);
begin
{identyfikacja komunikatu zamykania Windows}
if Message.Msg = WM_QUERYENDSESSION then
begin
{tu nalezy wprowadzic akcje np. pozwalajaca na
zamkniecie Windows lub tez nie...}
end;
inherited WndProc(Message);
end;
pozdrawiam
ShowMessage('Niech Delphi będzie z Tobą');
Dzięki Dominik, właśnie o to mi chodziło.
(jas_dream, Twoj sposob jest bardzo podobny do tego co pokazał Dominik, ale też dziękuję)
Problem jednak w tym, że nie chce mi to działać na winxp. Sprawdzałem tez na win98 i wszystko jest tak jak byc powinno. Moze to wina niestabilności tego xp, więc wróce do wątku jesli po przeinstalowaniu będa problemy.
Jeszcze raz wielkie dzięki.