Récupérer les valeurs de composants d'une form crée dynamiquement [Résolu]

Messages postés
316
Date d'inscription
vendredi 21 septembre 2007
Dernière intervention
6 février 2013
- - Dernière réponse : cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
- 28 sept. 2009 à 11:11
Messieurs dames, bien le bonjour !

Ca faisait si longtemps que je n'étais pas venu poser une questin sur le forum (et oui je commence à me débrouiller seul ), mais sur le coup j'ai quand même une difficulté, que je m'en vais vous expliquer :

J'aurais besoins de faire afficher plusieurs fois la même page dans un PageControl avec une multitude de composants dessus, et le nombre de pages étant variable, je ne peux que les créer dynamiquement.

J'ai bien vu dans quelques tuto que le composant TabControl serai plus adapté à mon utilisation, cependant, ayant fait des tests, je me suis appercu que, si par exemple j'ai deux tabs à mon TabControl, si je coche une checkBox sur ma page 1, elle se retrouve cochée sur ma page 2, comme si elles étaient "liées", hors je souhaiterais qu'elles soient indépendantes... Alors est-ce une erreur de ma part, une options que je n'aurais pas vu dans le tabcontrol ?

N'étant pas parvenu à mes fins avec le tabControl, j'ai utilisé une autre méthode, qui me convient à peu pret :
Je charge une Form dans mes page de mon page control grâce à la fonction suivante :
http://delphi.about.com/od/adptips2005/a/bltip0305_5.htm

Mais le seul "hic", c'est que je ne parviens pas à retrouvé les valeurs des composants, par exemple sur la page 2, j'ai chargé la form en question, mais je ne vois pas comment accéder à la checkbox qui se trouve sur cette form pour savoir si elle est cochée par exemple...


J'éspère que je suis assez clair dans mes explications

Merci pour votre aide !


L'Armand joue, l'arme en joug... www.art-ment.com
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
3
Merci
a ta place, j'utiliserai une TFrame.
comme ca, tu cree une modele pour les pages identiques, et tu insert ta frame dans les pages necessaires (dynamiquement ou statiquement)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
Le composant TFrame est certainement le plus approprié et c'est également ce que je t'aurais proposé.
Ce composant est largement sous-employé et méconnu à mon avis (apparu avec Delphi 5 il me semble).

[<a href="http://2999.lapetition.be/ 8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne]
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
3
Merci
Je plusois et je t'invite à regarder ICI.

C'est vrai que TFrame est sous-utilisé. C'est pourtant un objet précieux qui peut aussi être mis dans la palette de composants de l'IDE et rendre de grands services !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de Caribensila
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
Voici un code qui permet de connaître l'état de la case à cocher figurant sur l'onglet actif :
procedure TForm3.PageControl1Change(Sender: TObject);
var
  i: integer;
begin
  with TPageControl(sender).ActivePage do
    for I := 0 to ControlCount - 1 do
      if Controls[i] is TFrame2 then
      begin
        checkbox1.Checked := TFrame2(Controls[i]).CheckBox1.Checked;
        break;
      end;
end;


Explications : sur l'évènement OnChange du composant TPageControl, on récupère l'onglet actif (ActivePage) et on recherche le composant TFrame2 s'il existe. Si tel est le cas, on affecte la propriété checked de l'élément coché à une case à cocher présente sur la fiche active (Form3 ici) et on sort de la boucle immédiatement.
La case à cocher CheckBox1 ne sert qu'à figurer l'état actuel de sa semblable sur le composant TFrame affiché.

Pré-requis : ajouter une case à cocher nommée CheckBox1 sur la fiche active.

Est-ce plus clair maintenant ?

[<a href=http://2999.lapetition.be/ 8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne]
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
316
Date d'inscription
vendredi 21 septembre 2007
Dernière intervention
6 février 2013
0
Merci
Aj, j'ai jamais utilisé le TFrame, vais voir ça

Merci Guillemouze !

L'Armand joue, l'arme en joug... www.art-ment.com
Commenter la réponse de L_art_ment
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
@delphi:
tes liens ne fonctionnent pas (sauver mambo etc..)


cantador
Commenter la réponse de cs_cantador
Messages postés
316
Date d'inscription
vendredi 21 septembre 2007
Dernière intervention
6 février 2013
0
Merci
Bon et bien, j'ai regardé du côté du TFrame, alors, j'ai ouvert un nouveau projet, j'ai placé un PageControl, ai créé un TFrame qui contient juste une CheckBox pour le moment, un bouton qui me permet d'ajouter une TabSheet et mon TFrame en client sur ce TabSheet, le code du bouton (trouvé sur Developpez):

var
tbs : TTabSheet;
begin
//On s'assure que Self est un descendant de TComponent
assert(Self is TComponent, 'L''objet Self n''est pas un descendant de TComponent');
// Création de la page
tbs := TTabSheet.Create(Self);
// Création du contenu de la page
with TFrame2.Create(self) do
begin
// Attention, chaque frame doit avoir un nom différent
Name := 'Frame2' + intToStr(PageControl1.PageCount);
Align := alClient;
Parent := tbs;
end;
// Ajout de la page au TPageControl
tbs.PageControl := PageControl1;
// Modification du titre de l'onglet
tbs.Caption := 'Frame n°' + intToStr(PageControl1.PageCount);
end;

donc à chaque clique sur le bouton me créé bien un nouvel onglet avec le TFrame dedans, donc ma chackbox, mais mon problème reste toujours le même, je ne parviens pas à retrouver l'état de ma checkbox...



L'Armand joue, l'arme en joug... www.art-ment.com
Commenter la réponse de L_art_ment
Messages postés
316
Date d'inscription
vendredi 21 septembre 2007
Dernière intervention
6 février 2013
0
Merci
Ah oé effectivement, j'avais pas vu ça comme ça, bein c'est bon j'ai reussi à adapter le code que tu viens de me donner dans un bouton et je récupére bien l'état de ma checkBox...

Bein merci beaucoup à vous tous

L'Armand joue, l'arme en joug... www.art-ment.com
Commenter la réponse de L_art_ment
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
pour plus de simplicité de manipulation, je modifierai la reponse de delphiprog de cette façon :
procedure TForm3.GetActiveFrame: TFrame2;
var
  i: integer;
begin
  Result := nil;
  i := 0;
  while (Result = nil) and (i < PageControl1.ActivePage.ControlCount) do
  begin
    if PageControl1.ActivePage.Controls[i] is TFrame2 then
      Result := TFrame2(PageControl1.ActivePage.Controls[i]);
    Inc(i);
  end;
end;

procedure TForm3.PageControl1Change(Sender: TObject);
var
  f: TFrame2;
begin
  f := Self.GetActiveFrame;
  if f <> nil then
    checkbox1.Checked := f.CheckBox1.Checked;
end;
Commenter la réponse de Guillemouze
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
petite info supplementaire, au cas où :
Dans la palette de composant standard (dans D7 en tout cas), tu as un composant "Cadre", qui te permet de poser statiquement en conception une Frame appartenant à ton projet.
Perso, j'utilise beaucoup les frames et j'essaye de ne faire quasiment que ca. Ca permet de creer la Form juste en posant la frame en alClient, et si jamais j'ai besoin de proposer cette fiche à un autre endroit (genre au sein meme d'une autre fenetre), je peux la remettre sans souci.
Commenter la réponse de Guillemouze
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Petite info pour Guillemouze :
Frame = cadre en français
Nous parlons donc bien du même composant.
Dans les versions suivantes de Delphi, il faut faire "Fichier > Nouveau > Autres > Projets Delphi > Fichiers Delphi" et cliquer sur "Cadre" (Delphi 2009).
Tout est dit.
Fermez le ban...


8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
Tout est dit.

Non ce n'est pas ce que je veux dire (enfin je crois). La manip que tu propose est pour concevoir le cadre.
Celle dont je parle permet d'inserer une frame préalablement créée dans un autre container (une Form par exemple). L'equivalent en conception de
with TMaFrame.Create(Panel1) do
  Parent := Panel1;
Commenter la réponse de Guillemouze
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
@guillemouze : c'est vrai et tu as parfaitement raison de me le rappeler.

8000 Lévriers 'galgos' par an sont torturés et massacrés en Espagne
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog

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.