Décocher un checkbox avec mot de passe

Résolu
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006 - 15 avril 2005 à 20:00
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 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?????

10 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
16 avril 2005 à 15:44
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
3
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
15 avril 2005 à 20:42
essaie ça:

Procedure TForm1.CheckBox1Click(Sender: TObject);
Begin

CheckBox1.Checked :=
Not
CheckBox1.Checked;


If
(Form2.ShowModal = 1) then



CheckBox1.Checked :=
Not
CheckBox1.Checked;


End;



;)
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
15 avril 2005 à 21:22
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'
0
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
15 avril 2005 à 21:54
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.
0

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

Posez votre question
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
15 avril 2005 à 22:31
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.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
15 avril 2005 à 23:12
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'
0
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
16 avril 2005 à 12:13
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.
0
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
16 avril 2005 à 12:52
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.
0
EddiTheHead Messages postés 58 Date d'inscription mercredi 16 février 2005 Statut Membre Dernière intervention 2 juin 2006
16 avril 2005 à 20:41
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.
@+
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
16 avril 2005 à 23:01
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
0
Rejoignez-nous