Продолжение цикла статей “Производство”

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

Навигатор форм или оконный навигатор - механизм переключения между ранее открытыми окнами. 

Выглядит навигатор как кнопки или ярлыки вкладок многостраничника. Идеальным кандидатом на роль навигатора можно считать класс 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)

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *