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


Автор: Aleks26 25.4.2012, 14:08
У меня элементарный цикл:

Код

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 

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

Автор: northener 25.4.2012, 16:13
Можно вызвать метод Refresh.

Автор: RelictOs 25.4.2012, 17:38
Код

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

к примеру так..

Автор: Aleks26 25.4.2012, 18:01
Цитата

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

С применением ProcessMessages у них следующий пример. А около приведенного примера - сноска, в которой сказано:
"На самом деле значение свойства Caption будет изменяться, так как  сообщение об изменении подписи посылается в обход очереди сообщений Windows с помощью команды Perform. Однако для отображения изменений подписи форма должна обработать сообщение WM_PAINT о перерисовке окна (этому сообщению соответствует событие OnPaint формы), а это может произойти только после завершения обработчика нажатия на кнопку." Хотелось просто подробнее понять, что они имеют здесь в виду.  smile 

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

Автор: Aleks26 26.4.2012, 08:27
Цитата

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

Большое спасибо.

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