Afficher plusieurs fois le même composant

Résolu
Signaler
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007
-
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
-
Bonjour, je suis débutant en delphi, et je voulais savoir si'il était
possible, comme en visual basic, de créer un groupe de composant, c'est
a dire un tableau de bouton par exemple, et que dans les procédures
associées aux événemments de ce composant, on ait l'index.

J'ai essayé la méthode suivante mais ça ne marche pas :'(

button1 := array[0..5] of tbutton;



Merci de m'aider !!

10 réponses

Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
var MyBut : TButton ;
implementation
procedure OnClickEvent(Sender:TObject);
begin
//évènement
end;

procedure TForm1.OnCreate(Sender:TObject);
begin
MyBut:= TButton.Create;
MyBut.OnClick:=OnClickEvent;
end ;

procedure TForm1.OnClose(...);
begin
MyBut.Free;
end;
end.

On aurait pu gérer des blocs INITIALIZATION et FINALIZATION, mais restons simple si tu veux les créer dynamiquement.

=============
Validez les réponses si ok...

ViewVite : HTML
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
var MyBut : array[0..(*Un trou*)] of TButton ;
implementation
var UnNombre : integer;
procedure OnClickEvent(Sender:TObject, indx:smallint);
//Sender est normalement uniquement autorisé. Je n'ai jamais essayé, mais indx devrait être interdit. Déclare plutôt une variable sous le mot implementation, et gère-là ensuite
begin
showmessage('index: ' + Intostr(smallint));
//Non sens
end;


procedure TForm1.OnCreate(Sender:TObject);
var i : integer;
begin
for i := 0 to length(mybut) do
//Là, tu te fous de ma gueule
begin
MyBut[i]: =TButton.Create;
//MyBut n'a aucune propriété
MyBut[i].Name:= 'but'+IntToStr(i);
MyBut[i].Parent:=Form1;
MyBut[i].Caption...
MyBut[i].OnClick:= OnClickEvent (i) //pas de paramètres. On assigne un PROCEDURE OF OBJECT.</gras>
end;
end;


procedure TForm1.OnClose(...);
//manque une déclaration
var i : integer;
begin
for i : = 0 to length(mybut)//idem</gras>
begin
MyBut[i].Free;
end;
//les alignements: 0/20
end.

Dis-moi, t'as pas Delphi là ?

=============
Validez les réponses si ok...

ViewVite : HTML
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Gérer un composant:
Form1.Components[index];

Nombre de composants:
Form1.ComponentCount;

Tester la classe:
if (Form1.Components[index] is TButton) then ... ;

Faire une boucle:
var i : integer;
begin
for i:= 0 to Form1.ComponentCount-1 do
if...
end;

Initialiser un tableau
procedure Form1.OnCreate(...);
var MonTbl : array[0..1] of TButton = (Form1.But01, Form1.But02);
begin
end;

//je doute de cette réponse

Le smiley à la fin de ta question est limite douteux...

===========
Validez les réponses si ok...

ViewVite : HTML
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

désolé pour le smiley, j'avais pas vu qu'il était animé, je voulais
juste mettre le petit bonhome rouge :s, mais si je cré dynamiquement
des boutons, comment intercepter leur évenements ? Est-ce au moins
possible
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

Merci a toi grandvizir, une dernière chose cependant:

est ce que le code suivant est correct ?

var MyBut : array[0..] of TButton ;
implementation
procedure OnClickEvent(Sender:TObject, indx:smallint);
begin
showmessage('index: ' + Intostr(smallint));
end;

procedure TForm1.OnCreate(Sender:TObject);

var i : integer;
begin

for i := 0 to length(mybut) do

begin

MyBut[i]:=TButton.Create;
MyBut[i].OnClick:=OnClickEvent(i);

end;
end ;

procedure TForm1.OnClose(...);
begin


for i : = 0 to length(mybut) do

begin


MyBut[i].Free;
end;
end.
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

Merci de ta réponse.
Si, j'avais delphi, mais il fallait que je reboot mon pc pour l'utiliser, et je ne pouvais pas car j'avais une tâches importante en cours, mais peu importe, j'ai corrigé "mon" code, mais par contre les boutons ne s'affichent pas: voici ce que j'ai:
unit Unit1;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;


type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


var
Form1: TForm1;
MyBut: array[0..5] of TButton;
indbut: smallint;


implementation


{$R *.nfm}


procedure OnClickEvent(Sender:TObject);
begin
showmessage('clic de ?');
end;


procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
begin
for i : = 0 to length(mybut)-1 do
begin


MyBut[i]:= TButton.Create(self);
MyBut[i].Name:='but'+IntToStr(i);
MyBut[i].Parent:=Form1;
MyBut[i].Caption:='but'+inttostr(i);
MyBut[i].Tag:=i;
MyBut[i].OnClick:=OnClickEvent;
mybut[i].Visible := true;
mybut[i].left := 10;
mybut[i].top := 10;
mybut[i].height := 50;
mybut[i].width := 100;
end;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i : integer;
begin
for i : = 0 to length(mybut)-1 do
begin
myBut[i].Free;
end;
end;
end.
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Déclare MyBut: array[0..5] of TButton; dans les PRIVATE.

===========
Validez les réponses si ok...

ViewVite : HTML
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Length(MyButs) doit devenir Hi(MyBut). Sinon fait ainsi:

const Mx = 5;
var MyBut : array[0..Mx] ...
implementation
...
begin
for i: =0 to Mx do ...
end;

Désolé, mais .

===========
Validez les réponses si ok...

ViewVite : HTML
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

ça n'est pas grave, surtout que chez moi ça ne marche pas. au fait, le
problème ne venait pas de private, car ça ne marchais pas, mais j'ai
tout simplement mis la suite des propriétés dans l'évenements activate
comme ceci ça fonctionne bien:



unit Unit1;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button1Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

private

var



public

{ Déclarations publiques }

end;



var

Form1: TForm1;

MyBut: array[0..5] of TButton;

indbut: smallint;





implementation



{$R *.nfm}



procedure OnClickEvent(Sender:TObject);

begin

showmessage('clic de : '+tbutton(sender).Tag);

end;



procedure TForm1.FormCreate(Sender: TObject);

var i : integer;

begin

for i := 0 to length(mybut)-1 do

begin

MyBut[i]:=TButton.Create(self);

MyBut[i].Name:='but'+IntToStr(i);

end;

end;





procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var i : integer;

begin

for i := 1 to length(mybut)-1 do

begin

myBut[i].Free;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var i : integer;

begin

//close;



begin



end;



end;

procedure TForm1.FormActivate(Sender: TObject);

var i:longint;

begin

for i := 0 to length(mybut)-1 do

begin



MyBut[i].Parent:=Form1;

MyBut[i].Caption:='but'+inttostr(i);

MyBut[i].Tag:=i;

MyBut[i].OnClick:=OnClickEvent;

mybut[i].Visible := true;

mybut[i].left := 10;

mybut[i].top := 10;

mybut[i].height := 50;

mybut[i].width := 100;

end;

end;



end.



Sur ce je vais me coucher, merci encore pour ton aide
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Gérer tout çà dans OnActivate est ridicule. C'est à dire que tu veux modifier les propriétés d'un composant à chaque fois que la fenêtre s'active ? Pff... Faudra alors m'expliquer le rôle de OnCreate.

Delphi est similaire à VisualBasic. Ca devrait pas être trop dur à faire les correspondances... ??
But:TButton.Create( Form1 );
Validez les réponses si ok...

ViewVite : HTML