Criar componente dinamicamente e atribur procedure e passar um parametro.

03/06/2009

Bom dia.     Estou criado o componente conforme abaixo:   Preciso passar um parametro no onTimer a principio o valor meuTime.Tag. ´ O problema é que o meuTimer0 ou 1 eu não sei como passar o tab para o evento do button1 ou para a procedure que esta associada ao button1.   Se tiver geito de associar uma procedure ao on timer dinamicamente ou outro recurso.       procedure TFormIntegrador.CriarTime;
var
  time, I, T: Integer;
  meuTime: TTimer;
  ETime: array[0..20, 0..20] of string;
  var
  configs: TIniFile;   begin
    Configs := TIniFile.Create(ExtractFilePath(Application.ExeName) + '.\Configuracoes.ini');
    T := StrToInt(configs.readString('NTIMES', 'QUANTIDADE', ''));
   Time := 0;   for i := 0 to T - 1 do
    begin
      name := 'meuTime' + Inttostr(i);
      meuTime := TTimer.Create(self);
      Time := Time + 1000;
      meuTime.Enabled := True;
      meutime.Interval := 1000 * 60 * StrToInt(configs.readString('TIMES', name, ''));       meuTime.Tag :=  StrToInt(configs.readString('meuTime.Tag', name, ''));
      meutime.OnTimer := Button1.OnClick;
      meuTime.Name := name;
      ETime[i, i] := name;     end;     configs.Free; end;
  Att.. Ricardo Horoi    
Frigorifico Sa

Frigorifico Sa

Curtidas 0

Respostas

Rodrigo Mourão

Rodrigo Mourão

03/06/2009

Olá Ricard,

Vamos lá, para associar um procedure a um evento ele tem que ter a assinatura do evento, ou seja, se o evento é padrão então a assinatura é: procedure Nome(Sender: TObject), se o evento for de tecla então seria procedure Nome(Sender: Tobject; Key: Char).

Enfim, basta criar uma procedure com um parametro do tipo TObject.Então no seu porjeto cria uma função como o exemplo abaixo:

procedure Execute(Sender: TObject);

Agora a sua rotina ficara assim:

procedure TFormIntegrador.CriarTime;
var
  time, I, T: Integer;
  meuTime: TTimer;
  ETime: array[0..20, 0..20] of string;
  var
  configs: TIniFile;   begin
    Configs := TIniFile.Create(ExtractFilePath(Application.ExeName) + '.\Configuracoes.ini');
    T := StrToInt(configs.readString('NTIMES', 'QUANTIDADE', ''));
   Time := 0;   for i := 0 to T - 1 do
    begin
      name := 'meuTime' + Inttostr(i);
      meuTime := TTimer.Create(self);
      Time := Time + 1000;
      meuTime.Enabled := True;
      meutime.Interval := 1000 * 60 * StrToInt(configs.readString('TIMES', name, ''));       meuTime.Tag :=  StrToInt(configs.readString('meuTime.Tag', name, ''));
      meutime.OnTimer := Execute;
      meuTime.Name := name;
      ETime[i, i] := name;     end;     configs.Free; end;

Agora vem o pulo do gato. Imagine que dependendo do tag do timer que chamou o evento vc faco algo diferente, então basta fazer como no exemplo abaixo:

procedure Execute(Sender: TObject);
begin
  case TTimer(Sender).tag of
     1: facoalgoaqui;
     2: facoalgoaqui;
     3: facaalgoaqui;
end;


Como vc fez um method pointer com o TTimer la em cima, quando o evento for chamado o sender recebe o componente que chamou o evento, ou seja, o timer. Entao fazemo um type cast e pegamos o tag.

Abs !!!


GOSTEI 0
Frigorifico Sa

Frigorifico Sa

03/06/2009

Rodrigo,   Funcionou perfeitamente era disso que eu estava precisando.   Cada dia aprendo mais com vcs da ClubeDelphi.   Muito obrigado.     Pode encerrar.   Att..   Ricardo Horoi
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

03/06/2009

Show !!!

Abs!!!

GOSTEI 0
POSTAR