Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинный цикл в обход очереди сообщений 
V
    Опции темы
Aleks26
  Дата 25.4.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



У меня элементарный цикл:

Код

unit unOcheredMes1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
 for i := 0 to 500000 do
  Label1.Caption := IntToStr(i);
end;

end.

Он выполняется пока не закончится цикл и в Label1 выдает затем 500000.
Однако в учебнике говорится о том, что возможно обойти очередь сообщений с помощью команды PerForm() и обработки сообщения WM_PAINT о перерисовке окна. Подскажите, как это сделать. Никак не соображу.  smile 
PM MAIL   Вверх
MetalFan
Дата 25.4.2012, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Не понял, при чем тут цикл и вызов Perform? Хочешь, чтобы кэпшн у лабела перерисовывался постоянно? Вставь Application.ProcessMessages в цикл.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
northener
Дата 25.4.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Можно вызвать метод Refresh.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
RelictOs
Дата 25.4.2012, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.2.2012

Репутация: 1
Всего: 1



Код

 for i := 0 to 500000 do
  begin
   Label1.Caption := IntToStr(i);
   Label1.Refresh;
   Sleep(10);
  end;

к примеру так..
PM MAIL ICQ Skype   Вверх
Aleks26
Дата 25.4.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



Цитата

Не понял, при чем тут цикл и вызов Perform? Хочешь, чтобы кэпшн у лабела перерисовывался постоянно? Вставь Application.ProcessMessages в цикл. 

С применением ProcessMessages у них следующий пример. А около приведенного примера - сноска, в которой сказано:
"На самом деле значение свойства Caption будет изменяться, так как  сообщение об изменении подписи посылается в обход очереди сообщений Windows с помощью команды Perform. Однако для отображения изменений подписи форма должна обработать сообщение WM_PAINT о перерисовке окна (этому сообщению соответствует событие OnPaint формы), а это может произойти только после завершения обработчика нажатия на кнопку." Хотелось просто подробнее понять, что они имеют здесь в виду.  smile 
PM MAIL   Вверх
Rennigth
Дата 25.4.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Aleks26, Имеется ввиду что WM_PAINT используя  Perform посылается сразу в WndProc, а не через Send(Post)Message.

Это сообщение отредактировал(а) Rennigth - 25.4.2012, 21:16


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Aleks26
Дата 26.4.2012, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



Цитата

Имеется ввиду что WM_PAINT используя  Perform посылается сразу в WndProc, а не через Send(Post)Message.

Большое спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.