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
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
Curtir tópico
+ 0
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]
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,
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
Clique aqui para fazer login e interagir na Comunidade :)