Fórum Criar (e ter acesso!) a componente criado em Run time #364925
12/10/2008
0
Estou desenvolvendo uma aplicação onde um determinado Panel é preenchido com diversos componentes dependendo de qual opção é selecionada.
Criei um classe chamada ´TCompletaPanel´ que me retorna um Panel preenchido com os componentes(Edits, CheckBoxs, Buttons,etc) .
Até ai, tudo ok... o panel é retornado e inserido normalmente no form que o chamou.
O problema esta esta em acessar, a partir do form que o chamou, as propriedades desses componentes criado. Simplesmente não consigo.
No exemplo abaixo a minha dúvida é : como faço pra ter acesso ao conteúdo do componente Edit criado em run time?
Não sei exatamente o que estou fazendo de errado.
Se alguém se dispor a fazer o teste pra me ajudar, basta criar uma unit com o nome Complemento.pas e salva-la.
Segue o código:
unit Complemento.pas (que contem a classe PanelComplemento)
unit Complemento;
interface
uses ExtCtrls, stdCtrls, Forms;
type TPanelComplemento = class
public
function montaPanel01(formulario: TForm): TPanel;
end;
{ TPanelComplemento }
implementation
function TPanelComplemento.montaPanel01(formulario: TForm): TPanel;
var
panel01: TPanel;
radioButtonCria: TRadioButton;
EditNome : Tedit;
begin
panel01 := TPanel.Create(nil);
radioButtonCria := TRadioButton.Create(nil);
EditNome := TEdit.Create(nil);
radioButtonCria.Parent := panel01;
radioButtonCria.Top := 8;
radioButtonCria.Left := 8;
radioButtonCriaSM.Caption := ´Criar´;
editNome.Parent := panel01;
editNome.Top := 32;
editNome.Left := 8;
editNome.Name := ´editNome´;
panel01.Parent := formulario;
panel01.Left := 400;
panel01.Height := 257;
panel01.Top := 56;
panel01.Width := 153;
result := panel01;
end;
end.
Os códigos abaixo foram criados no form da aplicação (não na unit Complemento.pas)
Chamada do método que cria o Panel com os componentes em run time no meu form (adicionar a unit Complemento na cláusula USES)
procedure TForm1.Button1Click(Sender: TObject); var completaPanel : TPanelComplemento; begin completaPanel := TPanelComplemento.Create; completaPanel.montaPanel01(self); end;
Botão que gostaria que fizesse a leitura da propriedade Text do componente Edit criado em run time anteriormente:
procedure TForm1.Button2Click(Sender: TObject); begin showMessage(EditTeste.Text); // <-- Não compila, pois não encontra referência ao componente EditNome. end;
_flavio_
Curtir tópico
+ 0Post mais votado
13/10/2008
Para criar os componentes faça assim:
TEdit.Create(Self).Name := ´Edit_1´; TEdit.Create(Self).Name := ´Edit_2´;
Depois para acessa-los :
With TEdit( FindComponent(´Edit_1´ ) do Begin Left := 10; Top := 10; Width := 10; End; With TEdit( FindComponent(´Edit_2´ )) do Begin Left := 10; Top := 10; Width := 10; End;
Para liberar a memoria...
FindComponent(´Edit_1´ ).Free; FindComponent(´Edit_2´ ).Free;
Se não der certo, poste ai novamente...
Hallysson
Gostei + 1
Mais Posts
12/10/2008
Renato.pavan
var panel01: TPanel; radioButtonCria: TRadioButton; EditNome : Tedit;
showMessage(completapanel.Editnome.Text)
Abraços,
Renato
Gostei + 0
13/10/2008
_flavio_
var panel01: TPanel; radioButtonCria: TRadioButton; EditNome : Tedit;
showMessage(completapanel.Editnome.Text)
Obrigado, Renato, funcionou com a sua dica.
Estou com uma dúvida conceitual agora : então os componentes criados pela função são pertencentes ao objeto completaPanel? Pensei que após a criação eles fossem propriedades do form que a chamou.
Fiz um outro teste, agora mais enxuto.
function TCompletaPanel.montaPanel(formulario: TForm): TPanel; begin panel1 := TPanel.Create(formulario); edit1 := TEdit.Create(formulario); edit1.Parent := panel1; panel1.Parent := formulario; result := panel1; end;
Pelo que estou entendendo, mesmo instanciando o objeto como sendo propriedade do form que o chamou ([b:b376da1e3b]edit1 := TEdit.Create(formulario);[/b:b376da1e3b]) o componente não é de fato do formulário, e sim da classe completaPanel?
Gostei + 0
13/10/2008
_flavio_
TEdit.Create(Self).Name := ´Edit_1´; TEdit.Create(Self).Name := ´Edit_2´;
With TEdit( FindComponent(´Edit_1´ ) do Begin Left := 10; Top := 10; Width := 10; End; With TEdit( FindComponent(´Edit_2´ )) do Begin Left := 10; Top := 10; Width := 10; End;
FindComponent(´Edit_1´ ).Free; FindComponent(´Edit_2´ ).Free;
Muito obrigado pela ajuda,Hallysson. Usando o seu método, o meu projeto compilou, mas continuo tendo o mesmo problema de não conseguir acessar o componente edit criado em run time.
Gostei + 0
13/10/2008
Hallysson
TEdit( FindComponent(NomeEdit ).PropriedadeQueDeseja
Gostei + 0
13/10/2008
_flavio_
TEdit( FindComponent(NomeEdit ).PropriedadeQueDeseja
Hallysson, acho que o meu problema está sendo o seguinte : o componente que estou procurando não pertence ao form, e sim a classe onde está a chamada do método... o que está me deixando bem confuso, pois pensei que com o NOME_DO_COMPONENTE.create(formulario-que-é-dono-do-componente) o problema estaria resolvido...
Gostei + 0
13/10/2008
Hallysson
Ex:
TEdit( FindComponent(´NomeClasseOrigem.´ + NomeEdit ).PropriedadeQueDeseja
é como se vc estivesse acessando um objeto de outro form...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)