![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему List index out of bounds(-1) ? [D7, WinXP]
kyn66 © (2005-08-25 10:53:00)Доброго всем дня! Уважаемые мастера. На форме у меня лежит StringGrid (2 строки, 10 столюцов).Я написал проседуру, которая провепяет, если ячейка пустая, то присвоить один курсор, если нет - другой.
procedure TMainFrm.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
C, R: Longint;
begin
with (Sender as TStringGrid) do
begin
MouseToCell(X, Y, C, R);
if Cells[C, R] <> '' then
Cursor := ClearCursor
else
Cursor := crHandPoint;
end;
end;
Все вроде работает. Однако, стоит мне нажать на кнопку мышки на первой ячейке и не отпуская ее провести до последней,
с выходом за пределы сетки, сразу вылетает САБЖ. Как лечиь? Спасибо.
kyn66 (2005-08-25 12:55:00) [1]>> Reindeer Moss Eater
А вот как раз и при чем, [2] - помогло.
Может это элементарный случай , у меня конкретное кол-во строк и столбцов и я их знаю. Ошибка ликвидирована. Всем спасибо.
han_malign (2005-08-25 11:28:00) [2]Если координата "за ячейками" таблицы, то по ней возвращается (-1,-1) - и достаточно проверять что значение неотрицательно... Хотя в документации это не регламентируется - так что лучше, на всякий пожарный, проверять вхождение в диапазон по всем границам...
Grids.pas:
procedure TCustomDrawGrid.MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
var
Coord: TGridCoord;
begin
Coord := MouseCoord(X, Y);
ACol := Coord.X;
ARow := Coord.Y;
end;
..........................
function TCustomGrid.MouseCoord(X, Y: Integer): TGridCoord;
var
DrawInfo: TGridDrawInfo;
begin
CalcDrawInfo(DrawInfo);
Result := CalcCoordFromPoint(X, Y, DrawInfo);
if Result.X < 0 then Result.Y := -1
else if Result.Y < 0 then Result.X := -1;
end;
..........................
function TCustomGrid.CalcCoordFromPoint(X, Y: Integer;
const DrawInfo: TGridDrawInfo): TGridCoord;
function DoCalc(const AxisInfo: TGridAxisDrawInfo; N: Integer): Integer;
var
I, Start, Stop: Longint;
Line: Integer;
begin
with AxisInfo do
begin
if N < FixedBoundary then
begin
Start := 0;
Stop := FixedCellCount - 1;
Line := 0;
end
else
begin
Start := FirstGridCell;
Stop := GridCellCount - 1;
Line := FixedBoundary;
end;
Result := -1;
for I := Start to Stop do
begin
Inc(Line, GetExtent(I) + EffectiveLineWidth);
if N < Line then
begin
Result := I;
Exit;
end;
end;
end;
end;
function DoCalcRightToLeft(const AxisInfo: TGridAxisDrawInfo; N: Integer): Integer;
..........................
begin
if not UseRightToLeftAlignment then
Result.X := DoCalc(DrawInfo.Horz, X)
else
Result.X := DoCalcRightToLeft(DrawInfo.Horz, X);
Result.Y := DoCalc(DrawInfo.Vert, Y);
end;
- хотя на мой взгляд (-1,-1) - это не совсем правильно - нельзя определить "ближайшую" ячейку(с какой стороны от таблицы указатель)
Reindeer Moss Eater (2005-08-25 11:05:00) [3]Т.е.? Проверить, водит-ли C in (0-9) и R in (0-1) ?
Ну и при чем здесь 9 и 1?
У стринггрида свойства есть, говорящие сколько у него того и сего имеется.
kyn66 (2005-08-25 10:59:00) [4]Т.е.? Проверить, водит-ли C in (0-9)и R in (0-1)?
stone (2005-08-25 10:59:00) [5]
> Однако, стоит мне нажать на кнопку мышки на первой ячейке
> и не отпуская ее провести до последней,
> с выходом за пределы сетки, сразу вылетает САБЖ
Правильно, потому что по полученным X, Y уже нет ни одной ячейки. Соответственно в добавок к Cells[C, R] <> '' нужно проверять валидность C и R
Reindeer Moss Eater (2005-08-25 10:56:00) [6]Как лечиь? Спасибо.
Проверять на вхождение в диапазон разумеется.
Перед тем как используешь индекс.