Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnValidate, для поля в таблице 
:(
    Опции темы
Inga
Дата 7.3.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо.


>Это признак того, что у Вас с логикой работы приложения не все впорядке.


У меня простое приложение: один дбгрид с данными. Хочется предусмотреть любые не стандартный действия пользователя.
PM   Вверх
Vyacheslav
Дата 7.3.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Начинаем с нуля. Любая даже очень хорошая программа может выдавать ошибки и их надо перехватывать. Цели перехвата могут быть совершенно разные(выдача осмысленного сообщения, журналирование ошибок и пр. пр.). Неужели для этого нужно делать перехват по каждому чиху. Естественно, нет, если по логике перехват по месту не нужен. Следовательно должно быть место цетрализованной обработки ошибок. Решаем это следующим образом
Кладем на форму ApplicationEvents и для начала организуем перехват ошибок вообще и от базы данных в частности
Код

void __fastcall TForm1::ApplicationEvents1Exception(TObject *Sender,
      Exception *E)
{
    if( EDatabaseError* err = dynamic_cast< EDatabaseError*>(E)) {
        ShowMessage("Ошибка работы с БД:" + err->Message );
         return;
    }
    ShowMessage(AnsiString("Программа выполнила недопустимую операцию")+E->Message;
}

Для начала - это все. А весь остальной код убираем. Я не знаю, с какой БД Вы работаете, ну возможно, для нее предусмотрены производные классы от EDatabaseError, которые имеют дополнительную информацию, на основе которой можно выдать более подробные сообщения.
Кроме того, желательно создать свой класс, производный от Exception , который должен нести дополнительную информацию( серьезность ошибки, файл и строка, где произошла ошибка), что бы опять же централизировать обработку ошибоки дать Вам возможность быстро находить бани при работе программы.
Вот например как это выглядит у меня в одном из проектов
Код

void __fastcall TMainDataModule::ApplicationEventsException(
      TObject *a_Sender, Exception *a_Exc)
{
// Если это клиентское исключение, то просто выдаем сообщение...
    try
    {
        if (EipException* Exc = dynamic_cast<EipException*>(a_Exc))
        {
            Exc->Show();
            return;
        }
        // Если это серьезная ошибка
        std::auto_ptr<TErrorDialog> Dlg(new TErrorDialog(this, a_Exc,a_Sender));
        Dlg->ShowModal();
        // если ошибка произошла при входе в систему,
        // прекращаем работу
        if (m_Logining)
            Application->Terminate();
    }
    catch(...)
    {
    }
}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Inga
Дата 7.3.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, круто и красиво. smile
Я работаю с BDE (таблица Paradox). В книжках по БД (те которые у меня), такие красивые решения не описаны. smile
PM   Вверх
Vyacheslav
Дата 9.3.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Кстати пару замечаний по организации работы с БД.
Практика показывает, что редактирование непосредственно в гриде - плохой стиль. Вдвойне плохо, если программа в редактировании входит в автоматическом режиме, только потому, что сделан клик на поле ввода(AutoEdit==true). При работе с БД должен быть четко выделен момент начала редактирования и момент окончания редактирования с возможностью отказа от изменений. А посему грид только для просмотра, а редактирование надо реализовывать в отдельном окне. А в окне с гридом
предусмотреть кнопки редактирования, добавления и возможно просмотра( если в гриде выводится не вся информация.
Тогда обработчики кнопок у Вас будут выглядеть примерно так
Код

 void __fastcall TForm1::EditButtonClick(TObject *Sender)
{
    ClientDataSet1->Edit();
    if(EditDlg->ShowModal() == mrOk){
        ClientDataSet1->Post();
        return;
    }
    ClientDataSet1->Cancel();
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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