![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подвисает программа после после использования колеса мыши [XP]
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, то проблема исчезает.