Création dynamique de composants

Résolu
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 22 févr. 2011 à 10:32
Nicolas___ Messages postés 992 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

4 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 févr. 2011 à 13:54
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 ?
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
22 févr. 2011 à 13:56
Salut,
i := 0;
while TToolButton(FindComponent(Format('btPedalier%d',[i]))) <> nil do
    inc(i);
bt.Name := Format('btPedalier%d',[i]);

@+yanb
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
22 févr. 2011 à 14:02
Oups,
le temps de répondre est foxi est passé par là avec
une solution complete et top...
@+yanb
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
22 févr. 2011 à 14:23
@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
0
Rejoignez-nous