gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009
-
7 mai 2007 à 18:45
gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009
-
13 mai 2007 à 21:51
Bonjour à tous,
Je veux créer un objet (un boutton par exemple) dynamiquement sur unr Form en mode modale.
Dans les sources j'ai trouvé un code qui parait sympathique. (permet de faire une verif au moment de la libération)
Objects: array of TControl;
procedure TForm1.Button2Click(Sender: TObject);
begin
setlength(Objects,length(Objects)+1);
Objects[length(Objects)-1]:=TButton.create(Application);
(Objects[length(Objects)-1] as TButton).Parent:=Form1;
(Objects[length(Objects)-1] as TButton).Name:='MyButton';
(Objects[length(Objects)-1] as TButton).Caption:='MonBouton';
(Objects[length(Objects)-1] as TButton).Top:=100;
(Objects[length(Objects)-1] as TButton).Left:=20;
end;
En le testant avec une Form puis F9....ça fonctionne.
En l'incorporant à une application (style page principale avec menu qui ouvre une autre Form2 en mode modale) j'applique ce code sur cette Form2 rien ne s'affiche mais le bouton est crée. (j'ai une exeption en recréant le bouton).
Je pense que celà provient du mode modale mais pourquoi ????
A+ et Merci
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 7 mai 2007 à 21:13
Salut, déjà, simplification du code :
<hr size= "2" width="100%" /> var
B: TButton;
begin B : = TButton.Create(Self);
with B do
begin
Parent := Self;
Caption := 'Bouton crée !';
SetBounds(100, 20, Width, Height);
end;
SetLength(Objects, Length(Objects) + 1);
Objects[High(Objects)] := B;
end; <hr size ="2" width="100%" />
Déjà, ce code est bien plus lisible.
En plus :
- Utiliser "Self" est bien plus adapté que Application pour le propriétaire de l'objet ,surtout si c'est une fiche modale.
- Creér une variable temporaire c'est plus simple.
- Utiliser "Self" comme parent t'évite des embrouilles (par ex, que le compo ne s'affiche pas sur la bonne fiche après avoir remanié un peu le code, ce qui doit être ton cas).
- SetBounds() évite le double-réaffichage lorsquetu modifies Left et Top.
- Le groupement with...do, c'est plus agréable à lire.
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 9 mai 2007 à 12:44
re,
autant que possible (et logique) declare tes var en tant que champs (fields) de ta (tes) form et non en tant que var global de l'unité de ta form. cela te limitera déjà un peu tes problème des noms/portées de var.
si la différence n'est pas clair pour toi, renseigne toi, puis, si c'est toujours obscure, demande moi en MP.
A+
Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009 7 mai 2007 à 22:20
Salut,
Je suis comme toi, j'aimes bien le code propre......Là j'avais mis le code brute de décoffrage.
Exact, celà fonctionne.... peut-être l'histoire de la variable....
J'en ai profiter pour lire ton Tuto sur les procedure pour créer des objets.......Très interressant...celà fait des années (et plus) que je programme, et j'en apprends tous les jours.
Je vais m'en servir pour mes objets dynamiques....
allez A+ et merci
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 8 mai 2007 à 12:54
@gebu: en fait, comme te le dit Loda, c'est le problème Form1 <> Form2. Si tu changes ton code (copier-coller) mais pas le nom de la variable, deux choses arivent :
- Soit Delphi te balance des jurons parce qu'il ne trouve pas Form1.
- Soit tu as mis Unit1 dans les uses et alors là le code compile sans problème mais ne fait pas ce que tu veux.
C'est la deuxième chose qui vient de t'arriver.
En parlant de ça, renomme tes fiches ! Au moins, quand tu reliras le code, tu te diras "nondidjou ! Ma quésquésaféla ?"
gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009 9 mai 2007 à 06:58
Salut,
Les Form1 et Form2 c'est juste pour les tests, en vérité ma page d'accueil s'appelle toujours Fprincipal et le reste suivant l'application.(j'applique des conventions d'écriture que je me suis fixé).
Par contre le tableau "Objects: array of TControl;" peut-être déclaré sur plusieurs Form et peut-être que là il y a confusion.....
A+
gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009 9 mai 2007 à 16:24
Salut ,
Si c'est très clair, d'ailleurs j'essaie d'utiliser le moins de varable possible (je viens du TurboPascal Dos ou il fallait être économe sur le code....les machines n'étaient pas des bêtes de course....d'ou j'ai gardé quelques habitudes...).
Néanmoins depuis que je programme, j'en apprends encore et franchement je n'est pas honte.
Merci à tous les deux de vos réponses claires.
A+
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 13 mai 2007 à 16:48
@Cantador:
C'était pour reprendre en partie le code original de gebu que j'ai écrit ceci.
Mais j'imagien bien sûr qu'il en crée plusieurs de boutons. sinon, ça n'as pas trop d'intérêt.
D'ailleurs, son tableau Objects devrait plutôt être "array of TButton" que "of TControl". Sinon après, à force de tout mélanger, on n'en finit plus...
gebu34
Messages postés118Date d'inscriptionsamedi 9 décembre 2006StatutMembreDernière intervention17 novembre 2009 13 mai 2007 à 21:51
Salut à tous,
J'ai repris mon tableau (conseil de Loda) en Array of Tbutton, Array of TEdit, Array of TComboBox.......c'est beaucoup plus favile à gérer.
A+