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

Résolu
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013 - 25 sept. 2009 à 17:28
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre 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

13 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 sept. 2009 à 18:13
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)
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
25 sept. 2009 à 22:06
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.
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
25 sept. 2009 à 23:27
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 !
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 sept. 2009 à 09:43
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.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
25 sept. 2009 à 18:23
Aj, j'ai jamais utilisé le TFrame, vais voir ça

Merci Guillemouze !

L'Armand joue, l'arme en joug... www.art-ment.com
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
25 sept. 2009 à 23:30
@delphi:
tes liens ne fonctionnent pas (sauver mambo etc..)


cantador
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
26 sept. 2009 à 00:01
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
0
L_art_ment Messages postés 302 Date d'inscription vendredi 21 septembre 2007 Statut Membre Dernière intervention 6 février 2013
26 sept. 2009 à 10:47
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
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
26 sept. 2009 à 18:03
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;
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
26 sept. 2009 à 18:07
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.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 sept. 2009 à 08:08
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.
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
28 sept. 2009 à 10:05
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;
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 sept. 2009 à 11:11
@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.
0
Rejoignez-nous