Création dynamique de composants [Résolu]

Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
- - Dernière réponse : Nicolas___
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
- 22 févr. 2011 à 14:23
Bonjour,

Dans le cadre d'un projet, je dois réaliser une application ou il est nécessaire de créer à la volée toute une série de composants (création dynamique, càd dans le code si je ne suis pas assez clair )

Là ou il y a difficulté (ou pas), c'est que ces composants que je créé à la volée, je peux aussi les effacer à la volée.

Donc je fais un tout petit test pour savoir si le nom du composant existe déjà, si oui je saute le nom sinon je le prend.

J'aimerais savoir si cette solution est propre ou non ... Et comment à l'exécution du code (à partir de l'IDE) je peux désactiver l'erreur qu'il génère

var
  bt : TToolButton;
  i : integer;
  ok : boolean;
begin
  bt := TToolButton.Create(tbPedalier);
  bt.Parent := tbPedalier;
  bt.Caption := TToolButton(Sender).Caption;
  bt.ImageIndex := TToolButton(Sender).ImageIndex;
  bt.OnClick := tbPedalierTButtonClick;
  i:=0;
  ok := false;
  // C'est ici qu'il faut regarder :) 
  while(not ok) do begin
    try
      bt.Name := Format('btPedalier%d',[i]);
      ok := true;
    except
      i := i + 1;
    end;
  end;
end;


Merci pour votre attention
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
3
Merci
en dynamique on s'en fout du Name seul la référence compte, le name c'est en conception que c'est utile.

Méthode plus rapide et sans erreur :
type
  TFormX = class(TForm)
    procedure FormXCreate(Sender: TObject);
    procedure FormXDestroy(Sender: TObject);
  private
    MLC : TList;
  protected
    function AddButton: integer;
    procedure RemoveButton(index: integer);
    procedure FindAndRemoveButton(aButton: TToolButton);
  public
  end;
function TFormX.AddButton : integer;
var
  bt : TToolButton;
begin
  bt := TToolButton.Create(tbPedalier);
  bt.Parent := tbPedalier;
  // Facultatif car l'EDI choisis un nom automatiquement // 
  bt.Name := format('btPedalier%p',[pointer(bt)]);
  bt.Caption := TToolButton(Sender).Caption;
  bt.ImageIndex := TToolButton(Sender).ImageIndex;
  bt.OnClick := tbPedalierTButtonClick;   
  result := MLC.add(pointer(bt));
end;

procedure TFormX.RemoveButton(index: integer); {overload}
begin
  TToolButton(MLC.items[index]).Free;
  MLC.Delete(index);
end;

procedure TFormX.FindAndRemoveButton(aButton: TToolButton);
var index: integer;
begin
  index := MLC.indexOf(pointer(aButton));
  if index <> -1 then
  begin
    TToolButton(MLC.Items[index]).Free;
    MLC.Delete(index);
  end;
end;

procedure TFormX.FormXCreate(Sender: TObject);
begin
  MLC := TList.Create;
end;

procedure TFormX.FormXDestroy(Sender: TObject);
begin
  while MLC.Count > 0 do
  begin
    TToolButton(MLC.Items[0]).Free;
    MLC.Delete(0);
  end;
  MLC.Free;
end;



________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?

Dire « Merci » 3

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

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 mars 2016
5
3
Merci
Salut,
i := 0;
while TToolButton(FindComponent(Format('btPedalier%d',[i]))) <> nil do
    inc(i);
bt.Name := Format('btPedalier%d',[i]);

@+yanb

Dire « Merci » 3

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

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_yanb
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 mars 2016
5
0
Merci
Oups,
le temps de répondre est foxi est passé par là avec
une solution complete et top...
@+yanb
Commenter la réponse de cs_yanb
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
0
Merci
@yanb : ta solution est juste mais elle part du même principe que la mienne et elle ne me semblait pas top ...

@foxi : parfait, c'est un ça que je cherchais, du code frais (cad non connu de mon cerveau, et c'est vachement rare )

Je ne pense jamais à utiliser un TList, faudrait que je me force ...

Merci
Commenter la réponse de Nicolas___