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

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

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

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