View previous topic :: View next topic |
Author |
Message |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Wed Feb 12, 2025 15:45 Post subject: |
|
|
AkulaBig wrote: | А применение List() не решит проблему? |
Не решит, потому что 32767 это не моё ограничение, а системных Ini-функций, которые, к слову, микрософтом еще тридцать лет назад были названы устаревшими. Чтобы его обойти, необходимо писать свою поддержку ini.
AkulaBig wrote: | А без командной записи никак. |
AkulaBig wrote: | А хотелось-бы: |
Как это никак? За исключением нескольких небольших исключений, любую функцию можно записать в функциональной записи.
Code: |
Func SwitchIniSect(sIni, sSectSource, sSectTarget)
Local SwitchSect = List()
SwitchSect.Text = IniReadSection(sIni, sSectSource)
IniWriteSection(sIni, sSectTarget, SwitchSect.Text)
EndFunc
|
Только зачем читать в список и потом из него обратно, если читаемый и записываемый блок совместим по формату и его можно писать без изменений. И поскольку IniRenameSection точно так же читает и записывает содержимое секции, это полностью равноценно:
Code: |
Func SwitchIniSect(sIni, sSectSource, sSectTarget)
IniRenameSection(sIni, sSectSource, sSectTarget)
EndFunc
|
AkulaBig wrote: | Хотелось-бы узнать, что это за команда. |
Это загадочная магическая связка. По номерам сообщений нельзя достоверно сказать, что по факту она делает, не является ли то, что она делает побочным эффектом чего-то другого, и не создает ли она сама побочные эффекты.
147 = 0x93, в MSDN такого сообщения нет, изредка мелькает некая WM_UAHINITMENU, что вообще нерелевантно. Возможно, какие-то внутренние сообщения Delphi.
1045 = 0x415 - видимо, WM_USER + 0x15.
Понятно, что использование такого не от хорошей жизни, но... |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Wed Feb 12, 2025 16:36 Post subject: |
|
|
Loopback wrote: | Не решит, потому что 32767 это не моё ограничение, а системных Ini-функций |
А, ну все ясно. Я думал может вы какие-то свои ограничения накладываете.
Loopback wrote: | За исключением нескольких небольших исключений, любую функцию можно записать в функциональной записи.
|
Допускаю, что я не разобрался, но я не смог сделать вот такой вызов через функциональную запись:
Code: |
Local ini_Buttonbar = %COMMANDER_PATH% & "\Ini\Buttonbar.ini"
Local sect_Buttonbar = "Buttonbar"
SwitchIniSect("%ini_Buttonbar%", %sect_Buttonbar% & %lng%, %sect_Buttonbar%)
|
Loopback wrote: | Это загадочная магическая связка. По номерам сообщений нельзя достоверно сказать, что по факту она делает |
Вот и я не смог найти концов. Искал по TDlgCustomColors и вот такое вывалило в теме про TCFS2. И ведь без TCFS2 прекрасно работает. На оф форуме тоже не нашел. Это msg(147,0,1302100), вроде cm_ReloadBarIcons. По крайней мере взаимозаменяемо. А вот 1045 аналога не нашел. Вроде вызывается cm_InternalAssociate, но окно не появляется.
Добавлено спустя 18 минут:
Code: |
[quote="Loopback"]Func SwitchIniSect(sIni, sSectSource, sSectTarget)
IniRenameSection(sIni, sSectSource, sSectTarget)
EndFunc[/quote]
|
Проверил. Думал я чего-то не понял. Но нет, все правильно я делаю. Речь не про ассоциации. У меня инишки сейчас состоят из таких секций:
Code: |
[Buttonbar]
[Buttonbar_rus]
[Buttonbar_eng]
|
А в переспективе количество секций может быть любое. Поэтому тут другой алгоритм. |
|
Back to top |
|
 |
sa
Joined: 29 Apr 2009 Posts: 2688
|
(Separately) Posted: Wed Feb 12, 2025 17:29 Post subject: |
|
|
AkulaBig wrote: | На оф форуме тоже не нашел. |
Разве что эта тема перекликается в чём-то. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 777
|
(Separately) Posted: Wed Feb 12, 2025 17:44 Post subject: |
|
|
sa wrote: | Первоначально на форуме здесь упоминалась... |
Ну я так и подумал, что отловили ) Слышал о таком.
А теперь вопрос, и очень серьёзный: можно ли таким же способом отловить, какие сообщения стоят за пунктами меню, добавляемые в контекстное через внутренние ассоциации? Речь идет о:
Code: | Filter19=*.exe
Filter19_innoextract 1.9=**MultiArc
Filter19_Instal Explorer=**InstExpl
Filter19_Total Observer=**TotalObserver |
Это удивительно, как Гислер не сделал команду открытия нужным плагином.
Добавлено спустя 7 минут:
AkulaBig wrote: | А в переспективе количество секций может быть любое. Поэтому тут другой алгоритм. |
Ничто вам не мешает и дальше использовать AutoIt-скрипт для этих целей, если возникают такие сложности. Имхо, а учитывая ограничения в 32К, оно даже будет и лучше. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Wed Feb 12, 2025 17:52 Post subject: |
|
|
sa wrote: | Разве что эта тема перекликается в чём-то. |
Судя по tcm(2958) скрипт не рабочий. У меня точно не рабочий, так как я пробовал cm_ReloadFileIcons. Не работает. Может у других работает. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 777
|
(Separately) Posted: Wed Feb 12, 2025 17:54 Post subject: |
|
|
AkulaBig wrote: | Не работает. Может у других работает. |
Пример в справке действительно не рабочий. Работает вот так:
Code: | 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 |
|
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Wed Feb 12, 2025 18:12 Post subject: |
|
|
Orion9 wrote: |
Code: |
#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. Без этого не обновляется состояние кнопки. Причем интересно, сначала почему-то мне требовалось два раза прописывать обновление кнопки. Иначе появлялось окно ассоциаций. Сейчас попробовал, одной команды достаточно.
Last edited by AkulaBig on Wed Feb 12, 2025 19:06; edited 1 time in total |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 777
|
(Separately) Posted: Wed Feb 12, 2025 18:17 Post subject: |
|
|
AkulaBig wrote: | Без этого не обновляется состояние кнопки. |
А у Flasher-a и нет кнопки в его примере, обновляться нечему  |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Wed Feb 12, 2025 19:08 Post subject: |
|
|
Orion9 wrote: | А у Flasher-a и нет кнопки в его примере, обновляться нечему |
А при чем тут кнопка? SendCommand(2958) - это обновление значков. У него значки не обновляются. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Wed Feb 12, 2025 20:07 Post subject: |
|
|
AkulaBig wrote: | но я не смог сделать вот такой вызов через функциональную запись: |
Потому что первый параметр "%ini_Buttonbar%" - строка. В функцию так и передастся строка %ini_Buttonbar%. Нужно без кавычек:
Code: | SwitchIniSect(%ini_Buttonbar%, %sect_Buttonbar% & %lng%, %sect_Buttonbar%) |
или, учитывая что это ФЗ, и % не нужны:
Code: | SwitchIniSect(ini_Buttonbar, sect_Buttonbar & lng, sect_Buttonbar) |
|
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Wed Feb 12, 2025 23:51 Post subject: |
|
|
Loopback
Отлично все работает с вашим синтаксисом. Спасибо за разъяснения. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 777
|
(Separately) Posted: Wed Feb 12, 2025 23:56 Post subject: |
|
|
AkulaBig wrote: | Без этого не обновляется состояние кнопки. |
AkulaBig wrote: | А при чем тут кнопка? |
И действительно, причём тут кнопка?
Хотя теперь понял о чём речь. Действительно, SendCommand(2958) - команда обновления значков на панелях. Но в примере Flasher значки не обновляются. Как потом выяснилось, значки обновляются только посылкой сообщения с номером 1045, причём одного этого сообщения вполне достаточно. Возможно, раньше (т.е. в прошлых версиях ТС) эти две команды и требовались:
Code: | SendMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
SendCommand(2958) |
Но сейчас от них никакого эффекта, если секция при старте ТС была отключена. Что касается посылки SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0), то скорее всего, это и есть то самое "служебное" сообщение, которое сам Тотал и ловит при нажатии "OK" в своем же окне TDlgCustomColors. lz57005 выловил это сообщение, за что ему честь и хвала. Я это так примерно понимаю )
Loopback
А вот вам честь и хвала за функцию CRC32 в справке. У меня как раз недавно возникла потребность в этой функции, но думал, что подожду, пока вы не сделаете функции для работами с секциями, а уж потом спрошу. А тут такой приятный бонус
Наверное, не мешало бы подвести какой-то итог по новому функционалу из последней версии, но я ещё не успел всё проверить и опробовать. Единственная проблема, с которой пока столкнулся - появление функции Opt. У меня были вот такие записи преобразования переменной окружения %COMMANDER_PATH%, считываемой из ini-файла:
Code: | If StrPos(TCFS2, "%COMMANDER_PATH%") Then
TCFS2 = %COMMANDER_PATH% & StrReplace(TCFS2, "%COMMANDER_PATH%")
Endif
|
StrPos перестала работать как ранее, что привело к проблемам. Пришлось потратить немного времени, чтобы найти в чём причина. В итоге, пришлось сделать так:
Code: | Opt("FuncExpandVars", 0)
If StrPos(TCFS2, "%COMMANDER_PATH%") Then
TCFS2 = %COMMANDER_PATH% & StrReplace(TCFS2, "%COMMANDER_PATH%")
Endif
Opt("FuncExpandVars", 1)
|
Завтра планирую пройтись по всему остальному функционалу, посмотрим, что ещё всплывёт. А может, и ничего больше не всплывёт, очень на это надеюсь. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Thu Feb 13, 2025 00:20 Post subject: |
|
|
Orion9 wrote: | StrPos перестала работать как ранее |
Вообще-то не должна была. Opt это для решения одной проблемы, если не нужна была раньше - то и сейчас не должна быть нужна. Завтра посмотрю в чем разница, это скорее ошибка вследствие изменений. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 332
|
(Separately) Posted: Thu Feb 13, 2025 05:37 Post subject: |
|
|
Orion9 wrote: | Opt("FuncExpandVars", 1) |
Помните я у вас просил выложить мои инишники? Вот я в au3 применил Opt. Только результат ее работы меня удивил. Все переменные развернулись прямо в инишнике. А они у меня оказались в одном экземпляре. Страшная функция. Надеюсь здесь она не так работает. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Thu Feb 13, 2025 13:14 Post subject: |
|
|
Orion9
А какое точное содержимое переменной TCFS2 до указанного кода и каков ожидаемый результат? Я не вижу разницы в поведении.
Orion9
По просьбе Flasher-а передаю некоторые комментарии по поводу ассоциаций.
 Hidden text
Код из справки был уточнён, новая версия ниже:
Code: |
# Автор — 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 в первом варианте кода была связана с изменением размера шрифта в панелях и артефактами в процессе перерисовки. С чем связана проблема шрифтов пока непонятна, но это наблюдалось на некоторых из тестовых стендов.
Но вообще, если эта тема актуальна и интересна, лучше вам как-то найти с Flasher-ом прямые каналы взаимодействия. Мне не хочется работать испорченным телефоном. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|