![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ярлык, Объект, Проводник. Функша.
Финжер © (2006-08-10 19:47:00)[D7, WinXP]
Здрасте! Подскажите, плиз-з-з-з, какую функшин или команду нужно выполнить, что бы туда... в нее... в функцию передать имя файла, а она (функша) открыла окно проводника и выделила этот файл. Хочу в меню ярлыков добавить пункт "найти объект" Ну типа того как в свойствах ярлыка одноименная кнопка. А это, сделать прогу APIшную "20 килограмовую" и вся ее задача будет "найти" файл переданный первым параметром.
Финжер (2006-08-14 14:48:00) [1]
> ANTPro © (13.08.06 20:32) [20]
Подаждемс....
ANTPro (2006-08-13 20:32:00) [2]Финжер (13.08.06 20:01) [19]
На сайте есть линк на KOLMCK там все подробно
Занят я ща дипломкой, но тема интересная для меня так что могет быть ...
Финжер (2006-08-13 20:01:00) [3]> [18] ANTPro © (13.08.06 09:43)
Я не использую KOL, но если сможешь пример, т.н. 80% моей проги :)), привести как это сделать, то скажу тебе большой сенькс.
PS что такое KOL и уместен ли он здесь, т.к. стараюсь на API все сделать.
ANTPro (2006-08-13 09:43:00) [4]Финжер (13.08.06 7:30) [17]
Размер считаю важным для данного случая
Тогда тебе в KOL думаю в 30 кб можно управиться
Финжер (2006-08-13 07:30:00) [5]> [8] Rouse_ © (11.08.06 12:13)
А нельзя ли как нибудь сделать то же самое без использования SHDocVw.
Т.е. я сделал без него урезанный вариант.
> [12] Финжер (11.08.06 17:50)
Все вроде бы нормально но, Ваш способ имеет плюс... и минус. (Плюс и минус касаются только моей проги). Плюс - это, выделяет файл в любом случае,(урезанный - нет). Минус использование SHDocVw который увеличивает размер Exeшника до ~430kb, в данный момент у меня он 95Kb, делает впринципе, то чё и задумывалось... но может есть способ.
На данный момент список модулей у меня такой:
program Project1;
uses
SysUtils, Windows, ShellAPI, Registry;
..........///...........
И вот так нахожу и выделяю
procedure OpenExplorerAndSelectFile(Path: String);
var FilePath, FileName: String;
begin
FilePath:=AnsiUpperCase(ExtractFilePath(Path));
FileName:=ExtractFileName(Path);
ShellExecute(0, 'open', 'explorer.exe', PChar('/select, ' + FileName), PChar(FilePath), SW_SHOWNORMAL);
end;
procedure GetObjectFromLink(const FLinkNm: String);
var FileInfo: TWin32FINDDATA;
WidePath: array [0..MAX_PATH] of WideChar;
Buff: array [0..MAX_PATH] of Char;
Obj: IUnknown;
begin
if not FileExists(FLinkNm) then Exit;
if not CoInit(Obj) then Exit;
try
StringToWideChar(FLinkNm, WidePath, SizeOf(WidePath));
(Obj as IPersistFile).Load(WidePath, STGM_READ);
(Obj as IShellLink).GetPath(Buff, Max_PATH, FileInfo, SLGP_UNCPRIORITY);
if FileExists(Buff) then OpenExplorerAndSelectFile(Buff) else
if MessageBox(0, PChar('Файл:'#13#10+Buff+#13#10#13#10'на который ссылается ярлык:'#13#10+
FLinkNm+#13#10#13#10'Не найден!'#13#10'Удалить этот ярлык?'), 'Внимание', MB_YESNO)=IDYES then begin
DeleteFile(PChar(FLinkNm));
end;
finally CoUninitialize; end;
end;
И еще косяк, если кликнуть по ярлыку папки то прога предлагает его удалить потому что файл не найден. Как можно здесь отличить ярлык для папки или для файла и в случаи с папкой откыть данную папку
P/S: Размер считаю важным для данного случая, т.к. задача у проги наипростейшая.
Финжер (2006-08-11 23:22:00) [6]Отвечаю сам себе. У lnkfile создаем раздел shell а в нем раздел FindObj (т.е не Open как я пытался сделать) ну и в нем command и усе нормально.
Спасибочки всем за то что Вы есть!
Финжер (2006-08-11 22:46:00) [7]Блин, че за фигня, не добавляется пункт в контекстное меню проводника на файлах *.lnk, делал пока в "ручки", в regedite добавил в раздел lnkfile разделы shell>open>command, написал название пункта в open'e и команду в command'e "C:\findobject.exe" "%1" //временно имеется в C:\ для тестирования
но если создать "текстовый документ.txt" и переименовать в "текстовый документ.lnk" то все нормальное меню пропадает, а появляется какое то урезанное но зато с моим пунктом.
Как для ярлыков добавить свой пункт меню?
guav (2006-08-11 19:29:00) [8]
> Просто если такой экземпляр уже есть в наличии, то позиционирования
> на нужный экземпляр не происходит.
хм.. не знал
раз приходится работать с интерфейсами проводника, тогда наверное проще выбрать нужный файл через Shell API и не отлавливать открытые копии.
Финжер (2006-08-11 17:54:00) [9]> [11] Rouse_ © (11.08.06 17:02)
Наверное понял. При "моем" урезанном способе не выделиться файл, если будет открыта уже папка с его содержанием и в ней будет выделен другой файл.
Финжер (2006-08-11 17:50:00) [10]> [8] Rouse_ © (11.08.06 12:13)
А так, чё будет неправильно или...
function OpenF(const FNm: String): Boolean;
begin
Result:=FileExists(FNm);
if not Result then Exit;
ShellExecute(0, 'open', 'explorer.exe', PChar('/select, '+FNm), PChar(FNm), SW_SHOWNORMAL);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenF('c:\windows\notepad.exe') then ShowMessage('No File');
end;
Rouse_ (2006-08-11 17:02:00) [11]
> Спасибо, Работает.... только вот как-то громоздко все это,
> я думал что, проще все это будет :)
Разве кто-то говорил, что будет легко? Весь остальной код ищет уже запущенный экземпляр браузера с данным путем и закрывает его. Просто если такой экземпляр уже есть в наличии, то позиционирования на нужный экземпляр не происходит.
Rouse_ (2006-08-11 16:50:00) [12]
> Спасибо, Работает.... только вот как-то громоздко все это,
> я думал что, проще все это будет :) Да и вот такой Вурнинг
> вылазит
> [Warning] Unit1.pas(37): Symbol 'IncludeTrailingBackslash'
> is specific to a platform
замени IncludeTrailingBackslash на IncludeTrailingPathDelimiter
Финжер (2006-08-11 15:56:00) [13]> [8] Rouse_ © (11.08.06 12:13)
Спасибо, Работает.... только вот как-то громоздко все это, я думал что, проще все это будет :) Да и вот такой Вурнинг вылазит
[Warning] Unit1.pas(37): Symbol 'IncludeTrailingBackslash' is specific to a platform
Чем это может грозить?
> [7] KilkennyCat © (11.08.06 05:23)
> онного с одной н пешится
Это единственное то, на что смогли ответить из моего вопроса?
Спасибо, учту. Но, я так понимаю Вам надо на форум русского языка тогда.
> ответ был в [1]Я это заметил. Но только вот не сообразил как это все припахать... А вот насчет справки... да, Вы правы, справка это веСЧь нужная и весьма полезная. Я читал справку.... но так как там написано на буржуйском языке, которого я не знаю, я в ней запутался и решил что, строчку кода (я думал что так оно и есть:))) можно спросить сдесь.
> все остальное учитывая я так думаю и я так понимаю есть
> в справке успехов и наилучшие пожелания чисто без обид ежели
> чего извините
Тут вот запятые немножко надо проставить, если Вы уж взялись за русский.
Да за что Вас извенять-то, это Ваше право отвечать или нет, и как...
Да я и не обивчивый. И Вам успехов, и спасибо за то, что хоть мимо не прошли.
Rouse_ (2006-08-11 12:13:00) [14]Ну вот тебе примерный функшин:)
uses ..., SHDocVw;
function OpenExplorerAndSelectFile(Path: String): Boolean;
function ParceURLName(const Value: String): String;
const
scFilePath: array [0..7] of Char = ('f', 'i', 'l', 'e', ':', '/', '/', '/');
begin
if CompareMem(@scFilePath[0], @Value[1], 8) then
begin
Result := Copy(Value, 9, Length(Value));
Result := StringReplace(Result, '/', '\', [rfReplaceAll]);
Result := StringReplace(Result, '%20', ' ', [rfReplaceAll]);
Result := IncludeTrailingBackslash(Result);
end
else
Result := Value;
end;
var
iShellWindow: IShellWindows;
iWB: IWebBrowserApp;
spDisp: IDispatch;
I: Integer;
S, FilePath, FileName: String;
begin
Result := FileExists(Path);
if not Result then Exit;
FilePath := AnsiUpperCase(ExtractFilePath(Path));
FileName := ExtractFileName(Path);
iShellWindow := CoShellWindows.Create;
for I := 0 to iShellWindow.Count - 1 do
begin
spDisp := iShellWindow.Item(I);
if spDisp = nil then Continue;
spDisp.QueryInterface(IWebBrowserApp, iWB);
if iWB <> nil then
begin
S := ParceURLName(iWB.LocationURL);
if AnsiUpperCase(S) = FilePath then
begin
SendMessage(iWB.HWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
Break;
end;
end;
end;
ShellExecute(0, 'open', 'explorer.exe',
PChar('/select, ' + FileName), PChar(FilePath), SW_SHOWNORMAL);
end;
procedure TForm18.Button4Click(Sender: TObject);
begin
if not OpenExplorerAndSelectFile('c:\windows\notepad.exe') then
ShowMessage('Файл не найден.');
end;
KilkennyCat (2006-08-11 05:23:00) [15]онного с одной н пешится
ответ был в [1]
все остальное учитывая я так думаю и я так понимаю есть в справке успехов и наилучшие пожелания чисто без обид ежели чего извините
Финжер (2006-08-11 05:04:00) [16]> [5] Германн © (11.08.06 03:34)
>
> > Лучше помогли бы чем глумиться.
>
> Дык какого лешего понесло тебя в WinAPI?
Еще один ценный и полезный ответ :(
А куда меня нести надо? Я так понимаю что какой то АПИшной функцией надо это делать поэтому сюда и занесло наверное.
И все же как найти файл по имени и открыть проводник с выделением онного в проводнике
Че выделил то и не получается.
Германн (2006-08-11 03:34:00) [17]
> Лучше помогли бы чем глумиться.
Дык какого лешего понесло тебя в WinAPI?
Финжер (2006-08-11 03:28:00) [18]> [3] KilkennyCat © (11.08.06 03:19)
Это суйти куда хотите, меня тоже ПЛЮЩЩЩИТТТТТТТ от плиз-з-з-зов.
Лучше помогли бы чем глумиться.
Одну строчку кода проще привести в пример чем писать всякую лабуду про орехи... Если чем обидел..., задел..., Извеняюсь, не хотел....
KilkennyCat (2006-08-11 03:19:00) [19]А это, в орешник сунуть уже можно, типа. Не очень смешно, но сойдет. Особенно "Плиз-з-з-з-з" !!! МЕНЯ ОТ ЭТОГО ПРОСТО ПЛЮЩЩЩИТТТТТТТ!
Финжер (2006-08-11 02:10:00) [20]> [1] guav © (10.08.06 23:20)
> Explorer.exe /select,"C:\WINDOWS\NOTEPAD.EXE"
Спасибо, А можно поконкретней как это, или куда всунуть...
Я так думаю надо сюда ShellExecuteкакимто образом... Каким?