LANCER UNE ACTION EN DIFFÉRÉ

florenth - 27 mars 2007 à 20:39
cs_Lassal Messages postés 27 Date d'inscription jeudi 7 novembre 2002 Statut Membre Dernière intervention 21 mai 2008 - 28 mars 2007 à 18:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41977-lancer-une-action-en-differe

cs_Lassal Messages postés 27 Date d'inscription jeudi 7 novembre 2002 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 18:13
Oui pour info moi je développe sous Delphi 7. :-)
Ahh oui, tu a tout à fait raison Cirec. Sous D6, on reçoit même plus qu'une seule insulte ! Par contre moi je n'ai pas d'erreur abstraite ...

Bref, pour faire du code compatible, faites comme Lassal. Pour ceux qui auraient doutés de l'utilité du code, vous avez un argument de choix en plus !
Utilisateur anonyme
28 mars 2007 à 16:27
Bon j'ai la réponse au mystère ...
enfin je crois :)

je suppose que tout comme moi Florenth a compiler le code avec TurboDelphi (D10) !

Parce que sous D9 on obtient effectivement un message d'insulte mais pas sous D10

Testé avec ton code juste en remplaçant:

PostMessage(Self.Handle, WM_POST, 0, 0);
Par
f_tCheckBoxToDelete.Free;


Ensuite j'ai refait le teste avec le code que je donnais dans mon précédant message
et la surprise sous D9 si je clique en premier sur la CheckBox 3, 4, ou 5 j'obtiens une erreur abstraite mais en cliquant d'abord sur la CheckBox 0, 1, ou 2 pas d'erreur ??????
Et bien sur sous D10 pas de problème !!!!

Voilà ... bizarre ... non !
cs_Lassal Messages postés 27 Date d'inscription jeudi 7 novembre 2002 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 15:57
Bah justement j'ai eu besoin de trouver cette solution de PostMessage car j'avais des violations d'accès lors de la suppression de CheckBox depuis l'évenement OnClick de ce même composant.
Pareil avec des panels créés en dynamique pour une une appli de gestion de carnet d'adresse récupéré depuis GroupWise.
Utilisateur anonyme
28 mars 2007 à 14:42
Je dirai même plus :

avec des TCheckBox ça fonctionne aussi ????


procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 5 do
with TCheckBox.Create(Nil) do
begin
Parent := Self;
Name := Format('CheckBox%d', [I]);
Left := 15;
Top := 15 + 30 * I;
Caption := Format('CheckBox n°%d', [I]);
OnClick := BtnClick;
end;
end;

procedure TForm1.BtnClick(Sender: TObject);
begin
(Sender as TCheckBox).Free;
end;
D'ailleurs, je viens de faire un autre test :

procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 5 do
with TButton.Create(nil) do
begin
Parent := Self;
Left := 15;
Top := 15 + 30 * I;
Caption := Format('Bouton n°%d', [I]);
OnClick := BtnClick;
end;
end;

procedure TForm1.BtnClick(Sender: TObject);
begin
(Sender as TButton).Free;
end;

Et ben, on peut supprimer les boutons sans problèmes, même dans leur gestionnaire d'évènement ! Etrange, non ?

PS: PostMessage() est préférable à SendMessage() pour tous les cas où tu n'as pas besoin de récupérer le résultat renvoyé. Et PostMessage() est quasi-incontournable dans les applications multi-threads car sinon, tout le thread attend le retour du message (ce qui peut être gênant lors des messages de mise à jour de la fenêtre ....)

PS2: @Lassal: En fait, tu as raison, ça suffit amplement comme exemple.

Bref, le mystère reste entier ...
cs_Lassal Messages postés 27 Date d'inscription jeudi 7 novembre 2002 Statut Membre Dernière intervention 21 mai 2008
28 mars 2007 à 10:17
Merci pour les remarques, j'ai mis à jour le source suite à tes remarques Japee. :-)

Sinon Florenth tu entends quoi par un exemple plus complet?

En tout cas encore merci pour les commentaires.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 mars 2007 à 23:42
Oui, oui, très intéressant...

Pour chipoter, j'aurais fait :

ligne 38 :
with TCheckBox.Create(self) do
au lieu de :
l_tCbx := TCheckBox.Create(self);
with l_tCbx do

et ligne 74 :
if not CheckBoxToDelete.Checked then
à la place de :
if f_tCheckBoxToDelete.Checked = False then

Mais bon... c'est juste histoire de dire que j'ai bien tout compris ton code, lol ^^

P-S : j'ai bien envie de te mettre 5/10 par erreur (rancunier, moi ? meeuuh nooooonnnn... mdr
Utilisateur anonyme
27 mars 2007 à 23:20
ah ben oui en effet c'est logique ... ;)

Merci WhiteHippo pour cette préscision
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 mars 2007 à 22:18
Cirec

SendMessage attends que le message soit traité, donc si ton système n'a pas de thread(s) en cours d'execution monopolisant le(s) processeur(s), tu ne peux pas voir la différence, car le traitement est quasi instantanné.
P.S PostMessage sert principalement pour des traitements asynchrones et/ou pour des notifications.

Cordialement.
Utilisateur anonyme
27 mars 2007 à 21:46
@Florenth:
D'accord pour SendMessage ....
mais j'ai fais le teste et ça fonctionne quand même ?????

as-tu une explication logique ?
Intéressant.
Un exemple un peu plus complet aurait été le bienvenu.

J'en profite pour dire qu'il faut utiliser PostMessage() et non SendMessage() car sinon cela ne sert à rien (SendMessage attend le retour du message)

Je rajouterai aussi que c'est le même mécanisme qui rentre en jeu lorsqu'on appelles FichePrincipale.Close: elle fait un PostQuitMessage qui se chargera de la détruire...
Rejoignez-nous