Форум: "Основная";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];
Внизпроблемма с консоль проектом... Найти похожие ветки
← →
BoTToN!k (2003-05-03 14:52) [0]Здравствуйте....вообщем есть такая проблемка вот пример:
program Project1;
{$APPTYPE CONSOLE}
uses
Unit1 in "Unit1.pas";
var
s:string;
begin
start;
readln(s);
end.
а вот юнит:
unit Unit1;
interface
uses
ExtCtrls,classes,Dialogs;
Procedure ontime( Sender : TObject );
procedure start();
implementation
var
timer1:TTimer;
procedure Start();
begin
Writeln("hi");
timer1:=TTimer.Create(nil);
timer1.Interval:=1000;
timer1.Enabled:=true;
timer1.OnTimer:=????????;
end;
procedure ontime (Sender:TObject ) ;
begin
ShowMessage("TEST");
end;
end.
...
...
вообщем всё дело в том что нет формы...главная задача это сделать событие на timer1.OnTime ....подскажите как....Заранее СПОСИБО
← →
Юрий Зотов (2003-05-03 15:20) [1]Обработчиком события должен быть метод объекта, а не просто процедура (OnTime). Можно сделать так:
type
TMyTimer = class(TTimer)
private
procedure OnTimerHandler(Sender: TObject);
end;
...
procedure TMyTimer.OnTimerHandler(Sender: TObject);
begin
ShowMessage("TEST");
end;
var
timer1: T MyTimer;
procedure Start;
begin
Writeln("hi");
timer1 := T MyTimer.Create(nil);
timer1.OnTimer := timer1.OnTimerHandler;
timer1.Interval := 1000;
timer1.Enabled := true;
end;
Вот только будет ли работать таймер VCL в консольном приложении? Ему же нужен цикл выборки сообщений - а его нет. Вероятно, надо использовать API-шную SetTimer с нулевым хэндлом окна и с прямым вызовом callback-обработчика.
← →
Verg (2003-05-03 15:48) [2]
> Вероятно, надо использовать API-шную SetTimer с нулевым
> хэндлом окна и с прямым вызовом callback-обработчика.
Да, но... Всеравно придется организовать цикл по типу
PeekMessage(Msg, 0,0,PM_REMOVE) / DispatchMessage(Msg)
Потому как:
When you specify a TimerProc callback function, the DispatchMessage function simply calls the callback function instead of the window procedure. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.
← →
circul (2003-05-03 16:23) [3]Вот пример класса-оболочки для организации таймера и пример использования:
unit uTMTimer;
interface
uses
Classes,windows,mmSystem,Dialogs;
type
TMTimerCallBack = procedure;stdcall;
TTimerMM = class(TThread)
private
fTmId: Cardinal;
fInterval: int64;
fCallBack: TMTimerCallBack;
proc: procedure(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD);stdcall;
protected
procedure Execute; override;
public
constructor Create(aInterval: Integer;CallBack: TMTimerCallBack);
destructor Destroy;override;
end;
implementation
uses sysutils;
procedure tCallBack(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD);stdcall;
begin
if Assigned(TMTimerCallBack(dwUser)) then TMTimerCallBack(dwUser);
end;
destructor TTimerMM.Destroy;
begin
TimeKillEvent(fTmId);
inherited;
end;
constructor TTimerMM.Create(aInterval: Integer;CallBack: TMTimerCallBack);
begin
inherited Create(True);
FreeOnTerminate := True;
fInterval := aInterval;
proc := @tCallBack;
fCallBack := nil;
if Assigned(CallBack) then fCallBack := CallBack;
Resume;
end;
procedure TTimerMM.Execute;
begin
fTmId := timeSetEvent(finterval,0,@proc,Cardinal(@fCallBack),TIME_PERIODIC);
while not terminated do Sleep(1);
end;
end.
Пример использования:
program TimerCons;
{$APPTYPE CONSOLE}
uses
SysUtils,
uTMTimer in "uTMTimer.pas";
type
TMTimerCallBack = procedure;stdcall;
var
Counter: Integer;
myTimer: TTimerMM;
procedure TickTimer;stdcall;
begin
Inc(Counter);
WriteLn(Counter);
end;
begin
counter := 0;
MyTimer := TTimerMM.Create(1000,@TickTimer);
ReadLn;
MyTimer.Terminate;
end.
← →
Юрий Зотов (2003-05-03 16:26) [4]Да, это верно. Либо можно использовать WaitableTimer.
← →
circul (2003-05-03 16:28) [5]PS.
в uses - Dialogs лишний модуль, использовался для отладки.
← →
BoTToN!k (2003-05-04 03:33) [6]хех...спосибо...буду в этом разбератся, но ,так к слову, тут компанент TTimer только бля примера чтоб разобратся с использованием компонентов в консольном приложении:)
← →
circul (2003-05-04 03:44) [7]С этого и начинать надо было.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c