Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
Финжер   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.046 c
9-1134035185
kblc
2005-12-08 12:46
2006.09.03
BlackJack


2-1155529937
Yel
2006-08-14 08:32
2006.09.03
Создать новые объекты в рантайме


2-1155562900
Слон
2006-08-14 17:41
2006.09.03
Нужна помощь с заданием.


2-1155505701
LORD Gregory
2006-08-14 01:48
2006.09.03
Записи в БД


9-1133771636
@!!ex
2005-12-05 11:33
2006.09.03
OpenGL на ATI и Intel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский