Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 300

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты! Много где написано про то, что можно по двойному нажатию на файле открыть его в своей программе! Но конкретно ничего нет. У меня к Вам подобный вопрос, вот только я в соей программе хочу организовать открытие какой-нибудь картинки. Помогите пожалуйста если знаете как! Заранее Спасибо!

eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

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™

min@y™ (статус: Доктор наук), 18 октября 2009, 18:38 [#2]:

Цитата (Жикльор):


ParamCount - это количество символов параметра при запуске программы.


Ты чо несёшь, дезинформатор?!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 18 октября 2009, 23:33 [#3]:

Чо читал, то и несу.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 19 октября 2009, 08:09 [#4]:

Цитата (Жикльор):

Чо читал, то и несу.


Выкинь своё чтиво фтопку!
ParamCount() - функция, возвращающая количество ПАРАМЕТРОВ, переданных программе через командную строку.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.04 сек.