Como atribuir uma variavel a um evento em runtime

Delphi

12/12/2008

Boa tarde,
Utilizo um formulário PAI onde tenho todas as situações para criação de minhas telas de cadastro, tamanho dos campos, fonte, cor, etc.

Utilizo o componente JEDI JvDateEdit e o mesmo já faz uma validação da data digitada por Default. Eu gostaria de fazer a validação com uma mensagem mais profissional e para eu possa fazer isso tenho que atribuir ao evento OnInvalidDate a variável Accept := True para que o mesmo não faça validação.

Como posso atribuir essa variável ao evento ?
Utilizo essa forma para mudar caracteristicas no FormPai .

for i:=0 to Self.ComponentCount-1 do begin
      if ((Self.Components[I] is TJvDateEdit) and (TJvDateEdit(Self.Components[I]).Visible)) then begin
         TJvDateEdit(Self.Components[I]).Font.Name     := ´Arial´;
         TJvDateEdit(Self.Components[I]).Font.Size     := 9;
         TJvDateEdit(Self.Components[I]).ImageKind     := ikEllipsis ;
         TJvDateEdit(Self.Components[I]).Width         := 85;
         TJvDateEdit(Self.Components[I]).AutoSelect    := True;
         TJvDateEdit(Self.Components[I]).CalendarStyle := csPopup;
         TJvDateEdit(Self.Components[I]).ButtonWidth   := 16;
end;
end;


Att
Mario[/code]


Aldus

Aldus

Curtidas 0

Respostas

Aldus

Aldus

12/12/2008

up


GOSTEI 0
Micheus

Micheus

12/12/2008

Como posso atribuir essa variável ao evento ?
[b:fc5f0c6196]aldus[/b:fc5f0c6196], voce apenas precisa escrever o metodo para o evento.
No seu form pai, vc declara um método contendo o [i:fc5f0c6196]header[/i:fc5f0c6196] de acordo com o especificado para este evento.

Eu não uso os componentes Jedi, mas digamos que o evento em questão esteja declarado na unit Jedi, como:
[color=darkblue:fc5f0c6196][i:fc5f0c6196][b:fc5f0c6196]Type [/b:fc5f0c6196]
TInvalidDateEvent = [b:fc5f0c6196]procedure [/b:fc5f0c6196](Sender: TObject; Accept :boolean) of object;[/i:fc5f0c6196][/color:fc5f0c6196]

Na sessão [i:fc5f0c6196]private[/i:fc5f0c6196] do seu form pai, vc declara:
TFormPai = class(TForm)
  :
private
  procedure InvalidDate(Sender :TObject; Accept :Boolean);
  :
end;
:
:
procedure TFormPai.... // seu procedimento
  for i:=0 to Self.ComponentCount-1 do begin
      if ((Self.Components[I] is TJvDateEdit) and (TJvDateEdit(Self.Components[I]).Visible)) then begin
         TJvDateEdit(Self.Components[I]).Font.Name     := ´Arial´;
         TJvDateEdit(Self.Components[I]).Font.Size     := 9;
         TJvDateEdit(Self.Components[I]).ImageKind     := ikEllipsis ;
         TJvDateEdit(Self.Components[I]).Width         := 85;
         TJvDateEdit(Self.Components[I]).AutoSelect    := True;
         TJvDateEdit(Self.Components[I]).CalendarStyle := csPopup;
         TJvDateEdit(Self.Components[I]).ButtonWidth   := 16;

         TJvDateEdit(Self.Components[I]).OnInvalidDate := Self.InvalidDate;  // o self pode ser omitido
  end;
end;

end;



GOSTEI 0
Aldus

Aldus

12/12/2008

Bom dia Michels,

Na Jedi está declarado como:

  TJvInvalidDateEvent = procedure(Sender: TObject; const DateString: string;
    var NewDate: TDateTime; var Accept: Boolean) of object;


Então declaro na seção PRIVATE:

procedure InvalidDate(Sender: TObject; const DateString: string; var NewDate: TDateTime; var Accept: Boolean);


Ao tentar compilar me retorna:

[Error] uPai1.pas(23): Unsatisfied forward or external declaration: ´TfPai1.InvalidDate´


Depois ao atribuir ´OnInvalidDate := Self.InvalidDate´ como vou setar ACCEPT para True?

att
Mario


GOSTEI 0
Aldus

Aldus

12/12/2008

Resolvido Michels,

Havia esquecido de iniciar a procedure e nela posso atribuir ACCEPT := TRUE;

Ficou assim, a quem possa interessar:

type
  private
    { Private declarations }
    procedure InvalidDate(Sender: TObject; const DateString: string; var NewDate: TDateTime; var Accept: Boolean);


procedure TfPai1.InvalidDate(Sender: TObject; const DateString: string;
  var NewDate: TDateTime; var Accept: Boolean);
begin
   Accept := True;
end;

// Para atribuir o novo valor ao evento


componenteTJvDateEdit.OnInvalidDate := Self.InvalidDate;


Grato Michels, abraço

Mario


GOSTEI 0
Aldus

Aldus

12/12/2008

Michels, aproveitando-me um pouco de seu conhecimento.

Quando propriedade AutoSelect está setada como True, o Componente JvDateEdit é acessado estando todo a data selecionada, quando o usuário digita um número, toda a data é acessada (como padrão de aplicações win). Se eu setar para False, esse componente tem um problema que o cursor fica por exemplo na coluna mês caso eu tenha alterado no último acesso o campo mês.
Então seto para True para evitar isso, mas em contra-partida tenho o problema de seleção total dele.
Gostaria de alterar o evento ONENTER da mesma forma do evento solucionado anteriormente, simulando o pressionamento da tecla HOME, daí o cursor ficaria na primeira coluna e solucionaria o problema.

Como ficaria essa declaração?

procedure iOnEnter;

procedure TfPai1.iOnEnter;
begin
   keybd_event(VK_HOME, 0, 0, 0);
end;

TJvDateEdit(Self.Components[I]).OnEnter       := Self.iOnEnter;


Dessa forma me retornou o erro:

[Error] uPai1.pas(110): Incompatible types: ´Parameter lists differ´


Att
Mario


GOSTEI 0
Micheus

Micheus

12/12/2008

Miche[color=red:cfb4645081][b:cfb4645081]l[/b:cfb4645081][/color:cfb4645081]s, aproveitando-me um pouco de seu conhecimento.
apenas corrigindo... meu nome escreve-se com [b:cfb4645081]u[/b:cfb4645081] - Miche[b:cfb4645081]u[/b:cfb4645081]s. :wink:

Gostaria de alterar o evento ONENTER da mesma forma do evento solucionado anteriormente, simulando o pressionamento da tecla HOME, daí o cursor ficaria na primeira coluna e solucionaria o problema.
acredito que vc possa usar o mesmo método que usamos para os TEdits - usar o as propriedades [i:cfb4645081]SelStart[/i:cfb4645081] e [i:cfb4645081]SelLength[/i:cfb4645081]:
procedure iOnEnter(Sender :TObject);

procedure TfPai1.iOnEnter(Sender :TObject);
begin
   TJvDateEdit(Sender).SelStart := 0; // posiciona no início
   TJvDateEdit(Sender).SelLength := 0;  // tamanho da seleção a partir de SelStart
end;

Observe sempre que a definição do header do método deve ser igual a declarada para o evento do componente. Assim, para o [i:cfb4645081]OnEnter[/i:cfb4645081], bem como para a maioria dos eventos, existe pelo menos o parâmetro [i:cfb4645081]Sender[/i:cfb4645081].

Abraços


GOSTEI 0
Aldus

Aldus

12/12/2008

Olá micheus, agora acho que acertei (tbm com CRTL+C E CRTL+V fica fácil).

Funcionou perfeitamente, obrigado.

Mario


GOSTEI 0
POSTAR