Orion9

|
Posted: Thu May 29, 2025 23:48 Post subject: |
|
|
Loopback
GetSelectedItems действительно быстрее стала работать, проверил сейчас. Изначально хотел вставить такую строку:
| Code: | If GetSelectedItems(3, 0) = '' And GetCurrentItem(3, 2) = 0 Then |
Чтобы проверять наличие объекта под курсором, когда на панели ничего не выделено. Иначе ТС выкидывает MessageBox при выполнении команды cm_CopyHdrFileDetailsToClip. Но на больших списках скорости все-равно недостаточно. Поэтому решил, что лучше сначала посылать команду cm_GoToFirstEntry, если под курсором пусто, и только потом делать повторную проверку. Также убрал обнуление массивов, теперь и без этого работает, спасибо за фиксы в новой версии. Ниже последний код функции для подсчета значений в колонках:
 Hidden text | Code: | RegisterCommand 62015 "Summarize"
Global SUM_THREAD = 0, SUM_MX = 0, SUM_MY = 0
Func Summarize(lParam)
If SUM_THREAD > 0 Then
SUM_THREAD = 0
Sleep(250)
Return
EndIf
If Not IsPressed(0x11) Then
MouseGetPos("SUM_MX", "SUM_MY")
SumUpColumns(1)
Return
EndIf
# CTRL запуск потока
RunThread ThreadSumCustomView
EndFunc
Func ThreadSumCustomView()
Local i
SUM_THREAD = 1
MouseGetPos("SUM_MX", "SUM_MY")
While SUM_THREAD > 0
SumUpColumns(0)
For i = 1 To 10
If SUM_THREAD = 0 Or (IsPressed (0x11) And IsPressed (0x1B)) Then
SUM_THREAD = 0
ShowHint("Операция прервана")
Break
EndIf
Sleep(50)
Next
Wend
SUM_THREAD = 0
EndFunc
Func SumUpColumns(lWait = 0)
Local txt, i, j, T1 = GetUptime()
If GetCurrentItem(3, 2) = 0 Then
SendCommand(2049, 0, 1) #cm_GoToFirstEntry
Endif
If GetCurrentItem(3, 2) = 0 Then
ShowHint("Index = 0", SUM_MX, SUM_MY, 1000, 1)
Return
EndIf
ShowHint("Clipboard Waiting", SUM_MX, SUM_MY, (lWait ? "" : 1000), (lWait ? "" : 1))
Local bReady = false, sMsg
Local aSel = List(), aCol = List(), _
aVal = List(), aRow = List()
SendCommand(2090, 0, 1) # cm_CopyHdrFileDetailsToClip
txt = ClipGet()
If StrLen(txt) > 0 Then
bReady = true
aSel.Text = txt
EndIf
If StrPos(aSel[0], auTAB) = 0 Then
bReady = false
sMsg = "Clipboard Data Incorrect"
Endif
If Not bReady Then
If lWait Then
ShowHint(sMsg, SUM_MX, SUM_MY)
Else
ShowHint(sMsg, SUM_MX, SUM_MY, 1000, 1)
Endif
Free(aSel, aCol, aRow, aVal)
Return
Endif
aCol.Split(aSel[0], auTAB)
aVal.Count = aCol.Count
txt = ""
For j = 1 To aSel.Count - 1
aRow.Split(aSel[j], auTAB)
For i = 0 To aRow.Count - 1
If StrPos(aRow[i], Chr(160)) Then
aRow[i] = StrReplace(aRow[i], Chr(160), "")
EndIf
If IsNumber(aRow[i]) Then aVal[i] += aRow[i]
Next
Next
For j = 0 To aCol.Count - 1
txt &= aCol[j] & ": " & aVal[j] & auCRLF
Next
Local TL = Round(GetUptime() - T1, 0) / 1000
txt &= "---" & auCRLF & _
"Selected: " & aSel.Count - 1 & auCRLF & _
"Powered by Autorun.wdx" & auCRLF & _
"Время операции: " & StrFormat("%.3f", TL) & " sec"
Free(aSel, aCol, aRow, aVal)
If lWait Then
ShowHint(StrTrim(txt), SUM_MX, SUM_MY)
Else
ShowHint(StrTrim(txt), SUM_MX, SUM_MY, 1000, 1)
Endif
EndFunc
|
Код, конечно, можно ещё пересматривать и дорабатывать, но сделать пока этого не смогу.
| Loopback wrote: | | А что такое инстанс? Это просто порядковый номер контрола. |
А когда он присваивается, на стадии проектирования или при запуске процесса?
Я думал, это значение постоянное и надежное, и что оно не должно меняться на лету. Autorun тут ни при чём. Я смотрел через Autoit v3 Windows Info. Если в ТС х86 строка состояния левой панели всегда равна TMyPanel5, то в ТС х64 значение инстанса данного элемента меняется прямо на ходу в зависимости от общего числа элементов интерфейса, которые отображаются в окне ТС, т.е. кнопки дисков, выпадающий список дисков, панель инструментов и т.д. Для удобства я использовал TCFS2, чтобы сразу убирать и добавлять по несколько элементов. Строка состояния левой панели при этом болтается как маятник - то Window 7, то Window 6, то опять Window 7, то снова Window 6. Но даже если просто через меню "Настройки" -> "Вид окна" убирать или добавлять компоненты по одной галочке, значение инстанса будет становиться другим, например Window 9 или Window 5, короче, таким, каким ему вздумается. Хочу еще раз отметить: такое происходит только в х64. В обычном 32-битном ТС всё нормально, хотя я не проводил глубоких тестов. Но вы видите у себя такую проблему?
| Loopback wrote: | | Потому что Autorun не интерактивное графическое приложение, с диалогами, статусными строками и тому подобным. |
Ну, вы так расписываете, словно вам действительно ставят задачу сделать из Autorun интерактивное графическое приложение ) На деле лишь просят добавить 1-2 формы для более удобного вывода сообщений и отображения статуса операций. В общем, нужно что-то вроде эквивалента командам infbx и prgrs в TCIMG. Если это возможно сделать, хотелось бы увидить в будущих версиях.
| AkulaBig wrote: | | Мне-же надо выводить проценты после определенных шагов операций |
Ну так сам прогресс-бар и запрос к Loopback как раз об этом.
| AkulaBig wrote: | | Потому что даже в файле autorun.example.cfg именно этот метод показан. |
Да, давненько я не открывал этот файл. Вижу, есть в нём некоторые изменения. А установкой переменных окружения в зависимости от разрядности я тоже пользуюсь, например:
 Hidden text | Code: | If SYSINFO_OSARCH = 64 and AUTORUN_TCARCH = 32 Then
SetEnv COMMANDER_SYSTEM32 "%windir%\Sysnative"
Else
SetEnv COMMANDER_SYSTEM32 "%windir%\system32"
EndIf
SetEnv NIRSOFT "%COMMANDER_PATH%\Utilites\NirSoft\NirSoft"
If SYSINFO_OSARCH = 64 Then
SetEnv NIRSOFT %"NIRSOFT & '\x64'"
Endif
|
| AkulaBig wrote: | | Кстати, вы-же забраковали мой набор пользовательских колонок со всеми существующими значениями. А я тут запускал его именно в альбоме каком-нибудь. Нормально смотрится, когда файлы из одного альбома. |
Где же я его забраковал, если я как раз писал, что нормально смотрится только на похожих файлах, например дискографиях исполнителей. А альбомы и есть составная часть дискографий. |
|