GARANTIR DESCONTO

Fórum Criar (e ter acesso!) a componente criado em Run time #364925

12/10/2008

0

Olá, pessoal...

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_

_flavio_

Responder

Post mais votado

13/10/2008

Bom dia!!
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

Hallysson
Responder

Gostei + 1

Mais Posts

12/10/2008

Renato.pavan

Essas variáveis,

 var
  panel01: TPanel;
  radioButtonCria: TRadioButton;  
  EditNome : Tedit; 
que voce declarou na função montaPanel01 deve ser declarado na sessão public da classe, dai na tela q vc criou o panel vc faz a chamada da seguinte forma:

showMessage(completapanel.Editnome.Text)


Abraços,

Renato


Responder

Gostei + 0

13/10/2008

_flavio_

Essas variáveis,
 var
  panel01: TPanel;
  radioButtonCria: TRadioButton;  
  EditNome : Tedit; 
que voce declarou na função montaPanel01 deve ser declarado na sessão public da classe, dai na tela q vc criou o panel vc faz a chamada da seguinte forma:
showMessage(completapanel.Editnome.Text)
Abraços, Renato

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?


Responder

Gostei + 0

13/10/2008

_flavio_

Bom dia!! 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...

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.


Responder

Gostei + 0

13/10/2008

Hallysson

Para acessar qualquer propriedade do objeto basta usar:

  TEdit( FindComponent(NomeEdit ).PropriedadeQueDeseja 



Responder

Gostei + 0

13/10/2008

_flavio_

Para acessar qualquer propriedade do objeto basta usar:
  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...


Responder

Gostei + 0

13/10/2008

Hallysson

se vc esta acessando um objeto a partir de outra classe, basta colocar o nome da sua classe que esta criando o objeto...
Ex:

TEdit( FindComponent(´NomeClasseOrigem.´ + NomeEdit ).PropriedadeQueDeseja 


é como se vc estivesse acessando um objeto de outro form...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar