Fórum Criacao de componentes #10670

28/10/2009

0

Tenho a seguinte duvida :   Em uma procedure do meu formulario, eu crio varios componentes em tempo de execucao. So que em uma outra procedure, eu tento acessar esses componentes e nao consigo. Ele  me fala que o componentenao existe.   Estou anexando a rotina que cria os componentes para vc verem como eu to fazendo.   procedure TFmExecutarPesquisa.CriaObjetos(i : integer);
var lblTitulo: TRxLabel;
    edtDados: TovcPictureField;
    cAtributo : String;
begin
  cAtributo := cdsParametros.FieldByName('PARAMNAME').asString;   //--- Label ---//
  lblTitulo := TRxLabel.Create(pnlEntradaParam);
  lblTitulo.Parent     := pnlEntradaParam;
  lblTitulo.Name       := 'lbl'+ cAtributo;
  lblTitulo.Caption    := cdsParametros.FieldByName('PARAMNAME').asString;
  lblTitulo.AutoSize   := false;
  lblTitulo.Width      := 130;
  lblTitulo.Height     := 20;
  lblTitulo.Top        := 5 + (i * 20);
  lblTitulo.Left       := 5;
  lblTitulo.Font.Size := 11;
  lblTitulo.Font.Style := [fsBold];
  lblTitulo.Transparent := true;   lblTitulo.ParentFont := True;
  lblTitulo.Alignment := taRightJustify;   //cria objeto de acordo com o tipo do parâmetro para entrar com os valores
  edtDados := TovcPictureField.Create(pnlEntradaParam);
  edtDados.Parent     := pnlEntradaParam;
  edtDados.AutoSize   := False;
  edtDados.Name       := 'edt'+cAtributo;
  edtDados.Top        := 5 + (i * 22);
  edtDados.Height     := 20;
  edtDados.Left       := 140;
  edtDados.Tag        := cdsParametros.recno;
  edtDados.Text := '';
  edtDados.Font.Size := 11;
  if cdsParametros.fieldbyname('PARAMTYPE').asString = 'DT_' then
  begin
     edtDados.DataType := pfTDate;
     edtDados.Width      := 100;
  end
  else
  begin
     edtDados.DataType := pftString;
     edtDados.Width      := 220;
  end;   edtDados.ParentFont := True;
//  edtDados.OnChange := TnotifyEvent( edtDadosChange(edtDados.Text));
end;
  Essa rotina realmente cria os componentes que eu preciso.....no caso ai ele criou um componente com o nome de EdtUnidade. E no debug dentro dessa procedure que cria ele eu vejo esse componnte.  Quando ele sai da rotina, os mesmos estao na tela...eu consigo digitar dentro deles e tudo....mas quando eu tento fazer um edtUnidade.text por exemplo....que é um componente que ele criou, ele fala que o componente nao existe.     Atenciosamente     Adriano
Adriano Silva

Adriano Silva

Responder

Posts

29/10/2009

Rodrigo Mourão

Olá Amigo,

Primeiro vc esta declarando as variaveis que vao representar seus componentes dentro da procedure. Com isso eles so serão visiveis dentro da procedure. Observe:

procedure TFmExecutarPesquisa.CriaObjetos(i : integer);
var lblTitulo: TRxLabel;
    edtDados: TovcPictureField;
    cAtributo : String;
begin


Bem até ai tudo bem. Agora o grande lance é o seguinte. Quando criamos um componente em tempo de execução temos que fazer referencia a ele pela variavel e nao pelo nome. Veja o exemplo:

Var
  Edt: TEdit;
begin
  Edt := TEdit.create(self);
  Edt.nome := 'EdtTeste';
end;

Para passar um valor para este edit nao adianta fazer EdtTeste.text isso não vai funcionar. TEm que ser Edt.text pois fazemos referencia ao componente pela variavel e nao pelo nome.

Quando vc colocar um componente no form, normalmente então o nome do componente e o nome da variavel por isso e que nao nos preocupamos com isso. Agora quando criamos dinamicamente tem que ser assim

Abs!!1]


Responder

Gostei + 0

01/11/2009

Rodrigo Mourão

Olá Amigo,

Esteremos colocando o chamado como concluido. Caso tenha alguma outra dúvida você poderá reabrí-lo que voltaremos a atendê-lo.

Att,

Responder

Gostei + 0

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

Aceitar