Комбобокс с открытым списком

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

Выпадающий список реализован через меню, и я в курсе, что никакой работы с меню "официально" нет, но всё же заметил такую странность:

Если посылаю сообщение в открытый комбобокс, то реагирует на него и сам диалог.
Например, можно увидеть в диалоге создания папки, с открытым комбобоксом Link type.

Code: Select all

local F = far.Flags
Macro {
  area="Common"; key="F1"; flags="EnableOutput";
  action=function()
    local DM = F.DM_ENABLEREDRAW
    local w  = far.AdvControl(F.ACTL_GETWINDOWINFO)
    local c  = w.Id:send(DM,-1)
    local w1 = far.AdvControl(F.ACTL_GETWINDOWINFO,w.Pos-1)
    local c1 = w1.Id:send(DM,-1)
    far.Show(c,c1)
    w.Id:send(DM,0)
    c  = w.Id:send(DM,-1)
    c1 = w1.Id:send(DM,-1)
    w.Id:send(DM,1)
    far.Show(c,c1)
  end;
}
Здесь w это информация о текущем окне (открытом комбобоксе), а w1 - об окне под ним (о самом диалоге).
Макрос пытается запретить перерисовку списка.
При этом показывает значения счётчиков обоих окон до попытки, и после неё.

Можно увидеть, что сообщение в комбобокс действует и на сам диалог.

Для сравнения можно повторить тот же эксперимент открыв не комбобокс, а историю текстового поля (в этом же диалоге).
Можно увидеть, что в этом случае поведение другое: меняется только счётчик меню истории.

P.S.
А полез я туда по той причине, что не получается запретить перерисовку комбобокса, вместо этого запрещается перерисовка диалога.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

Так, кое-что проясняется

Code: Select all

zg 08.05.2016 13:27:59 +0200 - build 4665

1. уточнение 4638.1: макрообласть для комбобокса - "Dialog".

2. опубликован тип окна WTYPE_COMBOBOX. ACTL_GETWINDOWINFO в Id возвращает хэндл родительского диалога.
Нехорошо..
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Комбобокс с открытым списком

Post by zg »

John Doe wrote: Выпадающий список реализован через меню
нет.
John Doe wrote:Если посылаю сообщение в открытый комбобокс, то реагирует на него и сам диалог.
сравните значения w и w1 — должно стать очевидно, почему так.
John Doe wrote:Для сравнения можно повторить тот же эксперимент открыв не комбобокс, а историю текстового поля (в этом же диалоге).
Можно увидеть, что в этом случае поведение другое: меняется только счётчик меню истории.
потому что история реализована через меню. а комбобокс — нет.
John Doe wrote:P.S.
А полез я туда по той причине, что не получается запретить перерисовку комбобокса, вместо этого запрещается перерисовка диалога.
забыли адрес багтрекера? а если ещё будет макрос, просто и наглядно показывающий проблему, то можно рассчитывать на быстрое исправление.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Комбобокс с открытым списком

Post by zg »

John Doe wrote:Нехорошо..
что именно?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

Что нет возможности работать со списком посредством диалоговых функций.
И кстати у комбобокса TypeName почему-то Menu.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Комбобокс с открытым списком

Post by zg »

John Doe wrote: Что нет возможности работать со списком посредством диалоговых функций.
список — не диалог, как вы собираетесь работать с ним посредством диалоговых функций?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

zg wrote: забыли адрес багтрекера? а если ещё будет макрос, просто и наглядно показывающий проблему, то можно рассчитывать на быстрое исправление.
Проблема описана тут: http://forum.farmanager.com/viewtopic.p ... 48#p140448
Заключается в том, что если в момент GetUserScreen на экране был диалог, то он перерисовывает себя и на пользовательском экране (Desktop).
Пытался побороть запретом перерисовки, но споткнулся на комбобоксе.

Code: Select all

local F = far.Flags
local isDialog = {[F.WTYPE_DIALOG]=true,[F.WTYPE_VMENU]=true,[F.WTYPE_COMBOBOX]=true}
local function enableRedraw(arg)
  for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT) do
    local w = far.AdvControl(F.ACTL_GETWINDOWINFO,i)
    if isDialog[w.Type] then
      w.Id:send("DM_ENABLEREDRAW",arg)
    end
  end
end

Macro {
  area="Dialog Menu"; key="CtrlO";
  priority=60;
  action=function()
    enableRedraw(0)
    panel.GetUserScreen()
    mf.waitkey()
    panel.SetUserScreen()
    enableRedraw(1)
    far.AdvControl"ACTL_REDRAWALL"
  end;
}
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

zg wrote: список — не диалог, как вы собираетесь работать с ним посредством диалоговых функций?
Так же как и со всеми списками, например выпадающей историей текстового поля.
Например один из моих макросов убирает оттуда сепараторы.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Комбобокс с открытым списком

Post by zg »

в четвёртый и последний раз: комбобокс - это не диалог.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Комбобокс с открытым списком

Post by John Doe »

Уловил, спасибо.
Он стал самостоятельным окном, в Id хэндл, из чего я сделал поспешные выводы.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Комбобокс с открытым списком

Post by zg »

4776. [F.WTYPE_COMBOBOX]=true можно убрать.
Post Reply

Return to “Разработка плагинов”