Citat:
Kako omoguciti da program odradi neki kod poslije pritiska na X odnosno izlaska iz programa?
Pretpostavljam da koristiš Borland C++ Builder, pošto pominješ Application->Terminate().
U tom slučaju, postoji par tipičnih mesta gde se taj kod može staviti, a svaki ima neke prednosti
i nedostatke:
1) DESTRUKTOR glavne forme
2) OnClose() događaj glavne forme
3) OnCloseQuery() događaj glavne forme
---
1) Destruktor glavne forme nije inicijalno napravljen od strane IDE-a, i moraš ga ručno postaviti:
--- H ---
Code:
// ... recimo, stavi ga odmah ispod konstruktora ...
__fastcall ~TForm1();
// ...
--- CPP ---
Code:
// ...
__fastcall TForm1::~TForm1()
{
// OVDE MOŽE DA DOĐE TVOJ KOD KOJI UPISUJE ZAVRŠNE PODATKE ...
}
// ...
Nemoj umesto destruktora koristiti događj OnDestroy(), koji je Delphi idiom za istu stvar, jer postoji
istorijat neobičnog ponašanja ovog događaja u smislu C++ programa, koji imaju drugačije standarde
kada je u pitanju destrukcija. Takođe, slično tome, ne koristi ni OnCreate() umesto konstruktora.
Konstruktor nemoj koristiti ako tvoji završni podaci zavise od POKAZIVAČA Form1, Form2 ili bilo čega
drugog što je možda u trenutku destrukcije uništeno ili može biti uništeno. Tada ćeš dobiti neki
Access Violation.
2) OnClose
OnClose() događaj je zgodno mesto za ovakve stvari:
Code:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// ... OVDE TVOJ ZAVRŠNI KOD ...
}
Ukoliko ne želiš da se program završi pritiskom na [X], možeš to sprečiti sa:
Code:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// ...
Action=caNone; // <--- PROGRAM SE NEĆE ZAVRŠTI. OVO JE ZGODNO ZA DIJALOGE ...
// ... KOJI TE PITAJU DA LI SIGURNO ŽELIŠ DA ZATVORIŠ APLIKACIJU
}
3) OnCloseQuery
OnCloseQuery() je jako sličan događaj kao i OnClose().
Code:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
// ... OVDE TVOJ ZAVRŠNI KOD ...
}
Ukoliko ne želiš da se program završi pritiskom na [X], možeš to sprečiti sa:
Code:
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
// ...
CanClose=false; // <--- PROGRAM SE NEĆE ZAVRŠTI. OVO JE ZGODNO ZA DIJALOGE ...
// ... KOJI TE PITAJU DA LI SIGURNO ŽELIŠ DA ZATVORIŠ APLIKACIJU
}
Prednost OnCloseQuery je u tome što će se ovaj deo koda automtski pozvati čak i kada
neko drugi krene da zatvara Windows-e (ShutDown) ili ide na promenu korisnika (Log off).
Tj., uhvatiće se poruka:WM_QUERYENDSESSION.
Predlažem da koristiš ovu mogućnost 3. Bitno je da osiguraš da CanClose bude TRUE, jer će
u suprotnom Winodws beskonačno dugo čekati na zatvaranje.
[Ovu poruku je menjao X Files dana 26.01.2007. u 18:21 GMT+1]