Objet dynamique et Form modale

Résolu
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 novembre 2009 - 7 mai 2007 à 18:45
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 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

11 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
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.

Avec tout ça, chez moi, ça marche nickel

++
Flo
3
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
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.
3
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 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
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
8 mai 2007 à 09:14
salut,

  (Objects[length(Objects)-1] as TButton).Parent:= Form1 ;

En l'incorporant à une application (style page principale avec menu qui ouvre une autre Form2 en mode modale) j

suivant ce que tu veux faire avec le buttoun, tu peux garder une ref (ptr) dans un champs de la form. (au lien d'une var local)

A+

Loda
<hr size ="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
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
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 ?"

++
Flo
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 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+
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 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+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
10 mai 2007 à 09:13
re,

bin je suis content de savoir que c'est clair pour toi :-)

bon code !

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
13 mai 2007 à 15:51
@florenth :

SetLength(Objects, Length(Objects) + 1);
Objects[High(Objects)] := B;

Pourquoi prévoir un tableau s'il n'y a qu'un seul bouton à créer ?

A+
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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...

++
Flo
0
gebu34 Messages postés 118 Date d'inscription samedi 9 décembre 2006 Statut Membre Dernière intervention 17 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+
0
Rejoignez-nous