Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Вниз

QProg и KOL v.2.83 (и выше)   Найти похожие ветки 

 
MTsv DN ©   (2007-11-01 15:54) [0]

Всем привет...

В общем, тема такая. Некоторое время назад перестала работать 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, может еще кто что подскажет...возможно Автор???


 
D[u]fa ©   (2007-11-01 16:28) [1]

а разве прально вызывать Paint в OnPaint"e для самого себя же %)
в результате того что поставил result True, он просто не вызывает событие перерисовки еще раз... вообще не понятная конструкция


 
homm ©   (2007-11-01 16:42) [2]

> [1] D[u]fa ©   (01.11.07 16:28)
> а разве прально вызывать Paint в OnPaint"e для самого себя
> же %)

OnPaint — событие, Paint — метод. Все правильно.


 
D[u]fa ©   (2007-11-01 16:43) [3]

метод который опять вызовет событие)


 
homm ©   (2007-11-01 16:47) [4]

> [3] D[u]fa ©   (01.11.07 16:43)
> метод который опять вызовет событие)

Это ты глядя в исходный код сказал? Тогда это косяк.
А если ты думаешь что событие OnPaint наступит лишь от одного вызова Paint — ты не прав.
Если не нравится название Paint, переименуй его в XochuRisovat и вызывай его, результат не изменится.


 
D[u]fa ©   (2007-11-01 16:53) [5]

нет я лишь к тому что там сделано через QProgBar_WndProc и в нем ловится WM_PAINT, а ведь можно назначить OnPaint и думаю проблемы не будет


 
SergeR ©   (2007-11-01 16:59) [6]

Нда. У меня после какого то обновления в проекте тоже ProcessMessages зацикливался. Пришлось от QProgressBar отказаться.


 
D[u]fa ©   (2007-11-01 17:12) [7]

хм странно, но Result:= True; действительно и вызывает где то цикл из-за которого все тормозит, хотя по идее он должен перекрывать обработчики перерисовки после него


 
Vladimir Kladov ©   (2007-11-01 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.


 
Danger ©   (2007-11-02 08:26) [9]


>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 заработал.


 
Danger ©   (2007-11-02 08:36) [10]


> 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.


 
MTsv DN ©   (2007-11-02 08:45) [11]

В общем, так... Отключая по "кускам" прорисовку в Paint, добрался до той единственной строчки которая зачикливает WM_PAINT, а именно:
procedure TQProgressBar.SetCaption( Value: KOLString );
var
 D: PQDataObj;
begin
 D:= PQDataObj( CustomObj );
 Caption := Value;                       <<<<<<<<<< ЗДЕСЬ!!!
 D.fHasCaption := not ( Value = "" );

Дальше разбираться не стал, но комментирование Caption := Value; нормализует работу компонента (естесссссна все предыдущие изменения отменяются)...

С Уважением...


 
homm ©   (2007-11-02 09:26) [12]

Там в конце обработки прорисовки потому что стоит некий «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 раза.


 
D[u]fa ©   (2007-11-02 12:14) [13]

ну дык присвоение  Caption вызывает заново перерисовку так?


 
Danger ©   (2007-11-02 12:46) [14]

Понял причины проблемы, осталось оформить все соображения в код. На днях сделаю, сейчас просто тотальная нехватка времени.


 
Danger ©   (2007-11-03 09:32) [15]

MTsv DN, вам письмо.


 
MTsv DN ©   (2007-11-05 18:39) [16]

Обновление на http://www.kolnmck.ru



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
15-1218525210
oldman
2008-08-12 11:13
2008.10.05
Последовательность действий при заправке кардриджа (лазер)


15-1218723698
Урсулапов
2008-08-14 18:21
2008.10.05
что-то с explorer.exe


2-1219298365
Matveih1
2008-08-21 09:59
2008.10.05
Как Item в ActionList сделать не доступной?


4-1197398579
Jolik
2007-12-11 21:42
2008.10.05
Как сделать свои подсказки...


15-1219010733
No_Dead(w)
2008-08-18 02:05
2008.10.05
монитор не выключается%)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский