Controle de saisie (bouton enabled:= true)

Résolu
Mr Capone Messages postés 21 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 19 juin 2005 - 19 juin 2005 à 11:58
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 19 juin 2005 à 15:18
Bonjour je souhaite pouvoir rendre un bouton disponible si tout les
controle (combo box) ne sont pas vide (contiennent une valeur)...



J'ai essayé un truc mais ca me fait une boucle inifinie



vide := true;

while vide do

begin

if cb_genre.Text = '' then

messagedlg ('Séléctionner un genre', mtInformation,[mbOk], 0)

end;



si quelqun peut m'aider



merci

5 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
19 juin 2005 à 12:57
Salut,

Si tes combobox se trouvent sur une fiche tu peux faire:

<hr size= "2" width="100%"> procedure TFrmPrinc.RendreBoutonDispo;

var

i: Integer;

begin

{ Parcours de tous les composants de la fiche. }

for i: =0 to ComponentCount -1 do

if (Component[i] is TComboBox) and ((Component[i] as TCombobox).Text <> '') then

begin

{ Si c'est un Combobox et qu'il n'est pasa rempli: Alerte. }

MessageDlg ('Sélectionner un genre', mtInformation,[mbOk], 0);

Exit;

end;

{ Si on arrive jusqu'ici, c'est que tous les combobox sont remplis. }

MonButton.Enabled:= True;

end ;


<hr size ="2" width="100%">

@ ++

Florent


Si tu ne te plantes pas ......
tu ne poussera jamais
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
19 juin 2005 à 13:01
Aïe, l'erreur:

Il faut lire Components[i]



J'en profite pour rajouter:

Tu peux aussi mettre cette procédure dans l'evenenement OnChange de tes ComboBox en enlevant les MessageDlg().

<hr size= "2" width="100%"> procedure TForm1.ComboBox1Change(Sender: TObject);

begin

RendreBoutonDispo;

end;

<hr size ="2" width="100%">@ ++

Florent


Si tu ne te plantes pas ......
tu ne poussera jamais
0
Mr Capone Messages postés 21 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 19 juin 2005
19 juin 2005 à 13:49
Merci d'être aller si vite, je suppose que ca marche également avec des
memo et des edit ? (car j'ai ces 3 types de composants dessus)
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
19 juin 2005 à 15:07
Non, cela n'est plus possible par la même technique (ou il faut implémenter différemment chaque objet).

Cependant, en utilisant les procedures RTTI de l'unité TypInfo, on peut arriver à cela:

<hr size= "2" width="100%"> uses

TypInfo;



procedure TForm1.RendreBoutonDispo;

var

i: Integer;

begin

{ Parcours de tous les composants de la fiche. }

for i: =0 to ComponentCount -1 do

{ Si c'est un composant qui publie la propriété Text et qu'elle n'est pas

remplie ( = EmptyStr) : Arret. }

if IsPublishedProp(Components[i],'Text') and PropIsType(Components[i],'Text',tkString) and

(GetStrProp(Components[i],'Text') = EmptyStr) then

Exit;

{ Si on arrive jusqu'ici, c'est que tous les combobox sont remplis. }

Button1.Enabled:= True;

end;

<hr size ="2" width="100%">Cete procédure doit être appelée pour
vérifier et activer le bouton: tu peux la mettre soit dans chaque
evenement de modification de tes composants ou à la suite d'un OnClick
d'un autre bouton qui vérifie le formulaire.



Je te renvoie à ce lien pour l'utilisation des procedures RTTI:

http://delphi.developpez.com/faq/?page=compopropri#proprieteparnom

Mais je reste ouvert à toutre question ou suggestion.



@ ++

Florent


Si tu ne te plantes pas ......
tu ne poussera jamais
0

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

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
19 juin 2005 à 15:18
Ah, je me suis planté (pourtant mes tests étaient concluants ...):

La propriété Text d'un TControl est de type TCaption et non pas string,
il faut donc remplacer tkString par tkLString (je ne sais pas pourquoi
mais il faut le faire ).



Ce qui donne:

<hr size= "2" width="100%"> uses

[...], TypInfo;



procedure TForm1.RendreBoutonDispo;

var

i: Integer;

begin

Button1.Enabled: =False;

{ Parcours de tous les composants de la fiche. }

fori:= 0 to ComponentCount -1 do

{ Si c'est un composant qui publie la propriété Text et qu'elle n'est pas
remplie ( = EmptyStr) : Arret. }

if IsPublishedProp(Components[i],'Text') and PropIsType(Components[i],'Text',tkLString) and

(GetStrProp(Components[i],'Text') = EmptyStr) then

begin

Showmessage('Tous les champs ne sont pas remplis.');

Exit;

end;

{ Si on arrive jusqu'ici, c'est que tous les combobox sont remplis. }

Button1.Enabled: =True;

end;

<hr size="2" width="100%">

Ouf, j'y suis arrivé.

Ca doit être la chaleur (je ne sais pas pour vous mais chez moi, il fait 32°C à l'ombre ...)



Bonne prog'

@ ++
0
Rejoignez-nous