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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2014, 23:55   #11
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Вопрос

Простите, но что сие означает? Вопрос решён с помощью этого или как?...
Streletz вне форума Ответить с цитированием
Старый 25.03.2014, 00:17   #12
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Код:
uses Registry, ShlObj;
...
var Reg: TRegistry;
...
procedure Associate;
var s:string;
begin
  Reg:=TRegistry.Create; // создаем
  Reg.RootKey := HKEY_CLASSES_ROOT; // указываем корневую ветку

  Reg.OpenKey('.dev\OpenWithProgids\', true);
  Reg.WriteString('TestApplication.dev', '');

  Reg.OpenKey('\TestApplication.dev\DefaultIcon\', true);
  s:=Application.ExeName+',0';
  Reg.WriteString('', s);

  Reg.OpenKey('\TestApplication.dev\Shell\Open\', true);
  Reg.WriteString('', 'Открыть в TestApplication');

  Reg.OpenKey('command\', true);
  s:='"'+Application.ExeName+'" "%1"'; // %1 номер иконки в ресурсах 
  Reg.WriteString('', s);

  Reg.Free;
  
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
первая иконка, это иконка самого exe, забиваем в ресурсы иконку ассоциации, меняем индекс.
XE5 вне форума Ответить с цитированием
Старый 25.03.2014, 00:18   #13
KaDima28
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 48
По умолчанию

Я этот код уже видел.
Код:
uses registry; 

procedure TForm1.RegisterFileType(prefix:String; exepfad:String); 
var 
reg:TRegistry; 
begin 
reg:=TRegistry.Create; 
reg.RootKey:=HKEY_CLASSES_ROOT; 
//create a new key --> .pci 
reg.OpenKey('.'+prefix,True); 
//create a new value for this key --> pcifile 
reg.WriteString('',prefix+'file'); 
reg.CloseKey; 
//create a new key --> pcifile 
reg.CreateKey(prefix+'file'); 
//create a new key pcifile\DefaultIcon 
reg.OpenKey(prefix+'file\DefaultIcon',True); 
//and create a value where the icon is stored --> c:\project1.exe,0 
reg.WriteString('',exepfad+',0'); 
reg.CloseKey; 
reg.OpenKey(prefix+'file\shell\open\command',True); 
//create value where exefile is stored --> c:\project1.exe "%1" 
reg.WriteString('',exepfad+' "%1"'); 
reg.CloseKey; 
reg.Free; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
RegisterFileType('pci','c:\project1.exe'); 
end;
Но он, почему-то меняет иконку программы.

Цитата:
Код:
RegisterFileType('pci','c:\project1.exe');
Знаю, знаю, я менял путь но тоже самое

Цитата:
Простите, но что сие означает? Вопрос решён с помощью этого или как?...
Нет, нет. Просто источники, может кто-то больше "апельсинового сока выдавит"?

XE5, спасибо за код. А вон те пустышки '' в них .ctt вбивать?

Последний раз редактировалось Stilet; 25.03.2014 в 22:42.
KaDima28 вне форума Ответить с цитированием
Старый 25.03.2014, 00:24   #14
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от KaDima28 Посмотреть сообщение
Но он, почему-то меняет иконку программы.
Код:
reg.WriteString('',exepfad+' "%1"');
Наверное потому что вместо расширения, которому нужно присвоить иконку, идёт присвоение иконки exepfad - самой программе. Вот иконка программы и меняется.

Короче смысл в том, чтоб в ветке реестра HKEY_CLASSES_ROOT нужно создать ключ .ctt. В ключе указать путь к исполняемому файлу, и номер иконки в этом файле. windows при открытии каталога, смотрит через реестр, какая программа, и какой номер иконки в этой программе ассоциирован с данным расширением, и автоматически подставляет эту иконку.

Последний раз редактировалось XE5; 25.03.2014 в 00:37.
XE5 вне форума Ответить с цитированием
Старый 25.03.2014, 00:36   #15
KaDima28
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 48
По умолчанию

Цитата:
XE5, спасибо за код. А вон те пустышки '' в них .ctt вбивать?
................................... ................................... ......
KaDima28 вне форума Ответить с цитированием
Старый 25.03.2014, 00:40   #16
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

KaDima28 Запустите RegEdit, вручную создайте необходимый ключ, когда поймёте смысл, напишете программное создание ключа. Код, который я дал мусолить не обязательно. Это лишь пример.
XE5 вне форума Ответить с цитированием
Старый 25.03.2014, 00:51   #17
KaDima28
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 48
По умолчанию

Я всё насчет regedit'a знаю, и эти ключи понимаю.

Насчет кода, то он нормальный, только надо эти ключи и все эти штучки тестить. У меня тут одна идея возникла. Если я решу, то код ОБЯЗАТЕЛЬНО скину на этот форум.

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
 reg :Tregistry;

begin
   Reg:=TRegistry.Create;
  reg.RootKey:=hkey_classes_root;
  Reg.OpenKey('.ctt',true);
  reg.WriteString('',Application.ExeName+' "%1"');
  reg.CloseKey;
  Reg.OpenKey('My',true);
  reg.WriteString('','Файл .ctt');
  //короче ниже так должно быть
  Reg.OpenKey('shell',true);
  Reg.OpenKey('open',true);
  reg.OpenKey('command',true);
   reg.WriteString('',Application.ExeName+' "%1"');
   reg.CloseKey;
      reg.CloseKey;
         reg.CloseKey;
  reg.Free;


end;
Не работает даже это. Я поменял вот эти строки: reg.WriteString('',Application.ExeN ame+' "%1"'); на эти reg.WriteString('','C:\CTT.ico');.
Но самое главное что при открытии "программы" сама "программа" обновляется, как бы резко исчезает и появляется. То есть иконка меняется "программы", а не расширения.

И так рассказываю что вышло.

1. Я поставил на .сtt файл основным для открытия - мою программу.
2. Я в реестре нашел сtt_auto_file. Вот всё что в нем было:

сtt_auto_file
|
+shell
|
+edit
| |
| +command
+open
|
+command

В командах, естественно была моя программа.
3. Я в сtt_auto_file создал defaulticon. Там я прописал: C:\CTT.ico. Не сработало
4. В Сервис - Свойства папки - Типы файлов, я когда-то давно еще до этого всего создал СТТ файл. (Если честно я не помню удалил я его или нет, но скорее всего удалил.)

5. Перед этим всем (кроме 4), я нашел такой замечательный код:
Код:
reg := tregistry.create;
// устанавливаем главный раздел
reg.rootkey := hkey_classes_root;
// создается ключ ".txt", если его нет
reg.openkey('.ctt',true);
// создается параметр со значением "!txt", если его нет
reg.writestring('', '!ctt');
// закрываем этот ключ


reg.openkey('!cttdefaulticon',true);
reg.writestring('', paramstr(0) + ', 1');
reg.closekey();
reg.openkey('!cttshellopencommand', true);
// создается параметр со значением "имя файла "%1"" - адрес нашей проги
reg.writestring('', 'D:\Vesna-Soft\INFORMATIKA\ComputerTests.exe');
// закрываем ключ
reg.closekey;
// освобождаем реестр, но настройки сохраняем
reg.free;
6. И ВЫ ПРЕДСТАВЛЯЕТЕ, ПОМЕНЯЛАСЬ ИКОНКА!!!. Я после этого удалил регистрацию СТТ, и она исчезла. Вы возможно скажете что это просто регистрация и поменяла иконку. Но нет! Посмотрите на код и на картинку. "!сtt" я не писал!

7. Я опять запустил код, и регистрация появилась, однако иконка не изменилась =(
Изображения
Тип файла: png 1.png (4.3 Кб, 31 просмотров)

Последний раз редактировалось KaDima28; 25.03.2014 в 23:15.
KaDima28 вне форума Ответить с цитированием
Старый 25.03.2014, 22:10   #18
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Хорошо

Цитата:
И ВЫ ПРЕДСТАВЛЯЕТЕ, ПОМЕНЯЛАСЬ ИКОНКА!!!
От всей души поздравляю с успехом!
Цитата:
Я опять запустил код, и регистрация появилась, однако иконка не изменилась =(
Как удаляли регистрацию? Возможно, что удаление прошло не корректно и оставшийся "мусор" в реестре мешает.
Streletz вне форума Ответить с цитированием
Старый 25.03.2014, 22:18   #19
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

При удалении регистрации нужно удалить ключ .сtt, и снова выполнить код
Код:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
для обновления иконок. Собственно не обновление параметров возможно и было ключевой проблемой, так как Вы не видели результат внесённых изменений.

Последний раз редактировалось XE5; 25.03.2014 в 22:20.
XE5 вне форума Ответить с цитированием
Старый 25.03.2014, 22:47   #20
KaDima28
Пользователь
 
Регистрация: 24.03.2014
Сообщений: 48
По умолчанию

Цитата:
Как удаляли регистрацию? Возможно, что удаление прошло не корректно и оставшийся "мусор" в реестре мешает.
Сначала удалил в Сервис - Свойства папки - Тип файлов (у меня Windows XP).

Цитата:
От всей души поздравляю с успехом!
Спасибо.

Я думаю что я на пути к финалу.

Не по теме: единственный минус в этом форуме, это то что он выходит автоматом.

Помогите, пожалуйста, ну никак не получается:
Я хочу что-бы два ключа: '!cttdefaulticon' и '!cttshellopencommand' были в ключе '.ctt'. Но при этом что-бы они были параллельно, а не '!cttshellopencommand' в '!cttdefaulticon' ключе. При закрытии '!cttdefaulticon' ключа, закрывается не он, а '.ctt'. И '!cttshellopencommand' лежит первым на "голой" земле. Вон та тот код предыдущий посмотрите может понятно.

Спасибо вам большое за помощь!
KaDima28 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написание своего расширения для QtCreator Avazart Qt и кроссплатформенное программирование С/С++ 1 23.06.2014 19:37
[Delphi], запись и чтение изображения в файл своего расширения Игорь0766 Помощь студентам 1 31.01.2011 16:41
Delphi: значок для программы kaa1977 Помощь студентам 3 23.03.2010 10:12
проблемы с создание своего расширения! blackstersl Общие вопросы Delphi 32 04.08.2009 22:12