Forcer l'évén onclose du MainForm de faire son travail avant Fin

Résolu
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019 - 11 août 2014 à 10:46
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019 - 25 août 2014 à 02:14
first i'm so sorry for using this language :
second my problem is:
How to force the onclose event of the Main Form to do his job before terminated or killed by any External Process like the task Manager .
i have using this code to make Fullscreen of my Main form Application and look like a game application and this is my code :

var
Form1: TForm1;
HTaskbar: HWND;
OldVal: LongInt;
implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
try
// Find handle of TASKBAR
HTaskBar := FindWindow('Shell_TrayWnd', nil);
// Turn SYSTEM KEYS off, Only Win 95/98/ME
SystemParametersInfo(97, Word(True), @OldVal, 0);
// Disable the taskbar
EnableWindow(HTaskBar, False);
// Hide the taskbar
ShowWindow(HTaskbar, SW_HIDE);
finally
with Form1 do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
Left := 0;
Top := 0;
Height := Screen.Height;
Width := Screen.Width;
end;
end ;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

//Find handle of TASKBAR
HTaskBar := FindWindow('Shell_TrayWnd', nil);
//Turn SYSTEM KEYS Back ON, Only Win 95/98/ME
SystemParametersInfo(97, Word(False), @OldVal, 0);
//Enable the taskbar
EnableWindow(HTaskBar, True);
//Show the taskbar
ShowWindow(HTaskbar, SW_SHOW);
end;

and this Onclose event is my problem when my application face a crash or access violation in his Mimory i have to use the task manager to kill or terminate My process from memory ,but this can't solve the problem and finish by hiding the task bar Menu system and this is very bad to me and the user
so please help ........

10 réponses

MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
Modifié par MiniApp le 11/08/2014 à 11:02
Bonjour (good Morning),

You can insert a command
Action := caFree
.
This command close and eliminate used memory of a form, but in a form the default value is
Action := caFree
, (N.B. : Pour MDIChild val par défault
Action := caMinimize
). Sorry if my English is bad.

In French (en français):
Tu peut insérez la commande
Action := caFree
.
La commande ferme et elimine la mémoire utilisé par la form, mais dans une form la valeurr par défault est
Action := caFree
, (N.B. : Pour MDIChild val par défault
Action := caMinimize
)
Chercher et essayer : vous trouverez la solution!
Fouiner et regarder partout : vous trouverez la connaissance!!
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
11 août 2014 à 11:47
good morning to MR MiniApp
th'x for your reply
if you have an exemple will make me very happy
i don't know the methode how to insert this command and it's declaration !!
and about your english you are so good .
with best kind of regards: Bravesaw
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
11 août 2014 à 12:02
Thank You for my English :-).
Else you can insert a command
Application.terminate
in end of event OnClose. For the exemple I not have this. :-(.
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
11 août 2014 à 12:59
thank's MiniApp you are make me very happy since your first reply and your suggest is very welcome
really in begining i was have a bad emotion that no one Can reply to my questions due to my english Questions, and your reply tell to me first and all members here second and for All Visitors that you wellcome for all your questions while we can understanding your language ....
finally i wish you the best of the best in your life and god bless you
bestregards: BraveSaw from BraveMouse.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 août 2014 à 13:40
Hi,

Can we speak English?
Yes we can. ^^

But you are on a French site, and we must use that language. If this is a problem for you, you can always use Google Translate to ask your question.

Thank you for your understanding.

If we finish the process from the outside and brutally (by Task Manager) no event is triggered (OnClose, OnCloseQuery, OnDestroy)


Salut,

Peut-on parler anglais?
Oui, nous pouvons. ^^

Mais vous êtes sur un site français, et nous devons utiliser cette langue. Si c'est un problème pour vous, vous pouvez toujours utiliser Google Translate pour poser votre question.

Nous vous remercions de votre compréhension.

Si on termine un processus de l'extérieur et de manière brutale (par le Gestionnaire de Tâches) aucun évènement n'est déclenché (OnClose, OnCloseQuery, OnDestroy)
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
11 août 2014 à 16:01
Monsieur Cirec merci pour votre Entré inattendue mais c'est vraiment mignonne et j'aimerai cette manière que vous parler et ça ma pousser de faire étudier la langue français comme même ...
en retour sur l'objet : es que il y à une Méthode de hook peut m'aider pour faire s'échapper de la Mort de Mon application depuis le gestionnaire des taches ? autrement dit es que je peut introduire une commande dans mon app pour le temp que je tue mon app depuis le task Manager la bare menu des taches de windows revienne à l'état précédente .....
c'est tous et pardonne moi pour mes fautes françaises
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
11 août 2014 à 16:10
j'ai oublier de dire encore merci pour votre peine le temps que vous écrit et répondre à moi .....
c'est était vraiment une magnifique stratégie pour me pousser à aller sur google translate et faire poser ma question et apprendre de la langue française en même temps .....
je vous félicite et merci beaucoup ...
Cordialement : bravesaw
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
11 août 2014 à 18:08
Google Translate est très pratique, mais il ne fait pas forçément de bonne traduction :-( ("pour votre peine le temps que vous écrit" is not French, "pour votre peine le temps que je vous écrit" is more good). Après pour sauver ton App du crash TaskMgr, il faut une seconde app. Perso je ne pense pas que sauver une app du crash est très pratique, quand le PC est surchargé si on veut arrêter ton app ce sera impossible et sa empirerait les choses.

Google Translate is very practical, but it doesn't necessarily make good translation. After for saving your App of crash taskmgr, it takes a second app. Personally I do not think saving a crash app is very convenient, when the PC is overloaded if you want to stop your app and it will not make things worse.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 août 2014 à 19:32
oui Google translate n'est pas toujours top ... mais on comprend bien le sens de la phrase.

Et si le texte est écrit en "bon Anglais" la traduction est impeccable.

pour BraveMouse:

La seule solution est de créer une seconde application un "Luncher" qui va faire les modifications de l'environnement (OS), lancer l'application et à la fin restaurer l'environnement et ce même si le processus est tué par le gestionnaire des tâches.

program Luncher;

{*$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

var
  HTaskbar: HWND;
  OldVal: LongInt;

procedure HideTaskBar;
begin
  // Find handle of TASKBAR
  HTaskBar := FindWindow('Shell_TrayWnd', nil);
  // Turn SYSTEM KEYS off, Only Win 95/98/ME
  SystemParametersInfo(97, Word(True), @OldVal, 0);
  // Disable the taskbar
  EnableWindow(HTaskBar, False);
  // Hide the taskbar
  ShowWindow(HTaskbar, SW_HIDE);
end;

procedure ShowTaskBar;
begin
  //Find handle of TASKBAR
  HTaskBar := FindWindow('Shell_TrayWnd', nil);
  //Turn SYSTEM KEYS Back ON, Only Win 95/98/ME
  SystemParametersInfo(97, Word(False), @OldVal, 0);
  //Enable the taskbar
  EnableWindow(HTaskBar, True);
  //Show the taskbar
  ShowWindow(HTaskbar, SW_SHOW);
end;

procedure LunchApp(const App: string);
var
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(Start, Sizeof(Start), #0);
  start.cb := SizeOf(start);

  if CreateProcess(nil, PChar(App), nil, nil, False,
    NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
  try
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
  finally
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end;


begin
  HideTaskBar;
  try
    LunchApp('.\AppTest.exe');
  finally
    ShowTaskBar;
  end;
end.


0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
13 août 2014 à 01:14
1) Tout d'abord, je vous remercie beaucoup M. Cirec.
2) Deuxièmement Un grand merci MiniApp et tous les membres qui sont présents ou absents et grand merci à ce site génial.
3) M. Cirec: Votre réponse est très utile, et vous résoudre mon problème, et mon application est OK et vous dire que vous êtes très belle personne et un bon programmeur ...
Enfin, le code je vais l'utiliser pour mon application, mais ne vous inquiétez pas M. Cirec que votre nom est sera ajouté en haut et en bas de mon application console, afin de maintenir les droits de l'homme, et éviter d'être ma mémoire vous oubliez. Vraiment chaque membre ici est le roi de son travail, ce qui signifie: la Miséricorde de toutes les nations ..
Cordialement : BraveMouse et pardonne moi pour toutes mes fautes françaises.
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
Modifié par solilog le 13/08/2014 à 19:00
Hi all,
Sorry Cirec, we can forget French for once.
I suggest something else...
The issue: when the prog crashes, the OnClose event is not called and the process created in the FormCreate is not killed.
There are the procedures initialization and finalization. As their names, the first is called when the unit is loaded, the second when the unit is unloaded (at the end of the application). When these proc are called, the Form never exists (or not created -initialization', or already free - finalization), so you cannot acces to object in the form, only variables, global procedures.

finalization is ALLWAYS called, even when the program crashes. Try to put your Onclose intructions there. No time to test it now, but sure it'll work.
example: no need the word procedure nor begin end.

interface
...
implementation
...

procedure closeprocess;
begin
...
end;

finalization
closeprocess;

end.

Regards

solilog
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 août 2014 à 20:28
Salut,

je suis désolé de dire non sur toute la ligne ^^

étant un site francophone on ne peut pas commencer a faire d'exception sinon on devra aussi d'accepter de répondre en Allemand, Portugais ... etc etc. ... bref et ça fait parti du règlement de CS.

sinon pour "initialization / finalization"
finalization is ALLWAYS called, even when the program crashes
ben ... c'est pareil ... c'est non !
ça ne fonctionne pas !
si le processus plante ou si il est tué plus rien n'est exécuté !!!


fais le teste ;)
bonne soirée.
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
Modifié par MiniApp le 14/08/2014 à 11:41
Cirec a raison.

Quand on arrête un processus on libère la mémoire dédié. Quand on fait fin tache Windows envoie le message "WM_QUIT" et attend la fin de l'éxécution. En plus j'ai moi même fait des tests par apport au curseur d'éxécution qui fait :
1-Appel des codes dans les blocs
initialization

2-Création des fiches et éxécution.
3-..
4-Destruction des fiches
5-Appel des codes dans les blocs
finalization

6- arrêt du processus.
Quand j'arrête le processus (quand je suis en pas à pas) le curseur d'éxécution ne passe même pas par finalization.

initialization peut être "désactivé" si on retire le code
Application.Initialize;
du dpr du project
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
Modifié par bravemouse le 16/08/2014 à 01:45
Merci aussi pour Monsieur : "solilog" je vous remercie beaucoup pour votre réponse , et touts commentaires sont traités comme des Bonnes conseilles et cette Suggestion que vous me demande Monsieur " solilog " et que Monsieur " Cirec " Voir illogique... ou bien Sa Marche Plus sur Delphi ,alors je vous dite please Mister "solilog" Your Welcome any time you wish to Discuss or comments and this welcome is for all, specially My Favorite Number Mister " Cirec " ... this if you don't Mind of Course ...
alors je vous dite Monsieur "solilog" que Vous êtes Bien Venue Chez Mon Profile le temps que Vous Souhaité Pour Notre Discussion et Commentaires aussi , et que cette Bien Venue soyer acceptable de la part de Monsieur "Cirec" si vous ne voyer pas inconvénients aussi ...
finalement Veuillez m'accepter Touts Mes expression de Ma Haute Considération . et Vous Pouvez enfin Monsieur "solilog" de faire Défendre sur Votre Suggestion Le Temps Que Vous Souhaité et que Mon Dieu vous bénisse et J'aime aussi Les différents Calcules qui affiche Toujours La Même Résultat .....
Cordialement: BraveSaw from braveMouse
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
14 août 2014 à 14:49
Bonjour,
mes excuses, j ai teste et Cirec a (encore et toujours) raison :-)
solilog
0
bravemouse Messages postés 74 Date d'inscription jeudi 8 mars 2012 Statut Membre Dernière intervention 2 avril 2019
25 août 2014 à 02:14
soyer les bien venus Monsieur : Solilog .
et Merci Pour Votre Suggestion .
0
Rejoignez-nous