DialogClass — модуль для работы с диалогами с стиле ООП

Здесь обсуждается всё, что касается макросов.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Модуль для работы с диалогами в стиле ООП.
  • Задание параметров диалога и элементов диалога в более нагладном виде - таблицами с именованными полями.
  • Вся работа с диалогом и элементами осуществляется вызовом соответствующих методов без непосредственного вызова far.SendDlgMessage и других функций из таблицы far.
  • Не требуется сохранять хендл диалога.
  • Нет необходимости считать вручную и где-то сохранять ID элементов. Элементы диалога имеют дополнительные поля, в том числе поле Name, позволяющее обращаться к элементам диалога по именам.
  • Специальные функции облегчают работу с созданием диалога "по строкам".
  • Дополнительные методы облегчат сохранение всех значений элементов в таблицу. И наоборот, заполнение значений элементов из таблицы.








Некоторые идеи честно стырены из исходников luafar4editor :)

DialogClass 1.15
Пример наследования классов: MultiPagesDialogClass
Last edited by Smitis on Mon 17 Jan, 2022 14:33, edited 1 time in total.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Небольшие доработки, без изменения функционала.
Вызов SendDlgMessage остался только один, все остальные - через методы.

Выявился один непонятный момент.
Получить значения полей диалога, в том числе изменённых, можно двумя способами.
1. Стандартный. Посылаем сообщение с нужным ID. Получаем значение. Работает пока диалог "жив" - до DialogFree. Так работает метод DialogClass:Save.
2. После закрытия диалога посмотреть соответствующие поля элементов диалога, [10] для текста, [6] для чекбоксов, и т.д. Как я понимаю, это уже фишка LuaFar. Но в данном случае (модуле DialogClass) такое не проходит. Значения не изменяются. Основное отличие класса DialogItems, содержащего все эти элементы диалога в метатаблице (это не таблица table). Скорее всего дело именно в этом, но ведь всё остальное работает. В чём тут дело?

Небольшой тестовый скрипт, диалог из макроса InsertMacro.
Создаётся разными способыми (меняется функция в макросе)
Разум когда-нибудь победит.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Shmuel »

Smitis wrote: 2. После закрытия диалога посмотреть соответствующие поля элементов диалога, [10] для текста, [6] для чекбоксов, и т.д. Как я понимаю, это уже фишка LuaFar. Но в данном случае (модуле DialogClass) такое не проходит. Значения не изменяются. Основное отличие класса DialogItems, содержащего все эти элементы диалога в метатаблице (это не таблица table). Скорее всего дело именно в этом, но ведь всё остальное работает. В чём тут дело?
В LuaFAR можете посмотреть, как это сделано (service.c:5773 - Lua, встроенный в Си) - значения тоже получаются до вызова DialogFree. Чудес не бывает.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Shmuel wrote:Чудес не бывает.
Значит бывают :)
В первом варианте InsertMacro1 все изменения в диалоге (поле описания, состояние чекбоксов) доступны уже ПОСЛЕ закрытия диалога. Разве ж только far.Dialog() не выполняет far.DialogFree(). Но тогда это уже больше на баг похоже.
Разум когда-нибудь победит.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Shmuel »

Ну я же вам указал, где посмотреть. Такое впечатление, что вы этого не сделали, а отвечаете.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Каюсь, сразу не посмотрел.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

v.0.03
В метод DialogClass:Init добавился первым параметр Opt, как и в конструкторе New. Надеюсь, больше ломки по параметрам не будет. Предполагается, что Opt будет либо строкой, где некоторые опции заданы буквами, либо таблицей параметров. На текущей момент только таблица, параметр один - Refresh, если истина, после DialogRun происходит считывание всех значений элементов обратно в Items вызовом соответственно добавленного метода Refresh. Наверное, стоит его зделать true по умолчанию, тогда вызов метода DialogClass:Open будет работать и как far.Dialog.
Или лучше вместо Refresh назвать Update? Или ещё как?

Также не нравится название метода Open. Open - это открыть. А тут открыть, потом закрыть... Может назвать его Call? В FarLua он far.Dialog. Но DialogClass:Dialog выгладит как-то масло-масляное.

Добавлен метод Copy. Работает, также, как Save, но не вызывая SendDlgMessage, а просто копируя значения из Items. Ну, типа, после Refresh можно вызвать вместо Save - Copy.

З.Ы.
Кто-нибудь делал на Lua наследование классов? Вроде оно понятно как делать... Хотя всё это как-то через одно место...
А то тут у меня основной класс DialogClass и два подчинённых DlgItem и DlgItems и если делать новые классы с новыми методами/перезагрузкой существующих с наследование от них всех... Что-то в мозгах стопорит :(
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by John Doe »

Smitis wrote:Кто-нибудь делал на Lua наследование классов?
http://lua-users.org/wiki/ObjectOrientedProgramming
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by HaRT »

Smitis wrote:Также не нравится название метода Open. Open - это открыть. А тут открыть, потом закрыть... Может назвать его Call? В FarLua он far.Dialog. Но DialogClass:Dialog выгладит как-то масло-масляное.
В некоторых библиотеках такое называется Exec, притом давным-давно.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Если бы было так просто. Если один класс, то да. А если несколько взаимосвязанных? Например, если создам новый DlgItemClassNew, наследник от старого, то и конструктор надо переделывать и DlgItemsClass новый...
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

v.1.00
Open перименован в Exec.
Плюс мелкие исправления.
В целом, всё рабочее.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

v.1.01
- Вместо таблицы Class, вызов модуля возвращает сами таблицы DialogClass, DlgItemClass и DlgItemsClass.
- Создание элемента диалога перенесено в метод AddItem, который теперь играет роль конструктора.
- AddItem теперь возвращает саму таблицу item.
- Хранение ссылки на DlgItemClass в самом объекте было не самым лучшим решением. Удалено.
Все изменения не изменяют основного функционала и предназначены, в основном, для лучшей возможности организации наследования классов в других модулях (пример в шапке).
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

Нда... Если не хранить ссылку на подчинённый DlgItemClass, то приходится перегружать AddItem. Поэтому потом опять сделаю хранение ссылки, только не с объектом, а в метатаблице. Тогда в производном классе можно будет как AddItem перегрузить, так и просто задать новый подчинённый класс в виде DialogClassNew.DlgItemClass = DlgItemClassNew и не трогать AddItem.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

v.1.02
В основном, некоторая внутренняя реорганизация без изменения функционала. Например, весь код добавления элемента диалога возвращён обратно в DlgItemsClass ибо незачем с, по сути, приватными полями работать извне класса.
- Объект DialogClass не содержит больше копию таблицы Opt.
- Подкорректирован пример наследования.
Разум когда-нибудь победит.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: DialogClass — модуль для работы с диалогами с стиле ООП

Post by Smitis »

v.1.03
- Исправлен I:GetListPos
- Добавлен метод I:Unchanged - управление состоянием "неизменённый" элемента диалога.
- Методы I:Show, I:Enable при отсутствии параметра теперь возвращают текущее состояние, не меняя его.
- I:Focus теперь возвращает логическое значение.
Разум когда-нибудь победит.
Post Reply

Return to “Обсуждение макросов”