| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Mon Jan 13, 2025 17:30    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | AkulaBig wrote: | 	 		  | Скорей всего без разницы. | 	  
 
Как бы сказал герой одного известного фильма: "Лёлик, но ведь это не эстетично"    
 
 
Если запустить монитор процессов, то уже через несколько секунд все окно будет засыпано примерно этим:
 
 	  | Code: | 	 		  TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 
TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini   
 
TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 
TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini   
 
TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 
TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini   
 
TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 
TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
 
TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini     | 	  
 
Но все же я склонен с вами согласиться, что в данном случае это "без разницы". Потому что если открыть Монитор Ресурсов или Process Explorer от Sysinternals, то можно увидеть, что I/O дисковых операций от процесса Totalcmd.exe есть, но самих дисковых операций (чтения/записи) нет. Видимо, всё это просто гоняется в кэше до тех пор, пока файл на диске действительно не изменится. 
 
 
Все-равно я думаю, Гислеру можно было бы сделать такую переменную, тем более что это несложно.
 
 	  | sa wrote: | 	 		  | Ещё, если это %COMMANDER_EXE% или имя программы без пути (Totalcmd.exe/TOTALCMD64.EXE). Планируется добавление shell32.dll и, возможно, imageres.dll. | 	  
 
Это безусловно радует, но хотелось бы, чтобы и другие библиотеки значков тоже умел читать    | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		sa
 
 
  Joined: 29 Apr 2009 Posts: 2709
 
  | 
		
			
				  (Separately) Posted: Mon Jan 13, 2025 17:51    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Orion9
 
Там проблема в производительности, если я правильно понял:
 
 	  | Help wrote: | 	 		  New functions and fixes in Total Commander 11.50:
 
Menu: Use icon defined in em_command, but only from wcmicons.dll or .ico files or from the main program, for speed reasons (virus scanners) | 	 
  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Mon Jan 13, 2025 19:56    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				sa
 
Ну, если пользователь решит сделать меню, где у него десятки пунктов будут завязаны на значки из exe-файлов, то это его выбор. Только какое отношение это имеет к возможностям Total Commander?    
 
 
Да и потом, речь больше идет о DLL и ICL, содержащие пользовательские значки, помимо стандартного wcmicons.dll.
 
 
P.S. Пересмотрел и адаптировал код, который делал еще в том году, для создания трёх панелей uwdx.
 
 
  Hidden text  	  | Code: | 	 		  RegisterCommand 70900 "Uwdx3Bars"
 
 
Func Uwdx3Bars(lParam)
 
   Local bar = %COMMANDER_PATH% & "\Bars\", usr
 
   Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
 
   
 
   #создание панелей   
 
   If b_Alt Then
 
      CreateUwdxBars()
 
      Return
 
   EndIf
 
 
   If b_Ctrl Then 
 
      usr = "em_auto_uwdxp"
 
      bar = bar & "Auto_uwdxp.bar"
 
   ElseIf b_Shift Then
 
      usr = "em_auto_uwdxa"   
 
      bar = bar & "Auto_uwdxa.bar"   
 
   Else
 
      usr = "em_auto_uwdxe"   
 
      bar = bar & "Auto_uwdxe.bar"   
 
   EndIf   
 
        
 
   If FileExist(bar) Then
 
      CommandExec(usr)
 
      #ShowPopupMenu /D %bar%
 
   Else   
 
      ShowHint("Не найден " & bar) 
 
   EndIf
 
EndFunc
 
 
Func CreateUwdxBars()
 
   Local f = 0
 
   ShowDarkHint("Создание панелей", 0)   
 
   f = f + CreateUwdxBar("Auto_uwdxa")
 
   f = f + CreateUwdxBar("Auto_uwdxe")
 
   f = f + CreateUwdxBar("Auto_uwdxp")   
 
   ShowDarkHint(f & " из 3 файлов было создано", 0)
 
EndFunc
 
 
Func CreateUwdxBar(Barname)
 
   Local i = 0
 
   Local bar, br2, wdx
 
   Local uwdx_dir = "\Plugins\uwdx\"
 
   Local uwdx_exe = "%COMMANDER_PATH%" & uwdx_dir & "uwdx.exe"
 
   Local uwdx_con = "%%COMMANDER_PATH%%" & uwdx_dir & "uwdx.exe"
 
   Local uwdx_obj = "%P%N" 
 
   
 
   bar = %COMMANDER_PATH% & "\Bars\" & barname & ".bar"
 
   br2 = %COMMANDER_PATH% & "\Bars\" & barname & ".br2"
 
  
 
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%bar%"""
 
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%br2%"""
 
   
 
   If FileExist(bar) Then   
 
      MsgBox("Ошибка удаления " & bar, "uwdx")
 
      Return 0
 
   Endif
 
   
 
   IniWrite %bar% "Buttonbar" "Buttoncount"  "0"
 
   If ERROR = 1 Then 
 
      MsgBox("Ошибка создания " & bar, "uwdx")
 
      Return 0   
 
   EndIf
 
     
 
   While i < 100
 
      IniRead /R wdx %COMMANDER_INI% "ContentPlugins" %"%i%" "stop"
 
      If wdx="stop" Then Break
 
     
 
      wdx = StrTrim(StrRight(wdx, StrLen(wdx)-StrPos(wdx, "\", -1)))
 
      
 
      IniWrite %bar% "Buttonbar" %"'Button'   & %i%+1" %uwdx_exe%
 
      IniWrite %bar% "Buttonbar" %"'Menu'     & %i%+1" %wdx%   
 
      IniWrite /EV- %bar% "Buttonbar" %"'Cmd' & %i%+1" "%COMSPEC% /k"
 
      
 
      Switch Barname
 
         Case "Auto_uwdxa"
 
            IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /I %wdx% ""%uwdx_obj%""'
 
         Case "Auto_uwdxe"
 
            IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /E /I %wdx% ""%uwdx_obj%""' 
 
         Else
 
            IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /I "%wdx%"'
 
      EndSwitch
 
              
 
      i = i + 1
 
   Wend
 
   IniWrite %bar% "Buttonbar" "Buttoncount"  %i%
 
   Return 1
 
EndFunc
 
 
Func ShowUwdxe
 
   CommandExec em_auto_uwdxe
 
EndFunc
 
 
Func ShowUwdxa
 
   CommandExec em_auto_uwdxa
 
EndFunc
 
 
Func ShowUwdxp
 
   CommandExec em_auto_uwdxp
 
EndFunc
 
 
  | 	 
  
 
  Hidden text  	  | Code: | 	 		  [em_auto_uwdxe]
 
cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxe.bar
 
[em_auto_uwdxa]
 
cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxa.bar
 
[em_auto_uwdxp]
 
cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxp.bar
 
  | 	 
  
 
  Hidden text  	  | Code: | 	 		  TOTALCMD#BAR#DATA
 
70900
 
 
%COMSPEC%
 
Панели Uwdx|Alt - Создать панели|Ctrl - Структура полей|Shift - Все поля плагина
 
 
 
-1
 
  | 	 
  
 
Пользовательски команды можно привязать к хоткеям или кликам мышки, например:
 
 	  | Code: | 	 		  ControlSetMouseAction /R /K:C 3 ShowUwdxe
 
ControlSetMouseAction /R /K:C /K:S 3 ShowUwdxa
 
  | 	 
  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Mon Jan 13, 2025 21:39    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  
 
Если запустить монитор процессов, то уже через несколько секунд все окно будет засыпано примерно этим:
 
 | 	  
 
Запустите какой-нибудь шпион и увидите, что там творится с любым окном. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Mon Jan 13, 2025 23:56    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				AkulaBig
 
Да это понятно. Просто речь шла о файловых операциях как раз, а не об окнах. Loopback же подтвердил, что макрос AUTORUN_TCLANG просто считывает ключ из wincmd.ini, что равноценно обычному вызову функции IniRead. Как по мне, то между:
 
 	  | Code: | 	 		  IniRead /R lng %COMMANDER_INI% "Configuration" "LanguageIni"
 
If lng = "WCMD_RUS.LNG" Then
 
 
Endif
 
 
  | 	  И:
 
 	  | Code: | 	 		  If %COMMANDER_LANG% = "WCMD_RUS.LNG" Then
 
 
Endif
 
  | 	  Я бы однозачно выбрал второе  
 
 
P.S. И все-таки добрались у меня руки до функции SuperWDX. В прошлый раз ее доделать помешал плагин wdx4i, который не хотел загружаться в объект, но поскольку Loopback исправил ошибку, я решил придать всему этому какой-то законченный вид:
 
 
  Hidden text  	  | Code: | 	 		  Func GetSuperWdx(FileName, FieldIndex, UnitIndex)
 
   
 
   Static video_ext = ".mp4 .mkv .avi", _
 
          audio_ext = ".mp3 .flac .m4a", _
 
          picture_ext = ".jpg .bmp .gif .png", _
 
          archive_ext = ".7z .rar .zip .cab .zst"     
 
 
    If StrPos(FileGetAttr(FileName), "D") Then
 
       Return "<Dir>"
 
    Endif
 
 
   Local file_ext    
 
   Local ext_pos = StrPos(FileName, '.', -1)
 
   
 
   if ext_pos > 0 Then
 
   
 
      file_ext = StrMid(FileName, ext_pos+1, StrLen(FileName)-ext_pos)
 
      
 
      If StrPos(video_ext, '.' & file_ext) Then Return GetVideoInfo(FileName)
 
      
 
      If StrPos(audio_ext, '.' & file_ext) Then Return GetAudioInfo(FileName)
 
      
 
      If StrPos(picture_ext, '.' & file_ext) Then Return GetPicsInfo(FileName)
 
      
 
      If StrPos(archive_ext, '.' & file_ext) Then Return GetArchInfo(FileName)                  
 
 
   Endif
 
 
EndFunc
 
 
Func GetVideoInfo(FileName)
 
Local s
 
   obj = Plugin("TCMediaInfo")
 
   If ERROR = 0 Then
 
      obj.FileName = FileName
 
      # All video as string      
 
      s = obj.GetValue(28)
 
      Free(obj)
 
   Else
 
      s = "Plugin error " & ERROR
 
   Endif
 
   Return s
 
EndFunc
 
 
Func GetAudioInfo(FileName)
 
Local s
 
   obj = Plugin("TCMediaInfo")
 
   If ERROR = 0 Then
 
      obj.FileName = FileName
 
      # All audio as string
 
      s = obj.GetValue(39)
 
      Free(obj)
 
   Else
 
      s = "Plugin error " & ERROR
 
   Endif
 
   Return s
 
EndFunc
 
 
Func GetPicsInfo(FileName)
 
Local s
 
   obj = Plugin("wdx4i")
 
   If ERROR = 0 then
 
      obj.FileName = FileName
 
      # wdx4i.pixw, wdx4i.pixh, wdx4i.orient, wdx4i.depth
 
      s = obj.GetValue(5)  & " x " & obj.GetValue(6) & " , " & obj.GetValue(7) & " , " & obj.GetValue(13)
 
      Free(obj)
 
   Else
 
      s = "Plugin error " & ERROR
 
   Endif
 
   Return s
 
EndFunc
 
 
Func GetArchInfo(FileName)
 
Local s
 
   obj = Plugin("Total7zip")
 
   If ERROR = 0 then
 
      obj.FileName = FileName
 
      s = (obj.GetValue(5) <> "" ? obj.GetValue(5) & ", " : "")      
 
      s &= "Folders: " & obj.GetValue(6) & ", Files: " & obj.GetValue(7)
 
      s &= (obj.GetValue(11) = "+" ? ", Solid" : "")
 
      s &= (obj.GetValue(1) = "+" ? ", Encripted" : "")      
 
      s &= (obj.GetValue(9) <> "" ? ", Method: " & obj.GetValue(9) : "")      
 
      s &= ",Type: " & obj.GetValue(8)
 
      Free(obj)
 
   Else
 
      s = "Plugin error " & ERROR
 
   Endif
 
   Return s
 
EndFunc
 
  | 	 
  
 
 
Вывод в дополнительном поле выглядит примерно так:
 
 
  Hidden text  	  | Code: | 	 		  test 01.m4a   AAC, 44.1 kHz, 2 Ch, 491 Kbps
 
test 02.flac   FLAC, 44.1 kHz, 2 Ch, 16 Bits, 848 Kbps
 
test 03.flac   FLAC, 44.1 kHz, 2 Ch, 16 Bits, 768 Kbps
 
test 05.mp3   MPEG Audio, 44.1 kHz, 2 Ch, 320 Kbps
 
test 06.mp3   MPEG Audio, 44.1 kHz, 2 Ch, 320 Kbps
 
test 08.jpg   3840 x 2160 , Landscape , 24
 
test 09.7z   93%, Folders: 0, Files: 1, Method: LZMA2:18,Type: 7z
 
test 10.jpg   505 x 550 , Portrait , 24
 
test 11.jpg   100 x 100 , Quadrate , 24
 
test 12.JPG   1223 x 465 , Portrait , 24
 
test 13.JPG   465 x 1223 , Landscape , 24
 
test 14.7z   27%, Folders: 1, Files: 5, Method: LZMA2:6k,Type: 7z
 
test 15.7z   26%, Folders: 2, Files: 73, Solid, Method: LZMA2:26 LZMA:20 BCJ2,Type: 7z
 
test 16.zst   Folders: 0, Files: 1, Method: header-open-only: XXH64 single-segments wnd-MAX:29893,Type: zstd
 
test 17.zst   Folders: 0, Files: 1, Method: header-open-only: XXH64 single-segments wnd-MAX:29663,Type: zstd
 
test 18.mkv   1920x804 (2.39:1), 23.976 fps, HEVC, 6,96 MBps
 
test 18.mp4   1920x1080 (16:9), 23.976 fps, AVC, 3,96 MBps
 
test 19.mp4   1920x1080 (16:9), 30.000 fps, AVC, 2,65 MBps
 
test 19.png   676 x 757 , Portrait , 24
 
test 20.png   960 x 687 , Landscape , 24
 
test 21.png   1223 x 465 , Landscape , 24
 
test 22.zip   48%, Folders: 1, Files: 6,Type: zip
 
test 23.zip   61%, Folders: 1, Files: 18,Type: zip
 
test 24.zip   66%, Folders: 1, Files: 21,Type: zip
 
test 25.zip   41%, Folders: 3, Files: 106,Type: zip
 
test 26.zip   41%, Folders: 3, Files: 106,Type: zip
 
test 27.rar   23%, Folders: 1, Files: 15, Solid, Method: v6:16M:m5,Type: Rar5
 
  | 	 
  
 
 
Ну не знаю... Вам решать. В любом случае, в Autorun сейчас есть такая возможность. Можно, конечно, при желании, все более тонко подстроить под конкретную задачу, это был лишь пример. Но главный конфиг обязательно должен в первой строке объявлять дополнительное поле:
 
 	  | Code: | 	 		  Pragma AutorunPluginFields "SuperWdx:::GetSuperWdx"   | 	 
  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Tue Jan 14, 2025 00:28    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  Я бы однозачно выбрал второе  
 
 | 	  
 
Дак понятно, что эта переменная для удобства создана.
 
 	  | Orion9 wrote: | 	 		  | В любом случае, в Autorun сейчас есть такая возможность. | 	  
 
Я только что перевод DirMenu закончил. Следующий этап колонки пользователя. Может пригодиться. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Wed Jan 15, 2025 00:20    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | AkulaBig wrote: | 	 		  | Я только что перевод DirMenu закончил. Следующий этап колонки пользователя. Может пригодиться. | 	  
 
В смысле? Если Гислер сделает такую переменную? Конечно пригодится!
 
 
А еще бы очень пригодилось, если бы он сделал раскрытие переменных окружения в сплывающих подсказках. Тогда не пришлось бы прыгать с бубном и определять индекс нужной кнопки для дальнейших манипуляций. Хотя всех проблем бы это не решило, но помогло бы во многом.
 
 
А пока приходится выходить из положения вот такими функциями    
 
 
  Hidden text  	  | Code: | 	 		  # поиск индекса кнопки на панели
 
# примеры вызова:
 
#{
 
   BarsPath = %COMMANDER_PATH% & "\Bars\"
 
   
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "cmd", "61007")
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "menu", "Auto_bars")   
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "button", "WCMICONS.dll,72") 
 
   
 
   MsgBox(FindButtonIdx(BarsPath & "Main.bar", "param", '/ef "tcm(60011,1)"'))
 
#}
 
 
Func FindButtonIdx(ButtonBar, ButtonKey, ButtonVal)
 
   Local txt, pos, len, sub, idx = 0
 
   If Not FileExist(ButtonBar) Then
 
      ShowDarkHint("Панель не найдена " & ButtonBar, 0)   
 
      Return 0   
 
   EndIf   
 
   len = StrLen(ButtonKey)
 
   ProcessExecGetOutput txt %COMSPEC% '/c type "%ButtonBar%"'
 
   pos = StrPos(txt, "=" & ButtonVal)
 
   If pos = 0 Then Return 0
 
   For i = 0 To 3
 
      sub = StrMid(txt, pos-len-i, len)
 
      #OutputDebugString("Autorun: " & sub)
 
      If sub = ButtonKey Then
 
         idx = StrMid(txt, pos-i, i)
 
         #OutputDebugString("Autorun: idx = " & idx)
 
         If IsInt(idx) Then Break
 
      Endif
 
   Next
 
   # перепроверка индекса
 
   If idx > 0 Then
 
      IniRead txt %ButtonBar% "Buttonbar" %"%ButtonKey% & %idx%"
 
      #OutputDebugString("Autorun: Key = " & txt)      
 
      If StrPos(txt, ButtonVal) > 0 Then Return idx
 
      #OutputDebugString("Autorun: Idx = " & idx)         
 
   EndIf
 
   Return 0
 
EndFunc   | 	 
  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Wed Jan 15, 2025 19:21    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				AkulaBig
 
Кажется, я понял, в чём была сложность той задачи: склеенные панели имеют один серьёзный недостаток - изменения, сделанные на склеенных панелях, не применяются к панелям-источникам и не синхронизируются с ними, а значит, и смысла в такой склейке практически никакого.
 
 
Но всё-равно я пересмотрел и доработал код. Теперь панели можно выбирать из меню, открывать на главной панеле, объединять с главной панелью и закреплять для последующих быстрых вызовов.
 
 
В меню действуют модификаторы: Ctrl - выбрать и объединить, Shift - закрепить, Ctrl+Shift - перейти к файлу. Вызов без модификаторов загружает выбранную панель на главную панель инструментов.
 
 
У самой кнопки тоже есть модификаторы: Ctrl - объединить панель и открыть, Shift - открыть закрепленную панель, Ctrl+Shift - выбор типа меню, Alt - открыть объединенную панель, Win - пересоздать меню из *.bar файлов.
 
 
Под "закреплением" подразумевается выбор панели в качестве текущей для дальнейших операций. Информация о выбранной панеле записывается в секцию [Autorun] файла wincmd.ini, ключ AutoBars (например: AutoBars=Vertical.bar). Если ключа нет, то "Vertical.bar" считается умолчанием. Панели ищутся в папке, указанной в переменной BarsPath (у меня, наверное, как и у большинства, это %COMMANDER_PATH% & "\Bars\").
 
 
Выбор типа меню происходит между тремя вариантами: "ShowPopupMenu", "em_bars_panel", "DisplayOpenBar". Меню сохраняется в файле "Auto_bars.bar": ShowPopupMenu открывает этот файл встроенной функцией, "em_bars_panel" вызывает пользовательскую команду, "DisplayOpenBar" то же, что и "em_bars_panel", только с позиционированем (на основе примера от Loopback). Команда в usercmd.ini:
 
 	  | Code: | 	 		  [em_bars_panel]
 
cmd=OPENBARMENU
 
param=%|COMMANDER_PATH|\Bars\Auto_bars.bar  | 	  
 
Еще одна команда, которую нужно добавить в usercmd.ini:
 
 	  | Code: | 	 		  [em_open_bar]
 
cmd=OPENBAR
 
param=%|COMMANDER_PATH|\Bars\%A0  | 	  
 
Используется для загрузки панели на главную панель инструментов. Поскольку загруженная панель может не содержать кнопки возврата, не лишним будет сделать пользовательскую команду, которая будет загружать главную панель инструментов, и посадить ее на хоткей. Например, у меня это:
 
 	  | Code: | 	 		  [em_open_main_bar]
 
cmd=OPENBAR
 
param=%|COMMANDER_PATH|\Bars\Main.bar  | 	  
 
 
В общем, пока все это только в режиме тестирования, но некоторые удобства уже есть. Да и сам код пригодится для повторного использования в качестве наработок. Путь к Clip.vbs нужно указать в скрипте.
 
 
  Clip.vbs  	  | Code: | 	 		  If WScript.Arguments.Count = 0 Then
 
   FileName = "Clip.txt"
 
Else 
 
   FileName = WScript.Arguments(0) 
 
End If
 
 
Set objHTML = CreateObject("htmlfile")
 
ClipboardText = objHTML.ParentWindow.ClipboardData.GetData("text")
 
 
Set objFSO = CreateObject("Scripting.FileSystemObject")   
 
Set objFile = objFSO.OpenTextFile(FileName, 2, true)
 
objFile.WriteLine ClipboardText
 
objFile.Close  | 	 
  
 
  Functions.aucfg  	  | Code: | 	 		  # модуль дополнительных функций
 
 
Func SaveClipToFile(Filename)
 
   Local vbsp = %COMMANDER_PATH% & "\Scripts\Vbs\"
 
   Local vbsf = vbsp & "Clip.vbs"
 
   If Not FileExist(vbsf) Then
 
      ShowDarkHint("Скрипт не найден " & vbsf, 0)   
 
      Return 0
 
   EndIf      
 
   ShellExec /SW_HIDE /WAIT:2000 %vbsf% '"%Filename%"' %vbsp%
 
   Return 1
 
EndFunc
 
 
Func ShowDarkHint(DarkHint, HintSleep = 1000)
 
 
   SetHintParam("ShowHint", "Font", 10, "Arial")
 
   SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
 
   SetHintParam("ShowHint", "Text", 0xFFFFFF)   
 
  
 
   ShowHint(DarkHint)
 
   
 
   If HintSleep > 0 Then 
 
      Sleep(HintSleep)
 
      WinSetState(23)
 
   Else
 
      Sleep(100)   
 
   Endif   
 
   SetHintParam("ShowHint", "Reload")
 
   
 
EndFunc
 
 
Func CreateNewBar(BarPath, BarName, BackButton = true)
 
   
 
   Local bar, br2, def
 
   
 
   bar = BarPath & BarName & ".bar"
 
   br2 = BarPath & BarName & ".br2"   
 
   
 
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%bar%"""
 
   ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%br2%"""
 
   
 
   If FileExist(bar) Then   
 
      ShowDarkHint("Ошибка удаления " & bar, 0)
 
      Return false
 
   Endif
 
    
 
   IniWrite %bar% "Buttonbar" "Buttoncount"  "0"
 
   If ERROR = 1 Then 
 
      ShowDarkHint("Ошибка создания " & bar, 0)
 
      Return false
 
   EndIf
 
   
 
   IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"   
 
   
 
   If BackButton Then
 
      IniWrite %bar% "Buttonbar" "Button1" "wcmicons.dll,15"
 
      IniWrite %bar% "Buttonbar" "Cmd1" %def%
 
      IniWrite %bar% "Buttonbar" "Menu1" "Вернуться"
 
   Endif
 
      
 
   Return true
 
EndFunc
 
 
Func DisplayOpenBar(UsercmdName)
 
   Local i, h
 
   MouseGetPos("x", "y")      
 
   CommandExec(UsercmdName)
 
   Sleep(20)   
 
   # ожидание панели    
 
   For i = 1 To 150
 
       h = WinFind(0, "#32768") 
 
       If h > 0 Then Break   
 
       Sleep(10)
 
   Next
 
   If h = 0 Then   
 
      ShowHint("Панель не найдена") 
 
      Return  
 
   Endif   
 
   WinSetPos(x, y,"","","", h)
 
EndFunc
 
 
# поиск индекса кнопки на панели
 
# примеры вызова:
 
#{
 
   BarsPath = %COMMANDER_PATH% & "\Bars\"
 
   
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "cmd", "61007")
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "menu", "Auto_bars")   
 
   idx = FindButtonIdx(BarsPath & "Main.bar", "button", "WCMICONS.dll,72") 
 
   
 
   MsgBox(FindButtonIdx(BarsPath & "Main.bar", "param", '/ef "tcm(60011,1)"'))
 
#}
 
 
Func FindButtonIdx(ButtonBar, ButtonKey, ButtonVal)
 
   Local txt, pos, len, sub, idx = 0
 
   If Not FileExist(ButtonBar) Then
 
      ShowDarkHint("Панель не найдена " & ButtonBar, 0)   
 
      Return 0   
 
   EndIf   
 
   len = StrLen(ButtonKey)
 
   ProcessExecGetOutput txt %COMSPEC% '/c type "%ButtonBar%"'
 
   pos = StrPos(txt, "=" & ButtonVal)
 
   If pos = 0 Then Return 0
 
   For i = 0 To 3
 
      sub = StrMid(txt, pos-len-i, len)
 
      #OutputDebugString("Autorun: " & sub)
 
      If sub = ButtonKey Then
 
         idx = StrMid(txt, pos-i, i)
 
         #OutputDebugString("Autorun: idx = " & idx)
 
         If IsInt(idx) Then Break
 
      Endif
 
   Next
 
   # перепроверка индекса
 
   If idx > 0 Then
 
      IniRead txt %ButtonBar% "Buttonbar" %"%ButtonKey% & %idx%"
 
      #OutputDebugString("Autorun: Key = " & txt)      
 
      If StrPos(txt, ButtonVal) > 0 Then Return idx
 
      #OutputDebugString("Autorun: Idx = " & idx)         
 
   EndIf
 
   Return 0
 
EndFunc   | 	 
  
 
  Buttons.aucfg  	  | Code: | 	 		  Pragma IncludeOnce
 
 
Global BarsPath = %COMMANDER_PATH% & "\Bars\"
 
 
RegisterCommand 61007 "TwoBars"
 
RegisterCommand 61008 "SpliceBarItem"
 
 
Func SpliceBarItem(lParam)
 
   Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10)
 
   Local bar = BarsPath & "Auto_bars.bar", def, b, c = 0, mnu, idx, txt, pos, str
 
   IniRead b %bar% "Buttonbar" %"'Menu' & lParam"
 
   bar = BarsPath & b
 
   If Not FileExist(bar) Then
 
      ShowHint("Панель не найдена " & bar)   
 
      Return   
 
   EndIf   
 
   If Not b_Ctrl And Not b_Shift Then 
 
      CommandExec("em_open_bar", b)
 
      Return
 
   Endif
 
   If b_Ctrl And b_Shift Then 
 
      CommandExec /CD:S %bar%      
 
      Return
 
   Endif      
 
   IniWrite /R %COMMANDER_INI% "Autorun" "AutoBars" %b%
 
   IniRead c %bar% "Buttonbar" "Buttoncount"
 
   # обновление подсказки на главной панели
 
   IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"   
 
   If StrPos(def, "%COMMANDER_PATH%") Then
 
      def = %COMMANDER_PATH% & StrReplace(def, "%COMMANDER_PATH%")
 
   Endif
 
   idx = FindButtonIdx(def, "cmd", "61007")
 
   If idx > 0 Then
 
      mnu = "menu" & idx
 
      IniRead txt %def% "Buttonbar"  %"%mnu%"
 
      #OutputDebugString("Autorun: txt = " & txt)
 
      pos = StrPos(txt, "Объединить панели")      
 
      If pos > 0 Then 
 
         str = StrMid(txt, pos)
 
         IniWrite %def% "Buttonbar" %"%mnu%" %"%b% & '|' & %str%"
 
      EndIf   
 
   EndIf   
 
   ShowDarkHint(b & auCRLF & "Панель закреплена." & auCRLF & "Кнопок = " & c, 0)
 
   If b_Ctrl Then 
 
      TwoBars(1)
 
      Return
 
   Endif   
 
EndFunc
 
 
Func Bars2PickMenu(AutoBars)
 
   Local menu_type = 2
 
   If Not FileExist(AutoBars) Then      
 
      ShowHint("Не найден " & AutoBars)
 
      Return
 
   Endif
 
   IniRead /R menu_type %COMMANDER_INI% "Autorun" "AutoBarsMenu" %"%menu_type%"   
 
   Switch menu_type
 
     Case 1
 
       ShowPopupMenu /D %AutoBars%
 
     Case 2
 
       CommandExec("em_bars_panel")            
 
     Else
 
      #DisplayOpenBar("em_bars_panel")            
 
      RunThread("DisplayOpenBar", "em_bars_panel")       
 
   EndSwitch     
 
EndFunc
 
 
Func TwoBars(lParam)
 
   
 
   Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12), b_Win = IsPressed(0x5B)
 
   
 
   Local bar = "Vertical.bar", usr, usr1 = "Auto_user.bar", bar1, def, brs, op = 0
 
   Static m = 0, _
 
          aMenuType = List("ShowPopupMenu","em_bars_panel","DisplayOpenBar")
 
   
 
   usr = BarsPath & usr1
 
   brs = BarsPath & "Auto_bars.bar"
 
   
 
   If b_Ctrl And b_Shift Then
 
      m += 1
 
      m = (m > 3 ? 1 : m)
 
      IniWrite /R %COMMANDER_INI% "Autorun" "AutoBarsMenu" %m%
 
      ShowHint("Тип меню: " & m & " : "& aMenuType[m-1])
 
      Return
 
   EndIf
 
   
 
   If lParam = 1 Then b_Ctrl = true
 
   
 
   If Not (b_Ctrl Or b_Shift Or b_Alt Or b_Win) Then
 
      If FileExist(brs) Then
 
         Bars2PickMenu(brs)
 
         Return
 
      Else
 
         b_Win = true
 
      EndIf   
 
   EndIf
 
   
 
   If b_Win Then
 
      Local aBars = List(), txt, pipe, j
 
      ProcessExecGetOutput pipe %COMSPEC% "/c dir /b *.bar" %BarsPath%
 
      aBars.Text = pipe
 
      txt = "[Buttonbar]"
 
      txt &= auCRLF & "Buttoncount=" & aBars.Count
 
      
 
      For j = 0 To aBars.Count - 1
 
          txt &= auCRLF &    "Cmd" & j+1 & "=cm_SpliceBarItem " & j+1
 
          #txt &= auCRLF &  "Param" & j+1 & "=" & j+1       
 
          txt &= auCRLF &   "Menu" & j+1 & "=" & aBars[j]
 
          txt &= auCRLF & "Button" & j+1 & "=wcmicons.dll,14" 
 
      Next
 
      
 
      Free(aBars)
 
      ClipPut(txt)
 
      If SaveClipToFile(brs) Then Bars2PickMenu(brs)   
 
      Return
 
   EndIf
 
   
 
   If b_Alt Then
 
      If Not FileExist(usr) Then
 
         ShowHint("Панель не найдена " & usr)   
 
      Else
 
         CommandExec("em_open_bar", usr1)
 
      EndIf            
 
      Return
 
   EndIf   
 
   
 
   IniRead /R bar1 %COMMANDER_INI% "Autorun" "AutoBars" %"%bar%"
 
   bar = BarsPath & bar1
 
   
 
   If Not FileExist(bar) Then
 
      ShowHint("Панель не найдена " & bar)   
 
      Return   
 
   EndIf
 
      
 
   If b_Shift Then
 
      CommandExec("em_open_bar", bar1)
 
      Return   
 
   EndIf
 
      
 
   ShowDarkHint("Объединение c " & bar1, 0)
 
   
 
   Local aBar = List(), _
 
         aItems = List("cmd","param","button","menu","path","iconic"), _
 
         offset, out, b, i, j, k, old, new, found
 
         
 
   IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"   
 
   If StrPos(def, "%COMMANDER_PATH%") Then
 
      def = %COMMANDER_PATH% & StrReplace(def, "%COMMANDER_PATH%")
 
   Endif
 
   If Not FileExist(def) Then
 
      ShowDarkHint("Главная панель не найдена " & def, 0)   
 
      Return   
 
   EndIf   
 
   IniRead offset %def% "Buttonbar" "Buttoncount" 0      
 
   
 
   ProcessExecGetOutput def %COMSPEC% '/c type "%def%"'
 
   
 
   ProcessExecGetOutput out %COMSPEC% '/c type "%bar%"'
 
   IniRead b %bar% "Buttonbar" "Buttoncount" 0     
 
         
 
   aBar.Text = out
 
   For j = 0 To aBar.Count - 1
 
       found = false
 
       For i = 1 To b
 
           For k = 0 To aItems.Count - 1
 
              old = aItems[k] & i & "="
 
              new = aItems[k] & i + offset + 1 & "="       
 
              If StrPos(aBar[j], old) Then
 
                 aBar[j] = StrReplace(aBar[j], old, new)
 
                 found = true
 
                 break
 
              EndIf
 
           Next   
 
           if found then break
 
       Next
 
   Next
 
   #aBar.Remove(0, 2)
 
   aBar[0] = "button" & offset + 1 & "="
 
   aBar[1] = "iconic" & offset + 1 & "="      
 
   out = def & auCRLF & aBar.Text   
 
   Free(aBar)
 
   Free(aItems)
 
   
 
   ClipPut(out)
 
   op = SaveClipToFile(usr)
 
   IniWrite %usr% "Buttonbar" "Buttoncount"  %"%offset%+1+%b%"
 
   
 
   If op = 1 Then ShowDarkHint("Панели объединены", 0)
 
   
 
   If IsPressed(0x12) Then Return
 
   If IsPressed(0x10) Then 
 
      CommandExec /CD:S %usr% 
 
      Return
 
   EndIf            
 
   CommandExec("em_open_bar", usr1)   
 
EndFunc
 
  | 	 
  
 
  Кнопка  	  | Code: | 	 		  TOTALCMD#BAR#DATA
 
61007
 
 
totalcmd.exe
 
Объединить панели| |Ctrl - объединить и открыть|Shift - открыть закрепленную|Ctrl+Shift - выбор типа меню| |Alt - открыть объединенную|Win - пересоздать меню *.bar
 
 
 
-1  | 	 
  
 
  TOTALCMD.INC  	  | Code: | 	 		  [________Autorun_________]=0
 
cm_SpliceBarItem=61008;Splice Bar Menu
 
  | 	 
  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Wed Jan 15, 2025 20:20    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  AkulaBig
 
склеенные панели имеют один серьёзный недостаток - изменения, сделанные на склеенных панелях, не применяются к панелям-источникам и не синхронизируются с ними, а значит, и смысла в такой склейке практически никакого.
 
 | 	  
 
Вот именно такая панель мне и нужна. И в этом ее смысл. Таким образом я не передаю свой мусор в сборку. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 00:08    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				AkulaBig, я понял.
 
 
Просто я почувствовал то же самое, что, вероятно, чувствовали и вы: не смог до конца понять, что мне нужно, и внятно сформулировать задачу   Причину этого описал выше - склеенная панель несет больше проблем, чем пользы. Малейший рассинхрон - и можно окончательно запутаться в трех соснах трех панелях: главной, вспомогательной и объединенной. Что самое плохое - склеенную панель уже не так просто разобрать на части, как ее собрать.
 
 
Но может быть для вашей задачи это и не нужно? Может быть, вам просто достаточно сделать две одинаковые главные панели и переключаться между ними по кругу: одна - официальная, другая - черновая. На вторую вы и будете докидывать кнопки, которые используются только для вашей работы, а первая будет оставаться в нетронутом виде. И алгоритм от этого будет гораздо проще, а значит и круче ))
 
 
Переключение по кругу между тремя панелями:
 
 	  | Code: | 	 		  # Alt+F1
 
SetHotkeyAction /K:A /H:F1 MainBarCycle
 
 
Func MainBarCycle()
 
   Static j = -1, aBarName = List("Main","Help", "Vertical")
 
   j += 1
 
   j = (j > aBarName.Count - 1 ? 0 : j)
 
   bar = "%COMMANDER_PATH%\Bars\" & aBarName[j] & ".bar"         
 
   IniWrite /R %COMMANDER_INI% "Buttonbar" "Buttonbar" %bar%
 
   SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
 
   SendCommand 2901
 
   SendCommand 2901
 
   sleep(50)
 
   SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
 
   WinRedraw(1)
 
   ShowHint("Включена: " & aBarName[j] & ".bar")
 
   Sleep(800)
 
   WinSetState(23)
 
EndFunc
 
  | 	  
 
Если не нужно запоминать панель в wincmd.ini и посылать cm_VisButtonBar для обновления изменений в окне ТС, то можно просто загружать ее командой OPENBAR, как это сделано постом выше, т.е CommandExec("em_open_bar", aBarName[j] & ".bar")
 
 	  | Code: | 	 		  [em_open_bar]
 
cmd=OPENBAR
 
param=%|COMMANDER_PATH|\Bars\%A0  | 	  
 
Но тогда при выходе, главная панель будет оставаться одной и той же. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 06:26    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  
 
Просто я почувствовал то же самое, что, вероятно, чувствовали и вы: не смог до конца понять, что мне нужно | 	  
 
Не поняли меня на форуме TCIMG. Поэтому пришлось самому команду доделывать. А я-то прекрасно знал, что мне нужно.
 
 	  | Orion9 wrote: | 	 		  | склеенная панель несет больше проблем, чем пользы.  | 	  
 
Несколько лет уже пользуюсь и очень доволен.
 
 	  | Orion9 wrote: | 	 		  | можно окончательно запутаться в трех соснах трех панелях: главной, вспомогательной и объединенной. | 	  
 
У меня всего две панели. Главная и пользователя. Если не лень, посмотрите видео про эту панель в папке моей сборки. Там все подробно показано.
 
 	  | Orion9 wrote: | 	 		  Может быть, вам просто достаточно сделать две одинаковые главные панели
 
 | 	  
 
И все это будет храниться в папке ТС и передаваться вместе со сборкой. Вы предлагаете стандартный вариант, по которому все делают дополнительные панели и который меня совершенно не устраивает.
 
 
 
Вот посмотрите. Я работаю в ТС. Когда мне надо воспользоваться какой-то программкой, я щелкаю по файлу и запускаю ПП. После перезагрузки ПП исчезла. Никакого мусора я через сборку не передаю.
 
Главный смысл моей панели, что она должна храниться в отдельном месте.
 
 	  | Orion9 wrote: | 	 		  
 
можно просто загружать ее командой OPENBAR | 	  
 
Именно так у меня и происходит.
 
 	  | Orion9 wrote: | 	 		  
 
Но тогда при выходе, главная панель будет оставаться одной и той же. | 	  
 
Именно это мне и нужно.
 
Собственно меня моя панель полностью устраивает. Отказываться от TCIMG я не собираюсь. У меня очень много на ней завязано. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 11:22    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | AkulaBig wrote: | 	 		  | И все это будет храниться в папке ТС и передаваться вместе со сборкой. | 	  
 
С чего вы решили? Просто поменяйте относительный путь на абсолютный, и все.
 
 
Мой последний пример остается в силе. Уберите третий элемент массива, замените относительный путь и добавьте em_команду. Можете сделать проверку существования вашего личного файла: если он не существует, ничего не переключать.
 
 
А пользователю вся эта склейка панелей (да еще и с выбором в каталоге) вряд ли нужна, уж поверьте. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 12:31    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  
 
А пользователю вся эта склейка панелей (да еще и с выбором в каталоге) вряд ли нужна, уж поверьте. | 	  
 
Я вообще-то тоже пользователь и мне нужна именно такая панель и никакая другая. Мне не нужны две панели, между которыми я буду переключаться. | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		Orion9
 
  
  Joined: 01 Jan 2024 Posts: 918
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 14:01    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | AkulaBig wrote: | 	 		  | Мне не нужны две панели, между которыми я буду переключаться. | 	  
 
А сейчас вы что делаете, не переключаетесь, что ли?    
 
 
  P.S. Мой пример все еще в силе. Пока я не понял, в чем заключается удобство вашего способа. Если вам действительно удобно как пользователю запускать каждый раз файл под курсором, чтобы загрузить его на панель, то дело-то ваше. А я, пожалуй, останусь при своем хоткее, и буду переключать панели по короткому кругу.  | 
			 
		  | 
	 
	
		| Back to top | 
		 | 
	 
	
		  | 
	 
	
		AkulaBig
 
 
  Joined: 03 Dec 2008 Posts: 454
 
  | 
		
			
				  (Separately) Posted: Thu Jan 16, 2025 14:19    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Orion9 wrote: | 	 		  
 
А сейчас вы что делаете, не переключаетесь, что ли?    
 
 | 	  
 
Не переключаюсь. просто к основной панели добавляю ПП. При этом основная панель доступна. | 
			 
		  | 
	 
	
		| 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 
 
		 |