Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-46761
Sergeys
2003-04-30 20:14
2003.05.15
Как можно обменять два Item-а в ListView


3-46630
me2
2003-04-24 12:26
2003.05.15
Вставка записи втаблицу при помощи IBDataSet


3-46622
Term
2003-04-23 10:17
2003.05.15
QuickReport, как сделать вертикальную надпись


3-46594
Igor Mish
2003-04-23 11:31
2003.05.15
Испорченый файл ??


14-46951
USB Flash Drive
2003-03-31 17:33
2003.05.15
При установке драйвера USB Flash исчезает CD-ROM ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский