Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Drag&Drop на главной панели инструментов
Goto page Previous  1, 2, 3
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Fri Jul 10, 2026 15:03    Post subject: Reply with quote

Orion9 wrote:
сделал сохранение

По-моему, файл не перезаписывается (не меняет дату и время модификации), если имя остаётся прежним. Это немного настораживает…
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Sat Jul 11, 2026 00:39    Post subject: Reply with quote

sa wrote:
Это немного настораживает…

Согласен. Сделал сообщение, что нельзя в тот же файл сохранить.

С удалением, конечно, надо подумать, но это дело второе. Меня больше интересовал перенос значка, и вроде получилось. Кода совсем немного, но приложу весь модуль, поскольку было много мелких правок, включая WinRedraw(0), который помогает лучше перерисовывать, чем скрытие панели.

Перенос значка - копирование + сброс с удержанием перемещения Smile

 beta

 Hidden text
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Sat Jul 11, 2026 14:04    Post subject: Reply with quote

sa
Да, я немного ступил, когда вы говорили об удалении. Думал, речь идет о выделении дипазона, но увы, в Autorun нет возможности делать поля ввода, за исключением самой простой формы, да и то через VBScript.

Что касается удаления одной кнопки, сделать его было несложно (самая последняя функция в модуле). Пока сделал так: вынос кнопки на 200 пикселей за панель (от начала панели) + удержание кнопки переноса удаляет ее. При этом появляется соответствующий значок. DPI не учитывается, что может быть проблемой при большом масштабировании, но это пока только для теста. Все можно изменить. Может быть, у вас появятся какие-то идеи, если не понравится. Я сам пока не понял: вроде бы нормально, но...

Относительно диапазона, сделал в меню удаления за разрывом дополнительные пункты для удаления кнопок между разрывов. Немного потестировал — вроде работает. Но косяки, конечно, могут быть. Пока не буду на первой странице делать обновления, поскольку модуль еще в режиме тестирования.

 Hidden text

P.S. Я добавил горячую клавишу в заголовок для отмены последнего действия Win+Backspace, можно изменить.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Sun Jul 12, 2026 10:28    Post subject: Reply with quote

Orion9 wrote:
Перенос значка
Работает. Лучше, наверное, запретить перенос значка на разделители, по крайней мере на разрывы – это, к тому же чревато ошибками в работе скрипта. См. ранее:
Quote:
в результате разрыв строки проверяется не по значению "-2", а по размеру 2. Но поскольку вероятность команды с двумя символами очень мала, пока оставил так, но нужно будет переделать.

Orion9 wrote:
Что касается удаления одной кнопки, сделать его было несложно
Работает. С учётом возможности отмены действия, в отличие от удаления средствами TC, наверное, это полезная функция.

Orion9 wrote:
дополнительные пункты для удаления кнопок между разрывов
Возможно, удобнее один из двух разрывов оставлять, но не факт...
А так всё наглядно получилось, тем более, что копировать разрывы для выделения диапазона несложно.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Sun Jul 12, 2026 12:23    Post subject: Reply with quote

sa wrote:
Лучше, наверное, запретить перенос значка на разделители, по крайней мере на разрывы – это, к тому же чревато ошибками в работе скрипта

Да, я посмотрю, что там. Пока не успел основательно все протестировать, но постараюсь сделать это в ближайшее время.
sa wrote:
С учётом возможности отмены действия, в отличие от удаления средствами TC, наверное, это полезная функция.

Вроде бы. Но само движение вниз для вас оказалось удобным? Я сначала делал, чтобы при касании верхней границы экрана кнопку можно было удалять, но доделав до смены значка, понял, что при расрытом на весь экран ТС это неудобно - расстояние слишком мальнькое. Вообще, вариантов как-то мало, наверное, пусть пока так останется, а там посмотрим.
sa wrote:
Возможно, удобнее один из двух разрывов оставлять, но не факт...

Да нет, тут я промахнулся. Конечно же лучше оставлять! Исправлю. А также сделаю в меню пункты для добавления разрыва и разделителя, чтобы при их отсутствии не нужно было залезать в диалог изменения панели. А копировать разрывы и разделители действительно удобно, не говоря уж о кнопках, спасибо за идею Very Happy
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Sun Jul 12, 2026 19:21    Post subject: Reply with quote

sa wrote:
Лучше, наверное, запретить перенос значка на разделители, по крайней мере на разрывы – это, к тому же чревато ошибками в работе скрипта.

Да, это приводит к серьезным ошибкам! Там вообще на ниточке все держится. Если в файле панели будет мальшее отклонение от нормы, то проблемы будут обязательно. Видимо, придется пересматривать считывание панели с учетом разных нюансов, ведь сейчас кнопки просто определяются по наличию ключа button=, а разделители по cmd= с учетом, что ключ button= пустой.
Fix:
Code:
Func HBarDragIcon(DragIdx, DropIdx)
    # проверка индекса получателя
    If gHBarMap[DropIdx-1] <> 1 Then Return ShowDragHint("Получатель не может быть разделителем")
    # сохранение значка
    Local val = IniRead(gHBarFile, "Buttonbar", "button" & DragIdx)

sa wrote:
Возможно, удобнее один из двух разрывов оставлять

Обновленная функция
 Hidden text

Добавил к регулярному выражению \Z, иначе последний ключ терялся, если панель заканчивается eof, а не \r\n. В функции HBarMergeOne это тоже нужно подправить.

+Новые два пункта
Code:
    txt &= 'MENUITEM SEPARATOR' & auCRLF
    txt &= 'MENUITEM "Добавить разрыв", em_aucmd -1 HBarAddButton -2' & auCRLF
    txt &= 'MENUITEM "Добавить разделитель", em_aucmd -1 HBarAddButton 1' & auCRLF   
    txt &= 'POPUP "Удалить кнопки за разрывом"' & auCRLF

 Hidden text

Здесь все было просто. И последний фикс
Code:
SetHotkeyAction /K:W /H:BS "HBarUndo"

Иначе клавиша Win чудила с ключами /DM /S, скорее всего из-за последнего.

Ну вот, пока так. Остальные испытания чуть позже. Кстати, WinRedraw(0) все-равно не всегда помогает, увы.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Tue Jul 14, 2026 09:22    Post subject: Reply with quote

Orion9 wrote:
WinRedraw(0) все-равно не всегда помогает

У себя убрал WinRedraw, каждую SendCommand(2945) заменил на две SendCommand(2901) везде, кроме функций переноса значка (HBarDragIcon) и HBarSetCodePage – в них количество строк панели как будто не должно изменяться.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Tue Jul 14, 2026 12:41    Post subject: Reply with quote

sa wrote:
каждую SendCommand(2945) заменил на две SendCommand(2901)

А блокировку окна через SendMessage(AUTORUN_TCHANDLE, 11, 0, 0) перед этим используете?

А так - да, придется откатиться, поскольку использование SendCommand(2945)+WinRedraw(0) не всегда срабатывает. И если при удалении кнопок могут хотя бы оставаться пустые полосы, то при загрузке новой панели экран иногда не обновляется, и не понятно сработала ли команда или нет. Причины такого поведения не известны.

Чуть позже добавлю полный модуль - нужно зафиксировать все последние изменения, тем более, что новых идей больше нет.

Хотя можно было бы сделать меню для открытия панелей через OPENBAR, но не хочется это делать через команду в usercmd.ini.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Tue Jul 14, 2026 15:59    Post subject: Reply with quote

Orion9 wrote:
А блокировку окна через SendMessage(AUTORUN_TCHANDLE, 11, 0, 0) перед этим используете?
Сейчас попробовал включать/отключать блокировку – ощутимой разницы не заметил (а ведь когда-то видел её!).

Orion9 wrote:
при загрузке новой панели экран иногда не обновляется, и не понятно сработала ли команда или нет
Возможно, это следствие установленного ограничения на количество отображаемых строк (например, BarLimitLines=3).
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Tue Jul 14, 2026 19:09    Post subject: Reply with quote

sa wrote:
Сейчас попробовал включать/отключать блокировку – ощутимой разницы не заметил

Я понял. Как раз сейчас сделаю дополнительные функциии для сохранения и обновления панели, заодно и попробую. Давно надо было это сделать, иначе один и тот же код повторяется от функции к функции. Будет примерно так

 Hidden text

sa wrote:
Возможно, это следствие установленного ограничения на количество отображаемых строк

Может быть. А может просто из-за того, что функция все еще тестовая?

 Hidden text
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Wed Jul 15, 2026 00:40    Post subject: Reply with quote

sa
Все-таки пришлось оставить WinRedraw(0), поскольку две SendCommand(2901) не работают с временной панелью, загруженной на главную через OPENBAR. Придется держать это в уме. Может быть, потом найдется другое решение.

Исправил некоторые ошибки. Но модуль все еще сырой, нужно больше тестов перед тем, как добавить его на первую страницу.

 Hidden text

Все четыре операции Drag&Drop:

- Переренос
- Копирование
- Копирование значка
- Удаление

 Hidden text
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Wed Jul 15, 2026 11:39    Post subject: Reply with quote

Orion9 wrote:
Все-таки пришлось оставить WinRedraw(0), поскольку две SendCommand(2901) не работают с временной панелью

А ведь связка
SendCommand(2945)
WinRedraw(1)
WinRedraw(0)

удачной оказалась – при удалении кнопок между разрывами пустых полос не остаётся как будто!
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Wed Jul 15, 2026 13:28    Post subject: Reply with quote

sa
Да, вроде лучше стало, но все-равно, кажется, не всегда срабатывает. Нужно это учитывать, т.е. пока придется иметь в виду, что при операциях добавления и удаления, если они приводят к новому количеству строк на панели, экран не всегда может обновиться, нужно вручную его обновлять изменением размера окна ТС. Но чаще все-таки автообновление срабатывает, чем нет.

Вчера пропустил одну строку в функции HBarMergeOne. Нужно удалить лишнее присвоение.
Code:
# сохранение панели
Local txt = gHBarList.Text
HBarSaveState(txt)

Оно происходит в самой HBarSaveState()
Code:
# сохранение панели
Local txt
HBarSaveState(txt)

Еще одно небольшое изменение в HBarWndProc:

 Hidden text

С параметром lParam = -1000 не будет ненужного клика над кнопкой.

 Hidden text

Самый надежный способ использования — загрузить файл панели вызовом подсказки над последней кнопкой. Если информация о кнопке правильная, значит все операции с загруженной панелью тоже будут правильные, т.к. карта панели составлена правильно. Но какие-то ошибки все-равно могут быть, пока полностью исключать их нельзя.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2749

Post (Separately) Posted: Wed Jul 15, 2026 16:40    Post subject: Reply with quote

Попробовал такую связку команд (без всяких WinRedraw):
SendCommand(2945)
SendCommand(2919)
SendCommand(2919)

Вроде она работает и с постоянной и с временной панелью…
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1200

Post (Separately) Posted: Thu Jul 16, 2026 00:39    Post subject: Reply with quote

Классную лазейку вы нашли, спасибо!

Тестировал где-то час, вроде работает! Very Happy

Попробовал как с включеннной кнопкой истории, так и выключенной. Разные операции на панели с 500 кнопками! На которой, к тому же, куча разрывов и разделителей.

Вообще, час пролетел незаметно: прикольно кнопки туда сюда гонять Smile

Сделал дополнительное меню для открытия временной панели через OPENBAR. В usercmd.ini нужна команда
Code:
[em_open_bar_path]
cmd=OPENBAR
param=%A0

Толком не протестировал, но, кажется, есть какие-то проблемы. Меню вызывается через Shift+ ПКМ
Code:
# правый клик с удержанием Shift
ControlSetMouseAction /R /K:S 28 "HBarShowOpenMenu"

 Hidden text

Надо будет его еще потестировать хорошенько. Вроде удобно.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3
Page 3 of 3

 
Jump to:  
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