FormDestroy nie działa po użyciu form1.Visible:=false;

0

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;

1

@Marcin Mikieta:

  1. nie wiem (mogę mieć hipotezy, ale nie o to chodzi)
  2. nic o szerszym kontekscie kodu nie wiemy, np może być "parzysta ilość błędów"
  3. a dlaczego cie to boli ? Niech zgadnę ... hmmm... niedokładnie dobrane eventy ? Na jaką okoliczność chcesz zareagować ?
1
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?

3

bo ubijanie przez task menadżera to nie jest NORMALNE kończenia programu/procesu

0

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

4

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);

1

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?

4
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!

0

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ć?

0

Ustawienie visible:= false dla formy w object inspectorze a nie w timerze daje taki sam efekt?

2

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ń.

2
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

0

w docelowym programie wyświetla się komunikat przez 2s kiedy było ostatnie zał/wył komputera

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