![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
QProg и KOL v.2.83 (и выше) [Delphi, Windows]
MTsv DN © (2007-11-01 15:54:00)Всем привет...
В общем, тема такая. Некоторое время назад перестала работать PAS_VERSION моего проекта (вообще, я использую асм-версию, но для тестов пас...не суть дела), смысл в том, что любой вызов ProcessMessages зацикливался в бесконечность и переставали закрываться окна... Начиная с версии 2.83, тем же самым меня "порадовала" и асм-версия. После 2х дней тестов, выяснил, что причиной всему компонент QProg. Тестовый проект здесь: http://slil.ru/25050629
Бесконечный цикл получался из-за постоянной обработки WM_PAINT:
function QProgBar_WndProc( Control: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
var
PaintStruct: TPaintStruct;
ProgressBar: PQProgressBar;
begin
Result := False;
ProgressBar:= PQProgressBar( Control );
case ( Msg.message ) of
WM_PAINT :
begin
BeginPaint( ProgressBar.Handle, PaintStruct );
ProgressBar.Paint;
EndPaint( ProgressBar.Handle, PaintStruct );
Result:= True;
Rslt:= 0;
end;
И присвоениюResult:= True;. Закомментировав эту строчку, все начало работать нормально...
Не знаю, насколько корректен этот fix, может еще кто что подскажет...возможно Автор???
MTsv DN (2007-11-05 18:39:00) [1]Обновление на http://www.kolnmck.ru
Danger (2007-11-03 09:32:00) [2]MTsv DN, вам письмо.
Danger (2007-11-02 12:46:00) [3]Понял причины проблемы, осталось оформить все соображения в код. На днях сделаю, сейчас просто тотальная нехватка времени.
D[u]fa (2007-11-02 12:14:00) [4]ну дык присвоение Caption вызывает заново перерисовку так?
homm (2007-11-02 09:26:00) [5]Там в конце обработки прорисовки потому что стоит некий «caption management».
Снова попытки использовать OnPaint не по назначению. Место ему, пожалуй гденить в SetPosition (или еше где может надпись изменится).
И еше замечание:
Brush.Color:= Parent.Color;
FillRect( MakeRect(0, 0, Width, Height ));
Нужно поставить
if NOT Transparent then begin
Brush.Color:= Parent.Color;
FillRect( MakeRect(0, 0, Width, Height ));
end;
Такой кусок встречается 2 раза.
MTsv DN (2007-11-02 08:45:00) [6]В общем, так... Отключая по "кускам" прорисовку в Paint, добрался до той единственной строчки которая зачикливает WM_PAINT, а именно:
procedure TQProgressBar.SetCaption( Value: KOLString );
var
D: PQDataObj;
begin
D:= PQDataObj( CustomObj );
Caption := Value; <<<<<<<<<< ЗДЕСЬ!!!
D.fHasCaption := not ( Value = '' );
Дальше разбираться не стал, но комментированиеCaption := Value;нормализует работу компонента (естесссссна все предыдущие изменения отменяются)...
С Уважением...
Danger (2007-11-02 08:36:00) [7]
> Vladimir Kladov © (01.11.07 20:24) [8]
> Наверное что-то не прорисовалось. Посмторите вот на это:
> A window may receive internal paint messages as a result
> of calling RedrawWindow with the RDW_INTERNALPAINT flag
> set. In this case, the window may not have an update region.
> An application should call the GetUpdateRect function to
> determine whether the window has an update region. If GetUpdateRect
> returns zero, the application should not call the BeginPaint
> and EndPaint functions.
Это в том случае, если RedrawWindow() вызывается методом TControl, который был изменен в библиотеке в промежуток 2.63-2.84.
Danger (2007-11-02 08:26:00) [8]
>D[u]fa © (01.11.07 16:28) [1]
>а разве прально вызывать Paint в OnPaint'e для самого себя же %)
>в результате того что поставил result True, он просто не вызывает событие перерисовки еще раз... вообще не понятная конструкция
...
>D[u]fa © (01.11.07 16:43) [3]
>метод который опять вызовет событие)
Данный метод (Paint) не вызовет событие, он используется только для отрисовки графических элементов контрола и WM_PAINT не посылает.
Конечно, hommправ, от имени метода ничего не зависит.
Теперь по поводу проблемы: KOLQProgressBar был написан во времена KOL 2.50-2.60. Нельзя предугадать, как будет меняться библиотека ;) Где-то изменен механизм обработки/передачи сообщений по цепочке, и старая схема не годится. Разберусь, как только выберу свободное время.
P.S. Для эксперимента нашел и поставил KOL 2.63, и тестовый проект MTsvDN заработал.
Vladimir Kladov (2007-11-01 20:24:00) [9]Наверное что-то не прорисовалось.
Посмторите вот на это:
A window may receive internal paint messages as a result of calling RedrawWindow with the RDW_INTERNALPAINT flag set. In this case, the window may not have an update region. An application should call the GetUpdateRect function to determine whether the window has an update region. If GetUpdateRect returns zero, the application should not call the BeginPaint and EndPaint functions.
D[u]fa (2007-11-01 17:12:00) [10]хм странно, но Result:= True; действительно и вызывает где то цикл из-за которого все тормозит, хотя по идее он должен перекрывать обработчики перерисовки после него
SergeR (2007-11-01 16:59:00) [11]Нда. У меня после какого то обновления в проекте тоже ProcessMessages зацикливался. Пришлось от QProgressBar отказаться.
D[u]fa (2007-11-01 16:53:00) [12]нет я лишь к тому что там сделано через QProgBar_WndProc и в нем ловится WM_PAINT, а ведь можно назначить OnPaint и думаю проблемы не будет
homm (2007-11-01 16:47:00) [13]> [3] D[u]fa © (01.11.07 16:43)
> метод который опять вызовет событие)
Это ты глядя в исходный код сказал? Тогда это косяк.
А если ты думаешь что событие OnPaint наступит лишь от одного вызова Paint — ты не прав.
Если не нравится название Paint, переименуй его в XochuRisovat и вызывай его, результат не изменится.
D[u]fa (2007-11-01 16:43:00) [14]метод который опять вызовет событие)
homm (2007-11-01 16:42:00) [15]> [1] D[u]fa © (01.11.07 16:28)
> а разве прально вызывать Paint в OnPaint'e для самого себя
> же %)
OnPaint — событие, Paint — метод. Все правильно.
D[u]fa (2007-11-01 16:28:00) [16]а разве прально вызывать Paint в OnPaint'e для самого себя же %)
в результате того что поставил result True, он просто не вызывает событие перерисовки еще раз... вообще не понятная конструкция