Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.15;
Скачать: CL | DM;

Вниз

проблемма с консоль проектом...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-46658
_Narayan_
2003-04-24 17:04
2003.05.15
Хранимая процедура....


3-46651
galexis
2003-04-24 16:29
2003.05.15
Помогите составить правильный SQL запрос.


6-46877
AlexMax
2003-03-19 01:55
2003.05.15
Получение информации о расшареном ресурсе


1-46714
чютатель
2003-05-04 16:28
2003.05.15
Как прочитать константу из dll ?


14-46956
VEG
2003-04-26 18:58
2003.05.15
Морковка едет на учебе и игнорирует!