Форум: "Начинающим";
Текущий архив: 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.039 c