Продолжение цикла статей “Производство”
Минималистический интерфейс выбора форм табличного представления, основанный на главном меню, имеет один существенный недостаток: каждый раз, когда нужно выбрать форму, приходится отправляться в путешествие по пунктам меню. Чтобы упростить переключение между уже открытыми окнами, давайте добавим в приложение навигатор.
Навигатор форм или оконный навигатор - механизм переключения между ранее открытыми окнами.
Выглядит навигатор как кнопки или ярлыки вкладок многостраничника. Идеальным кандидатом на роль навигатора можно считать класс TTabControl – список кнопок (вкладок). К сожалению, в My Visual Database для этого класса не реализована поддержка обработки события onChange, в основе которого лежит функционал переключения окон, поэтому навигатор для программы “Производство” мы сделаем на базе класса TdbPageControl. От TTabControl он отличается тем, что кроме кнопок содержит специальные контейнеры – вкладки, на которых можно располагать элементы пользовательского интерфейса. В нашем случае в этом нет необходимости, так как отображение выбранной формы всегда происходит на одном и том же элементе главной формы, а переключение между формами происходит через управление видимостью форм и её расположением относительно других форм – вызов метода BrigToFront перемещает выбранную форму на передний план и она закрывает собой другие формы, уже находящиеся на той же панели.
Для отображения формы на другом компоненте уже имеется процедура Form_ShowOnWinControl(). Но для взаимодействия с навигатором лучше сделать отдельную процедуру, так как не все формы нуждаются в навигаторе (например формы, отображаемые на форме редактирования). Так как навигатор является структурной единицей главной формы, то логично назвать новую процедуру Form_ShowOnMainForm().
const
// задействовать навигатор форм
FORM_NAVIGATOR_ENABLED = True;
// специальные элементы управления
FORM_WORK_PANEL = 'panWork';
FORM_NAVIGATOR = 'pgcFormNavigator';
FORM_CLOSE_BUTTON = 'btnClose';
FORM_CLOSE_BUTTON_CAPTION = chr($D7);
FORM_CLOSE_BUTTON_HINT = 'Закрыть окно';
procedure Form_ShowOnMainForm(AForm: TForm;);
// отображение на главной форме, задействуется навигатор
var
tmpPanel: TdbPanel;
tmpPC: TdbPageControl;
tmpTabSheet: TdbTabSheet;
tmpName: string;
tmpButton: TdbButton;
begin
tmpName := DeleteClassName(AForm.Name);
FindC(MainForm,FORM_WORK_PANEL,tmpPanel); // рабочая панель главной формы
Form_ShowOnWinControl( AForm, tmpPanel );
// механика навигатора
if FORM_NAVIGATOR_ENABLED then
begin
FindC(MainForm,FORM_NAVIGATOR,tmpPC,False);
// если панель навигации не найдена, то создать её
if tmpPC = nil then
begin
tmpPC := TdbPageControl.Create( MainForm );
AssignEvents(tmpPC);
with tmpPC do
begin
Parent := tmpPanel.Parent;
Name := FORM_NAVIGATOR;
Font.Size := 11;
Height := 34; // минимальная высота для выбранного размера шрифта
TabPosition := tpBottom;
Align := alBottom;
dbonChange := 'Form_Navigator_OnChange';
end;
// корректируем выравнивание рабочей панели
tmpPanel.Anchors := 0;
tmpPanel.Align := alClient;
end;
// найти вкладку и переключить
FindC(MainForm,T_TAB_SHEET+tmpName,tmpTabSheet,False);
if tmpTabSheet = nil then
begin // если вкладки нет - создать её
tmpTabSheet := TdbTabSheet.Create( MainForm );
tmpTabSheet.Name := T_TAB_SHEET+tmpName;
tmpTabSheet.PageControl := tmpPC;
tmpTabSheet.Caption := AForm.Caption;
end;
tmpPC.ActivePage := tmpTabSheet;
// кнопка закрытия формы
FindC(AForm,FORM_CLOSE_BUTTON,tmpButton,False);
if tmpButton = nil then
begin // если кнопки нет, то создать её
tmpButton := TdbButton.Create( AForm );
AssignEvents(tmpButton);
with tmpButton do
begin
Name := FORM_CLOSE_BUTTON;
Parent := AForm;
Width := 18;
Height := 18;
Top := 0;
Left := AForm.ClientWidth - Width - 1;
Anchors := akTop + akRight;
Caption := FORM_CLOSE_BUTTON_CAPTION;
Font.Size := 11;
Font.Style := fsBold;
Hint := FORM_CLOSE_BUTTON_HINT;
ShowHint := True;
OnClick := @Form_Navigator_btnClose_OnClick;
end;
end;
tmpButton.Visible := True;
tmpButton.BringToFront;
end;
end;
Code language: Delphi (delphi)
Данная процедура не только отображает форму, но и активирует механизм навигатора, создавая нужные элементы пользовательского интерфейса. Для переключения форм с помощью кнопок навигатора используется процедура Form_Navigator_OnChange().
procedure Form_Navigator_OnChange (Sender: TObject);
// переключение видимости форм с помощью навигатора форм
var
tmpPC: TdbPageControl;
tmpTabSheet: TdbTabSheet;
tmpForm: TAForm;
begin
tmpPC := TdbPageControl( Sender ); // навигатор
tmpTabSheet := TdbTabSheet(tmpPC.ActivePage); // активная вкладка
tmpForm := App_GetFormByName( T_FORM + DeleteClassName(tmpTabSheet.Name) ); // ассоциированная форма
Form_ShowOnMainForm(tmpForm); // показать форму
end;
Code language: Delphi (delphi)
Другой дополнительной процедурой является Form_Navigator_btnClose_OnClick(), которая служит для закрытия формы и удаления кнопки управления окном из панели навигатора.
procedure Form_Navigator_btnClose_OnClick (Sender: TObject; var Cancel: boolean);
// закрытие формы и вкладки навигатора
var
tmpForm:TAForm;
tmpTabSheet: TdbTabSheet;
begin
CForm(Sender,tmpForm);
tmpForm.Hide;
FindC( MainForm ,T_TAB_SHEET+DeleteClassName(tmpForm.Name),tmpTabSheet,False);
if tmpTabSheet <> nil then
tmpTabSheet.Free;
end;
Code language: PHP (php)

Продолжение следует.