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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2013, 17:25   #1
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию Ошибка связи DataSource > DataSet

Всем привет. Проблема такая...
На одной форме связка DBGridEh > DataSource > DataSet
В гриде данные видны нормально.
На другую модальную форму бросаю Грид и связываю с тем же DataSource > DataSet. Грид пустой, т.е. показывает, что DataSet закрыт. На первой форме я вижу данные, на второй нет.

Если тупо в коде перед открытием модальной формы присвоить программно
Код:
Form_Indexes_edit.DBGridEh1.DataSource.DataSet:= ind_edit;
то все на модальной форме отображается нормально.

Пробую сделать проверку:
1. Присваиваю для чистоты эксперимента
Код:
ind_edit.Tag:= 999;
2. Пишу на кнопку код
Код:
if ind_edit<>Form_Indexes_edit.DBGridEh1.DataSource.DataSet then
ShowMessage(IntToStr(ind_edit.Tag)+' - '+IntToStr(Form_Indexes_edit.DBGridEh1.DataSource.DataSet.Tag));
Код срабатывает!!! (получается, что DataSet-ы разные), но сообщение вылетает с текстом 999 - 999 (т.е. DataSet один и тот же).
Что за бред? И как бороться?

P.S. да, чуть не забыл... использую FibPlus и Firebird 2.5.
_SERGEYX_ вне форума Ответить с цитированием
Старый 28.06.2013, 18:19   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

На модальную форму его открываете повторно?
ReportCube вне форума Ответить с цитированием
Старый 28.06.2013, 20:18   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Нет. Датасет уже открыт.
Раньше все работало нормально. Потом само так стало. Это явный "косяк" Delphi.
Пробовал заменить сами компоненты DataSource и DataSet на новые чистые. Ничего не помогает. Получается, что DataSource теряет DataSet сразу при запуске программы.
Если при создании формы написать
Код:
Form_Indexes_edit.DBGridEh1.DataSource.DataSet:= ind_edit;
то будет работать нормально.
_SERGEYX_ вне форума Ответить с цитированием
Старый 28.06.2013, 20:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сталкивался с чем-то подобным, точно не помню, по-моему тоже DBGridEh там фигурировал, хотя это и не принципиально. Случалось не регулярно и не предсказуемо. Причины не нашел, да и не искал. После этого имею привычку при создании формы и наличии подобного в коде прописывать ссылки. Да есть еще нюанс при программном создании формы - не поместить указатель формы в переменную, которую дельфи услужливо предлагает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.06.2013 в 20:38.
Аватар вне форума Ответить с цитированием
Старый 28.06.2013, 22:24   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

по идее новая форма ничего не знает о существующем подключении, поэтому ссылается на "пустое" место. стоит попробовать
Код:
Application.Create(TNewForm, NewForm);
DataSet.Open;
NewForm.ShowModal;
хотя сам с такой ошибкой не сталкивался. если будет возможжность - попробую смоделировать подобное
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 29.06.2013, 00:38   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А не существует ли две копии вызывающей формы? В одной из них датасет не открыт. Такой вариант точно вписывается в ситуацию из #1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.06.2013, 10:48   #7
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Программно формы нигде не создаются.
Цитата:
А не существует ли две копии вызывающей формы?
Нет. А разве можно создать две формы с одним именем?
Пробовал положить DBGrid на любую другую форму программы. Результат тот же.
Пробовал заменить DBGridEh на обычный DBGrid. Менял DataSorce на MyDataSource из компонентов MyDac. Поверил dfm-файлы. Там все написано правильно
В вызывающей форме
Код:
object DBGridEh1: TDBGridEh
     AllowedOperations = [alopInsertEh, alopUpdateEh, alopAppendEh]
    AutoFitColWidths = True
    DataGrouping.GroupLevels = <>
    DataSource = Form_Indexes.DSInd_edit
На основной форме
Код:
  object DSInd_edit: TDataSource
    DataSet = Ind_edit
Не знаю, что делать. В программе несколько десятков форм и начать переписывать код кусками что-то не хочется, если в других местах такие косяки вылезут.
_SERGEYX_ вне форума Ответить с цитированием
Старый 29.06.2013, 11:12   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
можно создать две формы с одним именем?
Насколько я помню - да. Но при определенных условиях.
Цитата:
Не знаю, что делать.
Не полагаться на DFM, а в OnActivate формы ручками приписать указание гриду Датасета. Это для начала.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.06.2013, 12:31   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А разве можно создать две формы с одним именем?
А че нет? В частности создаю динамически несколько не зависимых друг от друга экземпляров одной эмдишной дочерней формы. Другое дело глобальную переменную формы нельзя использовать в этом случае. Name формы винда сама уникальным делает - Form1_1, Form1_2 и т.д. Экземляр той же модальной формы можно динамически создавать, даже если она и создана в dpr. Но опять же - не пользоваться глобальной переменной формы, поскольку она будет указывать на последнюю созданную форму
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 29.06.2013 в 12:50.
Аватар вне форума Ответить с цитированием
Старый 02.07.2013, 08:56   #10
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Вопрос решился так: перенес DataSet-ы на DataModule и все заработало (при переносе на любую из форм работать не хочет). Хз почему такая ерунда получается.
Всем спасибо.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что за ошибка Cannot perform this operation on a closed dataset ? bakanaev Общие вопросы Delphi 3 20.03.2013 21:28
ошибка ADOQuery:DATAset not in edit or insert mode Novichok95 БД в Delphi 4 05.11.2012 18:00
ошибка dataset not in edit or insert mode Chicharrr Помощь студентам 2 06.06.2012 18:34
Ошибка dataset not in edit or insert mode. thebrownie Общие вопросы Delphi 3 12.02.2012 18:47
ошибка Query1: Cannot modify a read-only dataset demo_nik БД в Delphi 5 07.11.2008 19:16