Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.04.2012, 18:21
Аватар для Aleks26
Aleks26 Aleks26 вне форума
Прохожий
 
Регистрация: 19.12.2010
Сообщения: 32
Репутация: 12
Вопрос Ошибка в примере для события OnIdle

Я рассматриваю применение события OnIdle класса TApplication. Взял с одного из сайтов простой пример и пытаюсь запустить:
Код:
unit unIdleExample1;

interface

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

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
   procedure Waiting(Sender: TObject; var Done: Boolean);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnIdle := Waiting;
end;

procedure TForm1.Waiting(Sender: TObject; Done: Boolean);
begin
 StatusBar1.SimplePanel := True;
 StatusBar1.SimpleText := 'OK! Let"s get going';
 Done := True;
end;

end.
Но каждый раз компилятор выдает сообщение об ошибке:
"Declaration of 'Waiting' differs from previous declaration"
Просмотрел еще несколько примеров, но и там событие OnIdle описывается подобным же образом во время выполнения программы в обработчике события OnCreate главной формы. Не могу понять в чем проблема?
Ответить с цитированием
  #2  
Старый 26.04.2012, 18:25
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Цитата:
procedure Waiting(Sender: TObject; var Done: Boolean);
procedure TForm1.Waiting(Sender: TObject; Done: Boolean);

Видите разницу (TForm1 не в счет)?

А вообще, OnIdle может и не сработать, для фоновой работы лучше подойдут потоки
Ответить с цитированием
Этот пользователь сказал Спасибо ChinYan за это полезное сообщение:
Aleks26 (26.04.2012)
  #3  
Старый 26.04.2012, 18:57
Аватар для Aleks26
Aleks26 Aleks26 вне форума
Прохожий
 
Регистрация: 19.12.2010
Сообщения: 32
Репутация: 12
По умолчанию

Компиляция прошла, но дело было не в TForm1, как вы упоминали, а в отсутствии ключевого слова var перед вторым параметром:
Код:
procedure TForm1.Waiting(Sender: TObject; var Done: Boolean);
begin
 StatusBar1.SimplePanel := True;
 StatusBar1.SimpleText := 'OK! Let"s get going';
 Done := True;
end;
Ответить с цитированием
  #4  
Старый 26.04.2012, 19:42
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Я на это и намекал
Ответить с цитированием
  #5  
Старый 26.04.2012, 20:30
Аватар для Aleks26
Aleks26 Aleks26 вне форума
Прохожий
 
Регистрация: 19.12.2010
Сообщения: 32
Репутация: 12
По умолчанию

Еще такой маленький вопрос: будет ли вызов модальной формы MessageBox вызывать данное событие? Я попробовал немного изменить прежний модуль:
Код:
unit unIdleExample2;

interface

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

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Label1: TLabel;
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
   procedure Waiting(Sender: TObject; var Done: Boolean);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Waiting(Sender: TObject; var Done: Boolean);
begin
 StatusBar1.SimplePanel := True;
 StatusBar1.SimpleText := 'Событие OnIdle';
 Done := True;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
 i: Integer;
begin
Application.OnIdle := Waiting;
 if Application.MessageBox('Ожидание события!!', '') = IDOK then
 begin
  for i := 0 to 100000 do
  Label1.Caption := inttostr(i);
  Application.ProcessMessages;
 end;

end;

end.
Если при вызове модальной формы это событие вызывалось бы, то я увидел бы сначала текст в строке состояния, а только через некоторое время кэпшн объекта Label1, но у меня они выводятся одновременно.
Ответить с цитированием
  #6  
Старый 26.04.2012, 21:20
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Aleks26
... сначала текст в строке состояния, а только через некоторое время кэпшн объекта Label1...
Так и есть, только это очень маленькое время.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Aleks26 (26.04.2012)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025