Изменение Gauge через Windows API (PostMessage)

Рейтинг: 1Ответов: 1Опубликовано: 06.01.2015

Подскажите, пожалуйста, наименование WM сообщения, через которое можно обратиться к компоненту “Gauge” (чтоб менять свойство «Progress», используя PostMessage), управлять Gauge я буду из потока.

Вот, например, на одном из сайтов нашел похожую рабочую штуку, но не знаю, насколько эта реализация правильная:

Модуль, в котором выполняется поток:

  const
   MY_MESS = WM_USER + 100;

 procedure ThProcFile.Execute;
 var  
   LCount: integer;  
 begin  
 …
 while PrCount - LCount >= BlockSize do
     begin
       PrSourseStream.Read(LBuffer, BlockSize);
       EncipherBlock(LBuffer);
       PrDestStream.Write(LBuffer, BlockSize);
       Inc(LCount, BlockSize);
        PostMessage(Application.MainForm.Handle, MY_MESS, 1, LCount);
 …
     end;
 end;

Модуль основного окна:

 public
     procedure MyProgress(var msg: TMessage); message MY_MESS;
   end;
 ….
 procedure TFMain.MyProgress(var msg: TMessage);
 begin
   Gauge1.Progress := msg.LParam;
 end;

Спасибо.

P.S. "Synchronize" - тормозит поток в 2 раза.

Ответы

▲ 2Принят

Если вы собираетесь как-то взаимодействовать с формами из потока (менять свойства, выводить текст и т.д.), то без Syncronize никак. Если это тормозит работу потока, сделайте вывод прогресса не в каждой итерации.

Если вы будете отправлять WM сообщения форме из потока, то Syncronize не нужен. Чтобы поток не ожидал окончания обработки отправленного сообщения, делайте PostMessage вместо SendMessage.