Rajouter des composant avec un while

Résolu
rsamourai Messages postés 5 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 20 juillet 2005 - 16 juil. 2005 à 12:20
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 16 juil. 2005 à 17:11
bjr tous le monde!!!!



alors voici mon souci je suis debutant en delphi et j'aimerai faire
aparaitre des DateTimePikers celon que la personne est choisi
d'afficher 1 ou plusieurs date.

voici un exemple de ce que je fait pour le moment:



if (EditNbr.Text='4') then begin

Picker1.Visible:=True;

||
|| ||

Picker4.Visible:=True;

end;



sachant que sa peut aller jusqu'a 40

je pensait qu'avec un while sa serait plus util, comme par exemple :



i:=1:

while (Picker'I'<>EditNbr) do

Picker'i++'.Visible:=True;

end;



mais apparemment, sa ne marche pas comme ça.



a mon avis c'est une erreur de syntax, comme sa m'arrive souvant ;)



bon ben je vous remercie d'avance pour une éventuelle réponse

10 réponses

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
16 juil. 2005 à 13:53
Oui, c'est une erreur de syntaxe. On peut faire ce que tu demande, mais pas de cette maniere.

Essaie ceci, (tu peux aller jusqu'au chiffre que tu veux):



var

I:integer;



For I:= 1 to StrToInt(EditNbr) do

begin

with TDateTimePikers.Create(Self) do

begin

Name: ='Pickers'+InToStr(I);

Parent:= Form1;

Visible:=True;

// Tu peux indiquer de même tout ce qu'il y a dans l'inspecteur d'objet

end ;

end;



Fait attention que l'utilisateur ne créer pas deux fois ces objets. Si deux objets portent le même nom ca plante.

Alors, soit tu détruit tes composants en cas d'un nouveau choix, soit
tu désactive ce choix juste apres que l'utilisateur ait choisi.



Pour la destruction tu fait :



var


I:integer;

Compo:TDateTimePikers;





For I: =StrToInt(EditNbr) Downto 1 do


begin

Compo:=(Form1.FindComponent('Pickers'+IntToStr(I))) as TDateTimePikers;

If Compo<>nil then Compo.Free;


end;
3
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
16 juil. 2005 à 14:09
Apres relecture de ta question, je crois que je n'y répondais pas tout
a fait. Fait attention à ton titre, il ne correspond pas a ta question.
Je pense que tes composants sont déjà posés. Le code ci-dessus, crée
ces composants, comme ci ceux-ci n'existait préalablement pas.

Dans le code suivant on considère que les 40 compostants sont déjà posés:



var

I:integer;

Compo:TDateTimePikers;



For I:= 1 to StrToInt(EditNbr) do

begin

Compo: =(Form1.FindComponent('Pickers'+IntToStr(I))) as TDateTimePikers;

If Compo<>nil then Compo.Visible:= True;

end ;

For I: =StrToInt(EditNbr)+1 to 40 do


begin


Compo:= (Form1.FindComponent('Pickers'+IntToStr(I))) as TDateTimePikers;


If Compo<>nil then Compo.Visible: =False;


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
16 juil. 2005 à 14:21
Tout à fait...



Mais si tu ne veux pas créer tes DateTimePicker dynamiquement, tu peux faire tout simplement:



var i: Integer;

begin

for i := 0 to ComponentCount -1 do

if Components[i] is TDateTimePicker then

TDateTimePicker(Components[i]).Visible :=

StrToInt(TDateTimePicker(Components[i]).Name[7]) <= StrToInt(EditNbr.Text);

end;



à optimiser éventuellement.



Bonne prog'



japee
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 juil. 2005 à 14:22
Lol, j'ai encore un post de retard...
0

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

Posez votre question
cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
16 juil. 2005 à 14:43
Est-ce que ta procedure est réellement plus optimisé ?

ComponentCount représente le nombre total de composant sur la form.

Tu risque donc de faire plus de tour de boucle que necessaire.

Sinon la maniere dont tu as écrit ce code est interessant. (bien compacté, le strict nécessaire en fait)
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 juil. 2005 à 14:59
simple petite remarque en DELPHI l'incrementation se fait par la fonction inc( i ) et non i++ qui est une syntaxe du C
0
rsamourai Messages postés 5 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 20 juillet 2005
16 juil. 2005 à 15:09
ben merci beaucoup!!!!!

vous ête plustôt rapide a repondre, je pensait que sa prendrai plus de temps, en tout cas merc...
et en faite je programme en c et c++, et donc j'ai souvent des erreur de syntaxe qd je passe a delphi...

ben merci encore
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
16 juil. 2005 à 15:28
c'est bien ce qu'il me semblait que tu venais du C .

c'est une erreur fréquente que l'on fait quand on travaille sur les 2 langages ( j'en ai deja fait la cuisante espérience)

d'autre part si tu commence juste de programmer en DELPHI méfie toi
aussi des faux amis genre char du C qui BYTE en DELPHI (le char
de DELPHI est unsigned char du C et ceci pour ne siter que cet exemple

d'autre part DELPHI est beaucoup moins tolérant que C et n'autorise pas
comme en C les manipulations sur les variables de boucles for ce qui
d'ailleurs évite pas mal d'erreur ou de surprises à l'éxecution (que
celui qui en C n'a jamais modifier involontairement la variable de
boucle en C me jette la premiere pierre)
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 juil. 2005 à 16:38
Tu as raison, CptPingu, ça doit être plus rapide en utilisant FindComponent().



Du coup, mon code deviendrait :



const NbrPicker: Integer = 40; // nombre de TDateTimePicker

var i: Integer;

begin

for i := 1 to NbrPicker do

TDateTimePicker(FindComponent('Picker' + IntToStr(i))).Visible := i <= StrToInt(EditNbr.Text);

end;



Bonne prog'



japee
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 juil. 2005 à 17:11
En plus, je m'apercois que mon premier code devenait faux pour un
nombre de TDateTimePicker dépassant 9 (nombre à deux chiffres).

C'est facile à rectifier, mais l'usage de FindComponent est décidément plus simple.



Bonne prog', pfff... qu'est-ce qu'il fait chaud...
0