Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00

Самостоятельная работа 15: Создание СУБД средствами BDE (на примере протокола экзамена кандидатов в водители)

Настройка функциональности редактирования данных вкладки PageList

Пользователю на данном этапе нужно дать возможность в определенных приделах управлять данными таблицы Base0.dbf, а именно:

  1. Перемещать позицию курсора базы данных на любую запись с единичным шагом. Под курсором БД понимается текущая запись, выбранная пользователем для редактирования или просмотра.
  2. Сразу переходить на первую или последнюю запись загруженной таблицы БД.
  3. Добавлять в конец таблицы новую запись или вставлять ее перед текущей записью.
  4. Редактировать поля текущей записи.
  5. Сохранять изменения в файле.

По общепринятому правилу перечисленные возможности введем в меню приложения и продублируем их кнопками быстрого доступа на панели управления. Начнем с кнопок.

Программирование кнопок панели управления

Ранее на форму мы поместили панель управления ControlBar, а на нее - две панели инструментов ToolBar. На каждую панель инструментов мы поместили по одной кнопке SpeedButton, чтобы нормально настроить интерфейс.

  • Расширьте панель ToolBar1 и разместите на ней четыре кнопки SpeedButton из вкладки Additional оболочки (панель расширяется при Align=alTop ). После первой пары кнопок вставьте как разделитель компонент Panel из вкладки Standard. Настройте ее так: Width=10, BevelOuter=bvNone, Caption=Пусто.
  • Разместите на панели ToolBar2 три кнопки SpeedButton из вкладки Additional оболочки.
  • Добавьте к панели управления ControlBar еще один (третий) компонент ToolBar из вкладки Win32 и настройте ее так
    Свойства компонента ToolBar
    Свойство Значение
    Name ToolBar3
    Align alTop
    AutoSize true
    EdgeInner esNone
    EdgeOuter esNone
    Height 24
  • Поместите на ToolBar3 два компонента Panel из вкладки Standard оболочки и одну кнопку SpeedButton из вкладки Additional. Задайте для первого компонента Panel его свойства Width=50, BevelOuter=bvLowered, Color=clGreen, Caption=Пусто. Второй компонент Panel нужен как разделитель для красоты, поэтому в нем сотрите значение свойства Caption и установите Width=5, BevelOuter=bvNone.
  • Выделите через окно Object TreeView


    поочередно каждый компонент ToolBar и задайте его свойство Align=alNone, чтобы сократить ширину компонента (проследите, чтобы имело место быть AutoSize=true ).

  • Загрузите в свойство Glyph кнопок картинки, которые будут ассоциировать с их функциональностью. Файлы с картинками можно взять из оболочки по адресу Program Files\Common Files\Borland Shared\Images\... или в каталоге Source данной лабораторной работы.
  • Пользовательский интерфейс главной формы на данном этапе должен быть таким

  • Удерживая нажатой клавишу Ctrl, выделите через панель Object TreeView все быстрые кнопки


    и установите их свойство ShowHint в значение true, чтобы в приложении отображались короткие подсказки при наведении пользователем курсора на эти кнопки.

  • Назначьте каждой из быстрых кнопок следующие свойства (в порядке их следования)
    Свойства кнопок панели управления
    Старое имя Name Hint
    SpeedButton1 btnBof В начало
    SpeedButton1 btnEof В конец
    SpeedButton1 btnPrior Предыдущий
    SpeedButton1 btnNext Следующий
    SpeedButton1 btnInsert Вставить
    SpeedButton1 btnAppend Добавить
    SpeedButton1 btnDelete Удалить
    SpeedButton1 btnSave Сохранить

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

Программирование главного меню

Теперь нужно добавить те же самые функциональности в меню. Семь функциональностей разместим в меню Edit (Редакция), а последнюю - в меню File (Файл).

  • Двойным щелчком на компоненте TMainMenu (у нас он назван Menu ) вызовите редактор меню и скорректируйте пункты меню Файл и Редакция так, чтобы они имели следующий вид


Сепараторы (разделители между группами опций) задаются пробелом в свойстве Caption. Имя пункта-сепаратора оставьте таким, каким его сгенерировала оболочка, а остальным пунктам назначьте ассоциативные имена, приведенные в таблице

Свойства пунктов меню
Меню Name Caption
Edit EditBof В начало
EditEof В конец
EditPrior Предыдущий
EditNext Следующий
EditInsert Вставить
EditAppend Добавить
EditDelete Удалить
File FileSave Сохранить
FileExit Выход

Теперь наступает самый ответственный момент - добавление обработчиков, реализующих функциональность приложения на данном этапе. При щелчке на кнопке или выборе опции меню наступает событие OnClick, которое должен перехватить и обработать соответствующий обработчик. Обработчики как методы формы генерируются оболочкой автоматически при двойном щелчке на кнопке или выборе пункта меню в режиме проектирования. Имя обработчика включает имя соответствующего элемента, инициирующего возникновение события. Можно задавать свое имя обработчику выделенного компонента через вкладку Events панели Object Inspector оболочки C++Builder, например


Но лучше задавать компонентам осмысленные имена, а генерацию имен обработчиков поручить оболочке, тогда и их имена будут иметь ассоциативный смысл.

  • В режиме View Code перейдите к файлу UMain.h (нижняя вкладка в редакторе кода) и объявите в классе TMainForm локальную целую переменную countRecord, в которой будем хранить текущее количество записей
    Добавление счетчика записей в класс TMainForm
    class TMainForm : public TForm
    {
    .....................................
    private:	// User declarations
    		int countRecord;
    public:	// User declarations
    		__fastcall TMainForm(TComponent* Owner);
    };
  • Через инструмент Object TreeView выделите объект самой формы (он у нас называется MainForm), а в инструменте Object Inspector на вкладке Events найдите событие OnCreate и двойным щелчком на его поле создайте обработчик.

    Обработчик события OnCreate выполнится сразу после создания формы приложения после его запуска на выполнение. Мы хотим, чтобы данные таблицы Table1 файла Base0.dbf загружались в компонент DBGrid1 сразу после запуска приложения, поэтому

  • Заполните обработчик следующим кодом
    Код обработчика создания формы приложения
    void __fastcall TMainForm::FormCreate(TObject *Sender)
    {
      Table1->Open();
      countRecord = Table1->RecordCount;        
    }

Мы также хотим, чтобы сразу после запуска приложения компонент DBGrid получил фокус ввода.

  • Поэтому для события OnPaint формы MainForm создайте обработчик, который заполните так
    Код для получения фокуса ввода
    void __fastcall TMainForm::FormPaint(TObject *Sender)
    {
      DBGrid1->SetFocus();
    }
  • В режиме Design визуального проектирования интерфейса пользователя создайте для каждой кнопки обработчик события OnClick, выполнив на ней двойной щелчок.

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

  • Поэтому вначале заполните созданные обработчики следующим кодом
    Код обработчиков кнопок панели управления
    void __fastcall TMainForm::btnBofClick(TObject *Sender)
    {
      while(!Table1->Bof)
        Table1->Prior();
      DBGrid1->SelectedField = Table1->FieldByName("Number");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnEofClick(TObject *Sender)
    {
      while(!Table1->Eof)
        Table1->Next();
      DBGrid1->SelectedField = Table1->FieldByName("Number");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnPriorClick(TObject *Sender)
    {
      Table1->Prior();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnNextClick(TObject *Sender)
    {
      Table1->Next();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnInsertClick(TObject *Sender)
    {
      Table1->Insert();
      Panel1->Color = clRed;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnAppendClick(TObject *Sender)
    {
      DBGrid1->SelectedIndex = 0; // Выделить первое поле
      Table1->Append();
      Panel1->Color = clRed;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnDeleteClick(TObject *Sender)
    {
      Table1->Delete();
      Panel1->Color = clRed;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::btnSaveClick(TObject *Sender)
    {
    
      Panel1->Color = clGreen;
      if(!Table1->Modified
         && countRecord == Table1->RecordCount) return;
      Table1->Edit();
      Table1->Post();
      Table1->Close();
      Application->ProcessMessages(); //Прокачка сообщений
      Table1->Open();
      countRecord = Table1->RecordCount;
    }
    //---------------------------------------------------------------------------

Теперь нужно прикрепить созданные обработчики к соответствующим опциям меню, чтобы получить такую же функциональность. Прикреплять обработчики будем так: вызовем двойным щелчком на компоненте TMainMenu редактор меню. Установим инструмент Object Inspector на вкладку Events. В редакторе меню будем выделять соответствующий пункт, а в инспекторе объектов в поле события OnClick в раскрывающемся списке будем выбирать нужный обработчик.


В редакторе меню выбираем очередную опцию

В инспекторе объектов выбираем нужный обработчик
  • Выполните закрепление обработчиков за опциями меню (7 опций в меню Edit + 1 опция в меню File )
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .