Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Accéder aux objets dynamique [ Divers / Aide et documentation ] (gebu34)

vendredi 11 mai 2007 à 11:16:32 | Accéder aux objets dynamique

gebu34

Salut à tous,
Je crée dynamiquement un ComboBox sur une Form.
J'ai élaguer volontairement le code pour ne pas surchager....

var
  CmBx: TComboBox;
  Objects: array of TControl;
..............
CmBx := TComboBox.Create(Self);
with CmBx do
  begin
    Parent := Self;
    Name := 'CB1';
    OnClick := CmBxClick;
    SetBounds(100, 100, 150, 17);
  end;
SetLength(Objects, Length(Objects) + 1);
Objects[High(Objects)] := CmBx;

On peut charger la ComboBox par : CmBx.Items.Add(NomVariable);
On peut lire sur Click avec : variable := CmBx.Text;

Ca c'est bien quand on a 1 ComboBox... Mais avec plusieurs CB1, CB2 ?????

A+
Merci


vendredi 11 mai 2007 à 11:47:54 | Re : Accéder aux objets dynamique

Loda

Membre Club
salut,

var
MesCB : array[1..NBCB] of TcomboBox;

for i := 1 to NBCB do begin
CmBx := TComboBox.Create(Self);
with CmBx do
  begin
    Parent := Self;
//    Name := 'CB1'; // inutile ou CB + inttostr(i)
    OnClick := CmBxClick;
    SetBounds(100, 100+i*..., 150, 17);
   tag := i; // si ça t'aide....
  end;
  MesCB[i]:=cmbx;
end;
n'oublie pas que les event pass en param le "sender" ! Aussi, rappel toi le champs tag!

A+

Loda

Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.

vendredi 11 mai 2007 à 16:03:24 | Re : Accéder aux objets dynamique

gebu34

Re,
J'ai pris un tableau TControl car mets dedans aussi du TCheckBox et du TEdit.
Ca ne change pas grand chose. J'avais déjà vu la possibilité d'utiliser Tag, qui peut-être fort util dans ce cas. Mais pour accéder aux propriétés du compo, il existe peut-être un manière plus simple que :
for i:=0 to Length(Objects)-1 do
  begin
    if Objects[i].Tag = 2
    ou
    if Objects[i].Name = 'CB1'
  end;
pour récupérer l'indice de l'objet.....
A+


vendredi 11 mai 2007 à 19:08:21 | Re : Accéder aux objets dynamique

gebu34

Salut Loda,
J'étais en train de relire ton message, et je pense que tu as la solution. Je m'acharne à avoir un tableau TControl pour pouvoir mettre toute sorte de composants, alors que déclarer un tableau par composant TComboBox, TCheckBox, TEdit est plus lourd en code, mais plus simple à gérer (remplir des listes, extraire des données...)
Qu'en penses-tu ?
A+.

vendredi 11 mai 2007 à 20:36:51 | Re : Accéder aux objets dynamique

f0xi

Membre Club Administrateur CodeS-SourceS
ptite technique de derriere les fagots :


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Contnrs;

type
  TControlClass = class of TControl;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fDynCtrlList  : TObjectList;
  protected
  public
   constructor Create(AOwner : TComponent); override;
   destructor Destroy; override;
   function CreateChild(const AName : string; AClass : TControlClass;
                        AParent : TWinControl; const ALeft, ATop : integer;
                        var VIndex : integer) : TControl;
   property DynamicCtrls : TObjectList read fDynCtrlList write fDynCtrlList;

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fDynCtrlList := TObjectList.Create(true);
end;

function TForm1.CreateChild(const AName : string; AClass : TControlClass;
                            AParent : TWinControl; const ALeft, ATop : integer;
                            var VIndex : integer) : TControl;

begin
  result := AClass.Create(nil);
  VIndex := fDynCtrlList.Add(result);
  with Result do
  begin
    if Length(AName) >= 2 then
       Name   := AName
    else
       Name   := 'DynamicCtrl'+IntToStr(fDynCtrlList.Count);

    if AParent <> nil then
       Parent := AParent;

    SetBounds(ALeft,ATop,Width,Height);
  end;
end;

destructor TForm1.Destroy;
begin
  fDynCtrlList.Clear;
  fDynCtrlList.Free;
  inherited Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
var N,II,OT,OH : integer;
begin
  CreateChild('',TEdit,Self,10,10,II);
  with DynamicCtrls.Items[II]as TEdit do
  begin
    Text := 'Hahahahaha';
    OT := Top;
    OH := Height;
  end;

  CreateChild('',TComboBox,Self,10,OT+OH+8,II);
  with DynamicCtrls.Items[II] as TComboBox do
  begin
    for N := 1 to 10 do
        Items.Add(IntToStr(N));
  end;
end;





Croc (click me)

samedi 12 mai 2007 à 08:39:07 | Re : Accéder aux objets dynamique

gebu34

Salut,
En ce moment je me connecte en pointillés j'ai des problèmes sur la ligne.
La, FOxi nous présente THE code....
J'aime bien, c'est clair et nul doute efficace...
Petite question, ta variable II (Vindex) est initialisée comment ?
Dans mon cas, je veux faire apparaître les compos "à la volée" (un click sur une cellule d'un STringGrid = visible  une autre cellule = libéré). Je pense qu'il suffit de déclaré CreateChild non pas dans FormCreate mais dans OnSelectCell.
Par contre pour récupérer les données de ces compos comment utiliser DynamicCtrls ?
(Par exemple le OnClick d'un ComboBox remplis la cellule 1,1 d'un TStringGrid)
A+
et merci de vos efforts

samedi 12 mai 2007 à 19:07:53 | Re : Accéder aux objets dynamique

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

procedure TForm1.FormCreate(Sender: TObject);
var N,II,OT,OH : integer;
begin
  CreateChild('',TEdit,Self,10,10,II);
  with DynamicCtrls.Items[II] as TEdit do
  begin
    Text := 'Hahahahaha';
    OT := Top;
    OH := Height;
  end;

  CreateChild('',TComboBox,Self,10,OT+OH+8,II);
  with DynamicCtrls.Items[II] as TComboBox do
  begin
    for N := 1 to 10 do
        Items.Add(IntToStr(N));
  end;
end;

function TForm1.CreateChild(const AName : string; AClass : TControlClass;
                            AParent : TWinControl; const ALeft, ATop : integer;
                            var VIndex : integer) : TControl;

begin
  result := AClass.Create(nil);
  VIndex := fDynCtrlList.Add(result);



DynamicCtrls fonctione comme la propriété Items ou Lines d'une ListBox ou Memo, juste que la ce n'est pas des chaines mais des objets.

pour assigner les evenements, tu créer des gestionnaire dans l'objet ou la fiche que tu desire, puis, tu assigne les gestionnaires comme suis :

CreateChild('DEdit1',TEdit,Self,10,10,II);
with DynamicCtrls.Items[II] as TEdit do
begin
  Text       := '';
  OnClick    := DoDEdit1Click;
  OnChange   := DoDEdit1Change;
  OnKeyPress := DoDEdit1KeyPress;
end;



Croc (click me)

dimanche 13 mai 2007 à 00:03:24 | Re : Accéder aux objets dynamique

gebu34

Ok, c'est clair, en plus j'aime bien ce code.
Il ne me reste qu'a me mettre au clavier....
Merci
A+

dimanche 13 mai 2007 à 01:57:42 | Re : Accéder aux objets dynamique

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
ah et pour enlever un objet de la fiche tu fait :

DynamicCtrls.Delete(index de l'objet);

Delete s'occupera de la suppression et liberation de l'objet.



Croc (click me)

dimanche 13 mai 2007 à 21:44:06 | Re : Accéder aux objets dynamique

1 2

Cette discussion est classé dans : combobox, accéder, objets, objects, cmbx


Répondre à ce message

Sujets en rapport avec ce message

combobox [ par Microbsoft ] Je voudrais bloquer une combobox de l'ecriture est-ce possible si oui repondez. Merci @+ Manipulation de composants [ par finipe ] Bonjour à tous. Tout d'abord bravo au concepteur web, le site est bien fait et très clair, c'estagréable, ça change...Bon trève de compliments :)Je dé Combobox [ par lguez ] Je cherche à mettre à jour la partie texte de la combobox au fur et à mesure que j'ecris dans la combo?par exemple si ma combobox contient :aaaaaaaabb combobox [ par cldvax ] Bonjour à tousJe suis débutant en programmation vba et j'ai deux petits problèmes.Dans une combobox j'arrive à extraire une valeur dans une liste, pré Je veux mmoriser le contenu d'un combobox [ par Youyou0214 ] J'ai fait un executeur de exe. Un bouton ouvre le opendialog et met le chemin du exe dans une combobox puis un autre bouton permet d'executer le exe c findnearest dans la Combobox [ par mik38 ] Bonjour,j'aurais savoir comment faire (a part trouver un autre composant) pour pouvoir saisir dans une combobox et qu'il se place sur l'item le plus p combobox [ par Resco ] je cherche comment, dans un combobox, selectionner une valeur mais en envoyer une autre qui ne figure pas dans Items Propriété "Style" d'un ComboBox [ par jack554 ] Bonjour.Question pour contrôler la saisie dans un ComboBox :Si on positionne le Style d'un TComboBox à csDropDown, l'utilisateur peut taper des valeur pb combobox [ par tema ] Salut, g un petit prob : g associer une bdd access à mon prog et je voudrais faire une combobox avec les valuers d'un champ de ma baz access mais g le ComboBox.Text [ par magicvinni ] Bonjour, J'ai un comboBox, avec une liste de choix et j'ai rajoutté un dernier item : "autre". Je voudrais que quand on clique sur autre, il y ai ec


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,312 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.