Array
(
)

procedure

Fernando_ramos
   - 08 fev 2006

Amigos.

preciso da ajuda de voces para montar um procedure.

por exemplo, preciso desabilitar um Tedit, um Tbutton e um item do TMAINMENU

como fazer para criar um procedure q desabilite qualquer componente...independente de qual ele seja.

separado eu sei fazer numa boa...por exemplo se fosse para desabilitar um Tedit faria assim:

#Código


procedure Tform1.desabilita(campo: Tedit);
begin
campo.enabled := false;
end;


e chamaria assim:

#Código

form1.desabilita(NOME DO EDIT);


so que preciso fazer uma procedure q nem essa so que eu não sei qual tipo de componente será...pode ser um TEDIT...um TMEMO...uma TLABEL...


fico no aguardo!


Motta
   - 08 fev 2006

Fernando vc precisa fazer um Typecast , pode ,creio , usar o ancestral TControl


procedure Tform1.desabilita(controle: TControl);
begin
controle.Enabled := false;
end;

Acho que funciona , não peguei bem o que se quer.


Fernando_ramos
   - 08 fev 2006

amigo a idéia é essa mesmo....

funcionou 99¬.....

o unico problema é...quando aplico isso para um item do TMAINMENU o seguinte erro me retorna....

#Código


[Error] Unit2.pas(44): Incompatible types: ´TControl´ and ´TMenuItem´



Fernando_ramos
   - 09 fev 2006

pessoal alguem tem uma ideia?


Bico
   - 09 fev 2006

Bom dia.

Faça o seguinte colega:

Crie duas rotinas com o mesmo nome e defina-as como overload.

#Código

procedure desabilita(controle: TControl); overload;
procedure desabilita(controle: TMenuItem); overload;


A implementação de cada uma:

#Código
procedure TForm1.desabilita(controle: TControl);
begin
controle.Enabled := false;
end;


#Código
procedure TForm1.desabilita(controle: TMenuItem);
begin
controle.Enabled := False;
end;


Chamando as rotinas:

#Código
procedure TForm1.Button1Click(Sender: TObject);
begin
desabilita(Edit1);
desabilita(Teste1);
end;



Atenciosamente,
Fernando.


Motta
   - 09 fev 2006

E que TMainMenu não é herdeiro de TControl.

Vc pode fazer ...

procedure Tform1.desabilita(obj: TObject);
begin
if obj is TControl then
TControl(obj).Enabled := false;
if obj is TMainMenu then
TMainMenu(obj).Enabled := false;
...
end;

é uma solução


Fernando_ramos
   - 23 fev 2006

desculpe voltar em topico antigo, é pq estava viajando.

como base de teste amigo...

copiei e colei seu codigo...logico tirando os ´...´, e apresentou o seguinte erro...

#Código


[Error] frmsplash.pas(130): Undeclared identifier: ´TMainMenu´


se puder me ajudar...


Michael
   - 23 fev 2006

O typecast não deve ser feito para TMainMenu, e sim TMenuItem.

#Código

procedure AtivarDesativarControle(Controle: TComponent; Ativar: Boolean);
begin
if Controle is TControl then
(Controle as TControl).Enabled := Ativar
else if Controle is TMenuItem then
(Controle as TMenuItem).Enabled := Ativar;
end;


Lembrando que vc pode usar Actions associadas a mais de um controle. E neste caso só precisaria desativar a ação e os controles ligados a ele tbm seriam automaticamente.

[]´s


Fernando_ramos
   - 24 fev 2006

amigo MICHAEl, efetuei o mesmo teste , copiei e colei!!

deu o seguinte erro!


#Código


[Error] frmsplash.pas(130): Undeclared identifier: ´TMenuItem´



Michael
   - 24 fev 2006

Colega Fernando,

Quando este tipo de erro ocorrer, a primeira coisa que vc deve fazer é ir no help do Delphi e procurar pelo identificador não declarado, no caso TMenuItem. Lá vc pode ver em qual unit ele está.

No nosso contexto, é a unit Menus. Esqueci de citar no último post. Adicione-a, portando, à cláusula uses do seu arquivo.

[]´s