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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2012, 15:34   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Перестал работать таймер в Delphi 2010

При переводе программы с Delphi 7 на Delphi 2010 перестал работать таймер.
Код:
...
type
  // Поток для создания процесса
  TApplicationRunning_Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  public
    GoTimer: TTimer;
  end;

var
  Form7: TForm7;
  ApplicationRunning_Thread: TApplicationRunning_Thread;
  i: Integer = 0;
...
procedure TForm7.Button1Click(Sender: TObject);
begin
  ApplicationRunning_Thread := TApplicationRunning_Thread.Create(True);
  ApplicationRunning_Thread.GoTimer := TimerApplicationRunning;
  ApplicationRunning_Thread.FreeOnTerminate := True;
  ApplicationRunning_Thread.Resume;
end;
//-------------------------------Создание процесса------------------------------
procedure TApplicationRunning_Thread.Execute;
begin
  GoTimer.Enabled := True;
end;
//------------------------------------------------------------------------------
procedure TForm7.TimerApplicationRunningTimer(Sender: TObject);
begin
  Inc(i, 1);
  Caption := IntToStr(i);
end;
В чём проблема не пойму.
Shouldercannon вне форума Ответить с цитированием
Старый 10.07.2012, 15:41   #2
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

А попроще никак нельзя таймер запускать?
Aristarh Dark вне форума Ответить с цитированием
Старый 10.07.2012, 15:50   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а оно и не должно работать, используйте цикл со Sleep.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.07.2012, 17:51   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Цитата:
Сообщение от Aristarh Dark Посмотреть сообщение
А попроще никак нельзя таймер запускать?
Это упрощённый вариант был. В потоке запускаю процесс и если процесс запущен, то и таймер должен начать работу.
Код:
procedure TApplicationRunning_Thread.Execute;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_SHOWNORMAL;

  FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);

  if CreateProcess(nil,
                   PChar(Format('%s\Project.exe%s', [GamePath, CmdlMain])),
                   nil,
                   nil,
                   False,
                   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil,
                   PChar(GamePath),
                   StartupInfo,
                   ProcessInfo) then
  begin
    GoTimer.Enabled := True;
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE); // Ждём до завершения процесса
  end;
end;
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а оно и не должно работать
Это почему. Снова кривые ручки при написании новой версии Delphi что-то испоганили?

Даже с костылём не работает.
Код:
procedure Test(B: Boolean);
...
//-------------------------------Создание процесса------------------------------
procedure TApplicationRunning_Thread.Execute;
begin
  Form7.Test(True);
end;

procedure TApplicationRunning_Thread.DoTerminate;
begin
  // Что-то... Если нужно до вызова внешнего OnTerminate (если назначен)
  inherited;
  // Что-то... Если нужно после вызова внешнего OnTerminate (если назначен)
  Form7.Test(False);
end;
//------------------------------------------------------------------------------
procedure TForm7.Test(B: Boolean);
begin
  TimerApplicationRunning.Enabled := B;
end;

Последний раз редактировалось Shouldercannon; 10.07.2012 в 21:19.
Shouldercannon вне форума Ответить с цитированием
Старый 10.07.2012, 22:54   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Нашёл решение проблемы.
Жалко нельзя следать так
Код:
procedure Test(B: Boolean);
begin
  Timer.Enabled := B;
end;

Synchronize(Form1.Test(True)); // E2250 There is no overloaded version of 'Synchronize' that can be called with these arguments
Shouldercannon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перестал работать css impulsgraw HTML и CSS 8 22.08.2011 21:28
Перестал работать тестер kanich Помощь студентам 4 15.11.2010 13:02
Перестал работать код Mikuro Microsoft Office Excel 6 12.11.2010 15:24
Перестал работать инетрнет Golovastik Операционные системы общие вопросы 8 16.01.2010 14:12