| 
| 
 | Вопрос # 3 300/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты! Много где написано про то, что можно по двойному нажатию на файле открыть его в своей программе! Но конкретно ничего нет. У меня к Вам подобный вопрос, вот только я в соей программе хочу организовать открытие какой-нибудь картинки. Помогите пожалуйста если знаете как! Заранее Спасибо! 
|  |   Вопрос задал: eclipse (статус: Посетитель)Вопрос отправлен: 18 октября 2009, 09:23
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Для того, чтобы твоя прога реагировала на даблклик по файлу с заданным расширением, надо это расширение зарегистрировать в системе - создать или изменить кое-какие ключи реестра в разделе HKEY_CLASSES_ROOT. Итак, вот 2 функции:
 
 
 // Регистрация расширения, установка иконки и ассоциативной программы
function RegFileExt(AExtension, AExtDescription, AFileDescription,
                    AOpenWith, AParamString: String; AIconIndex: Integer): Boolean;
  var  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
  with Reg do begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey(AExtension, True);
    WriteString('', AExtDescription);
    OpenKey('\' + AExtDescription, True);
    WriteString('', AFileDescription);
    OpenKey('DefaultIcon', True);
    WriteString('', AOpenWith + ','+IntToStr(AIconIndex));
    OpenKey('\' + AExtDescription + '\Shell\Open\Command', True);
    WriteString('', '"' + AOpenWith + '" "' + AParamString + '"');
  end;
  Result := True;
  except
    Result := False;
  end;
  Reg.Free;
end;
 
// Проверка регистрации
function FileExtIsRegistered(const AExtension: string): Boolean;
var
  Reg: TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    Reg.RootKey:= HKEY_CLASSES_ROOT;
    Result:= Reg.KeyExists(AExtension);
  finally
    Reg.Free();
  end;
end;В своих программах я их использую в конструкторе главной формы:
 
 
 const
  // Расширения, иконки, реестр
  ProjectFileExt =       '.seproj';
  ProjectDefaultExt =    'seproj';
  ProjectExtDesc =       'seproject';
  ProjectFileDesc =      'Проект Source Editor';
  ProjectIconIndex =     1; // <-- Это номер иконки в ресурсах EXE, которую
                            // система будет отображать для файлов данного расширения
 
implementation
 
{$R *.dfm}
 
{ TMainForm }
 
constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited;
 
  // Регистрация расширения
  if not FileExtIsRegistered(ProjectFileExt) // <--- если расширение ещё не зарегистрировано
    then RegFileExt(ProjectFileExt,
                    ProjectExtDesc,
                    ProjectFileDesc,
                    ParamStr(0), // <--- имя exe-файла программы
                    '%1',
                    ProjectIconIndex);
end;В итоге, после таких изменений в реестре, при даблклике на файл с расширением .seproj запускается мой редактор с параметром командной строки в виде полного имени этого файла. Я извлекаю его ParamStr(1) и открываю на редактирование. Вот, собсно, и всё.
 
 Ну, и напоследок, функция удаления регистрации расширения из реестра:
 
 
 // Удаление регистрации
function UnRegFileExt(AExtension, AExtDescription: String): Boolean;
  var Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
     begin
      RootKey := HKEY_CLASSES_ROOT;
      DeleteKey(AExtension);
      DeleteKey('\' + AExtDescription);
     end;
   Result := True;
  except
   Result := False;
  end;
  Reg.Free;
end;Я понятно объяснил?
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 18 октября 2009, 10:09
 Оценка за ответ: 5
 Комментарий к оценке: Не ... в реестр то засунуть я смог вручную(это просто), а вот как открыть файл в своей программе. Или я чего-то недопонял? Объясните поподробнее пожалуйста. Ответ 2-й, Евгения, по-моему вообще бред! |  Ответ #2. Отвечает эксперт: Жикльор Здравствуйте, eclipse!
 Первый ответ на мою мысль очень сложный. Есть намного проще вариант.
 
 Вы должны создать обработчик формы OnCreate и в этот раздел вписать вот такой фрагмент кода:
 ----------------------------------------------------------------------------------
 ...
 if ParamCount <> 0 then
 for i := 1 to ParamCount + 1 do
 str := str + ParamStr(i);
 ...
 ----------------------------------------------------------------------------------
 ParamCount - это количество символов параметра при запуске программы. Когда вы делаете двойной щелчок по файлу и на этот файл указано запускать вашу программу, то операционная система посылает параметр вашей программе при запуске. Вот этот параметр и есть ваш путь к изображению.
 i - это счетчик цикла.
 str - это переменная типа string для записи каталога, где размещен ваш файл.
 После этого на переменную str происходит присвоение каталога. И в дальнейшем вы просто запускаете свою процедуру открытия графического файла с указанием этой переменной.
 
 Но это будет работать только тогда, когда вы вручную выберите программу, которой нужно открывать.
 
 Для регистрации в реестре используйте программу которая написана в ответе №1.
 
 П.С. Только не снижайте репутацию за то, что я возможно не так понял вопрос.
 
|  | Ответ отправил: Жикльор (статус: 5-ый класс)Время отправки: 18 октября 2009, 16:10
 
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 19 октября 2009, 08:09; участников в обсуждении: 2. 18 октября 2009, 10:09: Вопрос перемещён из тематического раздела Delphi » Мультимедийные приложения в раздел Delphi » Взаимодействие с Windows модератором Ерёмин А.А. 
|   | min@y™ (статус: Доктор наук), 18 октября 2009, 18:32 [#1]: Цитата: а вот как открыть файл в своей программе. Или я чего-то недопонял? Объясните поподробнее пожалуйста.
 
 
 Упрощённый вариант:
 
 
 procedure TMainForm.FormShow(Sender: TObject);
var
  AFileName: string;
begin
  // Открытие файла, переданного в командной строке
  if FShowed
    then Exit;
 
  AFileName:= ParamStr(1);
 
  try
    if FileExists(AFileName)
      then begin
             // <--- Открытие файла тут
           end;
  finally
    FShowed:= True; // <--- Это поле формы
  end;
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 18 октября 2009, 18:38 [#2]: Цитата (Жикльор): ParamCount - это количество символов параметра при запуске программы.
 
 
 Ты чо несёшь, дезинформатор?!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Жикльор (статус: 5-ый класс), 18 октября 2009, 23:33 [#3]:Чо читал, то и несу. Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию. |  
|   | min@y™ (статус: Доктор наук), 19 октября 2009, 08:09 [#4]: Цитата (Жикльор): Чо читал, то и несу.  
 Выкинь своё чтиво фтопку!
 ParamCount() - функция, возвращающая количество ПАРАМЕТРОВ, переданных программе через командную строку.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |