Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
ВнизПочему List index out of bounds(-1) ? Найти похожие ветки
← →
kyn66 © (2005-08-25 10:53) [0]Доброго всем дня! Уважаемые мастера. На форме у меня лежит 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;
Все вроде работает. Однако, стоит мне нажать на кнопку мышки на первой ячейке и не отпуская ее провести до последней,
с выходом за пределы сетки, сразу вылетает САБЖ. Как лечиь? Спасибо.
← →
Reindeer Moss Eater © (2005-08-25 10:56) [1]Как лечиь? Спасибо.
Проверять на вхождение в диапазон разумеется.
Перед тем как используешь индекс.
← →
kyn66 © (2005-08-25 10:59) [2]Т.е.? Проверить, водит-ли C in (0-9) и R in (0-1) ?
← →
stone © (2005-08-25 10:59) [3]
> Однако, стоит мне нажать на кнопку мышки на первой ячейке
> и не отпуская ее провести до последней,
> с выходом за пределы сетки, сразу вылетает САБЖ
Правильно, потому что по полученным X, Y уже нет ни одной ячейки. Соответственно в добавок к Cells[C, R] <> "" нужно проверять валидность C и R
← →
Reindeer Moss Eater © (2005-08-25 11:05) [4]Т.е.? Проверить, водит-ли C in (0-9) и R in (0-1) ?
Ну и при чем здесь 9 и 1?
У стринггрида свойства есть, говорящие сколько у него того и сего имеется.
← →
han_malign © (2005-08-25 11:28) [5]Если координата "за ячейками" таблицы, то по ней возвращается (-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) - это не совсем правильно - нельзя определить "ближайшую" ячейку(с какой стороны от таблицы указатель)
← →
kyn66 © (2005-08-25 12:55) [6]>> Reindeer Moss Eater
А вот как раз и при чем, [2] - помогло.
Может это элементарный случай , у меня конкретное кол-во строк и столбцов и я их знаю. Ошибка ликвидирована. Всем спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c