Конференция "KOL" » QProg и KOL v.2.83 (и выше) [Delphi, Windows]
 
  • MTsv DN © (01.11.07 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 © (01.11.07 16:28) [1]
    а разве прально вызывать Paint в OnPaint'e для самого себя же %)
    в результате того что поставил result True, он просто не вызывает событие перерисовки еще раз... вообще не понятная конструкция
  • homm © (01.11.07 16:42) [2]
    > [1] D[u]fa ©   (01.11.07 16:28)
    > а разве прально вызывать Paint в OnPaint'e для самого себя
    > же %)

    OnPaint — событие, Paint — метод. Все правильно.
  • D[u]fa © (01.11.07 16:43) [3]
    метод который опять вызовет событие)
  • homm © (01.11.07 16:47) [4]
    > [3] D[u]fa ©   (01.11.07 16:43)
    > метод который опять вызовет событие)

    Это ты глядя в исходный код сказал? Тогда это косяк.
    А если ты думаешь что событие OnPaint наступит лишь от одного вызова Paint — ты не прав.
    Если не нравится название Paint, переименуй его в XochuRisovat и вызывай его, результат не изменится.
  • D[u]fa © (01.11.07 16:53) [5]
    нет я лишь к тому что там сделано через QProgBar_WndProc и в нем ловится WM_PAINT, а ведь можно назначить OnPaint и думаю проблемы не будет
  • SergeR © (01.11.07 16:59) [6]
    Нда. У меня после какого то обновления в проекте тоже ProcessMessages зацикливался. Пришлось от QProgressBar отказаться.
  • D[u]fa © (01.11.07 17:12) [7]
    хм странно, но Result:= True; действительно и вызывает где то цикл из-за которого все тормозит, хотя по идее он должен перекрывать обработчики перерисовки после него
  • 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.
  • Danger © (02.11.07 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 © (02.11.07 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 © (02.11.07 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 © (02.11.07 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 © (02.11.07 12:14) [13]
    ну дык присвоение  Caption вызывает заново перерисовку так?
  • Danger © (02.11.07 12:46) [14]
    Понял причины проблемы, осталось оформить все соображения в код. На днях сделаю, сейчас просто тотальная нехватка времени.
  • Danger © (03.11.07 09:32) [15]
    MTsv DN, вам письмо.
  • MTsv DN © (05.11.07 18:39) [16]
    Обновление на http://www.kolnmck.ru
 
Конференция "KOL" » QProg и KOL v.2.83 (и выше) [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]