Objet dynamique et Form modale [Résolu]

gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention - 7 mai 2007 à 18:45 - Dernière réponse : gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 7 mai 2007 à 21:13
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 9 mai 2007 à 12:44
3
Merci
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.

Merci cs_Loda 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Loda
gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention - 7 mai 2007 à 22:20
0
Merci
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
Commenter la réponse de gebu34
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 8 mai 2007 à 09:14
0
Merci
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.
Commenter la réponse de cs_Loda
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 8 mai 2007 à 12:54
0
Merci
@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
Commenter la réponse de florenth
gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention - 9 mai 2007 à 06:58
0
Merci
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+
Commenter la réponse de gebu34
gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention - 9 mai 2007 à 16:24
0
Merci
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+
Commenter la réponse de gebu34
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 10 mai 2007 à 09:13
0
Merci
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.
Commenter la réponse de cs_Loda
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 13 mai 2007 à 15:51
0
Merci
@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+
Commenter la réponse de cs_cantador
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 13 mai 2007 à 16:48
0
Merci
@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
Commenter la réponse de florenth
gebu34 119 Messages postés samedi 9 décembre 2006Date d'inscription 17 novembre 2009 Dernière intervention - 13 mai 2007 à 21:51
0
Merci
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+
Commenter la réponse de gebu34

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.