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

Добавлено: Ср фев 12, 2025 14:45
Loopback
AkulaBig писал(а):А применение List() не решит проблему?
Не решит, потому что 32767 это не моё ограничение, а системных Ini-функций, которые, к слову, микрософтом еще тридцать лет назад были названы устаревшими. Чтобы его обойти, необходимо писать свою поддержку ini.
AkulaBig писал(а):А без командной записи никак.
AkulaBig писал(а):А хотелось-бы:
Как это никак? За исключением нескольких небольших исключений, любую функцию можно записать в функциональной записи.

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

Func SwitchIniSect(sIni, sSectSource, sSectTarget)
   Local SwitchSect = List()
   SwitchSect.Text = IniReadSection(sIni, sSectSource)
   IniWriteSection(sIni, sSectTarget, SwitchSect.Text)
EndFunc
Только зачем читать в список и потом из него обратно, если читаемый и записываемый блок совместим по формату и его можно писать без изменений. И поскольку IniRenameSection точно так же читает и записывает содержимое секции, это полностью равноценно:

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

Func SwitchIniSect(sIni, sSectSource, sSectTarget)
   IniRenameSection(sIni, sSectSource, sSectTarget)
EndFunc
AkulaBig писал(а):Хотелось-бы узнать, что это за команда.
Это загадочная магическая связка. По номерам сообщений нельзя достоверно сказать, что по факту она делает, не является ли то, что она делает побочным эффектом чего-то другого, и не создает ли она сама побочные эффекты.

147 = 0x93, в MSDN такого сообщения нет, изредка мелькает некая WM_UAHINITMENU, что вообще нерелевантно. Возможно, какие-то внутренние сообщения Delphi.

1045 = 0x415 - видимо, WM_USER + 0x15.

Понятно, что использование такого не от хорошей жизни, но...

Добавлено: Ср фев 12, 2025 15:53
AkulaBig
Loopback писал(а):Не решит, потому что 32767 это не моё ограничение, а системных Ini-функций
А, ну все ясно. Я думал может вы какие-то свои ограничения накладываете.
Loopback писал(а):За исключением нескольких небольших исключений, любую функцию можно записать в функциональной записи.
Допускаю, что я не разобрался, но я не смог сделать вот такой вызов через функциональную запись:

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

Local ini_Buttonbar = %COMMANDER_PATH% & "\Ini\Buttonbar.ini"
Local sect_Buttonbar = "Buttonbar"
SwitchIniSect("%ini_Buttonbar%", %sect_Buttonbar% & %lng%, %sect_Buttonbar%)
Loopback писал(а):Это загадочная магическая связка. По номерам сообщений нельзя достоверно сказать, что по факту она делает
Вот и я не смог найти концов. Искал по TDlgCustomColors и вот такое вывалило в теме про TCFS2. И ведь без TCFS2 прекрасно работает. На оф форуме тоже не нашел. Это msg(147,0,1302100), вроде cm_ReloadBarIcons. По крайней мере взаимозаменяемо. А вот 1045 аналога не нашел. Вроде вызывается cm_InternalAssociate, но окно не появляется.

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

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

[quote="Loopback"]Func SwitchIniSect(sIni, sSectSource, sSectTarget)
   IniRenameSection(sIni, sSectSource, sSectTarget)
EndFunc[/quote]
Проверил. Думал я чего-то не понял. Но нет, все правильно я делаю. Речь не про ассоциации. У меня инишки сейчас состоят из таких секций:

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

[Buttonbar]

[Buttonbar_rus]

[Buttonbar_eng]
А в переспективе количество секций может быть любое. Поэтому тут другой алгоритм.

Добавлено: Ср фев 12, 2025 16:29
sa
AkulaBig писал(а):На оф форуме тоже не нашел.
Разве что эта тема перекликается в чём-то.

Добавлено: Ср фев 12, 2025 16:50
Orion9
sa писал(а):Первоначально на форуме здесь упоминалась...
Ну я так и подумал, что отловили ) Слышал о таком.

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

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

Filter19=*.exe
Filter19_innoextract 1.9=**MultiArc
Filter19_Instal Explorer=**InstExpl
Filter19_Total Observer=**TotalObserver
Это удивительно, как Гислер не сделал команду открытия нужным плагином.

Добавлено спустя 7 минут:
AkulaBig писал(а):А в переспективе количество секций может быть любое. Поэтому тут другой алгоритм.
Ничто вам не мешает и дальше использовать AutoIt-скрипт для этих целей, если возникают такие сложности. Имхо, а учитывая ограничения в 32К, оно даже будет и лучше.

Добавлено: Ср фев 12, 2025 16:52
AkulaBig
sa писал(а):Разве что эта тема перекликается в чём-то.
Судя по tcm(2958) скрипт не рабочий. У меня точно не рабочий, так как я пробовал cm_ReloadFileIcons. Не работает. Может у других работает.

Добавлено: Ср фев 12, 2025 16:54
Orion9
AkulaBig писал(а): Не работает. Может у других работает.
Пример в справке действительно не рабочий. Работает вот так:

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

Func SwitchInternalAssociations(lParam)
   Local Sections = List(), Mess, ini = %COMMANDER_PATH% & "\Ini\Associations.ini"
   Sections.Text = IniReadSectionNames(ini)
   If Sections.IndexOf('Associations') > -1 Then
      IniRenameSection(ini, 'Associations', '-Associations')
      Mess = 'ОТКЛЮЧЕНЫ!'
   ElseIf Sections.IndexOf('-Associations') > -1 Then
      IniRenameSection(ini, '-Associations', 'Associations')
      Mess = 'ВКЛЮЧЕНЫ!'
   Else
      Mess = 'ОТСУТСТВУЮТ!'
   EndIf
   Free(Sections)
   #SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
   #SendCommand(2958)
   SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0)   
   ShowHint('Внутренние ассоциации ' & Mess, -1000, -1000, 1500, 1)
   WinAlign(LAST_HINT_WINDOW, 0, RequestInfo(3), 0)
EndFunc

Добавлено: Ср фев 12, 2025 17:12
AkulaBig
Orion9 писал(а):

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

   #SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
   #SendCommand(2958)
   SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0) [/quote]
Спасибо, что подтведили. С #SendCommand(2958) не работает. Только не понимаю, почему вы закомментили #SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100) или cm_ReloadBarIcons. Без этого не обновляется состояние кнопки. Причем интересно, сначала почему-то мне требовалось два раза прописывать обновление кнопки. Иначе появлялось окно ассоциаций. Сейчас попробовал, одной команды достаточно.

Добавлено: Ср фев 12, 2025 17:17
Orion9
AkulaBig писал(а):Без этого не обновляется состояние кнопки.
А у Flasher-a и нет кнопки в его примере, обновляться нечему :lol:

Добавлено: Ср фев 12, 2025 18:08
AkulaBig
Orion9 писал(а):А у Flasher-a и нет кнопки в его примере, обновляться нечему
А при чем тут кнопка? SendCommand(2958) - это обновление значков. У него значки не обновляются.

Добавлено: Ср фев 12, 2025 19:07
Loopback
AkulaBig писал(а): но я не смог сделать вот такой вызов через функциональную запись:
Потому что первый параметр "%ini_Buttonbar%" - строка. В функцию так и передастся строка %ini_Buttonbar%. Нужно без кавычек:

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

SwitchIniSect(%ini_Buttonbar%, %sect_Buttonbar% & %lng%, %sect_Buttonbar%)
или, учитывая что это ФЗ, и % не нужны:

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

SwitchIniSect(ini_Buttonbar, sect_Buttonbar & lng, sect_Buttonbar)

Добавлено: Ср фев 12, 2025 22:51
AkulaBig
Loopback
Отлично все работает с вашим синтаксисом. Спасибо за разъяснения.

Добавлено: Ср фев 12, 2025 22:56
Orion9
AkulaBig писал(а):Без этого не обновляется состояние кнопки.
AkulaBig писал(а):А при чем тут кнопка?
И действительно, причём тут кнопка? :lol:

Хотя теперь понял о чём речь. Действительно, SendCommand(2958) - команда обновления значков на панелях. Но в примере Flasher значки не обновляются. Как потом выяснилось, значки обновляются только посылкой сообщения с номером 1045, причём одного этого сообщения вполне достаточно. Возможно, раньше (т.е. в прошлых версиях ТС) эти две команды и требовались:

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

SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
SendCommand(2958)
Но сейчас от них никакого эффекта, если секция при старте ТС была отключена. Что касается посылки SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0), то скорее всего, это и есть то самое "служебное" сообщение, которое сам Тотал и ловит при нажатии "OK" в своем же окне TDlgCustomColors. lz57005 выловил это сообщение, за что ему честь и хвала. Я это так примерно понимаю )

Loopback
А вот вам честь и хвала за функцию CRC32 в справке. У меня как раз недавно возникла потребность в этой функции, но думал, что подожду, пока вы не сделаете функции для работами с секциями, а уж потом спрошу. А тут такой приятный бонус :)

Наверное, не мешало бы подвести какой-то итог по новому функционалу из последней версии, но я ещё не успел всё проверить и опробовать. Единственная проблема, с которой пока столкнулся - появление функции Opt. У меня были вот такие записи преобразования переменной окружения %COMMANDER_PATH%, считываемой из ini-файла:

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

   If StrPos(TCFS2, "%COMMANDER_PATH%") Then
      TCFS2 = %COMMANDER_PATH% & StrReplace(TCFS2, "%COMMANDER_PATH%")
   Endif
StrPos перестала работать как ранее, что привело к проблемам. Пришлось потратить немного времени, чтобы найти в чём причина. В итоге, пришлось сделать так:

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

   Opt("FuncExpandVars", 0)

   If StrPos(TCFS2, "%COMMANDER_PATH%") Then
      TCFS2 = %COMMANDER_PATH% & StrReplace(TCFS2, "%COMMANDER_PATH%")
   Endif
   
   Opt("FuncExpandVars", 1)   
Завтра планирую пройтись по всему остальному функционалу, посмотрим, что ещё всплывёт. А может, и ничего больше не всплывёт, очень на это надеюсь.

Добавлено: Ср фев 12, 2025 23:20
Loopback
Orion9 писал(а):StrPos перестала работать как ранее
Вообще-то не должна была. Opt это для решения одной проблемы, если не нужна была раньше - то и сейчас не должна быть нужна. Завтра посмотрю в чем разница, это скорее ошибка вследствие изменений.

Добавлено: Чт фев 13, 2025 04:37
AkulaBig
Orion9 писал(а):Opt("FuncExpandVars", 1)
Помните я у вас просил выложить мои инишники? Вот я в au3 применил Opt. Только результат ее работы меня удивил. Все переменные развернулись прямо в инишнике. А они у меня оказались в одном экземпляре. Страшная функция. Надеюсь здесь она не так работает.

Добавлено: Чт фев 13, 2025 12:14
Loopback
Orion9
А какое точное содержимое переменной TCFS2 до указанного кода и каков ожидаемый результат? Я не вижу разницы в поведении.

Orion9
По просьбе Flasher-а передаю некоторые комментарии по поводу ассоциаций.

[cut]
Код из справки был уточнён, новая версия ниже:

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

# Автор — Flasher
 
# Включение/отключение внутренних ассоциаций
# [ Из-за переноса секции IniRenameSection позже будет заменена. ]
RegisterCommand 64000 SwitchInternalAssociations
 
Func SwitchInternalAssociations(lParam)
   Local Sections = List(), Mess
   Sections.Text = IniReadSectionNames(COMMANDER_INI)
   If Sections.IndexOf('Associations') > -1 Then
      IniRenameSection(COMMANDER_INI, 'Associations', '-Associations')
      Mess = 'ОТКЛЮЧЕНЫ!'
   ElseIf Sections.IndexOf('-Associations') > -1 Then
      IniRenameSection(COMMANDER_INI, '-Associations', 'Associations')
      Mess = 'ВКЛЮЧЕНЫ!'
   Else
      Mess = 'ОТСУТСТВУЮТ!'
   EndIf
   Free(Sections)
   Static c
   c += 1
   If Mess <> 'ОТСУТСТВУЮТ!' Then
      SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
      If c = 1 And Mess = 'ВКЛЮЧЕНЫ!' Then
         SendMessage(AUTORUN_TCHANDLE, 1045)
      Else
         SendCommand(2958)
      EndIf
   EndIf
   ShowHint('Внутренние ассоциации ' & Mess, -1000, -1000, 1500, 1)
   WinAlign(LAST_HINT_WINDOW, 0, RequestInfo(3), 0)
EndFunc
Причина отсутствия 1045 в первом варианте кода была связана с изменением размера шрифта в панелях и артефактами в процессе перерисовки. С чем связана проблема шрифтов пока непонятна, но это наблюдалось на некоторых из тестовых стендов.
[/cut]

Но вообще, если эта тема актуальна и интересна, лучше вам как-то найти с Flasher-ом прямые каналы взаимодействия. Мне не хочется работать испорченным телефоном.