среда, 19 октября 2011 г.

Урок 23. Очень важная последовательность действий



Сначала я назвал этот урок “Форма выбора мемориального ордера”. Но, поскольку, ниже поведу речь о добавлении в проект новой формы, подключении ее к источнику данных, о том, как организовать выбор в форме и передать выбранные данные дальше, как их оценить и обработать, показать оператору и т.п. О многом из того, что будет представлено в этом уроке, я уже говорил ранее. Более того: в будущем действия, о которых пойдет здесь речь, станут привычной рутиной. Поэтому мне хотелось бы очень подробно остановиться на этом вопросе, чтобы потом только ссылаться на него не повторяясь. Всегда интереснее обсуждать что-то новое, чем талдычить об одном и том же, правда? Поэтому, дорогой читатель, наберись терпения. Урок будет длинный, более 20 пунктов...
Цель: добавить в проект новую форму, в которой должна отображаться какая либо справочная таблица, чтобы пользователь мог выбрать одну из записей, предварительно добавив ее, если нужной записи нет.
Озадачимся вопросом: что нужно знать программе, т.е. что должен пользователь уже определить, прежде, чем начнет вводить записи о расходах в наш реестр?
Валюту? Правильно, но пока я принял валюту по умолчанию - рубли.
Пользователь должен определиться, как он будет группировать информацию. Опытный бухгалтер на крупном предприятии обычно не ограничивается распределением информации только по месяцам года, он дробит ее на более мелкие группы. Но, я думаю, что для бытовых целей, достаточно группировать записи о расходах по месяцам. Поэтому в дальнейшем под мемориальным ордером будем понимать часть записей базы данных, относящихся к определенному месяцу. Отсюда и перечень мемориальных ордеров будет состоять из 12 строк по числу месяцев в году.
Нам понадобится очень многое из предыдущих уроков, поэтому, если Вы с ними не ознакомились по какой либо причине, то лучше это сделать сейчас.
Приступим (подробности - см. в соответствующем уроку видео материале).
1. Добавьте на форму Main компоненты TADOTable и TDataSource с постфиксами MOs в названиях. Назначьте ADOTableMOs свойство Connection=ADOConnection1 (ранее выполнено подключение к базе данных). Определите свойство TableName=MOs (имя таблицы базы данных “Расход”, содержащей перечень мемориальных ордеров). Компоненту DataSourceMOs назначьте DataSet=ADOTableMOs (этот компонент будет иметь связь с таблицей, чтобы выполнить визуализацию - вывод на экран - данных, хранящихся в ней). Установите свойство AutoEdit этого компонента в False.
2. Добавьте  в проект новую форму с именем Name=MOs_Frm, назвав модуль формы Unit=MOs. Задайте некоторые свойства формы: заголовок - Caption=’Список мемориальных ордеров’, KeyPreview=True, чтобы форма реагировала на нажатие клавишей (понадобится в дальнейшем для обработки нажатия функциональных кнопок и таких как “Escape” или “Enter”), Position=poScreenCenter, чтобы форма выводилась в центре экрана.
3. Добавьте пару панелей из библиотеки компонентов ProDelphi с соответствующими опциями Align (одна панель должна располагаться внизу, вторая - быть клиентом).
4. С вкладки компонентов библиотеки EhLib, установленной ранее, добавьте компонент сетку - TDBGridEh на панель-клиент.
5. Установите на нижнюю панель разработанный ранее навигатор (вы можете использовать навигатор, поставляемый с средой разработки, работать он будет аналогично, отличия лишь во внешнем виде).
6. Пропишите взаимно формы в Uses в разделе implementation (в модуле формы Main: Uses MOs; в модуле формы MOs: Uses Main). Сие описание необходимо, чтобы можно было в одной форме использовать переменные и процедуры с глобальной областью видимости из другой формы.
7. Аналогично тому, как мы это делали в уроке 4, создайте в ActionList действие, назвав его Name=Data_SelectMO, с подсказкой - Hint=’Выбор мемориального ордера’, отнеся его к категории Category=Data с подписью Caption=’&Начать ввод’. Надеюсь, что Вы понимаете, для чего в Caption использован знак амперсанда. Создайте заготовку (достаточно ввести один комментарий, чтобы среда разработки не удалила пустышку при сохранении) OnExecute.
8. Свяжите пункт меню (Начать ввод, Name=N_Edit) с созданным действием Data_SelectMO, аналогично тому, как это делалось в уроке 4.
9. Добавьте  поля в ADOTableMOs (правой кнопкой по компоненту - Fields Editor, правой кнопкой по окну редактора полей - Add All Fields...)
10. Уберите форму из автодоступных в модуле проекта (как это сделать, см урок 12).
11. Создайте процедуру StatusBarUpdate, дав ее объявление в области Private, т.к. нет необходимости вызывать ее из других форм, отображающую в статус баре выбор оператора с помощью следующих команд:
StatusBar1.Panels[1].Text:='Валюта: '+ MySelect.MySel_ValName;
StatusBar1.Panels[2].Text:='МО: '+ MySelect.MySel_MOName;
StatusBar1.Panels[3].Text:='Счет: '+MySelect.MySel_AccName;
StatusBar1.Panels[4].Text:='Каталог: '+ MySelect.MySel_Dir;
12. Создайте Private процедуру ShowMOs, позволяющую выводить форму MOs_Frm на экран:
Application.CreateForm(TMOs_Frm, MOs_Frm); // Создание формы
MOs_Frm.ShowMoDal;                                          // Вывод формы на экран
MOs_Frm.Free;                                                      // Освобождение памяти
StatusBarUpdate;                                                   // Визуализация выбора
13. Добавьте на форму MOs_Frm кнопку выбора (экземпляр компонента TButton). Для этой кнопки достаточно изменить только подпись Caption=’Выбрать’, поскольку в дальнейшем я планирую заменить ее компонентом собственного производства. Не стоит создавать действие в ActionList, так как действие этой кнопки не будет продублировано в меню или где-то еще.
14. Напишите обработчик нажатия кнопки выбора:
// Выбор сделан
MyPSelect();
где MyPSelect() - Private процедура:
procedure TMOs_Frm.MyPSelect();
begin
// Обработка выбора
case ModalResult of
1:
begin
if MainFrm.ADOTableMOs.FieldByName('ID').Value>0
then
Begin
MySelect.MySel_IDMO:=MainFrm.ADOTableMOs.FieldByName('ID').Value;
MySelect.MySel_MOName:=MainFrm.ADOTableMOs.FieldByName('Name').Text;
MySelect.MySel_Mes:=MainFrm.ADOTableMOs.FieldByName('Mes').Value;
Close;
end;
end;
2:
Begin
Close;
end;
end;
end;
Обратите внимание, что переменная MySelect типа запись объявлена в форме Main!
15. Добавьте в обработчик создания формы операторы присвоения начальных значений переменным:
procedure TMOs_Frm.FormCreate(Sender: TObject);
begin
MySelect.MySel_IDMO:=0;
MySelect.MySel_MOName:='';
MySelect.MySel_Mes:=0;
end;
16. Чтобы сделать таблицу доступной (активировать), создайте в главной форме Private подпрограмму:
procedure TMainFrm.TableActive(p: boolean);
begin
// Активация (деактивация таблиц)
ADOTableMOs.Active:=p;
end;
которая так же может быть использована в целях отключения таблиц (подобных объектов в будущем будет несколько).
17. В конструкторе формы MOs_Frm назначте источник для DBGridEh: DataSource=MainFrm.DataSourceMOs. Обратите внимание, что средства подключения к базе данных и компоненты для работы с ней расположены на главной форме.
18. Теперь пришло время “облагородить” сетку, задав удобоваримые заголовки колонок (столбцов). Для этого кликните два раза по изображению грида на форме MOs_Frm, а затем по кнопке Add All Fields - добавить все поля. Перейдите в инспектор объектов. Выбирая последовательно поля, в свойстве Title-Caption задайте названия. Закройте окно Editing.DBGridEh.Colums.
19. Для сетки, отображающей таблицу из трех полей (колонок), удобно установить свойство AutoFitColWidths в значение True, чтобы они все уместились на экране, чтобы избежать появления горизонтальной полосы прокрутки.
20. Назначьте источник для навигатора аналогично тому, как Вы сделали это для DBGridEh.
21. Создайте обработчик события onKeyDown формы MOs_Frm дважды щелкнув по одноименной строке в инспекторе объектов:
procedure TMOs_Frm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Обработка нажатия клавиши
case Key of            // Start Case
VK_ESCAPE:
begin
if MessageDlg('Закрыть?',mtConfirmation, [mbYes]+[mbNo], 0)=6
then
Close;
end;
else
End;                   // End case
end;
Это нужно для того, чтобы пользователь мог закрыть форму клавишей Esc.
Вывод на экран окна диалога с вопросом “Закрыть?” можно оформить с помощью находящегося на главной форме компонента MyMessenger.
22. Для пользователей, которые не привыкли кликать по кнопкам, а предпочитают делать выбор двойным щелчком, оформите обработку соответствующего события для DBGridEh:
procedure TMOs_Frm.DBGridEh1DblClick(Sender: TObject);
begin
// Реакция на двойной клик
ModalResult:=1;
MyPSelect();
end;
23. И последнее, что необходимо сделать - обработать выбор после закрытия вспомогательной формы (если ничего не выбрано, зачем показывать пустую таблицу пользователю?!) и научить программу показывать необходимые в данную минуту пункты меню:
procedure TMainFrm.Data_SelectMOExecute(Sender: TObject);
begin
// Обработка выбора МО
// Инфо на статусбаре
StatusBarUpdate;
// Вывод формы выбора МО
ShowMOs;
// Обработка выбора
if MySelect.MySel_IDMO=0
then
PrDPanel2.Visible:=False
else
Begin
PrDPanel2.Visible:=True;
end;
// Открыть недоступные пункты меню
N12_Ins.Enabled:=True;
N10_Filter.Enabled:=True;
N_Credit.Enabled:=True;
N_ExportToMDB.Enabled:=True;
N_Kodifikators.Enabled:=True;
end;
Что же дальше?
Короткий разговор о сортировке записей в таблице-источнике.

Комментариев нет:

Отправить комментарий