florenth
-
27 mars 2007 à 20:39
cs_Lassal
Messages postés27Date d'inscriptionjeudi 7 novembre 2002StatutMembreDernière intervention21 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.
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és27Date d'inscriptionjeudi 7 novembre 2002StatutMembreDernière intervention21 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.
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;
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és27Date d'inscriptionjeudi 7 novembre 2002StatutMembreDernière intervention21 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és1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 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.
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...
28 mars 2007 à 18:13
28 mars 2007 à 16:40
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 !
28 mars 2007 à 16:27
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 !
28 mars 2007 à 15:57
Pareil avec des panels créés en dynamique pour une une appli de gestion de carnet d'adresse récupéré depuis GroupWise.
28 mars 2007 à 14:42
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;
28 mars 2007 à 14:17
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 ...
28 mars 2007 à 10:17
Sinon Florenth tu entends quoi par un exemple plus complet?
En tout cas encore merci pour les commentaires.
27 mars 2007 à 23:42
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
27 mars 2007 à 23:20
Merci WhiteHippo pour cette préscision
27 mars 2007 à 22:18
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.
27 mars 2007 à 21:46
D'accord pour SendMessage ....
mais j'ai fais le teste et ça fonctionne quand même ?????
as-tu une explication logique ?
27 mars 2007 à 20:39
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...