Управление закладками форм

Готовые скрипты, модули расширений, динамические библиотеки и вспомогательные утилиты.
Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 15 мар 2020, 17:15

Действие запуска. Позволяет выполнить кастомные настройки закладок форм и расширить функционал
управления закладками.


(работает с версией DataExpress от 15.03.2020 и новее)

Изображение

Возможности и опции:
Изображение

Управление:
  • 1. Добавить пункт "Закрыть все" в меню закладок.
    Добавляет в меню закладок дополнительный пункт, нажатием на который можно закрыть все закладки (кроме добавленных в исключения)

    2. Закрытие нажатием колесика мыши
    Активирует возможность закрытия закладки указанным способом (закладки, добавленные в исключения - не закрываются).

    3. Разрешить перетаскивание
    Опция позволяет перетаскивать мышью закладки относительно друг друга.

    4. Запретить закрытие
    Блокирует от закрытия любым способом закладки указанные в списке.
Внешний вид:
  • 5. Высота закладки в пикселях
    Числовое значение высоты закладок (в пикселях). Установлено ограничение в диапазоне 16..64.

    6. Название шрифта
    Можно указать кастомный шрифт (он должен присутствовать в системе, в противном случае, а также при пустом значении - будет установлен шрифт по-умолчанию)

    7. Размер шрифта
    Устанавливает размер шрифта (при пустом значении - будет установлен шрифт по-умолчанию).

    8. Стиль шрифта:
    • Жирный
    • Наклонный
    • Подчеркнутый
    9. Иконки закладок/форм:
    Устанавливает выбранные из галереи иконки для закладки и окна формы редактирования (если установлен режим отображения "только таблица).
Код расширенияПоказать

Код: Выделить всё

{@module
author=Develop-Soft [ https://forum.develop-soft.ru ]
version=1.2
description=Кастомизация интерфейса
Действия:
1. Управление закладками форм

Изменения:
v 1.0 от 15.03.2020 - выход первой версии
v 1.1 от 17.03.2020 - устранены некоторые недоработки, добавлены улучшения
v 1.2 от 19.03.2020 - запрос на сохранение записи при закрытии закладок
@}

const
CloseTabB64 =
'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';

VK_LBUTTON = 1;

var TabCaptureEnabled,TabCaptured,TabWasMoved,AllowMBMiddleClose:boolean;
    MoveIndex,CaptureIndex,CurrentIndex:integer;
    old_MainWindow_Pages_OnChange,
    old_MainWindow_OnDataBaseClose,
    old_MainWindow_Pages_PopupMenu_OnPopup:TNotifyEvent;
    old_MainWindow_OnCreateForm:TCreateFormEvent;
    IconSet:TVariantArray2d;
    old_MainWindow_Pages_OnMouseDown,
    old_MainWindow_Pages_OnMouseUp:TMouseEvent;
    old_MainWindow_Pages_OnMouseMove:TMouseMoveEvent;

function GetAsyncKeyState(vKey:longint):smallint;
external 'GetAsyncKeyState@user32 stdcall';

function L_MB_Pressed:boolean;
begin
  result := (GetAsyncKeyState(VK_LBUTTON)<0);
end;

function DissallowPageClose(Index:integer):boolean;
var Form:TdxForm;
begin
 Form := MainWindow.FormViews[Index].Form;
 result := (MainWindow.Params.ParamExists('DenyClose_'+Form.FormCaption));
 Form:=nil;
end;

function CloseTabMnu:TMenuItem;
begin
 result:=TMenuItem(MainWindow.FindComponent('MainFr').
 FindComponent('CloseTabMnu'));
end;

function CloseAllTabMnu:TMenuItem;
begin
 result:=TMenuItem(MainWindow.Pages.PopupMenu.FindComponent('CloseAllTabMnu'));
end;

procedure CloseAll(Sender: TObject);
var PageCount:integer;
begin
  PageCount:=MainWindow.Pages.PageCount;
  while PageCount>0 do
  begin
  if not DissallowPageClose(PageCount-1) then
   MainWindow.Pages.OnCloseTabClicked(MainWindow.Pages.Pages[PageCount-1])
  else
    begin
      dec(PageCount);
      Continue;
    end;
  dec(PageCount);
  end;
end;

procedure MD(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if old_MainWindow_Pages_OnMouseDown<>nil then
     old_MainWindow_Pages_OnMouseDown(Sender,Button,Shift,X,Y);
  TabCaptured:=true;
  CaptureIndex:=MainWindow.Pages.IndexOfPageAt(X,Y);
end;

procedure MU(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if old_MainWindow_Pages_OnMouseUp<>nil then
    old_MainWindow_Pages_OnMouseUp(Sender,Button,Shift,X,Y);
try
  if Button = mbMiddle then
  if AllowMBMiddleClose then
  if not DissallowPageClose(CurrentIndex) then
  MainWindow.DestroyPage(MainWindow.Pages.Pages[MainWindow.Pages.IndexOfPageAt(X,Y)]);

  if Button = mbLeft then
  begin
    if not TabCaptured then exit;
    if not TabWasMoved then exit;
    MainWindow.Pages.Pages[CaptureIndex].PageIndex:=MoveIndex;
    TabWasMoved:=false;
  end;
except
finally
   MainWindow.Pages.Cursor:=crDefault;
   TabCaptured:=false;
end;
end;

procedure MM(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if old_MainWindow_Pages_OnMouseMove<>nil then
  old_MainWindow_Pages_OnMouseMove(Sender,Shift,X,Y);
  CurrentIndex := MainWindow.Pages.IndexOfPageAt(X,Y);
  if not L_MB_Pressed then
  begin
    TabCaptured:=false;
    TabWasMoved:=false;
    MainWindow.Pages.Cursor:=crDefault;
    exit;
  end;

  if TabCaptureEnabled then
  begin
    TabWasMoved:=true;
    MoveIndex := CurrentIndex;
    MainWindow.Pages.Cursor:=crMultiDrag;
  end;
end;

procedure SetEditWinowIcon(Sender: TObject);
  var Bm:TBitMap;
begin
  if (TEditWindow(Sender).Form.Params['IconIndex']=null) then exit;
  if (TEditWindow(Sender).Form.Params['IconIndex']<0) then exit;
  Bm := TBitMap.Create;
    MainWindow.Pages.Images.GetBitmap(TEditWindow(Sender).Form.Params['IconIndex'],Bm);
    TEditWindow(Sender).Icon.Assign(Bm);
  Bm.Free;
end;

procedure AssignIcons(Sender: TObject);
var i:integer;
    Fm:TdxForm;
begin
 for i:=0 to MainWindow.Pages.Pagecount-1 do
 begin
     try
       if MainWindow.Pages.Pages[i].ImageIndex >-1 then Continue;
       Fm:=TdxForm(MainWindow.FormViews[i].Form);
       MainWindow.Pages.Pages[i].ImageIndex:=Fm.Params['IconIndex'];
       if old_MainWindow_Pages_OnChange<>nil then old_MainWindow_Pages_OnChange(Sender);
       if Fm.EditWindow<>nil then
       SetEditWinowIcon(Fm.EditWindow);
     finally
       Fm:=nil;
     end;
 end;
end;

procedure MainWindow_OnCreateForm(Sender: TObject; Form: TdxForm);
var i:integer;
begin
  if old_MainWindow_OnCreateForm<>nil then old_MainWindow_OnCreateForm(Sender,Form);
  Form.Params['IconIndex'] := -1;
  for i:=0 to length(IconSet)-1 do
  begin
   if IconSet[i][0] = Form.FormCaption then
   Form.Params['IconIndex']:=MainWindow.Pages.Images.AddImage(IconSet[i][1]);
  end;
 // Наверное это временно...
 MainWindow.FormViews[MainWindow.Pages.PageCount-1].OnChangeBounds:=@AssignIcons;
 Form.OnAfterOpen:=@AssignIcons;
end;

procedure MainWindow_Pages_PopupMenu_OnPopup(Sender: TObject);
var i:integer;
begin
if old_MainWindow_Pages_PopupMenu_OnPopup <> nil then
old_MainWindow_Pages_PopupMenu_OnPopup(Sender);
CloseTabMnu.Enabled := not DissallowPageClose(CurrentIndex);
if CloseAllTabMnu<>nil then
  begin
  CloseAllTabMnu.Enabled:=false;
    for i:=0 to MainWindow.Pages.PageCount-1 do
      begin
      if not DissallowPageClose(i) then
          begin
            CloseAllTabMnu.Enabled:=true;
            break;
          end;
      end;
  end;
end;

procedure MainWindow_OnDataBaseClose(Sender: TObject);
var i:integer;
begin
MainWindow.Params.Clear;
for i:=0 to length(IconSet)-1 do
begin
  IconSet[i][0]:=#0;
  IconSet[i][1]:=#0;
end;
SetArrayLength(IconSet,0);
if old_MainWindow_OnDataBaseClose<>nil then
old_MainWindow_OnDataBaseClose(Sender);
end;

{@action
Id=B905EC8F-0113-4E1F-A412-B37396D4266F
Target=main
OrigName=TunePages
Name=Управление закладками форм
Group=Кастомизация интерфейса
UI=<ui>
<divider/>
<checkbox name="ActionEnabled" caption="Действие включено" defaultvalue=1/>

<divider caption="УПРАВЛЕНИЕ ЗАКЛАДКАМИ ФОРМ"/>
<checkbox name="pmcloseall"
caption="Добавить пункт &quot;Закрыть все&quot; в меню закладок" defaultvalue=1/>
<checkbox name="mmbclose"
caption="Закрытие нажатием колесика мыши" defaultvalue=1/>
<checkbox name="movepages"
caption="Разрешить перетаскивание" defaultvalue=1/>
<grid name="DenyClose" caption="Запретить закрытие:" height=100>
<form name="fm_DenyClose"/>
</grid>
<divider caption="ВНЕШНИЙ ВИД ЗАКЛАДОК ФОРМ"/>
<number name="TabHeight" caption="Высота закладки в пикселях (16..64):"/>
<text name="TabFontName" caption="Название шрифта:"/>
<number name="TabFontSize" caption="Размер шрифта:"/>
<checkbox name="Bold" caption="Жирный"/>
<checkbox name="Italic" caption="Наклонный"/>
<checkbox name="UnderLine" caption="Подчеркнутый"/>

<grid name="options" caption="Иконки закладок/форм:">
  <form name="fm" caption="Форма"/>
  <image name="color" caption="Иконка"/>
</grid>
<divider/><divider/><divider/>
</ui>
Description=
<b>Позволяет выполнить кастомные настройки закладок форм и расширить функционал
управления закладками.</b><br><br>
<b>Управление:</b><br><br><ul><li><b>Добавить пункт "Закрыть все" в меню
закладок.</b><br>Добавляет в меню закладок дополнительный пункт, нажатием на
который можно закрыть все закладки (кроме добавленных в исключения)<br><br></li>
<li><b>Закрытие нажатием колесика мыши</b><br>Активирует возможность закрытия
закладки указанным способом (закладки, добавленные в исключения - не
закрываются).<br><br></li><li><b>Разрешить перетаскивание</b><br>Опция позволяет
 перетаскивать мышью закладки относительно друг друга.<br><br></li>
<li><b>Запретить закрытие</b><br>Блокирует от закрытия любым способом закладки,
 указанные в списке.<br><br> </li></ul><b>Внешний вид:</b><br><br><ul><li><b>
 Высота закладки в пикселях</b><br>Числовое значение высоты закладок (в
 пикселях). Установлено ограничение в диапазоне 16..64.<br><br></li><li><b>
 Название шрифта</b><br>Можно указать кастомный шрифт (он должен присутствовать
 в системе, в противном случае, а также при пустом значении - будет установлен
 шрифт по-умолчанию)<br><br></li><li><b>Размер шрифта</b><br>Устанавливает
 размер шрифта (при пустом значении - будет установлен шрифт по-умолчанию).
 <br><br></li><li><b>Стиль шрифта:</b><br> <br> </li><ul><li><b>Жирный</b></li>
<li><i>Наклонный</i></li><li><u>Подчеркнутый<br><br></u></li></ul><li><b>Иконки
закладок/форм:</b><br>Устанавливает выбранные из галереи иконки для закладки и
окна формы редактирования (если установлен режим отображения "только таблица).
<br><br><br><br></li></ul>
@}

procedure TunePages(
    ActionEnabled,
    Cb_PMCloseAll,
    Cb_MMBClose,
    Cb_MovePages:integer;
    DenyClose:TVariantArray2d;
    TabHeight:integer;
    TabFontName:string;
    TabFontSize,
    Bold,
    Italic,
    UnderLine:integer;
    P_Options:TVariantArray2d

);
var Mi:TMenuItem;
    IL,MP_IL:TimageList;
    SS:TStringStream;
    i:integer;
begin
  if ActionEnabled<>1 then exit;
  if MainWindow.Params['TunePages']<>null then
   begin
     MsgBox(' ','Обнаружено неоднократное подключение действия '+
     '"Управление закладками форм".')
     exit;
   end;
  MainWindow.Params['TunePages']:=1;

  old_MainWindow_OnDataBaseClose :=  MainWindow.OnDataBaseClose;
  MainWindow.OnDataBaseClose:=@MainWindow_OnDataBaseClose;

  old_MainWindow_Pages_PopupMenu_OnPopup := MainWindow.Pages.PopupMenu.OnPopup;
  MainWindow.Pages.PopupMenu.OnPopup := @MainWindow_Pages_PopupMenu_OnPopup;


if Cb_PMCloseAll=1 then
  begin
    Mi:=TMenuItem.Create(MainWindow.Pages.PopupMenu);
    Mi.Caption:='Закрыть все';
    Mi.Name := 'CloseAllTabMnu';
    SS:=TStringStream.Create(DecodeBase64(CloseTabB64,false));
    IL:=TimageList.Create(MainWindow.Pages.PopupMenu);
    MainWindow.Pages.PopupMenu.Images:=IL;
    Mi.ImageIndex:=MainWindow.Pages.PopupMenu.Images.AddFromStream(SS);
    SS.Free;
    Mi.OnClick:=@CloseAll;
    MainWindow.Pages.PopupMenu.Items.Add(Mi);
  end;

if Cb_MovePages=1 then
  begin
    old_MainWindow_Pages_OnMouseDown:=MainWindow.Pages.OnMouseDown;
    MainWindow.Pages.OnMouseDown:=@MD;
    old_MainWindow_Pages_OnMouseUp:=MainWindow.Pages.OnMouseUp;
    MainWindow.Pages.OnMouseUp:=@MU;
    TabCaptureEnabled := true;
  end;

AllowMBMiddleClose := (Cb_MMBClose = 1);

if (TabHeight>=16) and (TabHeight<=64) then
SetPropValue(MainWindow.Pages,'TabHeight',TabHeight);

with MainWindow.Pages.Font do
begin
  if Trim(TabFontName)<>'' then Name := TabFontName;
  if TabFontSize>0 then Size := TabFontSize;
  if Bold=1 then Style := Style + [fsBold];
  if Italic=1 then Style := Style + [fsItalic];
  if Underline=1 then Style := Style + [fsUnderline];
end;

  old_MainWindow_OnCreateForm := MainWindow.OnCreateForm;
  MainWindow.OnCreateForm:=@MainWindow_OnCreateForm;

  MP_IL:=TimageList.Create(MainWindow.Pages);
  MainWindow.Pages.Images:=MP_IL;
  IconSet :=  P_Options;
  if length(DenyClose)>0 then
  begin
  for i:=0 to length(DenyClose)-1 do
    if trim(DenyClose[i][0]) <> '' then
    MainWindow.Params['DenyClose_'+DenyClose[i][0]]:=1;
  end;
    old_MainWindow_Pages_OnMouseMove:=MainWindow.Pages.OnMouseMove;
    MainWindow.Pages.OnMouseMove:=@MM;
end;


Скачать:
Управление закладками форм v1.2.epas
Добавлен запрос сохранения
(17.03 КБ) 91 скачивание
Архив версийПоказать
Управление закладками форм v1.1.epas
17.03.2020 - исправления, улучшения.
(16.97 КБ) 45 скачиваний


Демо


Поддержка проекта

Теги:

Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 17 мар 2020, 14:03

v.1.1 от 17.03.2020 - внес некоторые исправления (не срабатывали опции в различных вариациях, вернул обработчики), мелкие улучшения (отключаются все пункты меню закладок, если не встретились закладки, разрешенные к закрытию)

Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 19 мар 2020, 14:53

v.1.2 от 19.03.2020 - добавлен корректный запрос сохранения при закрытии закладки (для диалога используется стоковая настройка в форме).

При "Закрыть все", если ответ на запрос "Да" или "Нет", выполняется соответсвующее действие и продолжается закрытие всех закладок форм, при ответе "Отмена" - закрытие закладок выполняется в обход текущей.

Аватара пользователя
Morozbl4
Сообщения: 10
Зарегистрирован: 19 дек 2019, 10:39

Управление закладками форм

Сообщение Morozbl4 » 19 мар 2020, 15:05

Прекрасно!
А реально подобное сделать для компонента "Закладки"?

Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 19 мар 2020, 15:39

Возможно... Вопрос - что (и зачем) туда пихать?:
...
1. Добавить пункт "Закрыть все" в меню закладок.
2. Закрытие нажатием колесика мыши
3. Разрешить перетаскивание
4. Запретить закрытие
5. Высота закладки в пикселях
6. Название шрифта
7. Размер шрифта
8. Стиль шрифта:
9. Иконки закладок
...
иное..?

Аватара пользователя
Morozbl4
Сообщения: 10
Зарегистрирован: 19 дек 2019, 10:39

Управление закладками форм

Сообщение Morozbl4 » 19 мар 2020, 15:54

Владимир писал(а):
19 мар 2020, 15:39
9. Иконки закладок
:-)

Аватара пользователя
SirWolf
Сообщения: 23
Зарегистрирован: 10 фев 2018, 21:24

Управление закладками форм

Сообщение SirWolf » 19 мар 2020, 16:28

Обновлять нужные вкладки при переходе (возврате) на нее.

Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 19 мар 2020, 18:05

Обновлять каждый раз при входе - чересчур дерзкая операция, которая может просадить навигацию (ибо скорее всего речь о DB-функциях) + создать условие для обновления будет не очень просто для потребителя. Для этих целей я вижу другое расширение со своей отдельной логикой.

Аватара пользователя
Morozbl4
Сообщения: 10
Зарегистрирован: 19 дек 2019, 10:39

Управление закладками форм

Сообщение Morozbl4 » 20 мар 2020, 15:57

Ошибка выскакивать начала(((
Вложения
Безымянный.jpg
Безымянный.jpg (17.43 КБ) 933 просмотра

Аватара пользователя
Владимир
Администратор
Сообщения: 662
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

Управление закладками форм

Сообщение Владимир » 20 мар 2020, 16:48

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

Ответить