EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDernière intervention 2 juin 2006
-
15 avril 2005 à 20:00
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDerniè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?????
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDerniè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.
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDerniè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.
EddiTheHead
Messages postés58Date d'inscriptionmercredi 16 février 2005StatutMembreDerniè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.