Вверх ↑
Ответов: 1925
Рейтинг: 172
#1: 2020-09-19 17:37:59 ЛС | профиль | цитата
Есть простой способ, но он каждый раз запускает новый процесс explorer.exe:
Add(WinExec,81349,469,210)
{
FileName="explorer /select,C:\Windows"
}
Add(Button,8532786,413,210)
{
Left=10
Top=20
Width=150
Caption="Новый процесс explorer"
link(onClick,81349:doExec,[])
}

А вот более интересный способ, который может выделять сразу много файлов в папке и на рабочем столе, причём даже в режиме редактирования имени.
Add(InlineCode,1971931,455,532)
{
WorkPoints=#190:doOpenFolderAndSelectItems=Открывает папку dtFolder и выделяет в ней файлы из списка dtFileNamesList. При dtEditMode=1 файл выделяется в режиме редактирования (только если указан один файл).|269:doSelectDesktopItems=Выделяет файлы из списка dtFileNamesList на рабочем столе. DtFolder игнорируется. При dtEditMode=1 файл выделяется в режиме редактирования (только если указан один файл). Чтобы выделить "Мой компьютер", вставьте в dtFileNamesList две пустых строки.|
DataPoints=#41:dtFolder=Путь к папке (напр.: C:\Windows)|59:dtFileNamesList=Список имён (без пути) файлов для выделения|101:dtEditMode=Если 1, то файл выделится в режиме редактирования (работает, только если указан один файл)|
Code=#92://Выделение файлов/папок в проводнике Windows и на рабочем столе. Есть режим редактирования.|40://Автор: 3042. Версия 1.0 от 19.09.2020.|15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|5:const|17: OFASI_EDIT = 1;|24: OFASI_OPENDESKTOP = 2;|0:|4:type|19: TSHItemID = record|12: cb: Word;|29: abID: array[0..0] of Byte;|5: end;|21: TItemIDList = record|20: mkid: TSHItemID;|5: end;|28: PItemIDList = ^TItemIDList;|31: //PPItemIDList = ^PItemIDList;|52: TPItemIDListArray = array[0..65535] of PItemIDList;|40: PPItemIDListArray = ^TPItemIDListArray;|57: {IShellFolder = interface(IUnknown)// [SID_IShellFolder]|45: function ParseDisplayName(hwndOwner: HWND;|75: pbcReserved: Pointer; lpszDisplayName: PWideChar; out pchEaten: ULONG;|72: out ppidl: PItemIDList; var dwAttributes: ULONG): HResult; stdcall;|6: end;}|28: THiAsmClass = class(TDebug)|10: private|66: procedure OpenFolderAndSelectItems(Desktop:boolean; dt:TData);|9: public|23: dtFolder:THI_Event;|30: dtFileNamesList:THI_Event;|25: dtEditMode:THI_Event;|67: procedure doOpenFolderAndSelectItems(var dt:TData; index:word);|61: procedure doSelectDesktopItems(var dt:TData; index:word);|5: end;|0:|73:function SHOpenFolderAndSelectItems( pidlFolder: PItemIDList; cidl: UINT;|88: apidl: PPItemIDListArray; dwFlags: DWORD ):HRESULT; stdcall; external 'shell32.dll';|96://function SHGetDesktopFolder(var ppshf: IShellFolder):HResult; stdcall; external 'shell32.dll';|91:function ILCreateFromPath(pszPath: PWideChar):PItemIDList; stdcall; external 'shell32.dll';|68:procedure ILFree(pidl:PItemIDList); stdcall; external 'shell32.dll';|0:|14:implementation|0:|71://----------------------------Внешние точки----------------------------|49:procedure THiAsmClass.doOpenFolderAndSelectItems;|5:begin|37: OpenFolderAndSelectItems(false, dt);|4:end;|0:|43:procedure THiAsmClass.doSelectDesktopItems;|5:begin|36: OpenFolderAndSelectItems(true, dt);|4:end;|0:|0:|75://----------------------------Внутренние методы----------------------------|74:procedure THiAsmClass.OpenFolderAndSelectItems(Desktop:boolean; dt:TData);|14:var i:Integer;|18: strFld:string;|20: boolEdm:boolean;|19: FList:PStrList;|26: IDLFolder:PItemIDList;|34: IDLFileList:PPItemIDListArray;|5:begin|40: if Desktop then strFld := '' else begin|36: strFld := ReadString(dt,dtFolder);|43: if not DirectoryExists(strFld) then exit;|63: if strFld[length(strFld)] ‹› '\' then strFld := strFld + '\';|5: end;|21: FList := NewStrList;|54: FList.SetText(ReadString(dt,dtFileNamesList), false);|50: if FList.Count=0 then begin FList.Free; exit end;|43: boolEdm := ReadInteger(dt,dtEditMode) = 1;|0:|70: if FList.Count=1 then begin //если объект один - всё немного проще :)|29: //SHGetDesktopFolder(desk);|91: //desk.ParseDisplayName(ReadHandle, nil, StringToOleStr(ToString(dt)), che, iidl, attrs);|101: //Вот нафига всякие там SHGetDesktopFolder, ParseDisplayName, когда есть простой ILCreateFromPath?!|75: IDLFolder := ILCreateFromPath( StringToOleStr(strFld + FList.Items[0]) );|81: SHOpenFolderAndSelectItems(IDLFolder, 0, nil, byte(boolEdm) + byte(Desktop)*2);|89: end else begin //а вот если объектов много... (да ещё и режим редактирования недоступен)|96: if Desktop then IDLFolder := nil else IDLFolder := ILCreateFromPath( StringToOleStr(strFld) );|57: GetMem(IDLFileList, SizeOf(PItemIDList) * FList.Count);|109: for i:=0 to FList.Count-1 do IDLFileList[i] := ILCreateFromPath( StringToOleStr(strFld + FList.Items[i]) );|83: SHOpenFolderAndSelectItems(IDLFolder, FList.Count, IDLFileList, byte(Desktop)*2);|58: for i:=FList.Count-1 downto 0 do ILFree(IDLFileList[i]);|23: FreeMem(IDLFileList);|5: end;|19: ILFree(IDLFolder);|12: FList.Free;|4:end;|0:|4:end.|
link(dtFolder,7616672:Text,[])
link(dtFileNamesList,12392943:Var,[])
link(dtEditMode,4174541:Text,[])
}
Add(Button,14117838,259,525)
{
Left=10
Top=45
Width=230
Caption="В старом процессе - мультивыделение"
link(onClick,5063566:doEvent1,[])
}
Add(Button,1557049,259,574)
{
Left=10
Top=70
Width=270
Caption="В старом процессе - выделение на рабочем столе"
link(onClick,14176758:doEvent1,[])
}
Add(StrList,3527368,511,371)
{
Strings=#11:regedit.exe|11:notepad.exe|3:Web|9:Write.exe|
}
Add(VisualStrings,4174541,469,497)
{
Lines=#1:1|
}
Add(StrList,11515467,462,371)
{
Strings=#18:Microsoft Edge.lnk|0:|0:|
}
Add(VisualStrings,7616672,455,336)
{
Lines=#10:C:\Windows|
Width=67
}
Add(Button,1211895,259,623)
{
Left=10
Top=95
Width=275
Caption="В старом процессе - выделение с редактированием"
link(onClick,11107918:doEvent1,[])
}
Add(GetIndexData,12392943,462,441)
{
Count=3
link(Data1,11515467:Text,[])
link(Data2,3527368:Text,[(475,429)(517,429)])
link(Data3,9759598:Text,[(482,429)(573,429)])
}
Add(ChanelToIndex,2834110,413,441)
{
Count=3
link(onIndex,12392943:doIndex,[])
}
Add(Hub,5063566,308,525)
{
link(onEvent1,2834110:doWork2,[(367,531)(367,454)])
link(onEvent2,6882957:doWork2,[])
}
Add(StrList,9759598,567,371)
{
Strings=#11:regedit.exe|
}
Add(Hub,14176758,308,574)
{
link(onEvent1,2834110:doWork1,[(357,580)(357,447)])
link(onEvent2,1971931:doSelectDesktopItems,[(388,587)])
}
Add(Hub,11107918,308,623)
{
link(onEvent1,2834110:doWork3,[(375,629)(375,461)])
link(onEvent2,6882957:doWork3,[(382,636)])
}
Add(HubEx,6882957,378,532)
{
link(onEvent,1971931:doOpenFolderAndSelectItems,[])
}
ps. Хотел сделать компонентом наподобие
Add(FilesContextMenu,8590425,224,329)
{
}
, но с добавлением компонентов на SVN сейчас напряг, а без этого смысла нет (зачем плодить несовместимости?). Пользуйте IC, да плюсовать, кому помогло, не забывайте :)

pps. Если не работает - символы ‹› в IC замените на нормальные угловые скобки (админы, поправьте уже этот косяк форума!!!)
карма: 9
2
Голосовали:Gunta, ric
Редактировалось 1 раз(а), последний 2020-09-19 17:41:51