![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Роковое число 255! [D6, dBase, FoxPro]
buka © (2004-08-23 06:42:00)Уважаемые мастера! Без вашей помощи никак не разобраться в том, что надо сделать.
Суть в следующем. Имеется таблица .mdb (Access). В ней 240 записей (всего -то!)
Имеется DBGrid (точнее abcDBFixedGrid, но это насколько я понимаю не столь важно).
Для просмотра записей имеется DBNav с соответствующими кнопками First, Last и пр.
После запуска программы курсор устанавливается на последнюю запись:
procedure Tfm_main.FormActivate(Sender: TObject);
begin
….
ADOTable1.Last;
end;
Щелчками по кнопкам “First” и “Last” без всяких проблем курсор устанавливается на первую и соответственно – последнюю запись. И это отражается, соответственно в DBGrid.
Таблицу я защитил паролем и реализовал это так:
procedure TPasswordDlg.OKBtnClick(Sender: TObject);
label lb1,lb2,lb3;
begin
i:= i+1;
if Password.Text='sezam' then goto lb1;
if i<2 then MessageDlg ('Ага! Фигушки!Пароль введен неправильно!', mtError,[mbOK],0);
if i>=2 then MessageDlg (‘Программа будет закрыта', mtError,[mbOK],0);
if i>=2 then fm_main.Close;
Password.Text:= '';
Password.SetFocus;
goto lb2;
lb1:
fm_main.abcPicBtn2.Visible:= false;
fm_main.abcPicBtn5.Visible:= true;
if Password.Text='sezam'then PasswordDlg.Close;
fm_main.ADOTable1.Close;
fm_main.abcPicBtn11.Visible:= true;
fm_main.ADOTable1.ReadOnly:= false;
fm_main.abcHDBGrid1.ReadOnly:= false;
fm_main.abcnpAppend1.Visible:= true;
fm_main.abcnpDelete1.Visible:= true;
fm_main.abcnpPost1.Visible:= true;
fm_main.ADOTable1.Open;
fm_main.Edit9.Text:= IntToStr (fm_main.ADOTable1.RecordCount);
LoadKeyboardLayout( StrCopy(Layout,'00000419'),KLF_ACTIVATE);
lb2:
end;
После этого курсор устанавливается на первую запись в таблице и соответственно – в DBGrid.
И дальше-при попытке «нырнуть» в конец таблицы (вне зависимости от того используешь ли Append или Last возникает исключение EInvalidGridOperation с сообщением ‘Grid index out of range’.
Скорее всего для Мастеров сразу очевидно в чем дело, но мне пришлось потратить достаточно времени для того чтобы понять, что несмотря на то, что в таблице –240 записей, тем не менее с учетом удаленных ранее реальный index 234 записи имеет № 255! (это я увидел через Access и копию таблицы с дополнительным полем «счетчик»).
Вот туда и устанавливается курсор после того как закроешь вышеуказанное сообщение.
Если используешь Next и до конца таблицы, то исключение не возникает. Записи под №242, 243 вписываются и отображаются нормально (в конце DBGrid, после № 241), но только до тех пор пока не закроешь редактирование таблицы.
Закрываю следующим образом:
procedure Tfm_main.abcPicBtn5Click(Sender: TObject);
begin
fm_main.abcPicBtn2.Visible:= true;
fm_main.abcPicBtn5.Visible:= false;
fm_main.ADOTable1.Close;
fm_main.ADOTable1.ReadOnly:= true;
fm_main.abcHDBGrid1.ReadOnly:= true;
fm_main.abcnpAppend1.Visible:= false;
fm_main.abcnpDelete1.Visible:= false;
fm_main.abcnpPost1.Visible:= false;
fm_main.abcPicBtn11.Visible:= false;
fm_main.ADOTable1.Open;
end;
Курсор после этого устанавливается на первую запись, но … 242 и 243 записи оказываются сразу после 238, т.е. последовательность записей такова …237, 238, 242,243,239,240.
Вот я и спрашиваю: как этот чертов range раздвинуть? Можно ли это сделать принципиально? Или идти по какому другому пути? Пробовал также перехватить исключение, так работа кнопки Last программно не отображается и исключение возникает ранее события
KSergey (2004-08-23 13:54:00) [21]'Grid index out of range’
Бредовейшее сообщение. Никогда не встречал...
попробуйте обычный грид вставить для пробы. Может все же какой-то страннейший косяк в используемых компонентах?
> Это я создал полев котором сам нумеруюзаписи поочередно.
> Но если я внес запись и тут же удалил, то в этом невидимом
> счетчике Delphiсвой № удаленной уже не использует для нумерации
> других записей.
Я никак не пойму: о каком счетчике речь? То про свое поле, то про какой-то счетчик, да еще и не видимый??
А, к стати, какой тип у этого поля? (только не спрашивайте какого: я так и не понял речь про свое поле или невидимыйсчетчик (что это вообще такое???))
buka (2004-08-23 13:45:00) [22]Erik1: Да нет у меня в рабочей таблице поля-счетчик. Это я перед тем как работать с основной создал копию с таким полем (на всякий случай) И случай этот понадобился, когда я сначала инуитивно заподозревал число 255, а потом открыл программой эту таблицу-копию и убедился в этом.
Причем Append и Last? Да при том, что и в том и другом случае курсор визуально (до опредленного числа записей в таблице- 255) прыгал в КОНЕЦ DBGrid и никаких проблем не было.
Еще раз. В Delphi есть какая-то штука, которая невидимо нумерует записи производимые в таблицу и если, какая либо запись удаляется, то очередной вносимой Delphi присваивает номер, следующей за удаленной. И так это идет все путем, до тех пор пока этот невидимый счетчик достигнет 255.
Это я создал поле в котором сам нумерую записи поочередно.
Но если я внес запись и тут же удалил, то в этом невидимом счетчике Delphi свой № удаленной уже не использует для нумерации других записей.
У меня отображается, например, ...232,233,234 ...Чего то я внес ошибочно и тут же удалил, полагая, что все путем и ничего не произошло. Ан нет! DElphi "про себя" считая удаленные и "про себя" присваивает, например тем же самым записям, (которые у меня идут под №№ 232,233,234) - ...253,254,255...И вот поскольку он уже набрал свой граничный range (255), то при попытке прыгнуть в конец таблицы, после внесения очередной записи (или в конец DBGrid, как кому угодно) Delphi и пишет 'Grid index out of range’!
В Access та же самая таблица наблюдается очень красиво все на месте и все по порядку, как надо (тем более, что отсортированы по возрастанию по полю с моей нумерацией) и записи добавляются красиво. Однако, когда смотришь моей программой c DBGrid, то те записи, которые я добавил Access(ом) находятся не в конце, который я считаю концом, а в том конце, который считает Delphi. Понятно или опять смутно?
KSergey (2004-08-23 12:53:00) [23]> [3] Рамиль © (23.08.04 12:43)
> Наоборот только:)
Да, конечно
Прошу прощения.
Рамиль (2004-08-23 12:43:00) [24]
> Append - перейти в конец набора записей, Last - добавить
> запись в конец и перейти на новую добавляемую
Наоборот только:)
KSergey (2004-08-23 12:40:00) [25]> И дальше-при попытке «нырнуть» в конец таблицы (вне зависимости
> от того используешь ли Append или Last возникает
Я так ничего и не понял, но вот в этой строчке есть странность: команды Append и Last - совершенно разные: Append - перейти в конец набора записей, Last - добавить запись в конец и перейти на новую добавляемую).
Так что надо-то?
Erik1 (2004-08-23 10:36:00) [26]Напонятно чего ты добиваешся, но поведение базы абсолютно логично. Зачем тебе создовать новую запись? А после пытатся с нее кудато уйти. Зачем тебе поле счетчик? Если надо добавлять записи, просто создай ID и заполняй его из программы. А если надо только просматривать то поставь ReadOnly := True;