Criando componentes em RunTime

21/02/2013

9

Olá boa tarde!
Estou pesquisando de como cria componentes em RunTime e encontrei um artigo arqui no Devmedia:
http://www.devmedia.com.br/criando-componentes-em-runtime/10563
blz, me ajudou bastante, mas acontece que estou desenvolvendo um programa para gerar etiquetas para impressora Zebra e queria fazer um similar parecido com o do fabricante, onde eu crio as etiquetas.
Agora desejaria saber como criar estes mesmos componentes em Panel, pois no exemplo os criei em um form.
Este Panel será a etiqueta e dentro dele preciso gerar os componentes.

A quem puder ajudar desde já meus agradecimentos

100+

ANT.CARLOS/SP


Responder

Posts

21/02/2013

Marco Salles

é so definir o Parent do component para O panel ...Poderia tb definir junto o Owner para o Parent mas não parece ser necessário

[]sds

seucomponent:=TClasseDoSeuComponent.Create(Seu Panel);
seucomponent.Parent:=Panel;
Responder

24/02/2013

Antonio Jesus

Olá boa tarde!
Obrigado pela atenção!

Desejaria agora saber como criar um evento no componente criado, como MouseDown, MouseUP, Duplo clique ?

Pois agora preciso abrir um formulario nestes eventos ou fazer algo.

100+

ANT.CARLOS/SP
Responder

26/02/2013

Antonio Jesus

xxxxxxxxxxxxx
Responder

26/02/2013

Marco Salles

defina no form procedures com o mesmo parâmetro dos eventos que vc quer

defina seu código ... Utilize os parâmetros internos do evento para realizar aa ações

por exemplo (sender)

Se for um button

TButton(sender).property := qq coisa;

para ligar esses eventos ao componente em rumtime é so atribui-lo


var
botao:Tbutton;
begin
//apos criao
botao.onclicl:=SeuForm.EventoOnclickDefinidoNoForm

[]sds

ps) é fácil
Responder

27/02/2013

Antonio Jesus

Olá boa tarde!

Fiz exatamente como vc me disse mas deve esta faltando alguma coisa.
No comp q crio não ativa o evento.
Inseri um comp. da paleta do Delphi e inseri o evento em rumTime ai funcionou.
No comp. q crio não funciona.

Embora ja tenha pesquisado sobre isto não consegui a solução.

Veja meu código:

-----------------------------
type
TForm3 = class(TForm)
ToolBar1: TToolBar;
ButtonEdit: TToolButton;
procedure ToolButton7Click(Sender: TObject);
procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormCreate(Sender: TObject);


//...Evento
procedure EditClick(Sender: TObject);


private
function GetCursor: TPoint;
function AddComponent(BaseClass: TComponentClass; p: TPoint): TComponent;
procedure SetDragMode(dm: TDragMode);
function getDragMode: TDragMode;



procedure doSaveControls;
procedure doLoadControls;
public
{ Public declarations }
end;

-----------------------------
function TForm3.AddComponent(BaseClass: TComponentClass; p: TPoint): TComponent;
begin
result := BaseClass.Create(self);
result.Tag := TAG_DINAMICO;
result.Name := BaseClass.ClassName + inttostr(ComponentCount+1);

if result.InheritsFrom(TWinControl) then begin
with TWinControl(result) do begin
Parent := Panel1;
Left := p.X;
Top := p.Y;
Visible := True;
//OnClick := Click;
texto := Copy(result.Name,2,6);
TForm(texto).OnClick:= EditClick; //...Meu obj criado

TForm(Edit1).OnClick:= EditClick; //...Comp. inserido da paleta do Delphi

end;
end else if result.InheritsFrom(TGraphicControl) then begin
with TGraphicControl(result) do begin
Parent := Panel1;
Left := p.X;
Top := p.Y;
Visible := True;
end;
end;
end;
----------------------------------
procedure TForm3.EditClick(Sender: TObject);
begin
ShowMessage('xxxxxxxxxxxxxxxxxx');
end;
----------------------------------






Responder

27/02/2013

Marco Salles

texto := Copy(result.Name,2,6);
TForm(texto).OnClick:= EditClick; //...Meu obj criado


vc esta fazendo um Type cast de um Texto

no lugar disso vc tem que colocar o seu Objeto Criado

ps)

este Type Cast que vc esta fazendo para o edit1 tb esta erradissimo

TForm(Edit1).OnClick:= EditClick;

O delphi não trata este Typcast , porque acredita que vc esta fazendo de modo correto . Vc so deve utiliza-lo quando tem
certeza que o Objeto é do Tipo da Classe .. No Cado o Edit não é da Classe TForm

o correto será vc utilizar assim

self.edit1.onclik:=EditClick; // Não precisa de Typcast para isto


ps)

TUmaClasse(ObjetoTemQueSerDaClassTUmaClasse).Propriedade

espero ter sido claro

[]sds
Responder

01/03/2013

Antonio Jesus

Olá boa noite!

Então, como o Edit1 não estou contruindo em tempo de execução, já tenho o nome do obj, funcionou.
Como tenho q identificar o tipo de objeto que quero atribuir um evento, criei estrutura e como devo usar para
attribuir um evento então?

Pois simplesmente assim não funciona "self.obj.OnClick := EditClick" gera erro.

100+

ANT.CARLOS/SP





------------------------------------------
function TForm3.AddComponent(BaseClass: TComponentClass; p: TPoint): TComponent;
var obj : TComponent;


begin
result := BaseClass.Create(self);
result.Tag := TAG_DINAMICO;
result.Name := BaseClass.ClassName + inttostr(ComponentCount+1);
nome := result.Name;
obj := result;

if result.InheritsFrom(TWinControl) then begin
with TWinControl(result) do begin
Parent := Panel1;
Left := p.X;
Top := p.Y;
Visible := True;

//...Identificacao do tipo de objeto
if (obj is TEdit) then
ShowMessage('é um TEdit!')
else if (obj is TComboBox) then

else if (obj is TButton) then

else if (obj is TLabel) then

else if (obj is TMemo) then

;

self.edit1.OnClick := EditClick; //...este evento esta funcionando normal

end;
end else if result.InheritsFrom(TGraphicControl) then begin
with TGraphicControl(result) do begin
Parent := Panel1;
Left := p.X;
Top := p.Y;
Visible := True;
end;
end;
end;
------------------------------------------
Responder

01/03/2013

Antonio Jesus

Olá, boa noite!
Bem!!! Pesando e refletindo a resp. anterior decobri a resposta.

Só não consegui fazer o clique funcionar no TLabel e no ComboBox, tem algum segredo tbém ?


só passei aqui pra registrar.

100+

ANT.CARLOS/SP


---------------------
//...Identificacao do tipo de objeto
if (obj is TEdit) then
TEdit(obj).OnClick:= EditClick
else if (obj is TComboBox) then
TComboBox(obj).OnClick:= EditClick
else if (obj is TButton) then
TButton(obj).OnClick:= EditClick
else if (obj is TLabel) then
TLabel(obj).OnClick:= EditClick
else if (obj is TMemo) then
TMemo(obj).OnClick:= EditClick;
---------------------
Responder

01/03/2013

Marco Salles

bem , ola so vc não precisa identificar o tipo de Objeto a não ser que vc crie um objeto que não possua o Onclick
(DbGrid é um exemplo , claro que dá para adiconar este evento isto é outra historia)

Pois bem vc ja consegui adiconar o evento

Todos esses objetos são derivados da Classe TControl certo ?

Pois bem , a propriedade onclick esta definida na classe TControl

property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;

so que ela esta protegida .. Para ter acesso vc cria uma classe Hacker

assim

type
THack =class (TControl);

seu código
THACK(Obj).OnClick:=EditClick;


logo vc pode substituir todos os Ifs pela instrução acima

OK ??
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira