Rajouter des composant avec un while

Résolu
Signaler
Messages postés
5
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 juillet 2005
-
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
-
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

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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;
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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;
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
Lol, j'ai encore un post de retard...
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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)
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
simple petite remarque en DELPHI l'incrementation se fait par la fonction inc( i ) et non i++ qui est une syntaxe du C
Messages postés
5
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
20 juillet 2005

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
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
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)
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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...