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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 788

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

Здравствуйте, эксперты!

Занялся связыванием файла по расширению с файлом программы.
Сделал ассоциацию файлов с программой (в приложении №1). Вроде бы все работает нормально.

В главной форме программы прописал загрузку нажатого файла (в приложении №2). Все хорошо работает, если в имени файла не встречаются пробелы.
Например, файл с именем "d:\temp\112 2 .32.grop"
параметр ParamStr(1) передает как "FileName=D:\temp\112", т.е. только до первого пробела.

В чем ошибаюсь?
Спасибо

Приложение:
  1.  
  2. {{code}} procedure TAssociatorForm.AssociateFile(ext: string; ExeName, ProgramName, IconName: string);
  3. var s: string;
  4. var Reg: TRegistry;
  5. begin
  6.  
  7.  
  8.  
  9.  
  10.  
  11. Reg.OpenKey(ext, True);
  12. Reg.WriteString('', ProgramName);
  13.  
  14. Reg.OpenKey('\' + ProgramName + '\DefaultIcon\', True);
  15.  
  16. s := IconName + ',0';
  17. Reg.WriteString('', s);
  18.  
  19. Reg.OpenKey('\' + ProgramName + '\Shell\Open\', True);
  20.  
  21.  
  22. Reg.OpenKey('command\', True);
  23. Reg.WriteString('', ExeName + ' %1');
  24.  
  25. Reg.Free;
  26.  
  27. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  28. end;
  29. {{/code}}
  30.  
  31.  
  32.  
  33.  
  34. {{code}}
  35.  
  36. procedure TFormManager.DblClickLoadFile;
  37. var FileName: string;
  38. var LogIni: TMemIniFile;
  39. begin
  40.  
  41. if ParamCount > 0 then
  42. begin
  43. FileName := ParamStr(1);
  44.  
  45. ///
  46. LogIni := TMemIniFile.Create('LogDblClickLoadFile.ini');
  47. LogIni.WriteString('DblClickLoadFile', 'FileName', FileName);
  48. LogIni.UpdateFile();
  49. FreeAndNil(LogIni);
  50. ///
  51.  
  52. Self.FManager.Load(Self, FileName);
  53. Self.LoadCalendarDate(Self);
  54. Self.UpdateView;
  55. end;
  56. end;
  57.  
  58. {{/code}}
  59.  
  60.  


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

Вопрос задал: Aндрей (статус: 1-ый класс)
Вопрос отправлен: 6 декабря 2010, 15:44
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Ну, всё понятно. Кое-где не хватает символов "двойные кавычки".
Короче, код я твой не смотрел, щас дам тебе один свой модуль, где есть нужные тебе функции. Выкинь свой код и замени на мой. Он отлажен и работает. По возможности просмотри его и разберись - КАК он работает. Модуль разделён на категории, тебе нужна вот эта категория (остальное можешь выкинуть):

// -------------------- Функции для работы с реестром --------------------------
function RegFileExt(AExtension, AExtDescription, AFileDescription,
                    AOpenWith, AParamString: String; AIconIndex: Integer): Boolean;
function FileExtIsRegistered(const AExtension: string): Boolean;
function UnRegFileExt(AExtension, AExtDescription: String): Boolean;
function ExtToFileType(const Ext: string): string; // Описание формата из реестра по расширению
function FileNameToFileType(const AFileName: string): string; // Описание формата из реестра по имени файла

Пример использования некоторых функций:
const
  // Расширения, иконки, реестр
  ProjectFileExt =       '.seproj';
  ProjectExtDesc =       'seproject';
  ProjectFileDesc =      'Проект Source Editor';
  ProjectIconIndex =     1;
 
// ... -------------------- ...
 
// Регистрация расширения
  if not FileExtIsRegistered(ProjectFileExt)
    then RegFileExt(ProjectFileExt,
                    ProjectExtDesc,
                    ProjectFileDesc,
                    ParamStr(0),
                    '%1',
                    ProjectIconIndex);

К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 6 декабря 2010, 16:05
Оценка за ответ: 5

Комментарий к оценке: К ответу прикреплён файл. Загрузить »
...и открывается пустая страница(

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Aндрей!
попробовать тут

Reg.WriteString('', ExeName + ' %1');
заменить на
Reg.WriteString('', ExeName + ' "%1"');

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 декабря 2010, 16:59


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 6 декабря 2010, 16:46; участников в обсуждении: 4.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 6 декабря 2010, 16:00 [#1]:

Если параметр содержит пробелы, то он берётся в двойные кавычки. В Windows всё работает автоматически: и запуск приложений с параметрами и обработка параметров. Так что вопрос в том, откуда вы пытаетесь вызывать свою программу — проблема должна быть там.
min@y™

min@y™ (статус: Доктор наук), 6 декабря 2010, 16:27 [#2]:

Цитата (Aндрей):

Комментарий к оценке: К ответу прикреплён файл. Загрузить » ...и открывается пустая страница(

Боюсь, сайт глючит. Вот, выложил на файлопомойку, попробуй оттуда скачать: http://zalil.ru/30087667
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 6 декабря 2010, 16:28 [#3]:

попробовать тут
Reg.WriteString('', ExeName + ' %1');
заменить на
Reg.WriteString('', ExeName + ' "%1"');
Галочка "подтверждения прочтения" - вселенское зло.
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 6 декабря 2010, 16:30 [#4]:

Цитата (Aндрей):

К ответу прикреплён файл. Загрузить »
...и открывается пустая страница(

Спасибо за замеченную ошибку, исправлено. Приношу извинения за неудобства.
Aндрей

Aндрей (статус: 1-ый класс), 6 декабря 2010, 16:46 [#5]:

Помогло! Спасибо всем большое!

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

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