Typecast
Olá .. em um TFormulariobase quero ter uma rotina que localize todo bitbtn de um form;
Essa eu até faço mas esses bitbtns tem na propriedade tag que vai de tag=0 até quantos bitbtns tiverem armazenando ou num TList ou num array a idéia é identificar esses bitbtns e de acordo com a propriedade tag e adotar um comportamento diferente entre eles no formulario da aplicação que herda de TFormulariobase. Exemplo : Operação de inclusão ou alteração de registro quando feita no form os bitbtns com tag = 0, 3, 5 e 6 enabled := False.
Importadora Ltda
Curtidas 0
Respostas
Wesley Yamazack
13/05/2010
Olá amigo,
Com o método abaixo você consegue varrer o formulário e saber os componentes que estão nele, em específico eu fiz o TBitBtn, além de adicionar o mesmo(Objeto), em um ListBox, com o caption e a Tag.
procedure TForm1.Button1Click(Sender: TObject);
Var
I : Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
if Components[I] is TBitBtn then
begin
ListBox1.Items.AddObject(TBitBtn(Components[I]).Caption + ' - Tag : '+
IntToStr(TBitBtn(Components[I]).Tag),TBitBtn(Components[I]));
end;
end;
end;
Seria isso que você estava querendo ?
Att,
Wesley Y
Com o método abaixo você consegue varrer o formulário e saber os componentes que estão nele, em específico eu fiz o TBitBtn, além de adicionar o mesmo(Objeto), em um ListBox, com o caption e a Tag.
procedure TForm1.Button1Click(Sender: TObject);
Var
I : Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
if Components[I] is TBitBtn then
begin
ListBox1.Items.AddObject(TBitBtn(Components[I]).Caption + ' - Tag : '+
IntToStr(TBitBtn(Components[I]).Tag),TBitBtn(Components[I]));
end;
end;
end;
Seria isso que você estava querendo ?
Att,
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
Olá Wesley .. obrigado pela rápida resposta ... mas essa parte eu tinha feito . o que eu ainda estou tentando é em vez de colocar em um listbox ou ou qualquer controle seria colocar num array e a função do FormularioBase identificar os Bitbnts associando com as respectivas tags e fazer o seguinte por exemplo :
procedure TFormularioBase.ConfigButtons(AForm: TForm; Editar: Boolean; ListBtn: array of TObject);
begin
if (Editar) then
begin
(ListBtn[0] as TBitBtn).Enabled := False; //Incluir
(ListBtn[1] as TBitBtn).Enabled := False; //Alterar
(ListBtn[2] as TBitBtn).Enabled := True; //Gravar
(ListBtn[3] as TBitBtn).Enabled := True; //Cancelar
(ListBtn[4] as TBitBtn).Enabled := False; //Delete
end
else
begin
(ListBtn[0] as TBitBtn).Enabled := True; //Incluir
(ListBtn[1] as TBitBtn).Enabled := True; //Alterar
(ListBtn[2] as TBitBtn).Enabled := False; //Gravar
(ListBtn[3] as TBitBtn).Enabled := False; //Cancelar
(ListBtn[4] as TBitBtn).Enabled := True; //Delete
end;
end; Sendo que eu passo o formulario da aplicação como parametro, a variavel Editar boolean se é editar ou não . .e o ListBtn que é um array que no caso ... o 0, 1, 2, representam os mesmos numeros das tags dos Bitbtns do formulario da aplicação chamando ConfigButtons que herda de TFomPrincipal = class(TformularioBase) de acordo com as tags dessa forma eu vou definir o comportamento em toda a aplicação.Exemplo . todas as tags 0 (Listbtn[0] serão inclusoes) e assim por diante.
begin
if (Editar) then
begin
(ListBtn[0] as TBitBtn).Enabled := False; //Incluir
(ListBtn[1] as TBitBtn).Enabled := False; //Alterar
(ListBtn[2] as TBitBtn).Enabled := True; //Gravar
(ListBtn[3] as TBitBtn).Enabled := True; //Cancelar
(ListBtn[4] as TBitBtn).Enabled := False; //Delete
end
else
begin
(ListBtn[0] as TBitBtn).Enabled := True; //Incluir
(ListBtn[1] as TBitBtn).Enabled := True; //Alterar
(ListBtn[2] as TBitBtn).Enabled := False; //Gravar
(ListBtn[3] as TBitBtn).Enabled := False; //Cancelar
(ListBtn[4] as TBitBtn).Enabled := True; //Delete
end;
end; Sendo que eu passo o formulario da aplicação como parametro, a variavel Editar boolean se é editar ou não . .e o ListBtn que é um array que no caso ... o 0, 1, 2, representam os mesmos numeros das tags dos Bitbtns do formulario da aplicação chamando ConfigButtons que herda de TFomPrincipal = class(TformularioBase) de acordo com as tags dessa forma eu vou definir o comportamento em toda a aplicação.Exemplo . todas as tags 0 (Listbtn[0] serão inclusoes) e assim por diante.
GOSTEI 0
Wesley Yamazack
13/05/2010
Olá amigo,
Gostaria de saber se você utiliza herança visual em sua aplicação, se usa concorda comigo que sempre terá o mesmo número de botões? Não havendo assim a necessidade deste código o que eu faço em minha aplicação com formulário padrão é o seguinte.
procedure TFrmPadrao.HabilitaControles;
begin
BtnNovo.Enabled := not(DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnGravar.Enabled := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnEditar.Enabled := (DSPadrao.DataSet.State in [dsBrowse]);
BtnDeletar.Enabled := (DSPadrao.DataSet.State in [dsBrowse]);
BtnCancelar.Enabled := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnPesquisa.Enabled := not (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
end;
Mas eu tenho DSPadrao no meu formulário, o que você poderia fazer era desabilitar simplesmente os botões pelo nome, mas isso tudo que eu falei só serve se você utilizar herança visual, ok ?
Agora se você não utiliza estou vendo aqui uma solução e assim que terminar lhe mando a resposta ok ?
Att,
Wesley Y
Gostaria de saber se você utiliza herança visual em sua aplicação, se usa concorda comigo que sempre terá o mesmo número de botões? Não havendo assim a necessidade deste código o que eu faço em minha aplicação com formulário padrão é o seguinte.
procedure TFrmPadrao.HabilitaControles;
begin
BtnNovo.Enabled := not(DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnGravar.Enabled := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnEditar.Enabled := (DSPadrao.DataSet.State in [dsBrowse]);
BtnDeletar.Enabled := (DSPadrao.DataSet.State in [dsBrowse]);
BtnCancelar.Enabled := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
BtnPesquisa.Enabled := not (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
end;
Mas eu tenho DSPadrao no meu formulário, o que você poderia fazer era desabilitar simplesmente os botões pelo nome, mas isso tudo que eu falei só serve se você utilizar herança visual, ok ?
Agora se você não utiliza estou vendo aqui uma solução e assim que terminar lhe mando a resposta ok ?
Att,
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
Realmente não uso herança visual, o controle desses botoes é dinâminco eu coloquei a tag.. porque.. normalmente eu faço o seguinte , varro todo o formulario identificando todos os componentes e adoto um comportamento padrão para cada situação.Mas no caso dos botoes eu tenho varios grupos de botoes para varias tabelas.Por exemplo .. na mesma tela eu tenho inclusão de UF .. e do lado inclusão de cidades.. , do lado a regiao ou micro-regiao.. todos eles tem botão incluir, gravar, cancelar, excluir ..etc. quando eu crio qualquer formulario herdando do TFormularioBase automaticamente irei varrer todos os botoes do formulario Aplicação e aplicarei o comportamento de acordo com a situação..no seu proprio grupo de botões... posso ter na mesma tela varios botoes incluir ... só que com tags padrão .. incluir tag = 1, 3, 5, 7, gravar tags 2,4,6, cancelar outras tags . assim por diante.Não sei se me fiz entender..
GOSTEI 0
Wesley Yamazack
13/05/2010
Olá amigo, não sei se entendi direito o que você quer, mas peguei sua função , adicionei alguns BitBtn`s, e na hora de chamar o formulário eu passei o seguinte código
procedure TForm1.FormShow(Sender: TObject);
Var
ListBtn: array of TObject;
I, J : Integer;
begin
J := 0;
SetLength(ListBtn, 5);
for I := 0 to componentcount - 1 do
begin
if Components[I] is TBitBtn then
begin
ListBtn[J] := TBitBtn(Components[I]); //TBitBtn(Components[I]);
Memo1.Lines.Add((ListBtn[J] as TBitBtn).Caption);
Inc(J);
end;
end;
ConfigButtons(Self,True,ListBtn);
end;
E os botões foram desabilitados sem problemas.
Seria isso que você estava querendo ?
Att,
Wesley Y
procedure TForm1.FormShow(Sender: TObject);
Var
ListBtn: array of TObject;
I, J : Integer;
begin
J := 0;
SetLength(ListBtn, 5);
for I := 0 to componentcount - 1 do
begin
if Components[I] is TBitBtn then
begin
ListBtn[J] := TBitBtn(Components[I]); //TBitBtn(Components[I]);
Memo1.Lines.Add((ListBtn[J] as TBitBtn).Caption);
Inc(J);
end;
end;
ConfigButtons(Self,True,ListBtn);
end;
E os botões foram desabilitados sem problemas.
Seria isso que você estava querendo ?
Att,
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
É assim ... No meu formularioBase eu gostaria ter o codigo para varrer o form e mapear os bitbnts...dinamicamente.. se o formulario da aplicação tiver 50 bitbtns jogar num array por exemplo, para que eu possa acessar as propriedades deles lá no meu formulario da aplicação sem ter que digitar código, pois está tudo no formulariobase, então só chamar a procedure ou função do formulario base, para que no meu formulario da aplicação os botoes desabilitem, habilitem .. ou o visible fique true ou false dependendo do parametro passado, basicamente seria isso ..
GOSTEI 0
Importadora Ltda
13/05/2010
A minha dificuldade está em conseguir com que a procedure ou a função do meu formularioBase chamado pelo formulario da aplicação consiga acessar os objetos (bitbtns) localizados no formulario da aplicação ...
GOSTEI 0
Wesley Yamazack
13/05/2010
Olá amigo,
Teria como você fazer um exemplo ? Mandar pra mim 2 formulários, para eu poder simular exatamente oque você esta querendo?
Um abraço
Wesley Y
Teria como você fazer um exemplo ? Mandar pra mim 2 formulários, para eu poder simular exatamente oque você esta querendo?
Um abraço
Wesley Y
GOSTEI 0
Wesley Yamazack
13/05/2010
Olá amigo, estou aguardando o exemplo,
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
Olá ... vou preparar é que estou muito ocupado nas alterações urgentes no ERP que estou implementando ... e tenho que subir até hoje..peço desculpas pela demora, mas já preparo e mando o exemplo. Obrigado
GOSTEI 0
Wesley Yamazack
13/05/2010
Ok amigo, fico no aguardo.
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
Preparei o arquivo de exemplo mas está dando o erro abaixo, não consigo postar no disco virtual
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'CLng'
D:\WEB\DEVMEDIA.COM.BR\HTTPDOCS\DISCOVIRTUAL\../suporte/header.asp, line 12
GOSTEI 0
Devmedia
13/05/2010
Olá,
identificamos o problema e já estamos procedendo com o reparo. Em instantes o disco virtual estará no ar.
Pedimos sinceras desculpas pelo ocorrido.
GOSTEI 0
Importadora Ltda
13/05/2010
Olá.. consegui postar o arquivo .. está no disco virtual no link : http://video.devmedia.com.br/discovirtual/182603/Cadastro.rar disco, basicamente
eu queria mapear os bitbtns dinamicamente e configurar habilitar ou desabilitar cada um de acordo com a situação, só chamando a a procedure ou função do formulario base.
GOSTEI 0
Wesley Yamazack
13/05/2010
Olá amigo, se eu entendi bem você quer habilitar os botões do form, de acordo com o Tag Certo?
Veja se isso lhe ajudaria.
procedure TFormCadastro.Habilitarbotoes(Editar: boolean);
Var
I : Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
if Components[I] is TBitBtn then
begin
if TBitBtn(Components[I]).Tag = 0 then
TBitBtn(Components[I]).Enabled := not Editar
else
if TBitBtn(Components[I]).Tag = 1 then
TBitBtn(Components[I]).Enabled := not Editar
else
if TBitBtn(Components[I]).Tag = 2 then
TBitBtn(Components[I]).Enabled := Editar
else
if TBitBtn(Components[I]).Tag = 3 then
TBitBtn(Components[I]).Enabled := Editar
else
if TBitBtn(Components[I]).Tag = 4 then
TBitBtn(Components[I]).Enabled := not Editar
end;
end;
Um abraço
Wesley Y
Veja se isso lhe ajudaria.
procedure TFormCadastro.Habilitarbotoes(Editar: boolean);
Var
I : Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
if Components[I] is TBitBtn then
begin
if TBitBtn(Components[I]).Tag = 0 then
TBitBtn(Components[I]).Enabled := not Editar
else
if TBitBtn(Components[I]).Tag = 1 then
TBitBtn(Components[I]).Enabled := not Editar
else
if TBitBtn(Components[I]).Tag = 2 then
TBitBtn(Components[I]).Enabled := Editar
else
if TBitBtn(Components[I]).Tag = 3 then
TBitBtn(Components[I]).Enabled := Editar
else
if TBitBtn(Components[I]).Tag = 4 then
TBitBtn(Components[I]).Enabled := not Editar
end;
end;
Um abraço
Wesley Y
GOSTEI 0
Importadora Ltda
13/05/2010
Sim.. isso mesmo.. habilibar e desabilitar individualmente de acordo com a TAG ..
Obrigado .. e um Abraço .
GOSTEI 0
Wesley Yamazack
13/05/2010
ok amigo.
Chamado fechado.
Um abraço
Wesley Y
Chamado fechado.
Um abraço
Wesley Y
GOSTEI 0