Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 16:49   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Локальный таймер

Здрасте. У меня такой вопрос, можноли создать локальный таймер?
Например, чтото типо такого:

Код:
procedure Test();
var Timer:TTimer;
begin
Timer.Enabled:=true;
Timer.OnTimer(Timer);     ///Понятия не имею как правильно делать эту строку и строки после begin.
begin
//AttackSystemTimer.enabled:=false;
Timer.Enabled:=false;
DrawMap(BitMap);
BitMap.gWindowImage.Canvas.Draw(0,0,MapBitMap);
end;
end;
Эта процедура находится в модуле, поэтому не создаю "Реальный таймер", а если делать через форму, то слишком много лишнего кода будет.
В общем отпишитесь можно ли, сделать подобное с локальным таймером, если можно то как?
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 11.01.2012, 16:53   #2
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

можно)
1. создайте обьект таймера
2. присвойте ему процедуру, которую он будет выполнять
3. активируйте таймер(enabled:=true)

Как это "Реальный таймер"? )
Delphi_ProGer вне форума Ответить с цитированием
Старый 11.01.2012, 17:34   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Начьнём с того, что, что такое "Локальный" и "Реальный" таймер, в вашем понмании?

я знаю несколько таймеров:
1. TTimer в Disign-time(компонентокидательсво)
2. TTimer в run-time
3. Мультимедийный таймер.

ни первое ни третье вам не надо.
значит второе.
А там всё просто(Delphi proger прав):
Код:
var
 Timer:TTimer; //ExtCtrls в uses
begin
  Timer:=Ttimer.Create(Application);//т.к. у нас TTimer юзает WM_TIMER сообщение, то надо обязатель назначит форменного владельца. 
  Timer.Enabled:=False;
  Timer.Interval:=1000;
   Tiner.OnTimer:=@SomeProc;
end;

//а SomeProc имеет вид:
type
  TTimerProc=procedure (Sender:TObject); 

Следовательно где-то в коде:
procedure SomeProc(Sender:TObject);
begin
<Тут хоть на ушах стойте>.
end;

только правильно обьявите процедуру, на начьнёте плодить темы "Left can not be assigned to - ШО ЭТО??!!"

Последний раз редактировалось Человек_Борща; 11.01.2012 в 17:41.
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2012, 17:42   #4
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Начьнём с того, что, что такое "Локальный" и "Реальный" таймер, в вашем понмании?
Итак в моем понимании:
Реальный таймер, таймер-объект, который ставится на форму на равне с другими объектами, такими как кнопка, мемо и т.д.
Локальный таймер, таймер, который находится внутри функции или процедуры (var Timer:TTimer), который сможет использовать только, та процедура в которой он объявлен.

Спасибо
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 11.01.2012, 17:50   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Советую использовать понятия disign-time(Стадия проектирования проекта) и run-time(стадия выполнения целевого exe), они соответствуют "реально" и "локально", и имеют куда более широкий и правильный смысл.

Последний раз редактировалось Человек_Борща; 11.01.2012 в 17:52.
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2012, 17:54   #6
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

И еще вопросец.
Отказывается компилировать, пишет :
E2010 Incompatible types: 'TNotifyEvent' and 'Pointer'
И ссылается на строку:
Код:
Timer.OnTimer:=@SomeProc;
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 11.01.2012, 18:06   #7
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

попробуйте убрать "собачку"
Delphi_ProGer вне форума Ответить с цитированием
Старый 11.01.2012, 18:14   #8
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Delphi_ProGer Посмотреть сообщение
попробуйте убрать "собачку"
Если убрать собачку пишет : E2009 Incompatible types: 'method pointer and regular procedure'

Пробовал сделать так:
Код:
Timer.OnTimer(@SomeProc);
Тогда компилирует, но при исполнении выдает Access Violation at adress 00000000. Read of Adress 00000000
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 11.01.2012, 18:38   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ваша процедура SomeProc должна быть методом формы.
вот так, например:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure SomeProc(Sender:TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  sem : integer;

implementation
uses ExtCtrls;

{$R *.DFM}

procedure TForm1.SomeProc(Sender:TObject);
begin
  sem := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Timer:TTimer; //ExtCtrls в uses
begin
  Timer:=Ttimer.Create(Application);//т.к. у нас TTimer юзает WM_TIMER сообщение, то надо обязатель назначит форменного владельца.
  Timer.Enabled:=False;
  Timer.Interval:=1000;
  Timer.OnTimer:=SomeProc;
  sem := 0;
  Timer.Enabled:=true;
  while sem = 0 do begin
    Application.ProcessMessages;
    Sleep(100);
  end;
  Timer.Enabled:=false;
  FreeAndNil(Timer);
  Application.MessageBox('All Good!','Debug',mb_OK);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  sem := 1;
end;

end.
НО! есть подозрение на X-Y-Z!
Мне АБСОЛЮТНО непонятны зачем эти танцы с бубном вокруг "локального" таймера!!!
Может быть, Вы совсем не этого хотите?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2012, 19:16   #10
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Делаю ИИ для игры. Пробовал сделать с помощью обычного таймера, но слишком много грязи вытекает при его использовании, локальный или "Run-time" мне подходит.

Щас попробую все сделать
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Локальный проксик Den7656 Работа с сетью в Delphi 4 17.12.2011 23:20
Локальный чат Chelovek1 Работа с сетью в Delphi 0 19.11.2010 16:05
локальный хук vitalik007 Win Api 3 16.05.2008 09:08
Локальный чат. GAGARIN-NEW Софт 0 12.12.2007 22:43