Показать сообщение отдельно
  #4  
Старый 27.05.2014, 00:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от 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 лежит имя файла переданного для открытия
Ответить с цитированием