Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2011, 13:45   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию [Проблема]Создание нового типа файла и ассоциация его с программой

Всем доброго времени суток!

Задача такая:
Создать новый тип файла и ассоциировать его со своей программой.

Я сообразил это так:
Код:
procedure RegisterNewFileType(NewTypeExt, NewTypeDesc: string);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.OpenKey(NewTypeExt, True);
    Reg.WriteString('', NewTypeDesc);
    Reg.CloseKey;

    Reg.OpenKey(NewTypeDesc + '\DefaultIcon', true);
    Reg.WriteString('', ParamStr(0) + ', 0');
    Reg.CloseKey;

    Reg.OpenKey(NewTypeDesc + '\Shell\Open', True);
    Reg.WriteString('', 'Open this file with WFT!?');
    Reg.CloseKey;

    Reg.OpenKey(NewTypeDesc + '\Shell\Open\command', True);
    Reg.WriteString('', ParamStr(0) + ' "%1"');
    Reg.CloseKey;
  finally
    Reg.Free;
  end;
end;
Регистрируется аписывается и моей программой тоже открывается. НО! Иконка у файла не изменяется. Как задать файлам с этим типом, мои иконки? Ну или иконку exe файла который их открывает.

Долее почитал статейку понял что CLASSES_ROOT не есть хорошо.

Переделал:
Код:
procedure RegisterNewFileType(NewTypeExt, NewTypeDesc: string);
const
  ClassesKey='SoftWare\Classes';
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    If Reg.OpenKey(ClassesKey,False) then
    begin
    Reg.OpenKey(NewTypeExt, True);
    Reg.WriteString('', NewTypeDesc);
    Reg.CloseKey;

    Reg.OpenKey(NewTypeExt + '\DefaultIcon', true);
    Reg.WriteString('', ParamStr(0) + ', 0');
    Reg.CloseKey;

    Reg.OpenKey(NewTypeExt + '\Shell\Open', True);
    Reg.WriteString('', 'Open this file with WFT!?');
    Reg.CloseKey;

    Reg.OpenKey(NewTypeExt + '\Shell\Open\command', True);
    Reg.WriteString('', ParamStr(0) + ' "%1"');
    Reg.CloseKey;

    //Closing ClassesKey
    Reg.CloseKey;
   end;
  finally
    Reg.Free;
  end;
end;
Но в HKCU/Software/classes создаёт только мой .ext каталог. А в нутри него ничего нет.

Прошу пожалуйста, обьяснить почему и как надо привильно делать.

Последний раз редактировалось Человек_Борща; 07.03.2011 в 14:02.
Человек_Борща вне форума Ответить с цитированием
Старый 07.03.2011, 16:11   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Попробуйте вот так:
Регистрация своего типа файлов и пункт в контекстном меню

После регистрации расширения система будет открывать такие файлы с помощью указанной программы - т.е. передавать имя файла как параметр и соответственно обработать имя файла можно с помощью ParamsCount + ParamStrКод

Код:
//----- Регистрация своего типа файлов -----------
uses Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('.txt2' , True);
Reg.WriteString('', 'TXT2file');
Reg.CloseKey;
Reg.OpenKey('TXT2fileDefaultIcon', True);
Reg.WriteString('', Application.ExeName + ',0');
Reg.CloseKey;
Reg.OpenKey('TXT2fileshellopencommand', True);
Reg.WriteString('', Application.ExeName + ' "%1"');
Reg.CloseKey;
Reg.Free;
end;

//---------- Пункт в контекстном меню ------------
uses Registry;

procedure AddToContext(FileExt, text : string);
// FileExt - расширение типа файлов без точки вначале!
var R : TRegistry;
s : string; 
begin
r := TRegistry.Create;
r.RootKey := HKEY_LOCAL_MACHINE;
r.OpenKey('SoftwareClasses',false);
if not (r.KeyExists('.'+FileExt)) then
begin
ShowMessage('Такой тип файлов не найден.');
Exit;
end
else
r.OpenKey('.'+FileExt,true);
s := r.ReadString('');
ShowMessage(s);
r.CloseKey;
r.OpenKey('SoftwareClasses',false);
r.OpenKey(s,true);
r.OpenKey('shell',true);
r.OpenKey('Crypt', true);
r.WriteString('',text)
r.OpenKey('command',true);
r.WriteString('',Application.ExeName + '"%1"');
r.CloseKey;
r.Free;
end;
asmodey1 вне форума Ответить с цитированием
Старый 07.03.2011, 17:29   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Собственно 2 вопроса:
1. Почему расшрение в HKEY_Classes_root а пункт контекстного меню в HKCU\SoftWare\classes? Ведь слеледуя советам GunSmoker'a(Пример 3) - лучше всего заводить новые расширения в HKCU\SoftWare\Classes(Ссылка в первом сообщении).

2. Если рассматривать что программа закрыта и открывается ассоциированный с ней файл то, программа запускается и загружает файл.
А вот если программа уже запущена, и юзер открывает файл не через программу, а через контекстное меню то, как передать этот файл в уже открытую программу?

Последний раз редактировалось Человек_Борща; 07.03.2011 в 17:35.
Человек_Борща вне форума Ответить с цитированием
Старый 07.03.2011, 18:25   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

при использовании контекстного меню, все равно производится запуск того же ассоциированного приложения и уже забота этого приложения читать параметры запуска через paramstr() и обрабатывать нужным образом...
Код:
procedure context(p:boolean; txt:shortstring);
var hr:tregistry;
begin
 hr:=tregistry.Create;
 hr.RootKey:= $80000000;
 //
 if p then begin
  hr.OpenKey('*\Shell\ramedia',true);
  hr.WriteString('','ramedia');
  hr.WriteString('',txt);
  hr.CloseKey;
  //
  hr.OpenKey('*\Shell\ramedia\command',true);
  hr.WriteString('','command');
  hr.WriteString('',paramstr(0)+' "1%"');
  hr.CloseKey;
 end else begin
  hr.DeleteKey('*\Shell\ramedia');
  hr.CloseKey;
 end;
 //
 hr.Free
end;
Тема поднималась и неоднократно 1 2
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 07.03.2011, 20:49   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ну значится вот что у меня получилось=) И работает!
Пример приаттачил, там же упакованный exe, он то и весит 200 кб=)

Единственный оставшийся вопрос, открытие файла из оболочки винды в уже открытой программе.
Например как это делает Light Alloy:
Условие:
1-а копия программы уже запущена.

Сабж:
Юзер открывает в оболочке виндов ещё один avi , и вместо того, чтобы открыть новое окно Light Alloy, происходит следующее:
Новый файл просто поподает в плей-лист уже рабочей копии.

Вопрос:
Как такое реализовать у себя?
Откуда винды знают об уже запущеной копии программы и передают файл в плей-лист LA?

Знающие люди помогите пожалуйста!

Последний раз редактировалось Человек_Борща; 07.03.2011 в 20:53.
Человек_Борща вне форума Ответить с цитированием
Старый 07.03.2011, 21:35   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

ет реализовываеца при запуске ехе, она проверяет если уже запушеня и передает даные тои ехе, гдет такое было, шечас гляну, если наиду скину сс ылку
-----------------------------------------------------------------------------------------------
вот нашел
http://programmersforum.ru/showthrea...hlight=listbox
VirusN13

Последний раз редактировалось ArtGrek; 07.03.2011 в 21:45.
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового WAV-файла++ oren_yastreb Мультимедиа в Delphi 0 17.10.2010 01:58
Ассоциация файлов со своей программой dmitriegorovih Общие вопросы Delphi 7 21.08.2010 12:41
Выборка и создание нового файла kzld Microsoft Office Excel 15 28.12.2009 10:49
Delphi. Создание нового класса, его "предков". Krechet Помощь студентам 0 26.04.2009 15:52
Создание нового типа master_root Общие вопросы Delphi 2 02.07.2008 22:33