Q&A

  • 폼 없는 Unit에서 TTimer 생성하기...
ㅠㅠ


interface

uses
   ....;


  procedure XXXXX(Sender: TObject);  // 이거 넣도 에러...
  procedure Timer_Create;


implementation


procedure XXXXX(Sender: TObject);
begin
  ...
  ...
end;


procedure Timer_Create;
begin
  OkTimer := TTimer.Create(nil);
  OkTimer.OnTimer := XXXXX;  // 요기가 문제입니다.
end;

일단 폼이 없다보니 이런 오류 메시지가 나네요.

Incompatible Types: method pointer and regular procedure

컴포너트를 만드는것도 아니고 걍 폼없는 유닛하나 연결했는데 마침 타이머가 필요해서요.

어떻게 하면 되나요?
1  COMMENTS
  • Profile
    KDDG_Check 2003.07.19 04:51

    하이여, 방가여 남쉐기님
    여유로움 KDDG_Check입니다. 커커커

    음 일단 에러의 원인은 말그대루 메소드여야 하는데 일반 프로시져를 대입하면 호환이 안된다는 것이지요.
    그니까 TTimer.OnTimer는 메소드여야 한다는 말이 겠지요.
    해서 걍 가베지 클래스를 하나 만들어 메소드를 만들거나
    아님 걍 타이머 클래스를 상속받아서 하나 맹글거나 하면 되겠지요.

    예를 들어 보면
    콘솔 어플리게이션으루다가
    ********************************************************
    program Project2;

    {$APPTYPE CONSOLE}

    uses
      SysUtils, Windows, Messages,Dialogs, Forms, ExtCtrls, Classes;
    var
    TimerCount : integer;
    type
    TMyTimer = class( TTimer )  //타이머 상속받아서
    public
       constructor Create( AOwner: TComponent ); override;
       procedure TimerProc( Sender: TObject );
    end;
    TMyClass = class(TComponent)  //가베지 클래스
       constructor Create( AOwner: TComponent ); override;
       procedure TimerProc( Sender: TObject );
    end;

    { TMyTimer }

    constructor TMyTimer.Create(AOwner: TComponent);
    begin
      inherited;
      OnTimer := TimerProc;
    end;

    procedure TMyTimer.TimerProc(Sender: TObject);
    begin

      writeln('Timer1 시간 다 됐다' + IntToStr(TimerCount));
      inc(TimerCount);
    end;

    { TMyClass }

    constructor TMyClass.Create(AOwner: TComponent);
    begin
      inherited;

    end;

    procedure TMyClass.TimerProc(Sender: TObject);
    begin

      writeln('Timer2 시간 다 됐다');
    end;

    var
      testTimer1 : TTimer;
      TestTimer2 : TTimer;
      TestClass : TMyClass;

    begin
      { TODO -oUser -cConsole Main : Insert code here }
      timerCount := 0;
      TestTimer1 := TMyTimer.Create(Application);  //타이머 상속
      testTimer1.Interval := 1000;
      
      TestTimer2 := TTimer.Create(Application);
      TestTimer2.Interval := 3000;
      TestTimer2.OnTimer := TestClass.TimerProc; //가베지 클래스
      try
         while TimerCount < 10 do Application.ProcessMessages;
      finally
         testTimer1.Free;
         testTimer2.Free;
       showmessage('끝났다');
    end;
    end.
    ********************************************************

    저는 이렇게 해결 했는데, 이게 옳은 방법인지는 모르겠네요.

    다른 분들의 더 좋은 방법 있으시면 말씀해 주세요

    부디 좋은 결과 있길 바랍니다.
    GG KDDG, Forever KDDG

    즐스 &  즐프