перенесено со старого форума. сообщение от LEOGIGA.
Мне надо из делфи открыть файл, как мне это сделать?
перенесено со старого форума. сообщение от Virtson.
вызов программы по умолчанию :
WinExec(pchar(‘Explorer ‘+fst), sw_SHOWNORMAL);
(где fst — полное имя файла;
WinExec — находится в модуле Windows)
перенесено со старого форума. сообщение от Alar.
WinExec(pchar(‘Explorer ‘+fst), sw_SHOWNORMAL);
хороший способ, но его не удобно использовать если имя файла нужно ввести динамически.
Вот этот способ получше будет:
ShellExecute(0,’Open’,pchar(‘C:itog .swf’),nil,nil,1);
itog.swf — это файл который надо открыть.
Если нужно открыть файл в той же папке, что и exe файл, то сделай вот так:
ShellExecuteA(0, ‘Open’,pchar( ExtractFilePath(application.exename )+’itog.swf’),nil,nil,1);
Не забудьте в uses указать модуль — shellapi
Источник: www.programmersforum.ru
Delphi — Save and Open a project (How To)
Delphi: «Открыть с помощью» своей программы, обработка пробелов в имени файла
Сегодня я расскажу, как заставить Вашу программу на Delphi ПРАВИЛЬНО открывать указанный файл при запуске (например, если щелкнуть по какому либо файлу правой кнопкой мыши, выбрать пункт «Открыть с помощью…» и указать Вашу программу). При этом имя открываемого файла передается программе в параметре, и может возникнуть одна проблема — наличие пробелов в имени файла, который будет оценен как разделитель параметров. То есть, при указании имени файла «Новый файл.txt» программе будет передано 2 параметра: «Новый» и «файл.txt». Для правильной обработки этой ситуации нам необходимо «собрать» все параметры в кучу.
Итак, зададим переменную params типа string и в нее «сложим» все наши параметры, получаемые методом ParamStr, количество которых можно получить методом ParamCount. Вот такая простая процедура:
Procedure .
var params: string;
begin
params:=»;
if ParamCount>0 then
for i := 1 to ParamCount do
begin
params := params + ParamStr(i);
if i<>ParamCount then params := params + ‘ ‘;
end;
end;
Процедура обычно выполняется в событии FormCreate главной формы приложения. Затем остается только открыть файл, имя которого хранится в переменной params. Чтобы открытие файла можно было произвести в другой процедуре, переменную params делаем глобальной (выносим приведенный блок var, например, под блок uses в начале кода модуля).
Источник: brullworfel.ru
Ассоциация файлов с программой
Открытие файла с помощью нашей программы (Dephi)
Вообще все работает очень просто. Вся необходимая для этого информация заносится в реестр в определенную ветку. Откройте редактор реестра (Пуск -> Выполнить -> regedit) и зайдите в ветку HKEY_CLASSES_ROOT. Там Вы увидите все существующие в системе расширения. Там вы найдете и .txt и .bmp и многие другие знакомые расширения.
Давайте рассмотрим расширение .jpg. В нем у меня есть ветка OpenWithProgids, а в ней есть ACDSee Pro 2.0.jpg типа REG_SZ. Дальше переходим по ветке HKEY_CLASSES_ROOTACDSee Pro 2.0.jpg. В ней есть несколько веток. Рассмотрим те, которые нам понадобятся, это: DefaultIcon — путь к иконке которой будет отображаться файл в проводнике; shellOpencommand — какую программу открывать при двойном клике по файлу.
Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается. Поэтому нужно будет обрабатывать этот параметр.
Пусть файл будет расширения .dev . Напишем процедуру для добавления необходимых значений в реестр. Не забудьте добавить в секцию uses модуль Registry для работы с реестром.
uses Registry, ShlObj;. var Reg: TRegistry;. procedure Associate;var s:string;begin Reg:=TRegistry.Create; // создаем Reg.RootKey := HKEY_CLASSES_ROOT; // указываем корневую ветку Reg.OpenKey(‘.devOpenWithProgids’, true); Reg.WriteString(‘TestApplication.dev’, »); Reg.OpenKey(‘TestApplication.devDefaultIcon’, true); s:=Application.ExeName+’,0′; Reg.WriteString(», s); Reg.OpenKey(‘TestApplication.devShellOpen’, true); Reg.WriteString(», ‘Открыть в TestApplication’); Reg.OpenKey(‘command’, true); s:='»‘+Application.ExeName+'» «%1″‘; Reg.WriteString(», s); Reg.Free; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);end;
Функция OpenKey открывает ветку, указанную в первом параметре. Второй параметр установлен в True, чтобы ветвь создалась, если она не существует.
Далее в переменной s формируем путь к иконке. В данном случае берется иконка с индексом 0 из exe приложения. Например, можно добавить в приложение еще одну иконку и использовать её для файлов программы, но можно указать и путь к .ico файлу.
TestApplication.dev я выбрал сам. Название этой ветки придумываете вы сами. Обычно пишется название программы и добавляется расширение, так как программа может работать с несколькими расширениями.
После добавления данных в реестр вызывается процедура SHChangeNotify , чтобы иконки обновились и настройки применились.
Далее напишем процедуру для снятия ассоциации:
procedure DeleteAssociate;begin Reg:=TRegistry.Create; Reg.RootKey := HKEY_CLASSES_ROOT; reg.DeleteKey(‘.dev’); reg.DeleteKey(‘TestApplication.dev’); Reg.Free; SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);end;
Тут все еще проще — просто удаляем созданные ветки.
Теперь осталось только обработать параметр, чтобы программа не просто загружалась, а еще и открывала файл. Все очень просто, во время создания формы считываем функцией ParamCount количество параметров и если их число не 0, то вызываем функцию загрузки, а в качестве входного параметра в эту функцию передаем путь к файлу, который нужно открыть. Щелкните по форме два раза, тем самым создавая, обработчик создания формы.
procedure TForm1.FormCreate(Sender: TObject);begin if ParamCount <> 0 then Load(ParamStr(1));end;
Ну и нужно еще написать функцию загрузки файла. Добавьте TMemo на форму.
function Load(FName:string): boolean;begin Form1.Memo1.Lines.LoadFromFile(FName);end;
Скорее всего, в вашем приложении функция будет значительно сложнее с обработкой на невозможность открытия файла и возвратом результата открытия. В данном случае я не буду это делать.
Добавьте два TButton на форму. По клику по первому будет выполняться ассоциация, а по второму снятие ассоциации.
Кликаем два раза по первой кнопке и приводим процедуру к такому виду.
procedure TForm1.Button1Click(Sender: TObject);begin Associate;end;
Выполняем действия аналогичные описанным выше, но для второй кнопки.
procedure TForm1.Button2Click(Sender: TObject);begin DeleteAssociate;end;
Ну вот и все. При попытке открытия файла с расширением .dev в Memo1 должно загрузиться содержимое файла.
Просмотров: 20067
Порядок вывода комментариев:
0
Спам
( 17.05.2011 )
14. Алекс
Ассоциация .MP3 не работает Winamp не хочет меняется а если выбрать другой расширение то тогда работает
0
Спам
( 19.03.2011 )
13. Сергей (Xaker)
правда если файл уже зарегистрирован другой программой то ассоциация не сработает(
0
Спам
( 19.03.2011 )
12. Сергей (Xaker)
Ассоциация отлично работает спасибо, и всё вроде хорошо но назрел вопрос..
Как можно «добавить в приложение еще одну иконку» ? её нужно загрузить в файл ресурсов или ещё что? подскажите пожалуйста)
0
Спам
( 15.07.2010 )
11. Александр Чернявский
ассоциация не выходит
0
Спам
( 21.02.2010 )
10. Сергей (Xaker)
в общем путь то я нашёл но при закрытии программа не закрывается а выдаёт ошибку.. File Access Denied как можно исправить.
Ответ: Сложно сказать, ничего не известно.
Создайте тему на форуме с подробным разъяснением проблемы.
0
Спам
( 21.02.2010 )
9. Сергей (Xaker)
А что если мне нужно просто получить адрес файла через который запустили мою программу. Если использую FName то программа не работает + ещё и не закрывается.
Ответ: А это разве не то?
«Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается.»
0
Спам
( 10.12.2009 )
8. levwv
У меня другая проблема все .exe открываются через блокнот каквернуть всё обратно? (я просто ассоциацию сделал вирусу чтоб он открылся в блокноте, но его учать постигла все программы)
Ответ: ууу сложный случай, вирус видимо был .exe вот и все.
Попробовать экспортировать эту ветвь реестра с другой ОС и импортировать у себя.
0
Спам
( 16.11.2009 )
7. Евгений
а у меня пишет failed to set data for ‘editor.exe’
0
Спам
( 11.11.2009 )
6. melina
спасибо , ооочень помогло !!
0
Спам
( 03.11.2009 )
5. maksim_larionov
С обработкой нескольких выделенных файлов все же проблема: windows открывает их моей программой каждый отдельно (paramcount для каждой запущенной =1 ), а очень хотелось бы, чтобы paramcount совпадал с числом выделенных:) Пробовал записать в реестре не %1, а %l, но не помогает. Программа не MDI
Ответ: Думаю тут уже нужно просто после запуска программы, смотреть есть ли уже экземпляр приложения в памяти, если есть, то передавать другому экземпляру путь к файлу, а после принятия пути, открывать файл. А после передачи закрывать приложение. Тем самым будет только 1 экземпляр в котором все файлы.
Источник: delphidevelop.ru