Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataControls не изменяют DataSet в нужный момент 
:(
    Опции темы
ZVano
  Дата 15.12.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Проблемма со стандартными компонентами ввода данных (TDBLookupComboBox, TDBCheckBox и т.д.).
Эти компоненты модифицируют набор данных DataSet только в момент потери фокуса. (OnExit)
Мне нужно заставить компонент выполнить модификацию в любой момент.
Например: 
Пользователь выбрал строку из выпадающего списка TDBLookupComboBox, но компонент фокус не потерял.
Решил этот момент таким костылем:
Код

void __fastcall TfrmDocsEdit::dcbDocTypeCloseUp(TObject *Sender) {
    TWinControl * workControl = ActiveControl;
    FindNextControl(workControl, true, true, false)->SetFocus();//Переходим на следующий контрол
    workControl->SetFocus();//Возвращаем фокус обратно, чтобы пользователь ничего не заметил
}

Т.е. отловил момент закрытия списка выбора и принудительно переключил фокус на след.контрол, затем вернулся на предыдущий.
Этот костыль хоть и не нравится мне, но все же работает.

А как быть с TDBCheckBox? 
Пользователь может кликать по нему до посинения, а DataSet не изменится.
Попытка сместить фокус в обработчике OnClick вызывает исключение.
Код

void __fastcall TfrmDocsEdit::dcbDocIsActiveClick(TObject *Sender) {
    TWinControl * workControl =    ActiveControl;
    FindNextControl(workControl, true, true, false)->SetFocus();
    workControl->SetFocus();
}

Получаю жуткую ошибку "Abnormal program termination".

Вобщем, нужно сделать так, чтобы при редактировании данных в контроле они тут-же изменяли DataSet.
Либо корректно делать это обрабатывая события ввода.

Это сообщение отредактировал(а) ZVano - 15.12.2010, 14:01


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
_Dimon_
Дата 16.12.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 1



Код

void __fastcall TfrmDocsEdit::dcbDocTypeCloseUp(TObject *Sender) 
{
 dynamic_cast<TDBLookupComboBox*>(Sender)->DataSource->DataSet->Post();
}

PM MAIL   Вверх
ZVano
Дата 16.12.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Цитата(_Dimon_ @ 16.12.2010,  14:19)

Код

void __fastcall TfrmDocsEdit::dcbDocTypeCloseUp(TObject *Sender) {
 dynamic_cast<TDBLookupComboBox*>(Sender)->DataSource->DataSet->Post();
}


Не подходит:
1. Данные не должны быть отправлены на сервер - набор данных должен стать "DataSource->DataSet->Modified == true"
2. Получаем исключение "...: Dataset not in edit or insert mode" при попытке использовать этот подход для "TDBCheckBox"
Код

void __fastcall TfrmDocsEdit::dcbDocIsActiveClick(TObject *Sender) {
  dynamic_cast<TDBCheckBox*>(Sender)->DataSource->DataSet->Post();
}

И эта ошибка вполне ожидаема т.к. клик по объекту TDBCheckBox не вызывает изменения в связаном DataSet, что и является проблеммой, которую нужно обойти.



--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
_Dimon_
Дата 16.12.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 1



Код

 TDataSet * data = dynamic_cast<TDBCheckBox*>(Sender)->DataSource->DataSet;

 if (data->State!=dsBrowse)  data->UpdateRecord();



Незнаю почему, но первый клик не отображает замены, а потом нормально .... надо еще подумать .....


З.Ы. Перед тем как щелкать чекбокс ты вызываеш Edit() ?

Это сообщение отредактировал(а) _Dimon_ - 16.12.2010, 19:54
PM MAIL   Вверх
ZVano
Дата 17.12.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: 1
Всего: 4



Перед щелчком  Edit() не вызываю. Он происходит автоматически.

Приатачиваю тестовый проект, который скидывает в лог все события и состояние DataSet.
Нужно заставить кнопку "bnTbl1Save" быть активной после клика по DBCheckBox.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TDataSet.zip 32,89 Kb


--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.