Como atribuir uma variavel a um evento em runtime
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 .
Att
Mario[/code]
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
Curtidas 0
Respostas
Aldus
12/12/2008
up
GOSTEI 0
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
12/12/2008
Bom dia Michels,
Na Jedi está declarado como:
Então declaro na seção PRIVATE:
Ao tentar compilar me retorna:
Depois ao atribuir ´OnInvalidDate := Self.InvalidDate´ como vou setar ACCEPT para True?
att
Mario
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
12/12/2008
Resolvido Michels,
Havia esquecido de iniciar a procedure e nela posso atribuir ACCEPT := TRUE;
Ficou assim, a quem possa interessar:
Grato Michels, abraço
Mario
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
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?
Dessa forma me retornou o erro:
Att
Mario
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
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
12/12/2008
Olá micheus, agora acho que acertei (tbm com CRTL+C E CRTL+V fica fácil).
Funcionou perfeitamente, obrigado.
Mario
Funcionou perfeitamente, obrigado.
Mario
GOSTEI 0