Autorun

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Что-то не могу с простым действием разобраться.
Проверяю значение ключа в INI, если не соответствует надо записать, а при совпадении ничего не выполнять.

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

IniRead OCRPATH "%COMMANDER_PATH%\Utils\IrfanView\i_view32.ini" "OCR" "TS_EXE" ""
if %OCRPATH% <> "%COMMANDER_PATH%\Utils\IrfanView\Plugins\Tesseract\" Then
IniWrite "%COMMANDER_PATH%\Utils\IrfanView\i_view32.ini" "OCR" "TS_EXE" "%COMMANDER_PATH%\Utils\IrfanView\Plugins\Tesseract\"
Endif
Что не так делаю?
TC 11.58 combo, Windows 11 x64
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

jentoso
Это баг с <> для строк в последней версии, в рабочей уже исправлен. А пока можно переписать условие так:

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

if not (%OCRPATH% = "%COMMANDER_PATH%\Utils\IrfanView\Plugins\Tesseract\") Then
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Loopback
Вроде "рабочая" еще не выкладывалась?
По поводу проверки ключа, теперь срабатывает, но не понятен следующий момент. Если значение ключа в INI совпадает, значит и недолжна срабатывать команда IniWrite. Тогда почему в свойстве самого INI файла видна дата и время изменения, соответствующая запуску TC?
TC 11.58 combo, Windows 11 x64
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

jentoso писал(а):роде "рабочая" еще не выкладывалась?
На то она и рабочая, что еще не в общем доступе :)
jentoso писал(а):Если значение ключа в INI совпадает, значит и недолжна срабатывать команда IniWrite.
Прошу прощения, недоглядел, неправильно привел пример. Здесь простая текстовая строка, переменные в них в сравнении не будут разворачиваться (это только свойство функций, которые явно подразумевают разворачивание переменных в строковых параметрах). Переменную с текстом надо соединять вот так:

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

if not (%OCRPATH% = %COMMANDER_PATH% & "\Utils\IrfanView\Plugins\Tesseract") Then
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Loopback
это только свойство функций, которые явно подразумевают разворачивание переменных в строковых параметрах
Да, об этом ранее здесь уже оговаривалось, но без опыта не сразу понятно что к чему.
Теперь все работает как надо.
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Версия от 18.04.2024
- исправлена работа с пробелами в путях
- тултип теперь не прячется под панелью задач
- исправлены (вроде) спонтанные падения при использовании ControlSetHint
Класс! :)

С панелью разобрался. Сначала думал, что проблемные пункты объединяет только присутствие проблелов, но как только открыл панель в тектовом редакторе, сразу увидел, что у всех у них нет ключа cmd=. Версия 1.2.1.1 относилась к этому лояльно и отображала все пункты и значки, хотя сам ТС считает такие пункты невалидными в плане загрузки значков - пока не укажешь команду, значки отображаться не будут. Т.ч. все правильно. Прописал временно заглушку "em_em" и все работает.

Я тут вот что подумал. А не желаете сделать команду, которая будет отображать статус Autorun - основную версию, загруженные модули (и их версии), даты изменений, информацию о загруженных потоках и т.д. В общем, расширенное окно About :)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

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

Функция для получения некоторой отладочной информации будет, пока что с информацией о переменных, инициализированных на момент вызова в конкретной пользовательской функции. Что-то можно будет в эту функцию добавить, но хотелось бы чтобы от этого была какая-то практическая польза.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

но хотелось бы чтобы от этого была какая-то практическая польза.
А какая практическая польза от окна About? :lol:

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

У меня верхнее меню заканчивается строками:
HELP_BREAK

POPUP ""
END_POPUP

MENUITEM "Reboot", em_exit_1
MENUITEM ":::", em_TCFullScreen
Хотел бы, чтобы там еще и Autorun был, чтобы не лазить в каталог лишний раз, а видеть все сразу.

Простой поток, который выполняет одну команду время от времени можно написать в три оператора: цикл-> сон -> команда. Вот только проверить, выполняется ли такой поток и получить с него статус о таймере - это отдельные танцы. А хотелось бы, чтобы сразу в специальном окне Autorun была информация о всех запущенных потоках :)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Версия от [url=https:///total.darkhost.ru/files/temp/tweaks_20240421.zip]21.04.2024[/url]

- для ControlSetHint добавлен костыль в виде флага /F, позволяющий избавиться от родной подсказки путем временного перевода фокуса на подсказку.
- подсказка теперь не уходит за границы экрана
- добавлена функция SetHintParam

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

SetHintParam("CSH" | "SH", <param_id>, <param1> [, <param2> ... <param5>]
Первый параметр [s]"SH" или "CSH"[/s] - для какой функции будут заданы параметры. Ну коряво, да, но например 0 и 1 тоже вроде не лучше.
EDIT: в выложенной версии забыл переделать на строки, работают именно 0 и 1. В следующей исправлю.

param_id: одна из строк:
Reload - перезагружает параметры из конфига TC заново
Delay - (только для csh) задержка появления подсказки, в мс
Font - шрифт, порядок параметров: size, face, weight, style, charset
Border, DarkBorder - цвет рамки
BackColor, DarkBackColor - фон
Text, DarkText - цвет текста

Цвета в RGB

Примеры:

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

SetHintParam("SH", "Font", 9, "Courier New")
SetHintParam("SH", "BackColor", 0x00FF00)
На этом в первом приближении подсказки можно считать завершенными, надо только справку к ним написать.

Orion9 писал(а):А какая практическая польза от окна About?
Обычно версия, я как-то редко ожидаю от него большего :) Но это все же удел графических приложений.
Orion9 писал(а):Вообще, я люблю смотреть в окна About, особенно когда в них все видно
Суть понятна. Но если честно, в моем понимании это все же больше "шашечки". Можно подумать, но явно не сейчас, учитывая огромное количество недоделанного.
Orion9 писал(а):Хотел бы, чтобы там еще и Autorun был
Ну что-то (версии, даты), если очень хочется, вполне можно сделать скриптом: пройти по файлам и получить данные из versionInfo. Там дел-то на десять минут. Со статусом загрузки dll чуть сложнее, но не намного.
Orion9 писал(а):Вот только проверить, выполняется ли такой поток и получить с него статус о таймере - это отдельные танцы.
Поток, пока не будет явно произведен выход из цикла, находится всегда в запущенном состоянии. При необходимости можно, например, сделать глобальную переменную, установить ее при запуске потока и проверять. А снимать при окончании. Наверно, лучше было бы изначально сделать так, чтобы RunThread возвращала идентификатор и функцию для его проверки, но теперь как есть.

А вот что понимается под "статус о таймере" я так и не понял.
Orion9 писал(а):А хотелось бы, чтобы сразу в специальном окне Autorun была информация о всех запущенных потоках
Я просто не вижу, какая информация могла бы там выдаваться. Ну хорошо, вот запущено 5 потоков, с такими-то идентификаторами. Что нам даёт эта информация?
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Попробовал на такой конфигурации:
SetHintParam(1, "Font", 9, "Consolas")
SetHintParam(1, "BackColor", 0x000000)
SetHintParam(1, "Text", 0xFFFFFF)
Все работает :) С ControlSetHint не проводил эксперементов, т.к. пока не нашел, где можно применить этот функционал. А вот как, хотя бы теоретически, заставить появляться хинт над определенной кнопкой панели инструментов, и можно ли? )
Но это все же удел графических приложений.
Подобная фича у фоновых процессов и задач смотрится еще лучше.
Можно подумать, но явно не сейчас, учитывая огромное количество недоделанного.
Так дэдлайнов никаких нет.
Ну что-то (версии, даты), если очень хочется, вполне можно сделать скриптом: пройти по файлам и получить данные из versionInfo. Там дел-то на десять минут. Со статусом загрузки dll чуть сложнее, но не намного.
Интересен, прежде всего, нативный само-статус.
Поток, пока не будет явно произведен выход из цикла, находится всегда в запущенном состоянии. При необходимости можно, например, сделать глобальную переменную, установить ее при запуске потока и проверять.
Это и есть те самые танцы, о которых я писал. А если поток вылетит и переменная не изменится, может быть такое в теории?
А вот что понимается под "статус о таймере" я так и не понял.
[cut]

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

while 1
sleep(3600000)
cmd format c:\
wend
Как проверить, сколько осталось до следующего форматирования диска? :lol: [/cut]
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):А вот как, хотя бы теоретически, заставить появляться хинт над определенной кнопкой панели инструментов, и можно ли?
Нет, узнать надежно какая кнопка нельзя. Ну я во всяком случае не представляю, как это можно сделать. Максимум что можно, наверно, это например найти 5 кнопку слева. Но толку от этого никакого нет. Да и смысл, у кнопок панелей свои настраиваемые подсказки.
Orion9 писал(а):Это и есть те самые танцы, о которых я писал.
Ну хорошо, как вы себе это представляете, без "танцев"? Ну вот хотя бы в виде псевдокода, или пример из другого языка живой. Просто мне кажется мы по-разному понимаем эти вещи.
Orion9 писал(а):А если поток вылетит и переменная не изменится, может быть такое в теории?
В теории может быть всё что угодно. Но при нормальной работе чего бы ему вылетать, а если какие-то проблемы возникнут, то тут вряд ли только одним потоком обойдется.
Orion9 писал(а):Как проверить, сколько осталось до следующего форматирования диска?
Если писать так - то никак, конечно. Точно так же, как и в других языках. Sleep это не таймер, это задержка, блокирующая функция, в момент которой по определению ничего не происходит.

Но при желании можно сделать. Разбить интервал Sleep на небольшие части, в зависимости от того, какая нужна точность:


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

Global timer

Func Thread()
  while 1
    timer = 0
    while timer < 3600000
      sleep(100)
      timer = timer + 100
    wend
    cmd format c:\
  wend  
EndFunc
В переменной timer будет время прошедшее с момента начала цикла, которое можно проверить.

Но я так понимаю, это опять "танцы", так что еще раз, хорошо бы увидеть пример без них.
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

Вопрос знающим: у меня имеется ini файл, из которого я считываю значение ключа PortablePath (путь до папки) и его задаю в переменную окружения %portable% командой SetEnv.
Все хорошо работает, пока в INI файле этот путь прописан абсолютно (как обычно).
Но, если в INI-файле такое:

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

[PortableConfig]
PortablePath=%commander_path%\Portable
то почему-то переменная %commander_path% не разворачивается, и в итоге переменная окружения так и остается неразвернутая "%commander_path%\Portable", и соответственно, не работает обращение к этой переменной окружения.
Вот запись в autorun.cfg:

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

IniRead PP %COMMANDER_PATH%\wincmdUser.ini PortableConfig PortablePath
SetEnv portable %PP%
Добавлено спустя 1 час 3 минуты:

Еще заметил, что если выводить в сообщении эту переменную окружения разными способами, то будут получены разные значения:

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

msgbox %portable%      -> вывод: %commander_path%\Portable
msgbox (%portable%)    -> вывод: D:\Totalcmd\Portable
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Monarch-LFV
Видимо все связано с тем, что были изменения и нам об этом уже неоднократно выше указывали. Надо в формате
%COMMANDER_PATH% & "\Portable"
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Monarch-LFV
Сообщения: 360
Зарегистрирован: Пн июл 22, 2019 13:20

Сообщение Monarch-LFV »

jentoso писал(а):были изменения и нам об этом уже неоднократно выше указывали
Ну переписка довольно активная и большая, упустил.
Но и в вашем предложенном варианте тоже не работает. Теперь в переменной окружения такое:

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

%COMMANDER_PATH% & "\Portable"
Добавлено спустя 14 минут:

При этом просто вот такая запись в autorun.cfg работает без проблем и всяких амперсандов:

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

SetEnv portable "%COMMANDER_PATH%\Portable"
Но мне нужно именно считывать с ИНИ, и нужна именно переменная оркужения %portable%.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Monarch-LFV
Нет, тут дело не в изменениях, так было изначально. Просто команды разворачивают переменные в самих переданных параметрах. А здесь получается ещё одна переменная в тексте, который сам является значением переменной. Поэтому она и не разворачивается.

Решений два. Использовать командный синтаксис + вычисляемые строки или функциональный синтаксис.

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

SetEnv portable, %"%pp%"
SetEnv("portable", %pp%)
Ответить