Witam
Czy może mi ktoś podpowiedzieć dlaczego po ukryciu programu (form1.Visible:=false;) funkcja FormDestroy nie działa przy wyłączeniu przez Menedżera zadań. A jeżeli nie ukrywam formy1 to działa?
form1.Visible:=false;
- nie wiem (mogę mieć hipotezy, ale nie o to chodzi)
- nic o szerszym kontekscie kodu nie wiemy, np może być "parzysta ilość błędów"
- a dlaczego cie to boli ? Niech zgadnę ... hmmm... niedokładnie dobrane eventy ? Na jaką okoliczność chcesz zareagować ?
Marcin Mikieta napisał(a):
Czy może mi ktoś podpowiedzieć dlaczego po ukryciu programu (form1.Visible:=false;) funkcja FormDestroy nie działa przy wyłączeniu przez Menedżera zadań.
Pewnie dlatego, że Menedżer zadań po prostu ubija proces.
Który system operacyjny i w jaki sposób kończysz działanie procesu?
bo ubijanie przez task menadżera to nie jest NORMALNE kończenia programu/procesu
W obydwóch przypadkach wyłączam program za pomocą menagera
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
rok,miesiac,dzien :word;
wHour, wMin, wSec, wMSec : Word;
dataigodzina: string;
TF : TextFile;
S : String;
implementation
{$R *.DFM}
procedure TForm1.FormDestroy(Sender: TObject);
begin
DecodeDATE(now,rok,miesiac,dzien);
DecodeTime(Now, wHour, wMin, wSec, wMSec);
Dataigodzina:=IntToStr(DZIEN) + '/' + FormatFloat('00', miesiac) + '/' + FormatFloat('00', ROK)+' '+
FormatFloat('00',wHour)+ ':'+FormatFloat('00',wMin) + ':'+ FormatFloat('00',wSec);
AssignFile(TF, 'C:\Users\Marcin\Desktop\Delphi\raport.txt');
Append(TF);
Writeln(TF, DATAIGODZINA);
CloseFile(TF);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.Visible:=false;
end;
end.
Jak wykasuje form1.Visible:=false
to program zapisuje do pliku a w przeciwnym razie nie.
Posiadam system Windows8.1
Zamykamy formatkę za pomocą polecenia Close;
jeżeli odpalona normalnym Show;
FormDestroy(Sender: TObject);
to nieco za późno na jakieś zapisy, trzeba to zrobić w FormClosing(Sender: TObject);
Po co robisz chowanie formy w timerze? Nie możesz tego zrobić raz albo ukryć od razu przy utworzeniu?
Na ile masz ustawiony interval w timerze?
Marcin Mikieta napisał(a):
W obydwóch przypadkach wyłączam program za pomocą menagera
ty go NIE ZAMYKASZ! ty go na chama ubijasz. Nie masz w takim przypadku ŻADNEJ pewności co zostanie zawołane a co nie!
Program mam na celu zapisać datę godzinne zał/wył komputera (nie chce brać tej informacji z systemu ani z innego popularnego miejsca).
Program działa poprawnie do momentu ukrycia form.
Zmieniłem funkcję z Destroy na Close ale efekt ten sam ;(
Może ktoś z was wie jak to zrobić?
Ustawienie visible:= false
dla formy w object inspectorze a nie w timerze daje taki sam efekt?
Dziwnie ten program wygląda — niby ma formularz, ale zdaje się on być ciągle ukryty, tak jakby zawsze miał być niewidoczny. Mi to nie wygląda na typowy program okienkowy, a na coś, co ma działać w tle i nie posiadać w ogóle okna. Czyli w skrócie, ten program powinien być standardową usługą.
Lepiej by było łapać komunikat WM_ENDSESSION
i na niego reagować. Albo wykorzystać cokolwiek innego z systemowych mechanizmów, zamiast jakichś dziwnych kombinacji i ubijania procesów z poziomu Menedżera Zadań.
Marcin Mikieta napisał(a):
Program mam na celu zapisać datę godzinne zał/wył komputera
przy wyłączeniu komputera (wylogowaniu usera) wszystkie aplikacje są zamykane "normalnie" (jest do nich słany komunikat WM_CLOSE) i normalnie na taki komunikat aplikacja, nawet z ukrytą formą, reaguje. Natomiast zabicie jej z menadżera zadań nie wysyła do niej komunikatu WM_CLOSE - to że z otwartą formą jest wołany destruktor tej formy to tylko i wyłącznie twoje szczęście
w docelowym programie wyświetla się komunikat przez 2s kiedy było ostatnie zał/wył komputera