Открывает указанную папку и выделяет в ней указанные файлы. Может выделить сразу в режиме редактирования имени.
Может выделять файлы на рабочем столе.
Код:
Add(InlineCode,1971931,490,616) { @Hint=#90:Выделение файлов/папок в проводнике Windows и на рабочем столе. Есть режим редактирования.|38:Автор: 3042. Версия 1.0 от 19.09.2020.| 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,294,609) { Left=10 Top=45 Width=220 Caption="В старом процессе - мультивыделение" link(onClick,5063566:doEvent1,[]) } Add(Button,1557049,294,658) { Left=10 Top=70 Width=270 Caption="В старом процессе - выделение на рабочем столе" link(onClick,14176758:doEvent1,[]) } Add(StrList,3527368,546,455) { Strings=#11:regedit.exe|11:notepad.exe|3:Web|9:Write.exe| } Add(VisualStrings,4174541,504,581) { Lines=#1:1| } Add(StrList,11515467,497,455) { Strings=#18:Microsoft Edge.lnk|0:|0:| } Add(VisualStrings,7616672,490,420) { Lines=#10:C:\Windows| Width=67 } Add(Button,1211895,294,707) { Left=10 Top=95 Width=275 Caption="В старом процессе - выделение с редактированием" link(onClick,11107918:doEvent1,[]) } Add(GetIndexData,12392943,497,525) { Count=3 link(Data1,11515467:Text,[]) link(Data2,3527368:Text,[(510,513)(552,513)]) link(Data3,9759598:Text,[(517,513)(608,513)]) } Add(ChanelToIndex,2834110,448,525) { Count=3 link(onIndex,12392943:doIndex,[]) } Add(Hub,5063566,343,609) { link(onEvent1,2834110:doWork2,[(402,615)(402,538)]) link(onEvent2,6882957:doWork2,[]) } Add(StrList,9759598,602,455) { Strings=#11:regedit.exe| } Add(Hub,14176758,343,658) { link(onEvent1,2834110:doWork1,[(392,664)(392,531)]) link(onEvent2,1971931:doSelectDesktopItems,[(423,671)]) } Add(Hub,11107918,343,707) { link(onEvent1,2834110:doWork3,[(410,713)(410,545)]) link(onEvent2,6882957:doWork3,[(417,720)]) } Add(HubEx,6882957,413,616) { link(onEvent,1971931:doOpenFolderAndSelectItems,[]) }