Цитата:
Сообщение от RobinStone
Хотелось бы что б немного объяснили что куда и откуда...
|
Да на самом деле всё довольно прозаично - после регистрации в системе вашего расширения и ассоциации его со сборкой происходит следующее - если в проводнике произведён клик по данному файлу, то проверяется где расположена обрабатывающая его прога и ей посылается приказ запуститься, а в параметре ParamStr передаётся имя требуемого для обработки файла. На практике это выглядит так - при первом запуске программы в FormCreate необходимо записать в реестр подобное
Код:
...
var
r: Tregistry;
begin
r:= TRegistry.Create;
with r do
begin
RootKey:= HKEY_CLASSES_ROOT;
OpenKey('.bom', true);
WriteString('', 'Мой текстовик');
CloseKey;
CreateKey('Мой текстовик');
OpenKey('Мой текстовик\DefaultIcon', true);
WriteString('', Application.ExeName + ', 0');
CloseKey;
OpenKey('Мой текстовик\shell\open\command', true);
WriteString('', Application.ExeName + ' %1');
CloseKey;
Free;
end;
...
т.е. регистрируем своё расширение и меняем у него стандартную иконку на другую, в данном случае на значок вашего приложения. Затем следует такое в коде прописать
Код:
// RestoreLongName восстанавливает "короткое" имя файла
// Это нужно для запуска при получении параметров от проводника
// Прога конечно, запустится и так, но с мессагой типа "Файл не найден"
Function RestoreLongName(fn: string): string;
function LookupLongName(const filename: string): string;
var
sr: TSearchRec;
begin
if FindFirst(filename, faAnyFile, sr) = 0 then
Result:= sr.Name
else
Result:= ExtractFileName(filename);
SysUtils.FindClose(sr);
end;
function GetNextFN: string;
var
i: integer;
begin
Result:= '';
if Pos('\\', fn) = 1 then
begin
Result:= '\\';
fn:= Copy(fn, 3, length(fn)-2);
i:= Pos('\', fn);
if i <> 0 then
begin
Result:= Result + Copy(fn, 1, i);
fn:= Copy(fn, i + 1, length(fn)-i);
end;
end;
i:= Pos('\', fn);
if i <> 0 then
begin
Result:= Result + Copy(fn, 1, i-1);
fn:= Copy(fn, i + 1, length(fn)-i);
end else
begin
Result:= Result + fn;
fn:= '';
end;
end;
Var
name: string;
Begin
fn:= ExpandFileName(fn);
Result:= GetNextFN;
Repeat
name:= GetNextFN;
Result:= Result + '\' + LookupLongName(Result + '\' + name);
Until length(fn)= 0;
End;
в коментах есть описание, пропускаем этот шаг
Код:
procedure TFPlay.FormShow(Sender: TObject);
var
s: string;
i: integer;
begin
// Получены параметры от проводника
if ParamCount > 0 then
begin
s:= ParamStr(1); // Имя файла для открытия
// Если в имени файла есть пробелы, то шелл передает
// его не целиком, а "кусочками" (особенность системы :)
// Надо всё это соединить, не забывая про пробелы
for i:= 2 to ParamCount do
s:= s + ' ' + ParamStr(i);
s:=RestoreLongName(s);
end;
end;
теперь в s лежит имя файла переданного для открытия