|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|