Procedimento recebendo Form como parâmetro. Possivel?

28/03/2007

5

Pessoal é o seguinte. Estou montando uma unit para guardar todos os procedimentos e funções. Uma dessas funcoes sera a que trata os botoes de inserir e navegação. Tem como eu fazer uma função que receba um form como parametro para eu deixar ela bem generica? Por exemplo:


Procedure HabilitaNavegacao(Estado : Boolean);
begin
 With FrmCadEstado do
 begin
  if Estado = True then
    begin
        btnPrimeiro.Enabled:= True;
        btnUltimo.Enabled:= True;
        btnProximo.Enabled:= True;
        btnAnterior.Enabled:= True;
     end
    else
    begin
      btnPrimeiro.Enabled:= True;
      btnUltimo.Enabled:= True;
      btnProximo.Enabled:= True;
      btnAnterior.Enabled:= True;
    end;
 end;
end;


Queria que fosse algo assim

Procedure HabilitaNavegacao(Estado : Boolean;NomeForm : TForm);
begin
 With NomeForm do
 begin
  if Estado = True then
    begin
        btnPrimeiro.Enabled:= True;
        btnUltimo.Enabled:= True;
        btnProximo.Enabled:= True;
        btnAnterior.Enabled:= True;
     end
    else
    begin
      btnPrimeiro.Enabled:= True;
      btnUltimo.Enabled:= True;
      btnProximo.Enabled:= True;
      btnAnterior.Enabled:= True;
    end;
 end;
end;


Tem como??

Obrigado e abraços


Responder

Posts

28/03/2007

Rjun

Acho que seria melhor se você tivesse esse método HabilitaNavegacao dentro do form. Melhor ainda, crie um form base com esse método e crie seu forms herdando desse form base.


Responder

28/03/2007

Lucianobarreto

Entendi, mas dessa forma que eu falei não tem como?
Se for como você falou, o procedimento vai receber o que como parametro, pois mesmo herdado ele vai mudar o nome não vai?
Obrigado


Responder

28/03/2007

Rjun

Do jeito que você falou tem como fazer, mas você teria que procurar os componentes dentro do form. Viajando legal, você poderia criar uma interface que teria como propriedades os botões da sua barra de navegação. Cada form que necessitasse de uma barra de navegação teria que implementar essa interface. Mas não acho que esse caminho seria o ideal.

Ainda prefiro que se crie um form base com sua barra de navegacao e seus forms herdem desse form base.

Exemplo:
TFormBase = class(TForm)
private
public
  procedure HabilitaNavegacao(Estado: Boolean);
end;

TFormCadEstado = class(TFormBase)
private
public;

TFormCadAlgumaCoisa = class(TFormBase)
private
public;

TFormCadOutraCoisa = class(TFormBase)
private
public;


Veja que assim, qualquer dos forms pode acessar o método HabilitaNavegacao.


Responder

28/03/2007

Adriano Santos

Do jeito que você falou tem como fazer, mas você teria que procurar os componentes dentro do form. Viajando legal, você poderia criar uma interface que teria como propriedades os botões da sua barra de navegação. Cada form que necessitasse de uma barra de navegação teria que implementar essa interface. Mas não acho que esse caminho seria o ideal. Ainda prefiro que se crie um form base com sua barra de navegacao e seus forms herdem desse form base. Exemplo:
TFormBase = class(TForm)
private
public
  procedure HabilitaNavegacao(Estado: Boolean);
end;

TFormCadEstado = class(TFormBase)
private
public;

TFormCadAlgumaCoisa = class(TFormBase)
private
public;

TFormCadOutraCoisa = class(TFormBase)
private
public;
Veja que assim, qualquer dos forms pode acessar o método HabilitaNavegacao.

Eu vou com o [b:b7d4daacb6]Miyazaki[/b:b7d4daacb6] (não acostumei com seu apelido novo ainda, pode voltar ao RJun please? rsrsrs). Brincadeiras a parte, se não quiser criar um form herdado, crie então uma barra de tarefas (botões) com as funções genéricas usando um Frame ou um Component Template, fica legal também.

Uma outra boa abordagem, se realmente quiser fazer assim, é criand uma procedure que um dos parêmtros receba um Array de objetos, ai fica facinho.
Na sua unit de funções crie uma procedure assim:
procedure HabilitarDesabilitar(AForm: TForm; AEstado: Boolean; AComps: Array of TObject);
begin
  with AForm do
  begin
    if AEstado then
    begin
      (AComps[0] as TSpeedButton).Enabled := True;
      (AComps[1] as TSpeedButton).Enabled := True;
      (AComps[2] as TSpeedButton).Enabled := True;
      (AComps[3] as TSpeedButton).Enabled := False;
      (AComps[4] as TSpeedButton).Enabled := False;
    end
    else
    begin
      (AComps[0] as TSpeedButton).Enabled := False;
      (AComps[1] as TSpeedButton).Enabled := False;
      (AComps[2] as TSpeedButton).Enabled := False;
      (AComps[3] as TSpeedButton).Enabled := True;
      (AComps[4] as TSpeedButton).Enabled := True;
    end;
  end;
end;

Note que o terceiro parâmetro é um Array of TObject, ou seja, na chamada vc terá que passar um array que contenha os 5 SpeedButtons como eu define na procedure.
No form que vai chamar vc cria uma variável assim:
  public
    { Public declarations }
    AComps : Array[0..4] of TObject;
  end;


No onCreate ou em algum outro lugar vc precisa informar (popular) o array com os objetos:
procedure TForm1.FormCreate(Sender: TObject);
begin
  AComps[0] := SpeedButton1;
  AComps[1] := SpeedButton2;
  AComps[2] := SpeedButton3;
  AComps[3] := SpeedButton4;
  AComps[4] := SpeedButton1;
end;

Depois vc chama o procedimento:

Para habilitar:
procedure TForm1.Button1Click(Sender: TObject);
begin
  HabilitarDesabilitar(Form1, True, AComps);
end;

Para desabilitar:
procedure TForm1.Button2Click(Sender: TObject);
begin
  HabilitarDesabilitar(Form1, False, AComps);
end;

O ruim é ter que criar o Array em todos os forms, mas também é possível criar algum mecanismo genérico que o faça.


Responder

29/03/2007

Lucianobarreto

Entendi todas as formas, interessante.
Obrigado


Responder

11/03/2019

Jorge Issono

insira 6 buttons e tenta este

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
For i:=0 to componentcount -1 do
begin
if (Components[i] is TButton) then
(Components[i] as TButton).Enabled:=true; // habilita todos os botões

end;
For i:=0 to componentcount -1 do
begin
if (Components[i] is TButton) then
begin
if ((Components[i] as TButton).Name) = 'Button4' then // ou faz outro tipo de comparação, usando variáveis.
(Components[i] as TButton).Enabled:=false;

end;
end;
end;
Responder