Autorun

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

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

Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Примерно так (не тестировал)
Норм шпарит. Проверил сначала на 1000, потом на 2000 файлов с общим размером списка в буфере в 330 Кб, но думаю, он и больше возьмет, ведь ничего нигде не обрезается.
Loopback писал(а):Какие именно? Нужна все же какая-то конкретика.
Да, не успел просто написать, отвлекли немного. В общем, думаю, это связано с тем, что в коде после создания объектов List некоторым из них присваивается количество элементов через свойство Count:

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

Local aSel = List(), aCol = List(), aVal = List(), aRow = List()
...
aCol.Split(aSel[0], auTAB)
aVal.Count = aCol.Count
Вот здесь, возможно, есть проблема, но не хочу вводить вас в заблуждение - я вносил много изменений, может и сам где-то накосячил ранее из-за того, что функция была сначала завязана только на поток, просто подумал, не лишним будет сообщить об этом. Кстати, по этой же причине сразу за последними двумя строками следует:

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

For j = 0 To aVal.Count - 1
   aVal[j] = ""
Next
Без такой принудительной инициализации элементов тоже были проблемы. Может, сейчас их и нету, это надо тестировать, но в ближайшие 2-3 недели буду пребывать в полном ауте. Сейчас закомментировал:

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

    #{
    aSel.Count = 0
    aCol.Count = 0
    aVal.Count = 0
    aRow.Count = 0          
    #}
Нет. Тотал валится. Значит проблема с установкой элементов через Count всё же есть.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Тотал валится. Значит проблема с установкой элементов через Count всё же есть.
Да, нашёл, неправильно устанавливалась ёмкость списка. Действительно, в данном примере это можно устранить начальной инициализацией в 0, хотя не факт, что помогло бы в другом случае.
Orion9 писал(а):Кстати, по этой же причине сразу за последними двумя строками следует:
А вот как могло это чем-то помочь не понимаю. Без начального присваивания 0 этот код крашит тотал.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):А вот как могло это чем-то помочь не понимаю. Без начального присваивания 0 этот код крашит тотал.
Имелось в виду, что без этого когда были проблемы, даже при первом обнулении, поэтому пришлось его добавить. Но как я писал, изначально функция выполнялась только в потоке, и я использовал Static. Возможно, сейчас этот код вообще не нужен и ничего не делает, но спасибо, что посмотрели. Я еще буду всё пересматривать и доделывать позже, тогда и потестирую.

А вот какая мысль возникла. Функционал кастомных полей вы добавили, а что если листерную часть добавить? :shock:

Ведь это возможно? Начать хотябы с простого вывода строковой переменной в окно Листера с возможностью смены шрифта и фона, можно такое провернуть?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): а что если листерную часть добавить?
Возможно-то всё. Даже возникала такая мысль, но до появления DllCall было мало смысла, поскольку пришлось бы создавать развесистую обвязку, вроде GUI-функций в Autoit/AHK. Это долго, сложно и не очень интересно. Теперь без этого можно обойтись, но тут скриптового кода придется писать кучу, а при необходимости пользовательской отрисовки будет очень медленно. А сделать отрисовку быстрее - значит опять же нужен какой-то более высокоуровневый интерфейс для управления всем этим из Autorun.

В общем, добавлю в todo как потенциальную идею, но...
Orion9 писал(а):вывода строковой переменной в окно Листера
Просто так туда ничего не выведешь, оно же не предоставляет никаких инструментов для этого. Тут надо создавать свое дочернее окно и выводить или рисовать в нём.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

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

Сообщение Loopback »

Версия Autorun 2.2.19 beta

[cut="Список изменений"]- исправлена некорректная установка размера List свойством Count
+ Runtime: увеличена в разы скорость GetSelectedItems на больших списках
* Runtime: в GetSelectedItems изменён метод возврата текста большого размера
* Runtime: ClipGet может возвращать текст длиной более 32765 символов
+ API: расширен механизм возврата ошибок
- TextFile и BinaryFile не устанавливали макрос ERROR при ошибке
+ доработана и расширена функция FileGetVersion
- исправлено падение Date и Time на отрицательных числах
+ макрос AUTORUN_UTCDIFF, переменная AUTORUN_CFG
* оптимизация работы с внутренними командами для SendCommand
+ в функции FileSetAttr и FileSetTime добавлена поддержка масок и рекурсии
+ функции FileCopy, FileMove, FileDelete, DirCreate, DirCopy, DirMove, DirDelete
+ функции FileFind, FileFindEv, FileMatchMask
+ Runtime: в ItemAtCursor добавлен тип "name"
+ Runtime: GetCurrentItem может получать имя файла в режиме эскизов
+ FileGetAttr добавлен атрибут L (точка повторной обработки)
+ FileSetTime может задавать одновременно несколько видов меток времени
+ параметр lParam в функции обратного вызова RegisterCommand теперь опциональный
* при чтении переменных приоритет переменных окружения теперь ниже приоритета глобальных переменных
[/cut]
Эта версия сфокусирована на поиске и всём, что на нём завязано, в частности функции копирования/перемещения. Это последний крупный блок со взаимосвязями, который хотелось закончить до релиза, всё остальное прикладные задачи, которые могут быть сделаны в любое время. Да и наличие DllCall теперь избавляет о необходимости делать мелкие функции с одним-двумя вызовами системных функций. Так что настало время перейти к этапу исправлений и оптимизации.

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

Ранее в Autorun был запрет на одновременное существование глобальных переменных и переменных окружения. Это было связано с тем, что внутренние переменные и переменные окружения читаются единообразно, ещё одно наследие ранних версий.

При этом не получится создать глобальную переменную temp, tmp и path, или username и windir, поскольку такие переменные, скорее всего, есть в любой системе. Но это полбеды. Хуже с неизвестными переменными. Никогда не знаешь, какие переменные окружения могут оказаться на чужом компьютере. Т.е. делая сборку, нельзя быть уверенным, что она запустится на другом компьютере. Страдает переносимость кода.

На имеющиеся скрипты это изменение не должно никак повилять, потому что раньше с одним именем мог быть создан только один вид переменных и для них ничего не изменится. В новых изменённую логику нужно учитывать.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Отличные новости! Будем тестить потихонечку. Обновление проблем не вызвало.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Спасибо за шикарные файловые функции! Пока только начал тестирование, но кажется, есть проблема с FileGetVersion - стандартный пример из справки не работает:

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

# Запись версии TC в переменную (например, 11.03)
TCVersion = FileGetVersion(COMMANDER_EXE, "FileVersion") 
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):стандартный пример из справки не работает
Похоже только под x64. Вот как бы выработать привычку обязательно проверять под x64... Буду смотреть.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Нет, до х64 я ещё не успел добраться ) Но проблему удалось локализовать. Заметил, что в трее версия в подсказке нормально отображается, а при наведении на функциональную кнопку поля остаются пустыми. Другими словами, проблема проявляется, когда FileGetVersion вызывается из функции, привязанной к контролу через ControlSetHint. Вот полный код:

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

ControlSetHint /F /D:50 /B:7 17 "AutorunHints"
 
Func AutorunHints()   
    Local A_Version, A_Copyright, A_DateTime, _
          A_Wdx = AUTORUN_PATH & "\Autorun.wdx", txt   
                        
    If IsPressed (KEY_SHIFT) Then Return GetState("libs")
    If IsPressed (KEY_CTRL) Then 
       txt = GetState("procs")
       If StrLen(txt) > 0 Then txt = auCRLF & txt
       Return GetState("threads") & txt
    Endif   
    If IsPressed (KEY_ALT) Then Return GetState("paths") 
    
    A_Version   = FileGetVersion(A_Wdx, "FileVersion")
    A_Copyright = FileGetVersion(A_Wdx, "LegalCopyright")
    obj = Plugin("FileDateTime")
    If ERROR = 0 Then
       obj.FileName = A_Wdx
       A_DateTime = StrFormat("%.0f", obj.GetValue(3))
       Free(obj)
    Else
       A_DateTime = "Error " & ERROR
    Endif
    Return "Версия: " & A_Version & auCRLF & "Дата изменения: " & A_DateTime & auCRLF & "Авторские права: " & A_Copyright 
    
EndFunc
Если в любом месте файла конфигурации сделать простой вызов MsgBox(AutorunHints()), то проблем с FileGetVersion нет.

В общем, многое успел потестировать, вроде бы проблем пока нет. До новых функций, к сожалению, ещё не скоро доберусь, хотя хотелось бы побыстрее, но забыл в тот раз написать. Повесил ваш пример со сворачиванием окна ТС в трей на CTRL + "клик" - нравится эта идея. Но при разворачивании назад из трея, окно, которое было развернуто во весь экран до сворачивания в трей, назад во весь экран не разворачивается, а переходит в режим простого окна. У вас есть такая проблема?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9
Да, это не обязательно могло быть на x64, но у меня на ней проявилось. Исправил, обновил по той же ссылке.
Orion9 писал(а):назад во весь экран не разворачивается, а переходит в режим простого окна
Да, надо просто заменить WinSetState(1) на WinSetState(5) в функции MinTrayAction. Пример поправлю, так действительно будет правильнее.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Исправил, обновил по той же ссылке.
Теперь всё окей. Постепенно буду дальше тестировать функционал. Надеюсь, ничего серьёзного больше не выявится.

Глянул глазком FileFind, очень круто. Какие же возможности это открывает, и кстати, спасибо за роскошные примеры внизу! Там что ни пример, то можно в коллекцию, ну или в реальную сборку )
Loopback писал(а):Да, надо просто заменить WinSetState(1) на WinSetState(5) в функции MinTrayAction. Пример поправлю, так действительно будет правильнее.
Да, сделал. Только нужно еще WinSetState(23) добавить сразу за WinSetState(5), чтобы окно активировалось. А так всё классно. Жаль, что Би$$и & Co. во всей вЫнде так не сделали )

P.S.

ClipGet проверил на >5000 файлов и буфере в 870Кб, проблем не обнаружил. А этот код инициализации элементов действительно теперь не нужен:

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

    For j = 0 To aVal.Count - 1
        aVal[j] = ""
    Next
И без него всё работает.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Для того чтобы полностью избавиться от помощи внешних утилит теперь не хватает только StrRegexReplace :)
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Коммандер сказал "От винта!" :mrgreen:

[cut=".aucfg"]

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

RegisterCommand 62016 "RotateIcon"

Global ROTATE_THREAD = 0

Func RotateIcon()
    If ROTATE_THREAD > 0 Then
       ROTATE_THREAD = 0
       Return
    EndIf   
    RunThread ThreadRotateIcon  
EndFunc    

Func ThreadRotateIcon()
    ROTATE_THREAD = 1
    While ROTATE_THREAD > 0 
        Sleep(100)
        IconRotateDraw()
    Wend
EndFunc

Func IconRotateDraw()
    Static nIco = 0
    nIco += 1
    If nIco > 4 Then nIco = 1
    Local sFile = COMMANDER_PATH & "\Icons\TC" & nIco & ".ico"
    Local hIco = DllCall("shell32\ExtractIconW", _
                          "ptr", AUTORUN_TCHANDLE, _
                          "wstr", sFile, _
                          "uint", 0, _
                          "ptr")     
    Local hWnd = WinFind(AUTORUN_TCHANDLE, _
                        (AUTORUN_TCARCH = 32 ? "TMyPanel" : "Window"), _
                        (AUTORUN_TCARCH = 32 ? 5 : 7))
    Local hDC = DllCall("GetWindowDC", "ptr", hWnd, "ptr")
    Local x, y, w, h    
    WinGetPos("x", "y", "w", "h", hWnd)    
    DllCall("DrawIconEx", _
                   "ptr", hDC, _
                   "int", w - 30, _
                   "int", 1, _
                   "ptr", hIco, _
                   "int", 12, _
                   "int", 12,  _
                   "uint", 0, _
                   "ptr", 0,  _
                   "uint", 0x0003)
    SendMessage(AUTORUN_TCHANDLE, 0x80, 0, hIco)
    SendMessage(AUTORUN_TCHANDLE, 0x80, 1, hIco)
    DllCall("ReleaseDC", "ptr", AUTORUN_TCHANDLE, "ptr", hDC)                
    DllCall("DestroyIcon", "ptr", hIco)
EndFunc
[/cut]
[cut="Icons"]

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

MIME-Version: 1.0
Content-Type: application/octet-stream; name="TC.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="TC.7z"

N3q8ryccAATOSPgoMQQAAAAAAAAiAAAAAAAAAK6TTgPgEfcDrl0AAGAEkCoDQi96BFoomAoR6Kca
ksXsmah8Y2qfDe7uVm/oRITsfehEAWs4l3R/Nrj2A4m3iNMBRthITX7tVq2teSW4C/jO76jbgp/d
LbY3JMdcHOvv3u0e+Mafgo5oCZcQrwLQHTnkdcbdu4TZ9sGdkUDpGJ8r6N38csmd8i3UW0HHNaJw
riccfaKMfdIRWCOiYtyV3elDlLLghOUGCM2uxHU31Ifry7GIrJademsy7TMN2XbSz0ct37RKIg4w
B9R2hz5K/PRhXkB/IdCnjUwdPKVjSBw+5BmHwoHrDLfLPgq7cajARU1A6sNXACNXJEzJAY74MBS1
Wp/36QTgRAMMx0Kowu04W5XGnTl+/fRC99ICdEamxdG9Wu9ykcwKR6Nrl3lzqSPNeR8sZaXfixmw
b4K70KzwQstwZxLG3eUKEf98CvtGUuTaTeaLoKnscBrlrcZT2AGHywiirJ5pnBD39QPy073fntiD
u19RuRHpm00duKxjy8B+r7KYHlec7FnUyv2s8do7VEwNWO4jThua69EFIeA/8NvibAaFPCXiZp4J
rTiDO5GdNLZd1/xz+vJTaB/XnZhW9XRPK6JKjkrv7x/ixcN0PYMMWJ1GjcIykrhR68ZcooqcnCgK
sA2DHluYDhQ07B5Fy9qIRPWHy+gCCAEw7l6RV7g4kOIhIXJH/0TgtFNN82zTjacG2o4aG+6K2h6E
QY9rtnun6d6l+N5kywA3VQTQtqp64QESdyXgITw23Xgq8NbyRrciQx8At+LgLejPB+QWTHSmUbLe
DkOmS78l8N69brWxjLOhtPXumLguC5n50ZRKIo2hoXYK+uyzYu81jhxVEPeis27RqXdcRKO35K1t
je7bdL6NktQSO5d+4+pt6yGVDR4NMD1Jv9YQq9/GVARNdao7MpPErvo3fSTWJWKD4AWdauoWF7+q
B2AikrXt3R3N8/omjU7aHzi/JeFNve/eoK/HHokNziDbeKjhp0WbOnIBGWFHNjGAju2/21xSezfH
G5tbYGZCFdFGrCY4Z5q8HpAX8ZOV7eoR8zNLSsh6ql2NALlbU20F0+043W/K8zvMb5j0E2o0WgJN
TqB0i7ZkYxt3UXbfxAgqI0PG4NeBNQ42fp+vzTN79syYxNjN/q3pXlJrttF2/bWvCLjIKz8xpB9j
eCwlHXnUbnTfSkAPRvME15VMYUUEwQq2w5I/9qBOpFf5RUecmtffTF6mujgmeBlkkOG7jEujKav/
eCtJJklnxGl5oeTAAAAAgTMHrg/VUdtGlyTT/rNwFrFR7o9meG60H5TdVtMt2E/AVhb/besx56NL
glhEy1xsT8hbcNiw73O6polZti1hRoPHJr+Hsavanp2tBVFU+x4nNeiI831KFKi8iCGq5LCEcM5F
gzGK0trybzIaFbekvPW/KVKYjO0dIBcGg7YBCXsABwsBAAEjAwEBBV0AEAAADICuCgEEjNTnAAA=

[/cut]
[cut="Button"]

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

TOTALCMD#BAR#DATA
62016

%COMMANDER_EXE%
Поехали!


-1
[/cut]
Loopback писал(а):всё остальное прикладные задачи, которые могут быть сделаны в любое время
Об этом было в топике: одной из фич, которую хотелось бы увидеть, умение Autorun каким-то образом сообщать статус долгих операций. Пример выше, конечно, больше шуточный, но хотелось бы чего-то такого, более серьёзного.

P.S.

[cut="yozhik"]Autorun - это Cosmos )[/cut]
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Коли MediaInfo используется у меня в нескольких местах, конечно захотел прописать ее через переменную util_MI. В TCMediaInfo это без проблем работает, то-есть путь прописан правильно. В DllCall не работает:

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

	Static sLib = util_MI
	Static hLib = DllCall("LoadLibrary", _
			"wstr", sLib, _
			"ptr")
	If hLib = 0 Then
		Return "Error LoadLibrary " & sLib
	EndIf
Через DebugView путь показывает правильно. Как в вызове библиотеки правильно прописать?
Ответить