Страница 152 из 243

Добавлено: Сб ноя 16, 2024 00:18
Orion9
Возможно, тема фона панелей не такая важная и актуальная для многих, но я подумал, что она может быть использована в качестве хорошего примера применения функций Autorun - старых и новых. Поэтому я добавил к скрипту довольно много комментариев, чтобы они лучше демонстрировали и поясняли функционал (для тех, кто не так сильно в теме, но хочет ее лучше изучить). Надеюсь, кому-нибудь пригодится.

[cut="Backdrop.aucfg"]

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

# Ctrl+Shift+"+" 	- 	Повышение тонов
# Ctrl+Shift+"-" 	- 	Понижение тонов
# Ctrl+"+" 		- 	Автоповышение тонов
# Ctrl+"-" 		- 	Автопонижение тонов
# ESC 			- 	Выход из автоперебора
# Alt+"+" 		- 	Показ текущих значений

Pragma IncludeOnce

Global Pulsar = 0, BACKDROP_THREAD = 0, BackColor1 = 0, BackColor2 = 0, Previous1 = 0, Previous2 = 0

# повышение/понижение тонов
SetHotkeyAction /K:C /K:S /V:187 /R /DM SetBackGround 1
SetHotkeyAction /K:C /K:S /V:189 /R /DM SetBackGround 2

# авто
SetHotkeyAction /K:C /V:187 SetPulsar 1
SetHotkeyAction /K:C /V:189 SetPulsar 2

# показать текущие значения
SetHotkeyAction /K:A /V:187 ShowBackColor 1000

# регистрация команды для вызова из кнопки (пункта меню)
RegisterCommand 70001 "AutoBackdrop"

# прием сообщения окну установить значения фона
SetMessageAction /P "BackColorsMessage" SetBackColors

# значения фона при старте ТС
if BackColor1 = 0 or BackColor2 = 0 then
   IniRead /R BackColor1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R BackColor2 %COMMANDER_INI% "Colors" "BackColor2" -1
endif
  
Func AutoBackdrop(lParam)

   # удержание Ctrl+Shift
   # повышение тона на одну единицу после нажатия
   # на кнопку, выбора пункта меню или вызова другим способом
   If IsPressed (0x10) And IsPressed (0x11) Then Return SetBackGround(1)
   
   # удержание Ctrl
   # понижние тона на одну единицу
   If IsPressed (0x11) Then Return SetBackGround(2)
   
   # удержание Alt+Win
   # вернуть предыдущий фон
   If IsPressed (0x12) And IsPressed (0x5B) Then
      if Previous1 > 0 or Previous2 > 0 then WriteBackground(Previous1, Previous2)
      Return 
   endif
   
   # удержание Alt
   # вернуть первоначальный фон TC
   If IsPressed (0x12) Then Return WriteBackground(BackColor1, BackColor2)
   
   # удержание Shift
   # показ текущих значений фона
   If IsPressed (0x10) Then Return ShowBackColor()
   
   # поток уже запущен
   if BACKDROP_THREAD > 0 then
      BACKDROP_THREAD = 0
   else
      BACKDROP_THREAD = 1
      RunThread ThreadBackdrop
#      SetHintParam("ShowHint", "Font", 11, "Consolas")
      SetHintParam("ShowHint", "Font", 10, "Tahoma")
      SetHintParam("ShowHint", "BackColor", 0x000000)
      SetHintParam("ShowHint", "Text", 0xFFFFFF)
      #SetHintParam("ShowHint", "Border", 0xFFFFFF)       
      ShowHint("Отслеживание значений запущено." & auLF & "Значения в ColorMania / буфере будут применятся к фону панелей.")
      Sleep(2000)
      WinSetState(23)
      SetHintParam("ShowHint", "Reload")      
   endif
   		
EndFunc

Func SetBackColors(hWnd, uMsg, wParam, lParam)

     WriteBackground(wParam, lParam)
     
EndFunc

# запись значений, обновление панелей
Func WriteBackground(Color1, Color2)
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor" %Color1%
     IniWrite /R %COMMANDER_INI% "Colors" "BackColor2" %Color2%
     SendCommand 2957
     SendCommand 2957
EndFunc

Func ThreadBackdrop()
Local h = 0, max = 1*255 + 256*255 + 65536*255, clip, last = 0, w = 0, source

   # предыдущие значения фона
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1

   While BACKDROP_THREAD = 1
       
       h = WinFind(0, "TfrmColorPick")
       if h > 0 then
          # текст из ColorMania       
          clip = WinGetText(WinFind(h, "TEdit", 1))
          source = "ColorMania"
       else
          # первая строка в буфере 
          clip = StrPart(ClipGet(), auLF, 1)
          source = "Clipboard"            
       endif
          
       if IsInt(clip) then
          # новое число в диапазоне
          if clip >= 0 and clip <= max and not (clip = last) then
          
             WinSetText("Applying background value: " & clip)
             
             WriteBackground(clip, clip)
             
             w = w + 1
             last = clip
             Sleep(400)

          endif
       endif
       
       Sleep(250)
       WinSetText("Backdrop thread is watching for " & source & " values ...")
       
   Wend
   BACKDROP_THREAD = 0
   WinSetText("")
   SetHintParam("ShowHint", "Font", 10, "Tahoma")
   SetHintParam("ShowHint", "BackColor", 0x000000)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)   
   ShowHint("Отслеживание остановлено" & auLF & "Применений фона: " & w)
   Sleep(2000)
   WinSetState(23)
   SetHintParam("ShowHint", "Reload")   
EndFunc

Func SetBackGround(nParam)
Local bkg1, bkg2, max = 1*255 + 256*255 + 65536*255

   # при автоизменении потолок чуть меньше
   # попытка предотвратить переход в серые тона   
   if Pulsar = 1 then max = 1*245 + 256*245 + 65536*245
       
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   If Not IsInt(bkg1) Or Not IsInt(bkg2) Then
      MsgBox("Нечисловые значения цвета фона: " _ 
              & auLF & auLF & "BackColor=" & bkg1 & auLF & "BackColor2=" & bkg2 _
              & auLF & auLF & "ESC - Отмена операции")
      Return
   Endif
   
   if bkg1 = -1 then bkg1 = max
   if bkg2 = -1 then bkg2 = max
   
   if nParam = 1 then
      bkg1 = bkg1 + 1 + 256 + 65536
      bkg2 = bkg2 + 1 + 256 + 65536      
   else
      bkg1 = bkg1 - 1 - 256 - 65536
      bkg2 = bkg2 - 1 - 256 - 65536      
   endif
   
   if bkg1 > max then bkg1 = bkg1 - 1 - 256 - 65536
   if bkg2 > max then bkg2 = bkg2 - 1 - 256 - 65536
   
   if bkg1 < -1 then bkg1 = max 
   if bkg2 < -1 then bkg2 = max
   
   WriteBackground(bkg1, bkg2)

EndFunc

Func SetPulsar(nParam)
local a, b, s, l
static t = 0
   
   if Pulsar = 1 then 
      Pulsar = 0
      Return
   endif
   
    Pulsar = 1
   
   if nParam = 1 then 
      a = 1
      b = 2
      s = 1
   else
      a = 2
      b = 1
      s = -1
   endif
   
   IniRead /R Previous1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R Previous2 %COMMANDER_INI% "Colors" "BackColor2" -1
  
   While Pulsar = 1
   
      For j = a To b step s
      
         For i = 1 To 75
             
             SetBackGround(j)
             Sleep(25)
             l = l + 1
             t = t + 1
             
             if Pulsar = 0 then Break
             
             If IsPressed (0x1B) Then
                Pulsar = 0
                Break
             Endif
             
         Next
         
         if Pulsar = 0 then Break
      Next
      
   Wend
   # показать статистику, если выход по ESC
   If IsPressed (0x1B) Then
      ShowHint("Изменений тонов: " & l & auCRLF & "Всего изменений: " & t)
   Endif    
EndFunc 

Func ShowBackColor(lDelay = 300)
Local txt, bkg1, bkg2, max = 1*255 + 256*255 + 65536*255
       
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1
   
   if bkg1 = -1 then bkg1 = max
   if bkg2 = -1 then bkg2 = max

   # обратный расчет
   blue = floor(bkg1/65536)
   green = bkg1 - (blue * 65536)
   green = floor(green/256)
   red = bkg1 - (blue * 65536) - (green * 256)
   
   txt = "Фон 1" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg1
   txt = txt & auLF & "" & auLF
   
   blue = floor(bkg2/65536)
   green = bkg2 - (blue * 65536)
   green = floor(green/256)
   red = bkg2 - (blue * 65536) - (green * 256)
   
   txt = txt & "Фон 2" & auLF & "Красный: " & red & auLF & "Зелёный: " & green & auLF & "Синий: " & blue & auLF & "Значение: " & bkg2
   ShowHint(txt)
EndFunc
[/cut]
[cut]

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

TOTALCMD#BAR#DATA
70001

%COMMANDER_EXE%
Запустить/Оствновить|Отслеживание цвета фона| |Ctrl - Понижение тонов|Ctrl+Shift - Повышение тонов|Alt - Вернуть первоначальный|Alt+Win - Вернуть предыдущий| |Shift - Показать значения


70001
[/cut]
[cut]

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
/u- /ef "msg(regmsg(BackColorsMessage), 9211020, 9211020)"
%COMMANDER_EXE%
Установить фон через параметры сообщения


-1
[/cut]
Файл конфигурации и две кнопки. Первая кнопка запускает поток, который ищет окно ColorMania и считывает с него значение в формате цвета ТС (Powerbuilder), которое тут же применяет к фону ТС. Если окно ColorMania не найдено, то значение фона считывается из буфера, если оно там есть.

Поддерживаются только числовые значения цвета (ТС может хранить и HEX-формате).

Вторая кнопка посылает окну ТС цветовые значения. Можно сделать несколько таких кнопок при желании. Удобно, если нужно вернуться к своему родному заранее известному цвету.

Добавлено: Сб ноя 16, 2024 10:40
Orion9
sa писал(а):
Monarch-LFV писал(а):переделал на 4193 - проблема ушла.
А курсор тоже улетает вниз или остаётся в начале файла (как у меня)?
Кажется, понял в чём прикол. Если вставляемый текст умещается на одной странице, то он действительно вставляется за курсором. Но если текста много и он занимет несколько страниц, то курсор улетает вниз.

Loopback
Забыл вчера написать: кажется, нашел неполадки с SetHintParam("ShowHint", "Border", 0xFFFFFF). При применении стиля к рамке, подсказка вообще не показывается (вернее показывается какая-то точка на экране вместо неё).

Добавлено: Сб ноя 16, 2024 11:27
Loopback
Orion9 писал(а):Но если это действительно так просто, почему бы не дополнить функционал такой функцией?
Вот именно по причине простоты.

За редкими исключениями нативно функции добавляются в двух случаях: если её нельзя реализовать имеющимися скриптовыми средствами, либо если её скорость работы критична и нативное решение будет значительно быстрее. Тут явно ни один из двух случаев.

Со временем, надеюсь, появится некая библиотека полезных готовых решений, в том числе для таких функций.
Orion9 писал(а):кажется, нашел неполадки с SetHintParam("ShowHint", "Border", 0xFFFFFF).
Посмотрю, как появится возможность.

PS: Я правильно понял, что проблема с буфером обмена была при вставке в AkelPad, а не проблемой в ClipPut?

Добавлено: Сб ноя 16, 2024 11:49
Orion9
Loopback писал(а):Со временем, надеюсь, появится некая библиотека полезных готовых решений, в том числе для таких функций.
Можно пока в справку добавить примеры для расчета разницы между датами. Сейчас это нет так очевидно, хотя и говорится, что над ними можно выполнять арифметические операции.
Loopback писал(а):PS: Я правильно понял, что проблема с буфером обмена была при вставке в AkelPad, а не проблемой в ClipPut?
Всё так. Просто у AkelPad есть несколько команд для вставки текста. Я, не разобравшись, по ошибке использовал команду для вставки текста как ANSI - в результате русские буквы превратились в знаки вопроса.

Добавлено: Сб ноя 16, 2024 12:16
sa
Orion9 писал(а):Но если текста много и он занимет несколько страниц, то курсор улетает вниз
Вставлял буфер из примерно 4 500 строк (имена файлов в Windows\System32) - курсор не улетел.
Что-то другое влияет.

Добавлено: Сб ноя 16, 2024 13:25
Orion9
sa
Какая у вас версия? У меня стандартная давнишняя 4.9.8 (x86).

Добавлено: Сб ноя 16, 2024 13:32
sa
Orion9
У меня ещё более старая 4.9.6 (×86).
Если не путаю: просто сейчас не за компьютером.

Добавлено: Сб ноя 16, 2024 15:34
Monarch-LFV
sa, Orion9
У меня новая 4.9.9.
Если в акелпаде прописать команду на панели меню:

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

"" Command(4193) Icon(37) # Вставка
то курсор вроде остается вначале текста. Но раз на раз не приходится. Похоже, действительно, зависит от размера текста в буфере - при большом куске текста - улетает вниз. И если запускать новую копию программы с данным параметром, то курсор всегда улетает вниз. Похоже не хватает какой-то задержки на выполнение в коде. Как-то так.

Добавлено: Сб ноя 16, 2024 19:38
Orion9
Monarch-LFV
Для меня AkelPad - тёмный лес, лезть в него без необходимости не хочется. Там, конечно, много разного функционала и можно всё подстроить по себя, но где бы еще времени столько найти и желания )

Проблему решил двух-строчным скриптом (хотя потратил на него почти два часа) :mrgreen:

%COMMANDER_PATH%\Utilites\AkelPad\AkelFiles\Plugs\Scripts\GoHome.vbs

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

Set WshShell=CreateObject("WScript.shell")

WshShell.SendKeys("^{HOME}")
autorun.cfg

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

h = WinFind(0, "AkelPad4")
if h > 0 then
   ShellExec /SW_SHOWNORMAL %AKELP% '/Command(4101) /Command(4155) /Call("Scripts::Main", 1, "GoHome.vbs")'
else 
   ShellExec /SW_SHOWNORMAL %AKELP% '/Command(4155) /Call("Scripts::Main", 1, "GoHome.vbs")'
endif      
P.S.
Надеялся, что в AkelPad есть какая-то своя внутренняя команда для этого.

Добавлено спустя 1 час 45 минут:

А тем временем, добил я справку. Да! Раз уж взялся, решил, что надо теперь читать до конца.)

Эх, вернуть бы те времена, [s]когда деревья были большими[/s] когда компьютеры были большими, а "баги" настоящими и живыми - глядишь, может чё и понял из того, что делают битовые операции в новых оконных функциях :mrgreen:

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

Из классного нового функционала, безусловно нужно отметить объекты, дополнительные поля и куча новых функций для работы с файлами, окнами, временем/датами, буфером и т.д. Это ведь уже практически полноценный скриптовый язык! Осталось только DllCall сделать к WinAPI :mrgreen:

[cut]Круть! ♥️[/cut]

Добавлено: Вс ноя 17, 2024 00:17
Orion9
Каникулы на носу... Т.ч. принес вам еще немного подарков :lol:

В общем, просто небольшая демонстрация новых фич, чтобы они не затерялись между страницами толстой справки.)

Объект Plugin, вытягивание данных из wdx-плагинов. Теперь это делается легко и просто, без нужды использования консольных утилит. Соответственно, скорость такого вызова тоже выше. Пример альтернативной подсказки:

[cut]

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

ControlSetMouseAction /L /K:C 3 PanelsHint

Func PanelsHint
Local sPath, sName, sFile, hint, streams, links

    sPath = RequestCopyDataInfo("SP")
    sName = RequestCopyDataInfo("SN")
    sFile = sPath & sName
    
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       Return 
    Endif
    
   If StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Каталог")
       Return 
    Endif
   
   obj = Plugin("NTFSFileStreams")
   if ERROR = 0 then
      obj.FileName = sFile
      streams = StrFormat("%.0f", obj.GetValue(1))
      If streams > 0 then 
         hint = "Потоков: " & streams & auCRLF
         hint = hint & "Имена потоков: " & obj.GetValue(3) & auCRLF
         hint = hint & "Размер потоков: " & SizeFormat(obj.GetValue(5), 1, "K", 2) 
      Else
         hint = "Нет потоков"
      Endif           
      Free(obj)
   else
      hint = "Error " & ERROR
   endif
   
   obj = Plugin("NTLinks")
   if ERROR = 0 then
      obj.FileName = sFile
      links = StrFormat("%.0f", obj.GetValue(0))
      hint  = hint & auCRLF & "Жестких ссылок: " & links      
      If links > 1 then 
         hint = hint  & auCRLF & StrReplace(obj.GetValue(7), ", ", auCRLF)
      Endif   
      Free(obj)
   else
      hint = hint & auCRLF & "Error " & ERROR
   endif
   
   ShowHint(hint)
EndFunc

[/cut]
Здесь задействовано только два плагина, но тему можно развивать и развивать.

Дополнительные колонки в стиле плагина Super_WDX. Только костяк, но тему тоже можно развивать и развивать:

[cut]

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

Pragma AutorunPluginFields "SuperWdx:::GetWdxValue" 

Func GetWdxValue(FileName, FieldIndex, UnitIndex)
Local ext_pos, file_ext

Local video_ext = ".mp4 .mkv .avi", _
      audio_ext = ".mp3 .flac .m4a", _
      picture_ext = ".jpg .bmp .gif .png", _
      archive_ext = ".7z .rar .zip .cab"     

     If StrPos(FileGetAttr(FileName), "D") Then
        Return "<Dir>"
     Endif
     
     ext_pos = StrPos(FileName, '.', -1)
     
     if ext_pos > 0 Then
     
        file_ext = StrMid(FileName, ext_pos+1, StrLen(FileName)-ext_pos)
        
        If StrPos(video_ext, '.' & file_ext) Then Return "Video"
        
        If StrPos(audio_ext, '.' & file_ext) Then Return "Audio"
        
        If StrPos(picture_ext, '.' & file_ext) Then Return "Picture"
        
        If StrPos(archive_ext, '.' & file_ext) Then Return "Archive"                  

     Endif

EndFunc
[/cut]
Конечно, фич - гораздо больше. Но это все, на что хватило пока времени.)

[cut]Truely, Autorun is my guilty pleasure (c) Ghisler :mrgreen:[/cut]

Добавлено: Пн ноя 18, 2024 11:35
Orion9
Loopback
А что означает ошибка #3 при создании объекта Plugin?
Не удаётся найти одну или несколько обязательных функций wdx-плагина.
О каких обязательных функциях идет речь?

Сначала cловил эту ошибку при подключении wdx4i. Затем решил проверить и остальные плагины, сделав для этого небольшой скрипт (как же классно стало дебагить с OutputDebugString!)

[cut]

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

SetHotkeyAction /K:C /K:S /H:0 CheckWdxPlugins

Func CheckWdxPlugins()
Local i = 0, wdx, obj, dbg

   While i < 100
   
      IniRead /R wdx %COMMANDER_INI% "ContentPlugins" %"%i%" "stop"
      If wdx="stop" Then Break
      
      i = i + 1
     
      wdx = StrTrim(StrRight(wdx, StrLen(wdx)-StrPos(wdx, "\", -1)))
      If StrPos(wdx, "Autorun") Then Continue
      
      OutputDebugString("Autorun: i=" & i & " wdx=" & wdx)   
      
      obj = Plugin(wdx)
      if ERROR = 0 then
         Free(obj)
      else
         dbg = "Autorun: " & wdx & " plugin error " & ERROR
         OutputDebugString(dbg)   
      endif
      
   Wend
   
   ShowDebugHint("Done." & auCRLF & i & " items processed.")
   
EndFunc

Func ShowDebugHint(DebugHint)

   SetHintParam("ShowHint", "Font", 10, "Arial")
   SetHintParam("ShowHint", "BackColor", 0x000000)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)   
  
   ShowHint(DebugHint)
   Sleep(1000)
   WinSetState(23)
   
   SetHintParam("ShowHint", "Reload")
   
EndFunc
[/cut]
Удалив из полученного списка плагины, не имеющие отношения к полям и колонкам (SkipCompare и NameCompare), получился вот такой вот шорт-лист:
[3992] Autorun: wdx4i.wdx plugin error 3
[3992] Autorun: Office2007.wdx plugin error 3
[3992] Autorun: File.wdx plugin error 3
[3992] Autorun: DirSizeCalc.wdx plugin error 3
[3992] Autorun: IconLibrary.wdx plugin error 3
[3992] Autorun: similarity.wdx plugin error 3
[3992] Autorun: Shortcut.wdx plugin error 3
[3992] Autorun: Permissions.wdx plugin error 3
[3992] Autorun: exeinfo.wdx plugin error 3
[3992] Autorun: script.wdx plugin error 3
[3992] Autorun: Directory.wdx plugin error 3
[3992] Autorun: SplitNameByRegExpr.wdx plugin error 4
[7828] Autorun: random.wdx plugin error 3
До SplitNameByRegExpr у меня еще руки просто не успели добраться, поэтому он пока не возвращает никаких полей. Но другие - вполне рабочие плагины, неужели с ними не получится работать из Autorun?

Добавлено: Пн ноя 18, 2024 13:55
Loopback
Orion9 писал(а):неполадки с SetHintParam("ShowHint", "Border", 0xFFFFFF)
Это ошибка в справке, вместо "Border" должно быть "Frame".

Хотя все равно несуществующий параметр не должен менять размер шрифта.
Orion9 писал(а):слишком частое употребление оборота "Обратите внимание".
Согласен, решение по замене принято.
Orion9 писал(а):Осталось только DllCall сделать к WinAPI
Это, конечно, было бы весьма полезно, но к сожалению, очень непросто.
Orion9 писал(а):О каких обязательных функциях идет речь?
Те, которые обязательны для wdx (например, ContentGetDetectString, ContentGetValue). Но тут похоже какая-то проблема в алгоритме их определения, надо будет проверить. На имеющейся у меня wdx4i проблема воспроизводится.

Добавлено: Пн ноя 18, 2024 14:06
sa
Orion9 писал(а):... тема фона панелей ... Надеюсь, кому-нибудь пригодится.
Конечно, пригодится. Спасибо!
Вроде всё работает. Ну прям TC_ColorMania...
У себя дополнил функцию показа текущих значений ещё и записью в буфер строки параметров для второй кнопки:

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

ClipPut("/u- /ef ""msg(regmsg(BackColorsMessage), " & bkg1 & ", " & bkg2 & ")""")
Можно и всю кнопку (с новыми значениями) в буфер поместить:

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

ClipPut("TOTALCMD#BAR#DATA" & auCRLF & "%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" & auCRLF & "/u- /ef ""msg(regmsg(BackColorsMessage), " & bkg1 & ", " & bkg2 & ")""" & auCRLF & "%COMMANDER_EXE%")

Добавлено: Пн ноя 18, 2024 19:33
Orion9
Loopback
Параметр "Frame" работает, спасибо :) Например, SetHintParam("ShowHint", "Frame", 0x00FFFF)

Ничего, проживём и без DllCall как-нибудь ) Вы и так, работая в очень жёстких рамках псевдо-контентного плагина, сделали такой мощный скриптовый язык!

Я тут заметил: все-таки хотелось бы, чтобы ShowHint сама скрывалась по заданному таймеру. Пример простой:

ShowHint("Текст")
Sleep(5000)
WinSetState(23)

Если кликнуть и скрыть подсказку, то код функции все еще будет выполняться несколько секунд, возвращая фокус в окно ТС, когда уже другое окно стало активным. Но еще хуже, если вызвать подобную функцию несколько раз - тогда проблема нарастает.

В общем, если это нельзя сделать, то и ладно - не буду вас грузить :)

sa
Да, ТС определенно не хватает режима реального времени при работе с цветами, чтобы все сделанные изменения отображались сразу на панелях. Пока настроишь под себя - умучаешься ) Теперь хоть с фоном поиграться можно )
Можно и всю кнопку (с новыми значениями) в буфер поместить:
Да, поддержка буфера открывает теперь широчайшие возможности! Я почему-то сразу не догадался сделать запоминалку фона, а ведь она очень нужна, когда играешься с ColorMania :)

[cut]

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

# запоминание текущего фона
RegisterCommand 70002 "BackColorBar"

Func BackColorBar(lParam)
Local i, bkg1, bkg2, bar = %COMMANDER_PATH% & "\Bars\Backdrops.bar"
       
   If Not FileExist(bar) Then   
      MsgBox("Файл не существует " & bar, "Backdrop")
      Return
   Endif
   
   IniRead i %bar% "Buttonbar" "Buttoncount" 0
   
   If Not IsInt(i) or i < 1 Then
      MsgBox("Ошибка Buttoncount < 1 " & auCRLF & bar, "Backdrop")
      Return
   Endif
   
   IniRead /R bkg1 %COMMANDER_INI% "Colors" "BackColor" -1
   IniRead /R bkg2 %COMMANDER_INI% "Colors" "BackColor2" -1   
   
   i = i + 1
   
   Set /EV- tcfs2 "%COMMANDER_PATH%\\Utilites\TCFS2\TCFS2.exe"
  
   IniWrite /EV- %bar% "Buttonbar" %"'Button' & %i%" "%COMMANDER_EXE%"
   IniWrite %bar% "Buttonbar" %"'Cmd' & %i%"    "%tcfs2%"
   IniWrite %bar% "Buttonbar" %"'Param' & %i%"  '"/u- /ef "msg(regmsg(BackColorsMessage), %bkg1%, %bkg2%)"'      
   IniWrite %bar% "Buttonbar" %"'Menu' & %i%"   "Фон %bkg1%, %bkg2%"   
          
   IniWrite %bar% "Buttonbar" "Buttoncount" %i%
   
   ShowBackHint("Фон панелей сохранен")
   
EndFunc

Func ShowBackHint(BackHint)

   SetHintParam("ShowHint", "Font", 10, "Arial")
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
   SetHintParam("ShowHint", "Text", 0xFFFFFF)   
  
   ShowHint(BackHint)
   Sleep(1000)
   WinSetState(23)
   
   SetHintParam("ShowHint", "Reload")
   
EndFunc
[/cut]
Добавить кнопку на отдельную панель инструментов - и эта панель будет прирастать новыми кнопками. Можно использовать этот подход и для чего-то другого :wink:

Пути в скрипте, конечно, нужно заменить на свои, а сама панель будет выглядеть где-то так:

[cut]

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

[Buttonbar]
Buttoncount=6
button1=wcmicons.dll,15
cmd1=%COMMANDER_PATH%\Bars\Main.bar
iconic1=0
button2=%COMMANDER_EXE%
cmd2=70002
iconic2=0
menu2=Сохранить фон
button3=
iconic3=0
button4=%COMMANDER_EXE%
cmd4=%COMMANDER_PATH%\\Utilites\TCFS2\TCFS2.exe
param4=/u- /ef "msg(regmsg(BackColorsMessage), 9211020, 9211020)
iconic4=0
menu4=Фон 9211020, 9211020
Button5=%COMMANDER_EXE%
Cmd5=%COMMANDER_PATH%\\Utilites\TCFS2\TCFS2.exe
Param5="/u- /ef "msg(regmsg(BackColorsMessage), 8421230, 8421230)"
Menu5=Фон 8421230, 8421230
Button6=%COMMANDER_EXE%
Cmd6=%COMMANDER_PATH%\\Utilites\TCFS2\TCFS2.exe
Param6="/u- /ef "msg(regmsg(BackColorsMessage), 9865603, 9865603)"
Menu6=Фон 9865603, 9865603
[/cut]

Добавлено спустя 2 часа:

Вот ещё какую фишку обнаружил.

Альтернативная подсказка - это, конечно, хорошо, но все же не так удобно, поскольку приходится сначала выбирать файл в панели и только потом кликать на него (или использовать горячую клавишу), чтобы вызвать к нему дополнительную подсказку. Вариант рабочий, но хотелось бы, чтобы реакция была сразу при наведении и удержании клавиши-модификатора (Ctrl, Alt, Shift).

Новая фича Autorun позволят кое-чего добиться в этом направлении ( но сразу скажу: с небольшим недостатком, и не вине Autorun.)

Так вот. Дополнительная колонка "CustomHint" возвращает текст только при зажатом Ctrl:

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

Pragma AutorunPluginFields "SuperWdx:::GetWdxValue" "CustomHint:::GetCustomHint"


Func GetCustomHint(FileName, FieldIndex, UnitIndex)
Local obj, streams, links, hint

   If Not IsPressed (0x11) Then Return

   obj = Plugin("NTFSFileStreams")
   if ERROR = 0 then
      obj.FileName = FileName
      streams = StrFormat("%.0f", obj.GetValue(1))
      If streams > 0 then 
         hint = "Потоков: " & streams & auCRLF
         hint = hint & "Имена потоков: " & obj.GetValue(3) & auCRLF
         hint = hint & "Размер потоков: " & SizeFormat(obj.GetValue(5), 1, "K", 2) 
      Else
         hint = "Нет потоков"
      Endif           
      Free(obj)
   else
      hint = "Error " & ERROR
   endif
   
   obj = Plugin("NTLinks")
   if ERROR = 0 then
      obj.FileName = FileName
      links = StrFormat("%.0f", obj.GetValue(0))
      hint  = hint & auCRLF & "Жестких ссылок: " & links      
      If links > 1 then 
         hint = hint  & auCRLF & StrReplace(obj.GetValue(7), ", ", auCRLF)
      Endif   
      Free(obj)
   else
      hint = hint & auCRLF & "Error " & ERROR
   endif
   OutputDebugString(hint)
   Return hint
EndFunc
Эту колонку можно посадить на маску *.* последней в списке подсказок и выбрать параметр объединения подсказок, и всё! Теперь при зажатом контроле появляется дополнительная информация!

Недостаток: Символы перевода строки игнорируются и весь текст берется в одну единственную строку. Почему-то автор ТС решил именно так сделать (возможно, его кто-то об этом просил), хотя напрашивается другое. В любом случае, можно было предусмотреть опцию, переключающую эти режимы. Но такой опции я не нашел. Как не нашел и возможности раскрывать переменные окружения %% в подсказках (не только подсказках файловых панелей, а вообще), хотя это тоже напрашивается.

По идее, тут надо обращатся на оф-форум, но я слышал, что подобные просьбы могут даже не попать в to-do, а если и попадут, то ждать придется чуть ли не год, а может и более, что, конечно, не добавляет желания обращаться с такими просьбами :)

Добавлено: Пн ноя 18, 2024 22:15
Loopback
Orion9 писал(а): все-таки хотелось бы, чтобы ShowHint
Суть проблемы понятна. Ладно, посмотрим, но не сейчас.
Orion9 писал(а):Эту колонку можно посадить на маску *.* последней в списке подсказок и выбрать параметр объединения подсказок, и всё! Теперь при зажатом контроле появляется дополнительная информация!
Проблему однострочности несложно обойти добавлением нескольких единиц одной колонки и их добавлением в штатную подсказку с \n.

[cut]

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

[=autorun.CustomHint.L1]\n[=autorun.CustomHint.L2]\n[=autorun.CustomHint.L3]

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

Pragma AutorunPluginFields "CustomHint:L1|L2|L3::GetCustomHint"

Func GetCustomHint(FileName, FieldIndex, UnitIndex)
    Local obj, streams, links, hint

   If Not IsPressed (0x11) Then Return

   Switch UnitIndex 
    Case 0
       obj = Plugin("NTFSFileStreams")
       if ERROR = 0 then
          obj.FileName = FileName
          streams = StrFormat("%.0f", obj.GetValue(1))
          If streams > 0 then
             hint = "Потоков: " & streams & auCRLF
             hint = hint & "Имена потоков: " & obj.GetValue(3) & auCRLF
             hint = hint & "Размер потоков: " & SizeFormat(obj.GetValue(5), 1, "K", 2)
          Else
             hint = "Нет потоков"
          Endif           
          Free(obj)
       else
          hint = "Error " & ERROR
       endif
    Case 1
       obj = Plugin("NTLinks")
       if ERROR = 0 then
          obj.FileName = FileName
          links = StrFormat("%.0f", obj.GetValue(0))
          hint  = hint & auCRLF & "Жестких ссылок: " & links     
          If links > 1 then
             hint = hint  & auCRLF & StrReplace(obj.GetValue(7), ", ", auCRLF)
          Endif   
          Free(obj)
       else
          hint = hint & auCRLF & "Error " & ERROR
       endif
    Case 2
          hint = "Что-то ещё"
    EndSwitch       
   OutputDebugString(hint)
   Return hint
EndFunc
[/cut]
Orion9 писал(а):По идее, тут надо обращатся на оф-форум, но я слышал, что подобные просьбы могут даже не попать в to-do, а если и попадут, то ждать придется чуть ли не год,
С другой стороны, если не писать - шансов-то еще меньше :)