Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.013 c
1-1124867893
lehich
2005-08-24 11:18
2005.09.18
ProgressBar, который отрисовывает линейку програсса в Статусбаре


14-1124946500
Priest
2005-08-25 09:08
2005.09.18
Безопасность макросов в экселе


14-1124686374
Samozvanka
2005-08-22 08:52
2005.09.18
Помогите с расшифровкой аббревиатуры в программе 1C: Предприятие


3-1123079751
Гость22
2005-08-03 18:35
2005.09.18
Как в Database Desktop убрать ненужное поле таблицы Paradox?


2-1123936347
RomanBishkek
2005-08-13 16:32
2005.09.18
Как можно обновить одну запись через Query





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский