Problema com função publica.

Delphi

24/02/2006

Função que usos para tratar os botões do formulário frmNivelServico.
function TrataBotoes(Botao:String): String;
begin
with frmNivelServico do
begin
if Botao = ´frm´ then
begin
// Botoes
btbtnGravar.Enabled := False;
btbtnNovo.Enabled := True;
btbtnCancelar.Enabled := False;
btbtnExcluir.Enabled := True;
btbtnSair.Enabled := True;
btbtnPrimeiro.Enabled := True;
btbtnAnterior.Enabled := True;
btbtnProximo.Enabled := True;
btbtnUltimo.Enabled := True;
// Botoes fim
end;
end;
end;


Gostaria que todos os formulários usasem esta função então a mudei um pouco.


function TrataBotoes(Botao:String,Frm : TForm): String;
begin
with frm do
begin
if Botao = ´frm´ then
begin
// Botoes
btbtnGravar.Enabled := False;
btbtnNovo.Enabled := True;
btbtnCancelar.Enabled := False;
btbtnExcluir.Enabled := True;
btbtnSair.Enabled := True;
btbtnPrimeiro.Enabled := True;
btbtnAnterior.Enabled := True;
btbtnProximo.Enabled := True;
btbtnUltimo.Enabled := True;
// Botoes fim
end;
end;

Como paço para tornar esta função pubica e todos os formulários do projeto à usarem.

O problema é que com a mudança da função o delphi não reconhece os nomes dos botões
e não compila.

Obrigado pela atenção.


Ullrich

Ullrich

Curtidas 0

Respostas

Rjun

Rjun

24/02/2006

Utilize POO. Crie um form base com esses botões e use herança com os outros forms do seu projeto.


GOSTEI 0
Ullrich

Ullrich

24/02/2006

Muito bom, estou feliz em saber que da certo. mas tem um probleminha.

? ? ? Como se faz isso ? ? ?

Utilize POO. Crie um form base com esses botões e use herança com os outros forms do seu projeto.

? ? ? Como se faz isso ? ? ?

Se puder me enviar um exemplo simples maycon123@hotmail.com ficaria muitissimo grato, pois sou iniciante, e só aqui consigo ajuda.

Prometo postar aqui a resolução do meu problema, para beneficio de todos.


GOSTEI 0
Rjun

Rjun

24/02/2006

Veja se esse [url=http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=336&mode=thread&order=0&thold=0]artigo[/url] ajuda você.


GOSTEI 0
Martins

Martins

24/02/2006

Muito bom, estou feliz em saber que da certo. mas tem um probleminha. ? ? ? Como se faz isso ? ? ? Utilize POO. Crie um form base com esses botões e use herança com os outros forms do seu projeto. ? ? ? Como se faz isso ? ? ? Se puder me enviar um exemplo simples maycon123@hotmail.com ficaria muitissimo grato, pois sou iniciante, e só aqui consigo ajuda. Prometo postar aqui a resolução do meu problema, para beneficio de todos.


Como dito pelo nobre colega [color=darkblue:bcf38cf792][b:bcf38cf792]RJun[/b:bcf38cf792][/color:bcf38cf792], vc pode criar um form com essa função, um form q servirá de base para os outros, sendo assim todos os outros forms q forem criados com a finalidade de usar esses botões devem ser herdados desse form principal, crie um Form com as funções depois vá [b:bcf38cf792]New - Other[/b:bcf38cf792] e procure por seu form principal em[b:bcf38cf792] Project1[/b:bcf38cf792], deve está marcada a opção [b:bcf38cf792]InHerit[/b:bcf38cf792].

Boa sorte!!


GOSTEI 0
Ullrich

Ullrich

24/02/2006

Criei uma unit sem form.

Criei estas variaveis e compilo tranquilamente.

var
btbtnNovo, btbtnCancelar, btbtnExcluir,btbtnGravar : TButton;
btbtnSair,btbtnPrimeiro,btbtnAnterior, btbtnAlterar : TButton;
btbtnProximo, btbtnUltimo : TButton;

porem quando chega nesta linha o programa trava, com a mensagem:
Access violation ar address 004B33834 modulo ´projeto.exe´ Read of address 0000000´


with frm do
begin
if Botao = ´frm´ then
begin
// Botoes
btbtnGravar.Enabled := False; < --- Trava nesta linha. -------
btbtnNovo.Enabled := True;
btbtnCancelar.Enabled := False;
btbtnExcluir.Enabled := True;
btbtnSair.Enabled := True;
btbtnPrimeiro.Enabled := True;
btbtnAnterior.Enabled := True;
btbtnProximo.Enabled := True;
btbtnUltimo.Enabled := True;
// Botoes fim
end;
end;

Parece que o delphi não entende que é para concatenar o (frm: Tform) com
o (btbtnGravar: TButton) e alterar a prorpiedade do botão.

Como faço para resolver este problema?

Obeigado pela atenção.


GOSTEI 0
Rjun

Rjun

24/02/2006

Bom, pelo jeito o artigo não foi util.

Parece que o delphi não entende que é para concatenar o (frm: Tform) com o (btbtnGravar: TButton) e alterar a prorpiedade do botão.


Com certeza, não é só o Delphi que não entende...

Se você quer realmente fazer esse tipo de função, então vai.

procedure Absurdo(Form: TForm);
begin
  (Form.FindComponent(´btnGravar´) as TButton).Enabled := false;
  (Form.FindComponent(´btnNovo´) as TButton).Enabled := true;
  ....resto do código
end;



GOSTEI 0
Ullrich

Ullrich

24/02/2006

Meu amigo Rjun, muito obrigado pela dica, porem gostaria que não fosse tão infeliz em seus comentários...

Com certeza, não é só o Delphi que não entende...


procedure Absurdo(Form: TForm);


Gostaria muito de ter os seus conhecimentos, e quando os tiver, tenho certeza que não vou fazer piadinhas com pessoas que estão presisando de mim.

Obrigado pela sua atenção.


GOSTEI 0
Marco Salles

Marco Salles

24/02/2006

entuitivamente , pela natureza dos nomes dos botoes que voce passou , serem os mesmo nos vários formulários , a indicação de POO é mais do que natural...

Porem pude perceber que a sua dúvida vai aquem de POO

o que voce quer é um método gennerico que iniba os botoes de um formulário , e que esse método seje generico , para que voce não o tenha que escrever repitidamente no seu código


mesmo que voce utilize a herança visual , voce tem que saber escrever o método. [b:306f73ce7e]Isso é ponto[/b:306f73ce7e]

:idea: :idea: :idea:
primeiro recomendo que voce não trabalhe com os [b:306f73ce7e]nomes[/b:306f73ce7e] dos buttoes para esta finalidade .. O trabalho é muito maior , alem do mais voce é obrigado a ter os mesmos nomes em todos os formularios que usufruirem desse metodo

então existe uma [b:306f73ce7e]propriedade tag [/b:306f73ce7e](ver objecto inspector) que pode ser facilmente uzada para selecionar o que se quer daquilo que não se quer

e o método geral pode ser escrito dessa forma

procedure Habilitar(chave:boolean;formulario:Tform);
var
i:integer;
begin
  for i:=0 to formulario.ComponentCount -1  do
  if formulario.Components[i] is tbutton then
    if Tbutton(formulario.Components[i]).tag = 1  then
        Tbutton(formulario.Components[i]).enabled := chave;
end;


para habilitar e so chamar
Habilitar(true,NomeDoSeuFormulario)


para desabilitar
Habilitar(false,NomeDoSeuFormulario)


[b:306f73ce7e]atende que nesse caso eu especifiquei o tag dos botoes igua a [b]UM[/b:306f73ce7e] ...Para que fiquem habilitados ou desabilitados.. E claro que previamente eu alterei esse valor no objeto inspector dos referidos botoes [/b]


GOSTEI 0
Ullrich

Ullrich

24/02/2006

:P
Ficou D ++++
Agora com apenas uma função posso trabalhar os botões de todo o projeto. Muito bom mesmo, era isso que eu queria...

Muito obrigado pela dica Sr. Marco Salles, tem tanta coisa que eu quero aprender e todo dia aprendo uma nova, graças a pessoas como você, meus sinceros agradecimentos.

Sr. Rjum e Sr. Martins desculpe-me, acho que não fui bem claro com minhas dúvidas, é meio dífissil para mim, que não tenho muita pratica, saber como pedir alguma coisa, mesmo assim obrigado pela colaboração.

Aqui está a função, acho que podemos melhora-la, pois mudando o nª da TAG de cada componente que pretendemos alterar, acho que não é necessário um laço. Se alguem tiver uma idéia para aperfeisoar, serei muito grato.

De qualquer forma, ela funcionou muito bem desse jeito.

function TrataBotoes(Botao:String; frm: TForm): String;
var
i : Integer;
begin
if Botao = ´frm´ then
begin
for i:=0 to frm.ComponentCount -1 do
begin
if frm.Components[i] is tbutton then
if Tbutton(frm.Components[i]).Tag = 1 then // btbtnGravar
Tbutton(frm.Components[i]).enabled := False;
if Tbutton(frm.Components[i]).tag = 2 then // btbtnNovo
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 3 then // btbtnAlterar
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 4 then // btbtnCancelar
Tbutton(frm.Components[i]).enabled := False;
if Tbutton(frm.Components[i]).tag = 5 then // btbtnExcluir
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 6 then // btbtnSair
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 7 then // btbtnPrimeiro
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 8 then // btbtnAnterior
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 9 then // btbtnProximo
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 10 then // btbtnUltimo
Tbutton(frm.Components[i]).enabled := True;
end;
end;


Para chamar o procedimento use:

TrataBotoes(´frm´,TForm(frmCliente));

Agradeço a todos pela atenção.


GOSTEI 0
Marco Salles

Marco Salles

24/02/2006

Aqui está a função, acho que podemos melhora-la, pois mudando o nª da TAG de cada componente que pretendemos alterar, acho que não é necessário um laço. Se alguem tiver uma idéia para aperfeisoar, serei muito grato.


veja , voce não precisa ter varios valores diferentes de tag para cada componente... se o objetivo dele e so inibir ou desabitar então deixe todos desse grupo com o mesmo valor do tag.. Logo a função original que lhe passei tem o mesmo efeito que a sua

procedure Habilitar(chave:boolean;formulario:Tform); 
var 
i:integer; 
begin 
  for i:=0 to formulario.ComponentCount -1  do 
  if formulario.Components[i] is tbutton then 
    if Tbutton(formulario.Components[i]).tag = 1  then 
        Tbutton(formulario.Components[i]).enabled := chave; 
end;


os demais bottoes do formulario que tem o valor de tag diferentes de um , não são afetados pelo código...e so isso


GOSTEI 0
Ullrich

Ullrich

24/02/2006

Você está certo, porem veja isto:

Quando o usuario clicar no Botão Cancelar (On-click)

BotaoGravar := Desabilita.
BotaoNovo := Abilita.
BotaoEditar := Abilita.
BotaoCancelar := Desabilita.
BotaoExcluir := Abilita.
BotaoSair := Abilita.

if Tbutton(frm.Components[i]).Tag = 1 then // btbtnGravar <- Desa.
Tbutton(frm.Components[i]).enabled := False;
if Tbutton(frm.Components[i]).tag = 2 then // btbtnNovo <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 3 then // btbtnAlterar <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 4 then // btbtnCancelar <- Desa.
Tbutton(frm.Components[i]).enabled := False;
if Tbutton(frm.Components[i]).tag = 5 then // btbtnExcluir <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 6 then // btbtnSair <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 7 then // btbtnPrimeiro <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 8 then // btbtnAnterior <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 9 then // btbtnProximo <- Abilita
Tbutton(frm.Components[i]).enabled := True;
if Tbutton(frm.Components[i]).tag = 10 then // btbtnUltimo <- Abilita
Tbutton(frm.Components[i]).enabled := True;

Entendeu, No seu modo, eu posso abilitar todos os botões ou desabilitar todos os botões, todos de uma só vez, entretanto eu preciso abilitar algums e desabilitar outros, por isso ´dei´ um numero de TAG para cada um e posso manipular com o seu procedimento.


Abraços e obrigado.


GOSTEI 0
Marco Salles

Marco Salles

24/02/2006

Você está certo, porem veja isto:

Quando o usuario clicar no Botão Cancelar (On-click) BotaoGravar := Desabilita. BotaoNovo := Abilita. BotaoEditar := Abilita. BotaoCancelar := Desabilita. BotaoExcluir := Abilita. BotaoSair := Abilita.


[b:0a944d4571]voce não repcisa usar tags diferentes , voce usa o mesm tag e usa a chave para fazer isto .. Chave que ue falo e um propriedade booleana qua se passa junto com o form na procedure[/b:0a944d4571]

Olhe a definção

procedure Habilitar(chave:boolean;formulario:Tform); 
var 
i:integer; 
begin 
  for i:=0 to formulario.ComponentCount -1  do 
  if formulario.Components[i] is tbutton then 
    begin
       if Tbutton(formulario.Components[i]).tag = 1  then 
          Tbutton(formulario.Components[i]).enabled := chave;
     end
   else
         if Tbutton(formulario.Components[i]).tag = 2  then 
            Tbutton(formulario.Components[i]).enabled := not chave;

end;


assim todos os botoes que tem tag = 1 no formulario vai receber
Tbutton(formulario.Components[i]).enabled := chave;
e todos os demais botoes que tem tag =2 vai receber:
Tbutton(formulario.Components[i]).enabled :=not chave;
e os botoes que tem tag diferente de 1 ou diferente de dois nada vai acontecer


GOSTEI 0
Ullrich

Ullrich

24/02/2006

OK, valeu muito obrigado...


GOSTEI 0
POSTAR