Открывает указанную папку и выделяет в ней указанные файлы. Может выделить сразу в режиме редактирования имени.
Может выделять файлы на рабочем столе.
Код:
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,[])
}