Непонятки с TDbf

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Непонятки с TDbf

Сообщение arriah » 17.01.2017 18:33:15

Привет всем.

Понадобилось мне иипользовать dbf, в инете нашел пример, сильно переделывать не стал. В свой проект добавил неободимые компонены и на обработчик кнопки повесил следующее:

Код: Выделить всё
  WorkDir:=ExtractFilePath(ParamStr(0));
  DateTimeToString(RDate,'dd-mm-yyyy',now);
  If DirectoryExists (WorkDir+'RNews')=false then ForceDirectories(WorkDir+'RNews');

  //начальные установки:
  MyDBF.Exclusive:= True; //необходимо для изменения установок
  MyDBF.FilePath:= WorkDir+'RNews'; //таблица там же, где программа
  MyDBF.TableName:= rdate+'.dbf'; //имя файла таблицы
  MyDBF.IndexName:= rdate+'.ndx'; //имя индексного файла
  MyDbf.TableLevel:= 7; //тип таблицы Visual DBase VII
  //если таблицы нет - делаем её и индексный файл:
  if not FileExists(WorkDir+'RNews\' + rdate+'.dbf') then begin
    //устанавливаем поля и создаем таблицу:
    with MyDBF.FieldDefs do begin
      Add('ID', ftAutoInc, 0, True);
      Add('ID_RS', ftString, 10, True);
      Add('Date', ftString, 20, True);
      Add('News', ftString, 200, True);
      Add('Link', ftString, 200, True);
      Add('approve', ftBoolean, 0, False);
    end;
    MyDBF.CreateTable;
    MyDBF.Open;
    //устанавливаем и создаем индексы:
    MyDBF.AddIndex(rdate+'.ndx', 'ID', [ixPrimary, ixUnique]);
  end
  else begin //если таблица есть, просто открываем её и подгружаем индексы
    MyDBF.Open;
    MyDBF.OpenIndexFile(rdate+'.ndx');
  end;


При нажатии на кнопку таблица создается, если она есть открывается, заполняется данными, все ок.

Но при повтороном нажатии на кнопку вылетает ошибка, оно и понятно, потому как второй раз открывается БД, которая уже открыта. Поэтому решено было это код перекинуть в событие формы OnCreate

И вот тут самое интересное, при запуске приложения, при открытии формы вылетает ошибка Unable open file и указан путь к моему файлу dbf.
Пробовал удалять созданные таблицы, запускаю приложение - то же самое.

Ладно, вернул код в обработчик кнопки, запускаю, жму кнопку ошибка list of bounds
Но как? Но почему? Ведья просто перенес кусок кода :) Удалил дбгрид, поставил его заново - через кнопку все заработало...

Сделал тоже самое, перекинул код в событие открытия формы, удалил таблицы, удалил дбгрид - не помогло, ошибка таже не могу открыть файл.

Ну чтобы не возится с основным проектом, создал тестовую софтину, где только вышеприведенный код, поместил его в событие открытие формы - работает!

Я немного не понимаю, почему так? Куда копать?

PS: Причем если в диалоге ошибки нажать ОК, то программа продолжает работать, данные в таблицу заносятся и нет никакх проблем. Но почему то в моей основной программе ошибка открытия файла на этапе открытия формы, а втестовой ошибки нет... вобщем странно все это
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение vitaly_l » 17.01.2017 18:50:46

arriah писал(а):Куда копать?

отчистить и собрать, и удалите директорию lib.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Непонятки с TDbf

Сообщение Лекс Айрин » 17.01.2017 19:15:47

arriah писал(а):Я немного не понимаю, почему так? Куда копать?


Скорей всего, работа с БД не очень аккуратна. Попробуй открывать файл в одном месте, например, при создании формы, а обновлять содержимое в другом (по кнопке).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Непонятки с TDbf

Сообщение arriah » 17.01.2017 20:07:24

vitaly_l писал(а):отчистить и собрать, и удалите директорию lib.

НЕ помогло

Добавлено спустя 1 минуту 36 секунд:
Лекс Айрин писал(а):Скорей всего, работа с БД не очень аккуратна. Попробуй открывать файл в одном месте, например, при создании формы, а обновлять содержимое в другом (по кнопке).


Именно так и задуманно.

БД должна открываться при событии формы OnCreate, далее в программе при нажатии на кнопку происходит работа с базой.

Но вся проблема в том, что ошибка именно при открытии/создании базы в событии формы OnCreate
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение olegy123 » 17.01.2017 20:22:14

arriah писал(а):Но вся проблема в том, что ошибка именно при открытии/создании базы в событии формы OnCreate

1) Возможно множественное при монопольном открытие файла БД в системе виндовс..
2) сам файл DBF может блокировать доступ - файловая система(без наличии сервера) сигнализации состояний транзакций(ввод/редактирования/удаления) для множественного подключения к файлу. Тут нужно корректное завершение работы с БД.. Вспомните работу в 1С версии 7.. там требовалось монопольный режим с индексацией всей базы.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Непонятки с TDbf

Сообщение Лекс Айрин » 17.01.2017 20:28:48

arriah писал(а):Но вся проблема в том, что ошибка именно при открытии/создании базы в событии формы OnCreate


Тогда, попробуй создать в другом событии. А возможно, это действительно глюк и перекомпиляция с очисткой избавит от него.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Непонятки с TDbf

Сообщение arriah » 17.01.2017 20:34:32

olegy123 писал(а):1) Возможно множественное при монопольном открытие файла БД в системе виндовс..
2) сам файл DBF может блокировать доступ - файловая система(без наличии сервера) сигнализации состояний транзакций(ввод/редактирования/удаления) для множественного подключения к файлу. Тут нужно корректное завершение работы с БД.. Вспомните работу в 1С версии 7.. там требовалось монопольный режим с индексацией всей базы.


Нет ни множественного ни монопольного. В основном проекте этот код в событии формы OnCreate - выдает ошибку, в другом, в чистом проекте этот же код ошибки не дает. После запуска прилоения работы с БД не происходит, она будет только после нажатия на кнопку. То есть фактически программе надо при создании формы либо открыть dbf, либо создать если его нет.

Добавлено спустя 57 секунд:
Лекс Айрин писал(а):Тогда, попробуй создать в другом событии. А возможно, это действительно глюк и перекомпиляция с очисткой избавит от него.

пробовал в событии при нажатии на кнопку. Оставил бы там, но придется делат дополнительную проверку открыта база или нет

Добавлено спустя 13 минут 11 секунд:
Это жестоко.

Повесил этот код на событие формы OnActivate (для проверки) - работает без ошибок, но стоит повесить на OnCreate - вылет. Уже пересоздал событие, очищал, компилировал - пофигу...

Код рабочий, но в чистом проекте на OnCreate работает же... у меня слов нет.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение Лекс Айрин » 17.01.2017 20:57:34

arriah писал(а):пробовал в событии при нажатии на кнопку. Оставил бы там, но придется делат дополнительную проверку открыта база или нет


Есть куча более удобных событий.

arriah писал(а): В основном проекте этот код в событии формы OnCreate - выдает ошибку, в другом, в чистом проекте этот же код ошибки не дает.


Ищи в чем между ними разница. Просто так ничего не бывает, кроме глюков. Т. к. полного текста нет, то остается только воспользоваться услугами телепата.
Попробуй оформить открытие(ну и закрытие, заодно) БД как функцию/процедуру. Таким образом, ты отвяжешься от формы. Есть вариант (не знаю насколько реальный) сделать это в разделе инициализации модуля/программы.

ЗЫ: кстати, событие onCreate есть у любого визуального, как минимум, компонента. Хоть у самой этой кнопки.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Непонятки с TDbf

Сообщение vitaly_l » 17.01.2017 21:01:18

arriah писал(а):код в событии формы OnCreate - выдает ошибку, в другом, в чистом проекте этот же код ошибки не дает

У меня было похожее, учитывая что, чистка - Вам не помогает, то решайте так:
весь код в отдельную функцию и эту созданную отдельную функцию
запускаете в конце функции OnCreate, или лучше в onShow, или onActivate.
(но будь-те бдительны, т.к. возможно понадобится boolean на одноразовое открытие)

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Непонятки с TDbf

Сообщение arriah » 17.01.2017 21:27:02

Лекс Айрин писал(а):Ищи в чем между ними разница. Просто так ничего не бывает, кроме глюков. Т. к. полного текста нет, то остается только воспользоваться услугами телепата.
Попробуй оформить открытие(ну и закрытие, заодно) БД как функцию/процедуру. Таким образом, ты отвяжешься от формы. Есть вариант (не знаю насколько реальный) сделать это в разделе инициализации модуля/программы.


Да в принципе разницы нет. В событии OnCreate основного проекта и "чистого" - все одинаково. Ну разница в uses, в основном проекте контролы расположены на tpanel, на форме дбгрид и хромиум, пара кнопок и два едита... то есть нет ничего чтобы мешало открытию файла БД
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение Лекс Айрин » 17.01.2017 21:33:49

arriah писал(а): в основном проекте контролы расположены на tpanel, на форме дбгрид и хромиум, пара кнопок и два едита... то есть нет ничего чтобы мешало открытию файла БД


Ой ли? А пути к компонентам разные... Попробуй приблизить тестовую форму к рабочей... Тут либо создашь полностью идентичную рабочую форму, либо поймешь в чем проблема.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Непонятки с TDbf

Сообщение arriah » 17.01.2017 21:45:17

Лекс Айрин писал(а):Ой ли? А пути к компонентам разные... Попробуй приблизить тестовую форму к рабочей... Тут либо создашь полностью идентичную рабочую форму, либо поймешь в чем проблема.

Да. так и поступил. Сделал полностью рабочую копию...
TChromium... мать его... если его на форме нет - все работает нор, если есть вылетает с ошибкой...

Нежданчик.. что делать?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение olegy123 » 17.01.2017 21:53:30

TDBF - работает без зависимости от TApplication.. OnCreate не причем..
Без исходников сложно сказать в чем проблема..


Я так думаю: DBF - файловая бд с возможностью работать в многопользовательском режиме (fake SQL сервер).. статусы подключения и транзакции фиксируются в файле(по моему в ndx).. Если сессия пропала - то файл становится не корректным нужен чекет файла (погуглите в сторону: Check and repair DBF)..

Сами файлы (dbf/ndx) после "Unable open file .." открываются в любом просмоторщике(Far и т.п.)? Если да - то 146% проблема в корректности завершения сессий. Откройте любым тулсом "Check and repair DBF" посмотри что скажут...
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Непонятки с TDbf

Сообщение arriah » 17.01.2017 22:03:41

olegy123 писал(а):TDBF - работает без зависимости от TApplication.. OnCreate не причем..
Без исходников сложно сказать в чем проблема..

Выше приведенный код делает только создание/открытие DBF. При инициализации приложения, запуска программы и т.д.. работы с БД НЕ производятся никакие, так что нет речи о работе в много пользовательском режиме.
Задача именно в том, чтобы до работы с БД, ее создать/открыть.. а далее, при нажатии на соответсвующу кнопку происходит работа с БД
И самое, на мой взгляд, лучшее место для проверки существования БД и ее открытие было именно OnCreate формы. Но увы, TChromium портил всю малину. Выше приведенный код работал ВЕЗДЕ кроме OnCreate формы.

Сейчас я его поместил в событие OnAfterCreated хромиума, и все заработало как надо...

А вот в чем природа такого поведения понять не могу. Опой чую что косяк в TChromium...
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Непонятки с TDbf

Сообщение olegy123 » 17.01.2017 22:21:10

arriah писал(а):И самое, на мой взгляд, лучшее место для проверки существования БД и ее открытие было именно OnCreate формы.

Для этого есть отдельный unit TDataModule("Модуль данных")- в него можно положить любые движки баз данных и работу с таблицами(очень удобно при многоформенной работой) и его можно включать еще до загрузки основной главной формы..

arriah писал(а):А вот в чем природа такого поведения понять не могу. Опой чую что косяк в TChromium...
Вполне возможно, сам работаю с либлами написанных в си - от утечек памяти до выявления чужеродных данных в переменных..
как правило это признак некорректной работы с либлами.. Хватит ошибиться вместо PPointer записать Pointer - и полдня выяснять почему программа неожиданно в разных местах валится.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 80

Рейтинг@Mail.ru