Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2012, 22:18   #1
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
Вопрос Ошибка при обращении к FIBDataSet'y

Привет всем!
У меня следующая проблема. Есть приложение MDI, в нем есть форма (Child), на которой есть FIBDataSet, подключенный к базе FireBird и делающий выборку из таблицы "Журнал документов". Есть так же форма не Child, а обычная, на которой лежат два DateEdit'a с помощью которых можно установить за какой период нужно выбрать документы из таблицы. Итак, при нажатии на кнопку со следующим кодом:

Код:
frmjobsh.fibdataset1.Close;
frmjobsh.fibdataset1.SQLs.SelectSQL.Clear;
frmjobsh.fibdataset1.SQLs.SelectSQL.Add('select * from JOURNAL where DATA between :date1 and :date2 order by DATA, VREMYA');
frmjobsh.fibdataset1.params.ParamByName('date1').AsDate;
frmjobsh.fibdataset1.params.ParamByName('date2').AsDate;
frmjobsh.fibdataset1.params.ParamByName('date1').Value:=trunc(dateedit1.Date);
frmjobsh.fibdataset1.params.ParamByName('date2').Value:=trunc(dateedit2.Date);
frmjobsh.fibdataset1.Open;
вылезает вот такая дрянь:
"Access violation at address 00638113 in module 'MDI_App.exe'. Read of address 0000035C"

Ошибка выскакивает на первой строке, при попытке закрыть FIBDataSet. Пробовал делать все окна Cild, бесполезно, все равно появляется ошибка.
Причем если выполнить этот код на самой форме с FIBDataSet'ом, все происходит как и положено, документы выбираются за выбранный период.

Ах да, подобный код без проблем работал в обычном приложении (не MDI)/

Вот не могу разобраться в чем проблема? В том что приложение MDI? Если да, то как обойти эту проблему, не отказываясь от MDI?

Помогите люди добрые, очень нужно!!!
Заранее всем премного благодарен!!!
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 01.08.2012, 22:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А frmjobsh существует в момент нажатия на кнопку? Судя по ошибке и строке в которой она вываливается - нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.08.2012, 04:35   #3
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

а как она может не существовать? когда форма с датаедитами вызывается по нажатии на кнопку с этой формы.
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 02.08.2012, 04:52   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Приведи полный код кнопки вызова и отображения данной формы
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.08.2012, 13:35   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Цитата:
Сообщение от Vit@L Посмотреть сообщение
а как она может не существовать? когда форма с датаедитами вызывается по нажатии на кнопку с этой формы.
Она ТАК может не существовать. Советую запомнить, что обращение с переменными ссылающимися на объект формы - это очень опасные штуки, особенно в MDI приложениях (а также и внутри методов классов, на экземпляры которых ссылаются эти переменные), проверьте код в dpr файле, думаю там не прописано создание этой дочерней формы, а сама переменная есть, и она = НИЛ.
А поэтому надо запомнить, что работа с дочерними формами (и вообще любыми динамически создаваемыми вещами) должна чётко отслеживаться, на надо полагаться на среду дельфи, как Вы привыкли раньше.
В общем случае для работы с мди-формами надо использовать члены главной формы MDIChildren MDIChildCount, ActiveMDIChild.
Советую создать пустой проект в дельфи и выбрать за основу не Application, а MDI Application (в дельфи7 вкладка Projects, если пошагово: File - New - Other - появится окно со вкладками, выбрать Projects) и этот пример досконально разобрать.
phomm вне форума Ответить с цитированием
Старый 02.08.2012, 19:21   #6
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Приведи полный код кнопки вызова и отображения данной формы
Код:
var Child: TfrmJObsh;
begin
      Child := TfrmJObsh.Create(Application);
end;
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 02.08.2012, 19:24   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А frmjobsh тогда при каких делах, если указатель на созданную форму в Child помещен? Сам он в frmjobsh не попадет. И, да, phomm прав, работать с MDIChildren формами так чревато, особенно в случае, когда несколько экземпляров одной и той же формы создается. А Show где выполняется для формы?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.08.2012 в 19:33.
Аватар вне форума Ответить с цитированием
Старый 02.08.2012, 19:35   #8
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Аватар, а подскажите пожалуйста, как правильно создать дочернюю форму?
Спасибо!
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 02.08.2012, 19:53   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для случая если создается только один экземпляр и в случае если он существует, то просто активизируется:
Код:
procedure TFMainForm.PresentMDIChild(ChildClassName: String): Integer;
var i: Integer;
begin
  Result:=-1;
  for i:=0 to MDIChildCount-1 do
    if MDIChildren[i].ClassName=ChildClassName then begin
      Result:=i;
      Exit;
    end;
end;

procedure TFMainForm.MItem1Click(Sender: TObject);
var i: Integer;
begin
  i:=PresentMDIChild(TfrmJObsh.ClassName);
  if i=-1 then TfrmJObsh.Create.Show
          else MDIChildren[i].Show;
end;
Да, все DataSet-ы рекомендовал бы выбросить в отдельный DataModule, так заведомо меньше ошибок будет и удобней. Обращение к переменной frmJObsh не нужно. Если требуется к объектам формы обратиться из вызываемых из неё модальных форм, то можно Self как параметр передавать при создании модальной формы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 02.08.2012 в 19:58.
Аватар вне форума Ответить с цитированием
Старый 02.08.2012, 20:18   #10
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Аватар, спасибо за код. Но я не совсем разобрался. В общем ситуация такая, у меня форма frmjobsh, создается в дизайнере, присваивается ей Formstyle=fsMDIChild, ложатся на нее всякие контролы (дбгрид, различные кнопки), мне ее нужно создать (или просто вызвать) по нажатию кнопки на родительской форме. Причем она, именно frmjobsh, будет создана только один раз. Другие дочерние формы которые ссылаются на другие таблицы в базе, тоже содержат гриды и прочие контролы и будут создаваться по нажатию уже на другую кнопку. В общем, хорошим примером то что хочу сделать я - это программа 1С. Нажал на одну кнопку, появился один журнал документов, нажал на другую появился справочник товаров. В общем как то так.
Заранее спасибо за помощь
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при обращении к объекту CodeNOT C# (си шарп) 3 28.05.2011 12:47
Ошибка при обращении к реестру OLE. В чем причина? ILYA_SAKHA БД в Delphi 3 09.06.2010 04:02
при обращении с одной формы на другую вылетатет ошибка cowboy Общие вопросы Delphi 21 04.09.2009 14:25
Ошибка пр обращении к макросу tae1980 Microsoft Office Excel 3 04.04.2009 14:38
Ошибка при обращении к интернет странице Alter Свободное общение 2 06.08.2008 22:25