Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Почему 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
14-1124741392
Программер_
2005-08-23 00:09
2005.09.18
Написал аналог программы...


14-1124136607
Almaz
2005-08-16 00:10
2005.09.18
А как насчет SPbMP ?


14-1124952185
DVM
2005-08-25 10:43
2005.09.18
Странный знак на банкноте 100$


1-1124891888
ArtemESC
2005-08-24 17:58
2005.09.18
Текст на Canvas


1-1124892902
ocean
2005-08-24 18:15
2005.09.18
Размер в см при печати