Alt+F6 - тип ссылки по умолчанию

Здесь обсуждается всё, что касается макросов.
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

Latest post of the previous page:

zg wrote: Wed 23 Sep, 2020 14:03может быть, потому что приоритет not выше, чем у ==?
Именно, спасибо.
Почему-то в экшне по ивенту не работает if Dlg.Id == far.Guids.HardSymLinkId then, хотя по хоткею та же самая строчка работает.
far.Message вообще валит фар в ивенте
buniak_a_h
Posts: 2254
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 134 times
Been thanked: 241 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by buniak_a_h »

Pasha_ZZZ wrote: Thu 24 Sep, 2020 04:54 far.Message вообще валит фар в ивенте
Попробуйте заменить "прямой" вызов far.Message на "отложенный" типа mf.postmacro(far.Message, …).
Last edited by buniak_a_h on Thu 24 Sep, 2020 05:09, edited 1 time in total.
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

buniak_a_h wrote: Thu 24 Sep, 2020 05:01Попробуйте заменить
Попробовал. Валится. После закрытия окна эксепшна и до того, как сам фар закроется, окошко видно, что появилось.
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

С кондишном разобрался, надо было win.Uuid(far.Guids.HardSymLinkId) использовать. Сдается мне, что Dlg из LuaMacro и Dlg = far.SendDlgMessage(Param.hDlg, F.DM_GETDIALOGINFO) - две большие разницы. А где про вторую почитать?
buniak_a_h
Posts: 2254
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 134 times
Been thanked: 241 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by buniak_a_h »

Pasha_ZZZ wrote: Thu 24 Sep, 2020 06:49 Dlg из LuaMacro и Dlg = far.SendDlgMessage(Param.hDlg, F.DM_GETDIALOGINFO) - две большие разницы
Есессно. Dlg из LuaMacro - это таблица, содержащая 8 полей, а Param.hDlg - хендлер диалога. Т.е. тот объект, который может выполнять метод send.
Меня, например, больше напрягает не второй, а первый. Пока все диалоги были модальными, вопросов не было. Но можно же открыть несколько немодальных диалогов - и какой из них отражает эта таблица? Тот, который в фокусе?
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

buniak_a_h wrote: Thu 24 Sep, 2020 08:03Param.hDlg
Я не про хендл, а про Dlg, который через этот хендл получается в вышеприведенном примере
buniak_a_h
Posts: 2254
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 134 times
Been thanked: 241 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by buniak_a_h »

Pasha_ZZZ, извините, зрение подвело. Dlg и hDlg спутал.
far.SendDlgMessage(Param.hDlg, F.DM_GETDIALOGINFO) возвращает таблицу {Id=… , Owner=…}
Не хочу заниматься саморекламой, но мне очень помогает мой скрипт - замена Active Help. Просто встаёте на DM_GETDIALOGINFO, жмёте Ctrl+F1 - и оп-ля - получаете описание структуры.
И да! Id - "внутренний" (16-байтовый) GUID диалога. Т.е. для сравнения с far.Guids его надо преобразовать во "внешний" (символьный) (win.Uuid(…)). Ну или наоборот …
Last edited by buniak_a_h on Thu 24 Sep, 2020 10:06, edited 2 times in total.
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

buniak_a_h wrote: Thu 24 Sep, 2020 10:01Ну или наоборот…
Я ж написал, что с этим я уже разобрался.
В LuaMacro Dlg я в цикле пробегался по всем Dlg Item'ам (1, Dlg.ItemCount) и проверял их на тип DI_COMBOBOX через GetValue.
Как подобное проделать через этот полученный Dlg и где его описание взять?
Last edited by Pasha_ZZZ on Thu 24 Sep, 2020 10:17, edited 1 time in total.
buniak_a_h
Posts: 2254
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 134 times
Been thanked: 241 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by buniak_a_h »

Pasha_ZZZ! У меня есть макрос, который выводит все итемы в виде, почти готовом для включения в LUA-скрипт (ну, чуть более читабельные). Так я разбирал стандартные диалоги и менял их (например, копирование на временную панель, когда она не открыта; вывод искомой строки в диалоге Alt+F7). Если напрямую не получится использовать, посмотрите как пример. Если я правильно понял, что Вас интересует…
Для работы требуется либо переназначить хоткеи, либо использовать MacroEx от jd. У меня по умолчанию забит AltF1-F1 (Alt и F1 дважды). Получается примерно такое:


Сам скрипт - во вложении
AreaInfo.7z
(18.36 KiB) Downloaded 10 times
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

Понял. Итерация до отсечки. Оригинально конечно, что кол-во элементов диалога нигде не запросить. Ну да ладно. Вот что получилось:

Code: Select all

local F = far.Flags
local HardSymLinkId = win.Uuid(far.Guids.HardSymLinkId)

Event {
  id = "834AF84F-D1AB-49B9-8E0E-09053BCB91DE";
  group = "DialogEvent";
  description = "Select symlink by default in Alt+F6 dialog";
  condition = function(Event, Param)
    local doact = false
    if Event==F.DE_DLGPROCINIT and Param.Msg==F.DN_INITDIALOG then
      local Dlg = Param.hDlg:send(F.DM_GETDIALOGINFO)
      doact = Dlg and Dlg.Id==HardSymLinkId
    end
    return doact 
  end;
  action = function(Event, Param)
    local CBID = 0
    for a = 1, math.huge do
      local Item = Param.hDlg:send("DM_GETDLGITEM", a)
      if not Item then break end
      if Item[1] == F.DI_COMBOBOX then
        if CBID == 0 then
          CBID = a
        else
          CBID = 0
          break
        end
      end
    end
    if CBID == 0 then
      far.Message("Must be exactly one ComboBox!", "Wrong dialog!")
    else
      Param.hDlg:send(F.DM_LISTSETCURPOS, CBID, {SelectPos=3})
    end
  end;
}
buniak_a_h wrote: Thu 24 Sep, 2020 10:48Сам скрипт - во вложении
У вас, кстати, цикл подсчета кол-ва элементов можно упразднить. Count особо и не нужен (а если нужен - можно посчитать сразу в основном цикле).
buniak_a_h
Posts: 2254
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 134 times
Been thanked: 241 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by buniak_a_h »

Pasha_ZZZ wrote: Thu 24 Sep, 2020 11:20 У вас, кстати, цикл подсчета кол-ва элементов можно упразднить. Count особо и не нужен (а если нужен - можно посчитать сразу в основном цикле).
Исторически сложилось. Я получал Count по Dlg.ItemCount - что-то там не срослось. Правда не для диалогов, а для меню (которые, как оказалось, тоже диалоги) Поэтому чтоб не ломать то, что уже работает, просто вычисляю Count и делаю цикл до него.
Last edited by buniak_a_h on Thu 24 Sep, 2020 11:54, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by zg »

Pasha_ZZZ wrote: Thu 24 Sep, 2020 06:15Валится. После закрытия окна эксепшна и до того, как сам фар закроется, окошко видно, что появилось.
я так понимаю, вы используете в обработчике событий диалогов безусловно far.Message. far.Message — это тоже диалог и для него тоже приходят события. заведите хотя бы глобальный флаг.
Pasha_ZZZ
Posts: 163
Joined: Mon 12 Jun, 2006 14:58
Been thanked: 3 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by Pasha_ZZZ »

zg wrote: Thu 24 Sep, 2020 14:22заведите хотя бы глобальный флаг.
Ясно.
А есть способ вывести инфу (это ж в основном для дебага нужно) куда-нибудь, без заморочек?
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 158 times
Contact:

Alt+F6 - тип ссылки по умолчанию

Post by zg »

win.OutputDebugString
Post Reply

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