Duvida procedure...

Delphi

13/09/2006

Pessoal, tenho uma duvida simples q tah me tirando do serio. Jah recebi algumas respostas q explicam mt bem mas eu ainda to en duvida.
Tenho diversos formularios com dois botoes que possui a propriedade name = Inserir e name = editar respectivamente.

Gostaria de criar uma UNIT com esse procedimento da seguinte forma para poder executar a partir de qualquer formulario.


[color=darkblue:f5cc09482f]procedure tratabotoes;
begin
inserir.enabled:= not inserir.enabled;
editar.enabled:= not editar.enabled;
end;[/color:f5cc09482f]

Um amigo do forum me ajudou mas nao consegui com seu outro exemplo pois nao connsigo fazer as alteracoes pra utilizar dessa forma mas seu exemplo deu certo e segue abaixo porem desabilita todos os botoes q tenho no form. Obrigado!!!

[color=blue:f5cc09482f]unit UfrmProcedimentos;

interface

uses
StdCtrls,dialogs;

procedure Desabilitarinserir(sender:Tobject); //todo que esta qui é invisivel

implementation

procedure Desabilitarinserir(sender:Tobject);
begin
if sender is Tbutton Then
begin
Tbutton(sender).enabled:= not Tbutton(sender).enabled;
end;
end;
end.[/color:f5cc09482f]


Souzaaguiar

Souzaaguiar

Curtidas 0

Respostas

Fabiano Góes

Fabiano Góes

13/09/2006

souzaaguiar,

desculpe não entendi se o exemplo acima desabilitou todos os botoes do form, ou se você quer desabilitar todos os botoes do form.

testei aqui assim:
procedure TForm1.button1(Sender: TObject);
begin
  Desabilitarinserir( Sender );
end;


e desabilitou apenas o botão que chamou o método.


GOSTEI 0
Massuda

Massuda

13/09/2006

A procedure que trata um evento deve ser obrigatoriamente um método de uma classe, não pode ser um procedure ´solta´ na unit, como você fez. Normalmente, a procedure utilizada é um método de um form ou data module.


GOSTEI 0
Marco Salles

Marco Salles

13/09/2006

acho que o que ele quer é uma procedure para Habilita/Desabilitar os botoes editar e inserir e quer que este método seje chamado a partir de qualquer formulário...

Da maneira com esta , é apenas para exemplo e faz como o Fabiano Góes
disse:

desabilitou apenas o botão que chamou o método.

então faça assim

unit Unit2; interface uses StdCtrls,dialogs,forms; procedure HabilitarDesabilitar(Formulario:TForm); implementation procedure HabilitarDesabilitar(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:= not Tbutton(Formulario.Components[i]).Enabled; end; end.

Note que em vez do nome vamos estou usando uma propriedade Tag do componentes que voce que que sofra a ação
No Objecto inspector , coloque todos os botoes <o BtSalvar , BtEditar> no seu caso com a propreidade [b:2792f98988]Tag=1[/b:2792f98988]

Para chamar o método de qualquer formulário , basta declara na secção Uses a Unit aonde esta este método

Por fim chame o método:

procedure TForm1.Button3Click(Sender: TObject);
begin
habilitarDesabilitar(form1);
end;


Para finalizar tres coisas:

1) Qualquer dúvida , prossiga no proprio Topico e so clicar No Botão responder.. Não ha necessidade e nen é recomendádo abrir um novo tópico

2)
interface uses StdCtrls,dialogs; procedure Desabilitarinserir(sender:Tobject);[b:2792f98988] //todo que esta qui é invisivel[/b:2792f98988]


[b:2792f98988]isto esta errado...Tudo que for declarado na secção interface estara Visivel e tudo que for declarado na secção Implementation, pertencera exclusivamente a Unit[/b:2792f98988]


A procedure que trata um evento deve ser obrigatoriamente um método de uma classe, não pode ser um procedure ´solta´ na unit, como você fez. Normalmente, a procedure utilizada é um método de um form ou data module.

esta procedure , massuda do jeito incial , não trata nenhum evento especificamente.. Apenas desabilitava o Botao que a chamou.. [b:2792f98988]so isso[/b:2792f98988]

O fato de ser uma procedure Solta sem ser um método de alguma classe , foi propositalmente postado por mim em um outro tópico, para quebrar exatamente esta idéia que se formou a este respeito....Que todo método tem que pertencer a alguma classe.


GOSTEI 0
Massuda

Massuda

13/09/2006

[quote:4805559966=´Marco Salles´]O fato de ser uma procedure Solta sem ser um método de alguma classe , foi propositalmente postado por mim em um outro tópico...[/quote:4805559966]OK, não sabia que tinha ´outro tópico´.

[quote:4805559966=´Marco Salles´]...para quebrar exatamente esta idéia que se formou a este respeito....Que todo método tem que pertencer a alguma classe.[/quote:4805559966]Isso é verdade desde que não se tente atribuir a procedure ´solta´ a algum evento. Mas agora entendi o propósito disto.


GOSTEI 0
Souzaaguiar

Souzaaguiar

13/09/2006

Agradecendo as postagens. Era exatamente isso q eu precisava. Agora uma pequena duvida. Posso alterar a propriedade Enable do botao ao inves de usar a propriedade tag???? Obrigado pessoal, ajudou mt.


GOSTEI 0
Marco Salles

Marco Salles

13/09/2006

Agradecendo as postagens. Era exatamente isso q eu precisava. Agora uma pequena duvida. Posso alterar a propriedade Enable do botao ao inves de usar a propriedade tag???? Obrigado pessoal, ajudou mt.


veja , a procedure passada , ela altera exatamente a propriedade enable
de um Botão e não a propriedade tag
A propriedade tag foi usada apenas para determinar , qual serão os botoes qeu terão a sua propriedade enabled alterada , quando a procedure for chamada/executada

se voce não definir , quais são os botoes que terão sua propriedade enable alterada , a procedure alterara todos os botoes , e isto voce não quer

A instrução if Tbutton(Formulario.Components[i]).Tag = 1 Then esta apenas limitando a ação de laterar ou não .... Botoes definido em tempo de projeto com a propriedade tag = 1 terão sua propriedade enabled alterada pela execução da procedure


voce poderia usar outras limitaçoes , como o proprio nome , caption ou text , so que ai voce teria que escrever varios ifs para atender todas essas condicoes , o que certamente não é uma boa pratica

exemplo de uso não aconselhável

if (Tbutton(Formulario.Components[i]).caption = ´Salvar´)or
((Tbutton(Formulario.Components[i]).caption = ´Editar´)or
(Tbutton(Formulario.Components[i]).caption = ´outrosCaption´) Then

espero ter sido claro


GOSTEI 0
POSTAR