Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подвисает программа после после использования колеса мыши [XP]


Страницы:   1 2

madmech ©   (2010-06-03 16:31:00) 

Работаю с неким гридом, в котором обрабатываю OnMouseMove. В обработчике я задаю хинт, динамически меняющийся в зависимости от содержимого ячейки, над которой в данный момент находится курсор. До поры до времени все работает нормально, но как только я использую колесо мыши, например, для того, чтобы сместиться в конец грида, и навожу курсор на него, программа подвисает. Причем не сразу и не совсем стандартно: за курсором начинает тянуться странный шлейф, кнопка выхода не работает, хотя все остальные реагируют на команды, а через некоторое время программа виснет окончательно. Если я отключаю OnMouseMove, проблема исчезает.
Что делать?
Проблема появилась после перехода с D7 на D2010.
Куски кода я по необходимости представлю.


turbouser   (2010-06-04 11:23:00) [21]


> madmech ©   (04.06.10 10:57) [7]
>
>
> > Ловить момент появления хинта и в этот момент формировать
> > его текст.
>
>
> А я разве не это делаю?
>

нет :)
хинт появляется обычно с какой-то задержкой. а в данном случае куча кода выполняется при малейшем движении мыши. т.е. как минимум раз в 10 чаще, чем требуется.


madmech   (2010-06-04 10:57:00) [22]


> Ловить момент появления хинта и в этот момент формировать
> его текст.


А я разве не это делаю?


turbouser   (2010-06-03 23:50:00) [23]


> madmech ©   (03.06.10 18:32) [5]


> 2) А что можете предложить Вы?

Ловить момент появления хинта и в этот момент формировать его текст.


madmech   (2010-06-03 18:32:00) [24]


> turbouser

1) Использование пары DM1.EnumCDS.DisableControls и DM1.EnumCDS.EnableControls, "обрамляющей" код, ситуцию не спасло.
2) А что можете предложить Вы?


turbouser   (2010-06-03 18:11:00) [25]


> madmech ©   (03.06.10 18:02) [3]

1) где DisableControls?
2) вообще, странное что-то.. на онмоусемове дергать датасеты..


madmech   (2010-06-03 18:02:00) [26]

Так проблема в том, что моя программа является по сути некой надстройкой над общей (главной) программой, и оформляется она у меня в виде DLL. Так вот, когда я запускаю мой блок "локально", из Delphi 2010, то подвисания не происходит, а вот когда я его запускаю уже, как часть единого целого, из главной программы, то эта "ошибка" появляется.


Игорь Шевченко   (2010-06-03 17:32:00) [27]


> Что делать?


Запустить под отладчиком


madmech   (2010-06-03 17:25:00) [28]

procedure TMainForm.EnumDBGridMouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);    // Обработка перемещения курсора
var XX, YY, CurRec: integer;             // мыши над EnumDBGrid
   m, i, Pos: integer;
   s: string;
   KG_Flag: Boolean;
begin
 with THackDBGrid(EnumDBGrid) do
 begin
   XX := MouseCoord(x, y).x;
   YY := MouseCoord(x, y).y;
   s := '';
   if number1 > 1 then
   begin
     KG_Flag := True;
     for m := 1 to number1 do
       KG_Flag := KG_Flag and (( XX <> 2 * (m + 1) - 1 ) or ( YY <> 0 ));
     if (( XX <> 2 * (number1 + 1) ) or ( YY <> 0 )) and
        (( XX <> 2 * (number1 + 1) + 1 ) or ( YY <> 0 )) and KG_Flag then
       ShowHint := False;
   end
   else
     if ( XX <> 4 ) or ( YY <> 0 ) then
       ShowHint := False;
   CurRec := DataLink.ActiveRecord;
   DataLink.ActiveRecord := YY - 1;
   if number1 > 1 then
   begin
           
             ...
     
     for m := 1 to number1 do
       if ((XX = 2 * m) or (XX = 2 * m + 1)) and (YY > 0) then
       begin
         ShowHint := True;
         DM1.EnumCDS.RecNo := Columns[1].Field.AsInteger;
         Pos := 1;
         for i := 1 to quantity do
         begin
           if i = 1 then
             s := SurName[StrToInt(ExtractSubstr(Columns[2*m].Field.AsWideString, Pos, [',', ' ']))-1]
           else
             s := s + #13 + SurName[StrToInt(ExtractSubstr(Columns[2*m].Field.AsWideString, Pos, [',', ' ']))-1];
           Pos := Pos + 1;
         end;
         Hint := s;
         Break;
       end;

                ...
   end
   else
   begin

               ...  

   end;
   Application.ActivateHint(Mouse.CursorPos);
   DataLink.ActiveRecord := CurRec;
 end;
end;


Места, помеченные многоточием, похожи на центральную часть, поэтому не вижу смысла их приводить. Если убрать прямое обращение к содержимому DBGrid'а, как Columns[1].Field.AsInteger, то проблема исчезает.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо