Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Роковое число 255! [D6, dBase, FoxPro]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо