Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как использовать таймер без формы?


Автор: BeeMaster 15.4.2008, 20:56
Ну мне надо создать программы но у неё не должно быть вообще формы. Но там есть таймер. Ну вот пример програмки она шлет письма и там idSMTP не находится на форме, но он прописан в коде.

http://slil.ru/25692680

И откуда вытащить тот код?

 smile  smile  smile  smile  smile  smile  smile 

Автор: THandle 15.4.2008, 21:04
SetTimer - http://msdn2.microsoft.com/en-us/library/ms644906.aspx




Автор: MetalFan 15.4.2008, 21:27
создай TTimer динамически

Автор: BeeMaster 15.4.2008, 22:19
Цитата(MetalFan @ 15.4.2008,  21:27)
создай TTimer динамически

Это как?

Автор: MetalFan 15.4.2008, 23:23
BeeMaster, рючками)
Код

  lSomeTimer := TTimer.Create(nil);

Автор: BeeMaster 18.4.2008, 13:41
Дайте полный код! А то у меня не получается использовать таймер =(


 smile 

Автор: MetalFan 18.4.2008, 15:14
полный код чего?
это ты дай код, который не работает, и тебе скажут, что в нем не так.

Автор: BeeMaster 18.4.2008, 22:09
Как этот таймер можно использовать? Покажите пример!

Автор: MetalFan 18.4.2008, 22:22
Цитата(BeeMaster @  18.4.2008,  22:09 Найти цитируемый пост)
Как этот таймер можно использовать?

какой "этот"? ты с компонентом TTimer не работал?

Автор: BeeMaster 19.4.2008, 11:03
Работал. Но это у меня не работат! Ну дайте пример жалко чтоли! =(

Автор: MetalFan 19.4.2008, 17:18
Цитата(BeeMaster @  19.4.2008,  11:03 Найти цитируемый пост)
Но это у меня не работат!

показывай код.

Автор: BeeMaster 19.4.2008, 18:31
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
lSomeTimer := TTimer.Create(nil);
end;

end.











Я просто въехать не могу как его использовать!

Автор: source777 19.4.2008, 18:58
Цитата(THandle @  15.4.2008,  21:04 Найти цитируемый пост)
SetTimer - http://msdn2.microsoft.com/en-us/library/ms644906.aspx
Насколько я помню SetTimer работает посредством сообщения WM_TIMER, или другими словами не будет он работать в приложении без форм/окон...

Цитата(BeeMaster @  19.4.2008,  18:31 Найти цитируемый пост)
lSomeTimer := TTimer.Create(nil);
А кто за тебя обработчик OnTimer будет регистрировать?

Автор: THandle 19.4.2008, 18:59
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure OnMyTimer(Sender : TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tim : TTimer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  tim := TTimer.Create(nil);
  tim.OnTimer := OnMyTimer;
end;

procedure TForm1.OnMyTimer(Sender: TObject);
begin
  ShowMessage('Timer arbaiten!!!!');
end;

end.



ЗЫ: 
BeeMaster, пожалуйста, используй кнопку "Код".

Автор: THandle 19.4.2008, 20:43
Цитата(source777 @  19.4.2008,  19:58 Найти цитируемый пост)
Насколько я помню SetTimer работает посредством сообщения WM_TIMER, или другими словами не будет он работать в приложении без форм/окон...


Код

program Project1;

uses Windows, Messages;

procedure Timer;
begin
  MessageBeep(MB_OK);
end;

var
  Msg : TMsg;
begin
  SetTimer(0, 0, 2000, @Timer);
  while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end.

Автор: MetalFan 20.4.2008, 09:11
Цитата(source777 @  19.4.2008,  18:58 Найти цитируемый пост)
Насколько я помню SetTimer работает посредством сообщения WM_TIMER, или другими словами не будет он работать в приложении без форм/окон...

отчасти правильно понимаешь, НО:
Цитата(msdn)
You can process the message by providing a WM_TIMER case in the window procedure. Otherwise, DispatchMessage will call the TimerProc callback function specified in the call to the SetTimer function used to install the timer. 

т.о. если ты сам не обработаешь сообщение, то DispatchMessage (в петле обработки сообщений) вызовет колбэк функцию TimerProc.
собстно пример от THandle это прекрасно демонстрирует.

Добавлено через 1 минуту и 34 секунды
з.ы. в это частном примере, кстати, в вызове TranslateMessage нет необходимости

Автор: BeeMaster 24.4.2008, 21:50
Цитата(THandle @ 19.4.2008,  18:59)
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure OnMyTimer(Sender : TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tim : TTimer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  tim := TTimer.Create(nil);
  tim.OnTimer := OnMyTimer;
end;

procedure TForm1.OnMyTimer(Sender: TObject);
begin
  ShowMessage('Timer arbaiten!!!!');
end;

end.



ЗЫ: 
BeeMaster, пожалуйста, используй кнопку "Код".

Почему у меня сообщение не выскакивает?

Я же просил объяснить полностью =(

Автор: w3st 25.4.2008, 09:28
У меня все работает, спасибо за пример

Автор: BeeMaster 26.4.2008, 10:39
Код

program Project1;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

var
  tim : TTimer;

procedure FormCreate(Sender: TObject);
begin
  tim := TTimer.Create(nil);
  tim.OnTimer := OnMyTimer;
end;

procedure OnMyTimer(Sender: TObject);
begin
  ShowMessage('Timer arbaiten!!!!');
end;

end.


Вот я отключил форму. А  delphi кричит на OnMyTimer !!!!

Автор: generator 28.4.2008, 22:29
Ну молодец! Отключил форму - а кто за тебя теперь сообщения обрабатывать будет?

А ругается на OnMyTimer - потому что она у тебя не описана. То есть у тебя она описана, НО если ты пишешь процедурно - то процедура должна быть описана ДО ее первого использования.

Создать таймер просто. Но нужно еще обработчик события OnTimer его описать. То есть, то что ты делаешь в IDE тыкая мышкой, в твоем случае придется делать руками и я бы не стал так извращаться четко не понимая, что ты пишешь и как оно работает.

Если доводить до ума твой пример, то я бы сделал так:
Код

program Project1;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

// создаем класс для таймера
type
  TTimerHolder = class
    Timer: TTimer;
    // вот обработчик будующего таймера
    procedure OnMyTimer(Sender: TObject);
    constructor Create;
    destructor Free;
  end;

var
  Timer: TTimerHolder;
  Msg: TMsg;

{ TTimerHolder }

// конструктор класса таймера
constructor TTimerHolder.Create;
begin
  Timer:= TTimer.Create(nil);
  Timer.OnTimer := OnMyTimer;
end;

// соответственно деструктор
destructor TTimerHolder.Free;
begin
  Timer.Free;
end;

// вот обработчик будующего таймера
procedure TTimerHolder.OnMyTimer(Sender: TObject);
begin
  ShowMessage('Timer Event');
end;

begin
  // создаем наш класс с таймером
  Timer := TTimerHolder.Create;
  // ну а вот основная часть кода без него твое приложение не будет работать
  // очередь обработки сообщений
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.


но это не очень красиво, хотябы потому что останавливать твое приложение придется только через среду Delphi кнопкой "Program Reset"

Можно узнать, для чего тебе именно ракая реализация - без формы?

Автор: BeeMaster 29.4.2008, 11:26
 Трояны пишу но там из-за таймера нужно держать форму. А с формой трои много весят =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)