Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Ярлык, Объект, Проводник. Функша.   Найти похожие ветки 

 
Финжер   (2006-08-10 19:47) [0]

[D7, WinXP]
Здрасте! Подскажите, плиз-з-з-з, какую функшин или команду нужно выполнить, что бы туда... в нее... в функцию передать имя файла, а она (функша) открыла окно проводника и выделила этот файл. Хочу в меню ярлыков добавить пункт "найти объект" Ну типа того как в свойствах ярлыка одноименная кнопка. А это, сделать прогу APIшную "20 килограмовую" и вся ее задача будет "найти" файл переданный первым параметром.


 
guav ©   (2006-08-10 23:20) [1]

Explorer.exe /select,"C:\WINDOWS\NOTEPAD.EXE"


 
Финжер   (2006-08-11 02:10) [2]

> [1] guav ©   (10.08.06 23:20)
> Explorer.exe /select,"C:\WINDOWS\NOTEPAD.EXE"

Спасибо, А можно поконкретней как это, или куда всунуть...
Я так думаю надо сюда ShellExecute какимто образом... Каким?


 
KilkennyCat ©   (2006-08-11 03:19) [3]

А это, в орешник сунуть уже можно, типа. Не очень смешно, но сойдет. Особенно "Плиз-з-з-з-з" !!! МЕНЯ ОТ ЭТОГО ПРОСТО ПЛЮЩЩЩИТТТТТТТ!


 
Финжер   (2006-08-11 03:28) [4]

> [3] KilkennyCat ©   (11.08.06 03:19)

Это суйти куда хотите, меня тоже ПЛЮЩЩЩИТТТТТТТ от плиз-з-з-зов.
Лучше помогли бы чем глумиться.
Одну строчку кода проще привести в пример чем писать всякую лабуду про орехи... Если чем обидел..., задел..., Извеняюсь, не хотел....


 
Германн ©   (2006-08-11 03:34) [5]


> Лучше помогли бы чем глумиться.

Дык какого лешего понесло тебя в WinAPI?


 
Финжер   (2006-08-11 05:04) [6]

> [5] Германн ©   (11.08.06 03:34)
>
> > Лучше помогли бы чем глумиться.
>
> Дык какого лешего понесло тебя в WinAPI?

Еще один ценный и полезный ответ :(
А куда меня нести надо? Я так понимаю что какой то АПИшной функцией надо это делать поэтому сюда и занесло наверное.

И все же как найти файл по имени и открыть проводник с выделением онного в проводнике
Че выделил то и не получается.


 
KilkennyCat ©   (2006-08-11 05:23) [7]

онного с одной н пешится
ответ был  в [1]
все остальное учитывая я так думаю и я так понимаю есть в справке успехов и наилучшие пожелания чисто без обид ежели чего извините


 
Rouse_ ©   (2006-08-11 12:13) [8]

Ну вот тебе примерный функшин :)

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;


 
Финжер   (2006-08-11 15:56) [9]

> [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 16:50) [10]


> Спасибо, Работает.... только вот как-то громоздко все это,
>  я думал что, проще все это будет :) Да и вот такой Вурнинг
> вылазит
> [Warning] Unit1.pas(37): Symbol "IncludeTrailingBackslash"
> is specific to a platform

замени IncludeTrailingBackslash на IncludeTrailingPathDelimiter


 
Rouse_ ©   (2006-08-11 17:02) [11]


> Спасибо, Работает.... только вот как-то громоздко все это,
>  я думал что, проще все это будет :)

Разве кто-то говорил, что будет легко? Весь остальной код ищет уже запущенный экземпляр браузера с данным путем и закрывает его. Просто если такой экземпляр уже есть в наличии, то позиционирования на нужный экземпляр не происходит.


 
Финжер   (2006-08-11 17:50) [12]

> [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;


 
Финжер   (2006-08-11 17:54) [13]

> [11] Rouse_ ©   (11.08.06 17:02)

Наверное понял. При "моем" урезанном способе не выделиться файл, если будет открыта уже папка с его содержанием и в ней будет выделен другой файл.


 
guav ©   (2006-08-11 19:29) [14]


> Просто если такой экземпляр уже есть в наличии, то позиционирования
> на нужный экземпляр не происходит.

хм.. не знал

раз приходится работать с интерфейсами проводника, тогда наверное проще выбрать нужный файл через Shell API  и не отлавливать открытые копии.


 
Финжер   (2006-08-11 22:46) [15]

Блин, че за фигня, не добавляется пункт в контекстное меню проводника на файлах *.lnk, делал пока в "ручки", в regedite добавил в раздел lnkfile разделы shell>open>command, написал название пункта в open"e и команду в command"e "C:\findobject.exe" "%1" //временно имеется в C:\ для тестирования
но если создать "текстовый документ.txt" и переименовать в "текстовый документ.lnk" то все нормальное меню пропадает, а появляется какое то урезанное но зато с моим пунктом.
Как для ярлыков добавить свой пункт меню?


 
Финжер   (2006-08-11 23:22) [16]

Отвечаю сам себе. У lnkfile создаем раздел shell а в нем раздел FindObj (т.е не Open как я пытался сделать) ну и в нем command и усе нормально.
Спасибочки всем за то что Вы есть!


 
Финжер   (2006-08-13 07:30) [17]

> [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: Размер считаю важным для данного случая, т.к. задача у проги наипростейшая.


 
ANTPro ©   (2006-08-13 09:43) [18]

Финжер   (13.08.06 7:30) [17]
Размер считаю важным для данного случая

Тогда тебе в KOL думаю в 30 кб можно управиться


 
Финжер   (2006-08-13 20:01) [19]

> [18] ANTPro ©   (13.08.06 09:43)

Я не использую KOL, но если сможешь пример, т.н. 80% моей проги :)), привести как это сделать, то скажу тебе большой сенькс.
PS что такое KOL и уместен ли он здесь, т.к. стараюсь на API все сделать.


 
ANTPro ©   (2006-08-13 20:32) [20]

Финжер   (13.08.06 20:01) [19]
На сайте есть линк на KOLMCK там все подробно

Занят я ща дипломкой, но тема интересная для меня так что могет быть ...


 
Финжер   (2006-08-14 14:48) [21]


> ANTPro ©   (13.08.06 20:32) [20]

Подаждемс....



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
15-1154948534
Dimedrol
2006-08-07 15:02
2006.09.03
FullText поиск в MySQL


15-1155288363
крокодил гений
2006-08-11 13:26
2006.09.03
начинающий web-developer (или типа того) нуждается в совете


15-1155108043
Red_imp
2006-08-09 11:20
2006.09.03
VBA vs Other


15-1154685063
QuickFinder
2006-08-04 13:51
2006.09.03
Пятничная задачка


2-1155744819
dabreezy
2006-08-16 20:13
2006.09.03
Аналог в delphi