Décocher un checkbox avec mot de passe [Résolu]

EddiTheHead 60 Messages postés mercredi 16 février 2005Date d'inscription 2 juin 2006 Dernière intervention - 15 avril 2005 à 20:00 - Dernière réponse : japee 1798 Messages postés vendredi 27 décembre 2002Date d'inscription 1 juillet 2018 Dernière intervention
- 16 avril 2005 à 23:01
Bonjour,

J'aimerai décocher un checkbox uniquement si le mot de passe est correcte et le cocher sans mot de passe.

J'ai essayé avec ça :

-------------------------------------------------------------------------
Procedure TForm1.CheckBox1Click(Sender: TObject);
Begin
If Not CheckBox1.Checked Then
Begin
CheckBox1.Checked := True;
Form2.ShowModal;
If ResultatForm2 = 1 Then CheckBox1.Checked := False;
End
Else CheckBox1.Checked := True;
End;
-------------------------------------------------------------------------

La Form2 ouvre une fenêtre qui demande le mot de passe.ResultatForm2 1 si le mot de passe est ok, sinon à 0.

J'ai remarqué que le checkbox change d'état avant de rentrer dans la procédure "Click". C'est pour ça que je le teste avant, car si je le trouve à false, c'est qu'il était à true, je le force donc à true. Ca à l'air bête mais si il se décoche avant d'entrer le mot de passe, ça sert à rien.

Mais bon, ça marche pas. Quand le mot de passe est correcte, la form2 est automatiquement réafficher.

J'ai essayé avec le "OnExit" du checkbox mais y se passe rien quand je sort du checkbox. Par contre, quand j'ai clicker au moins une 1 fois sur le checkbox et que je quitte le programme, la form2 s'affiche?????
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
japee 1798 Messages postés vendredi 27 décembre 2002Date d'inscription 1 juillet 2018 Dernière intervention - 16 avril 2005 à 15:44
3
Merci
Propriété des CheckBox :



TabStop := False;



Puis tu relies tous les CheckBox à l'évènement OnMouseDown du premier CheckBox.



(Tu peux faire ces 2 choses avec l'inspecteur d'objets)



Enfin, le code :



procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Form2.ShowModal;

with TCheckBox(Sender) do

Checked := not ResultatForm2;

Panel1.SetFocus; // peut être le panel qui contient les cbox

end;



A suivre



Bonne prog'



japee

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 78 internautes ce mois-ci

Commenter la réponse de japee
retaks666 289 Messages postés jeudi 2 janvier 2003Date d'inscription 16 juillet 2007 Dernière intervention - 15 avril 2005 à 20:42
0
Merci
essaie ça:

Procedure TForm1.CheckBox1Click(Sender: TObject);
Begin

CheckBox1.Checked :=
Not
CheckBox1.Checked;


If
(Form2.ShowModal = 1) then



CheckBox1.Checked :=
Not
CheckBox1.Checked;


End;



;)
Commenter la réponse de retaks666
japee 1798 Messages postés vendredi 27 décembre 2002Date d'inscription 1 juillet 2018 Dernière intervention - 15 avril 2005 à 21:22
0
Merci
Pourquoi ne pas utiliser plutôt un Boolean pour ResultatForm2 ?



Pour éviter un petit problème de fonctionnement, il vaut mieux placer le code dans l'évènement OnMouseDown, ainsi :



var

ResultatForm2: Boolean;

// PassWordOk: Boolean serait plus explicite !



procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Form2.ShowModal;

CheckBox1.Checked := not ResultatForm2;

end;



Bonne prog'
Commenter la réponse de japee
EddiTheHead 60 Messages postés mercredi 16 février 2005Date d'inscription 2 juin 2006 Dernière intervention - 15 avril 2005 à 21:54
0
Merci
retaks666,

Je ne connaissais pas "Form2.ShowModal = 1". J'ai donc été voir dans l'aide et j'ai modifier le form2 (qui ne contient qu'un Edit) :

---------------------------------------------------------------------------
Procedure TForm2.FormShow(Sender: TObject);
Begin
ModalResult := mrCancel; // pour dire pas bien
EditMotDePasse.Text := '';
End;


Procedure TForm2.EditMotDePasseKeyPress(Sender: TObject; var Key: Char);
Begin
Case Key Of
#13 : Begin
If EditMotDePasse.Text = CodeDesactivation
Then ModalResult := mrOK; // pour dire bien
Close;
End;
#27 : Close;
End;
End;

dans Form1 :
Ton code en remplacant =1 par =mrOK, évidemment.
---------------------------------------------------------------------------

Mais le programme plante. En fait, le CheckBox change d'état au moins 100 par seconde (je suppose, ça va tellement vite) et en suite un message d'erreur de débordement de pile.

japee,

Pourquoi pas un booléan, tout simplement parce que je pensais renvoyer plusieurs états différents. Mais en fin de compte, y en aura que 2 et ton

CheckBox1.Checked := Not ResultatForm2;

est bien pensé.

Je vais tester ton idée, mais je sais déjà que le OnMouseDown va me poser un problème : on peut décocher le CheckBox avec la barre d'espace et la routine dans MouseDown ne sera pas exécuter.

Je teste et je reviens.
Commenter la réponse de EddiTheHead
EddiTheHead 60 Messages postés mercredi 16 février 2005Date d'inscription 2 juin 2006 Dernière intervention - 15 avril 2005 à 22:31
0
Merci
Comme je voulais un mot de passe pour décocher et rien pour cocher, j'ai rajouté un test :

-------------------------------------------------------------------------
Procedure TForm1.CheckBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
If CheckBox1.Checked Then
Begin
Form2.ShowModal;
CheckBox1.Checked := Not ResultatForm2;
End;
End;
-------------------------------------------------------------------------

Ca va comme je veux excepté le clavier. Le même code dans un OnClick, ça coince à cause du fait que le CheckBox change d'état avant que mon code s'exécute. J'ai bien mis un :
CheckBox1.Checked := Not CheckBox1.Checked;
mais cela ne donne pas de bon résultat.
Commenter la réponse de EddiTheHead
japee 1798 Messages postés vendredi 27 décembre 2002Date d'inscription 1 juillet 2018 Dernière intervention - 15 avril 2005 à 23:12
0
Merci
Tu peux toujours envoyer le focus sur un composant "neutre", un TPanel par exemple.



Ce qui donne :



procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Form2.ShowModal;

CheckBox1.Checked := not ResultatForm2;

//CheckBox1.Checked := not Bool(ResultatForm2); // si tu veux utiliser 0 ou 1

Panel1.SetFocus;

end;



A priori, ça fonctionne correctement...



Bonne prog'
Commenter la réponse de japee
EddiTheHead 60 Messages postés mercredi 16 février 2005Date d'inscription 2 juin 2006 Dernière intervention - 16 avril 2005 à 12:13
0
Merci
J'ai tester et ça fonctionne mais provisoirement puisque l'on peut revenir sur le CheckBox grâce (ou à cause) à la tabulation. Je sais que je chipote un peut mais comme il s'agit d'un mot de passe, je dois écarter toute probabilité de modification.

J'ai essayé ceci :

Procedure TForm1.CheckBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
If CheckBox1.Checked Then
Begin
Form2.ShowModal;
CheckBox1.Checked := Not ResultatForm2;
End;
End;


Procedure TForm1.CheckBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Begin
If Key = 32 Then Key := 0;
End;

Mais bon, je n'ai pas tout dit. En fait, j'ai 10 CheckBox et tester 10x le KeyDown, ça fait pas très cool. J'avais trouvé un prog pour faire une calculatrice et qui utilisait le "Sender" pour éviter les redondances. A l'époque j'avais rien compris. Je vais le relire pour voir si c'est plus claire.
Sinon, je suis partant pour toutes autres idées.
Commenter la réponse de EddiTheHead
retaks666 289 Messages postés jeudi 2 janvier 2003Date d'inscription 16 juillet 2007 Dernière intervention - 16 avril 2005 à 12:52
0
Merci
sinon une solution:

implementation

var

canchange : boolean;



Procedure TForm1.CheckBox1Click(Sender: TObject);
Begin

if (canchange = false) then exit;


canchange := false;



CheckBox1.Checked :=
Not
CheckBox1.Checked;


If
(Form2.ShowModal = 1) then begin



CheckBox1.Checked :=
Not
CheckBox1.Checked;



end;



End;



ensuite mets dans genre dans l'événement form activate


canchange := true;



Note: canchange doit être déclarée en globa:!! (en dessous implementation)



ça devrait marcher.
Commenter la réponse de retaks666
EddiTheHead 60 Messages postés mercredi 16 février 2005Date d'inscription 2 juin 2006 Dernière intervention - 16 avril 2005 à 20:41
0
Merci
retaks666,

if (canchange = false) then exit; // ça marche la 1er fois, ensuite le CheckBox

canchange := false;
// change d'état mais à cause de "exit"
// la Form2 n'est plus exécutée

japee,

Comme ça, on est d'accord.
C'est fou le nombre de chose qu'on peut apprendre avec une seul question.
Quand j'en aurai fini, je mettrai ma source sur le site.

Merci à vous 2.
@+
Commenter la réponse de EddiTheHead
japee 1798 Messages postés vendredi 27 décembre 2002Date d'inscription 1 juillet 2018 Dernière intervention - 16 avril 2005 à 23:01
0
Merci
Content que cet échange ait pu t'apprendre quelques bricoles.



Tu ne vas peut-être pas me croire, mais on apprend encore plus en
répondant aux questions qu'en les posant, enfin, au moins autant...



C'est ce que je pense.



Bonne continuation, EddiTheHead.



japee
Commenter la réponse de japee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.