Fórum Typecast #377547

13/05/2010

0

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

Importadora Ltda

Responder

Posts

13/05/2010

Wesley Yamazack

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
Responder

Gostei + 0

14/05/2010

Importadora Ltda

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.
Responder

Gostei + 0

14/05/2010

Wesley Yamazack

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
Responder

Gostei + 0

14/05/2010

Importadora Ltda

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..
Responder

Gostei + 0

14/05/2010

Wesley Yamazack

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
Responder

Gostei + 0

14/05/2010

Importadora Ltda

É 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 ..
Responder

Gostei + 0

14/05/2010

Importadora Ltda

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 ...
Responder

Gostei + 0

14/05/2010

Wesley Yamazack

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
Responder

Gostei + 0

20/05/2010

Wesley Yamazack

Olá amigo, estou aguardando o exemplo,

Att,
Wesley Y
Responder

Gostei + 0

20/05/2010

Importadora Ltda

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
Responder

Gostei + 0

20/05/2010

Wesley Yamazack

Ok amigo, fico no aguardo.

Att,

Wesley Y
Responder

Gostei + 0

21/05/2010

Importadora Ltda

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
Responder

Gostei + 0

21/05/2010

Devmedia

Olá, identificamos o problema e já estamos procedendo com o reparo. Em instantes o disco virtual estará no ar. Pedimos sinceras desculpas pelo ocorrido.
Responder

Gostei + 0

21/05/2010

Importadora Ltda

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.
Responder

Gostei + 0

21/05/2010

Wesley Yamazack

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
Responder

Gostei + 0

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

Aceitar