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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 19:08   #1
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
Вопрос Исправление ошибок в модуле

Привет. Можете подсказать как исправить ошибки в этом модуле и процедуре. Вот собствено модуль:
Код:
unit AssocUnit;

interface

uses Windows, Forms, Registry, SysUtils, ComObj, ShlObj;

type
  TAssoc = class(TObject)
  private
  public
  constructor Create;
  destructor Destroy; override;
  procedure Initilization(Name: string);
  procedure RegisterApp;
  function Register(pExt: PChar): Boolean;
  function UnRegister(pExt: PChar): Boolean;
  function IsRegister(pExt: PChar): Boolean;
  procedure UpdateIcon;
end;

var

FReg: TRegistry;
FAppAssocReg: IApplicationAssociationRegistration; //1)
MY_NAME: string;

implementation

constructor TAssoc.Create;
begin
FReg := TRegistry.Create;
FAppAssocReg := IApplicationAssociationRegistration 
(CreateComObject(CLSID_ApplicationAssociationRegistration)); //2)
end;

destructor TAssoc.Destroy;
begin
  FReg.Free;
end;

procedure TAssoc.RegisterApp;
var
  sKey: string;
begin
  if Assigned(FAppAssocReg) then //3)
  begin
    sKey := 'Software\Clients\Media\' + MY_NAME + '\Capabilities';
    FReg.RootKey := HKEY_LOCAL_MACHINE;
    if FReg.OpenKey('SOFTWARE\RegisteredApplications', True) then
    begin
      FReg.WriteString(MY_NAME, sKey);
      FReg.CloseKey;
    end;
    if FReg.OpenKey(sKey, True) then
    begin
      FReg.WriteExpandString('ApplicationDescription', MY_NAME);
      FReg.WriteExpandString('ApplicationIcon', '"' + Application.ExeName +
        '"' + ',0');
      FReg.WriteExpandString('ApplicationName', MY_NAME);
      FReg.CloseKey;
    end;
  end;
end;

function TAssoc.Register(pExt: PChar): Boolean;
var
  pCurrentAssociation: PChar;
  sID, sCurrentAssociation: string;
begin
  Result := False;
  FReg.RootKey := HKEY_CLASSES_ROOT;
  if not FReg.OpenKey(pExt, True) then
    Exit;
  sID := MY_NAME + pExt;
  if not FReg.OpenKey(sID + '\shell\open', True) then
    Exit;
  FReg.WriteString('', 'Îòêðèòü â ' + MY_NAME);
  FReg.CloseKey;
  if not FReg.OpenKey(sID + '\shell\open\command', True) then
    Exit;
  FReg.WriteString('', '"' + Application.ExeName + '"' + ' "%1"');
  FReg.CloseKey;
  if not FReg.OpenKey(sID + '\DefaultIcon', True) then
    Exit;
  FReg.WriteString('', '"' + Application.ExeName + '"' + ',0');
  FReg.CloseKey;
  FReg.RootKey := HKEY_LOCAL_MACHINE;
  if not FReg.OpenKey('Software\Clients\Media\' + MY_NAME +
    '\Capabilities\FileAssociations', True) then
    Exit;
  FReg.WriteString(pExt, sID);
  FReg.CloseKey;
  FReg.RootKey := HKEY_CLASSES_ROOT;
  if FAppAssocReg <> nil then //4)
  begin
    if FAppAssocReg.QueryCurrentDefault(pExt, AT_FILEEXTENSION, AL_EFFECTIVE, pCurrentAssociation)= 0 then //5)
    begin
      sCurrentAssociation := pCurrentAssociation;
    Result:=FAppAssocReg.SetAppAsDefault//6)(MY_NAME, pExt, AT_FILEEXTENSION//7) ):=0; 
      end;
  end
  else
  begin
    if FReg.OpenKey(pExt, False) then
    begin
      sCurrentAssociation := FReg.ReadString('');
      FReg.WriteString('', sID);
      FReg.CloseKey;
      Result := True;
    end;
  end;
  if FReg.OpenKey(sID, True) then
  begin
    FReg.WriteString('Backup', pCurrentAssociation);
    FReg.CloseKey;
  end;
end;
procedure TAssoc.Initilization(Name: string);
begin
if Name='' then exit;
MY_Name:=Name;
end;

function TAssoc.UnRegister(pExt: PChar): Boolean;
var
  sID, sBackup: string;
begin
  Result := False;
  sID := MY_NAME + pExt;
  FReg.RootKey := HKEY_CLASSES_ROOT;
  if not FReg.OpenKey(sID, False) then
    Exit;
  sBackup := FReg.ReadString('Backup');
  FReg.CloseKey;
  if not FReg.OpenKey(pExt, False) then
    Exit;
  FReg.WriteString('', sBackup);
  FReg.CloseKey;
  Result := FReg.DeleteKey(sID);
end;

function TAssoc.IsRegister(pExt: PChar): Boolean;
var
  b: BOOL;
  sID: string;
begin
  b := False;
  FReg.RootKey := HKEY_CLASSES_ROOT;
  sID := MY_NAME + pExt;
  if FAppAssocReg <> nil then //8)
    FAppAssocReg.QueryAppIsDefault //9) (pExt, AT_FILEEXTENSION //10), AL_EFFECTIVE //11), MY_NAME, b)
  else
  begin
    if FReg.OpenKey(pExt, False) then
    begin
      b := FReg.ReadString('') = sID;
      FReg.CloseKey;
    end;
  end;
  if b then
  begin
    b := False;
    if FReg.OpenKey(sID + '\shell\open\command', False) then
    begin
      b := Pos(Application.ExeName, FReg.ReadString('')) > 0;
      FReg.CloseKey;
    end;
  end;
  Result := b;
end;

procedure TAssoc.UpdateIcon;
begin
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось саша40; 29.10.2012 в 19:15.
саша40 вне форума Ответить с цитированием
Старый 29.10.2012, 19:10   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
Смущение

Ошибки:
Проблема в том что выдаются в эти ошибки:
Код:
1)[Error] AssocUnit.pas(24): Undeclared identifier: 'IApplicationAssociationRegistration' //говорит что нет такой функции
2)[Error] AssocUnit.pas(33): Undeclared identifier: 'CLSID_ApplicationAssociationRegistration' //тоже 
3)[Error] AssocUnit.pas(45): Incompatible types //кажись нехватает параметров
4)[Error] AssocUnit.pas(94): Operator not applicable to this operand type //нехватает оператора
5)[Error] AssocUnit.pas(96): 'THEN' expected but identifier 'QueryCurrentDefault' found //что то с условием
6)[Error] AssocUnit.pas(99): Missing operator or semicolon //отсутствует оператор
7)[Error] AssocUnit.pas(99): Undeclared identifier: 'AT_FILEEXTENSION' //тоже что и с функцией
8)[Error] AssocUnit.pas(150): Operator not applicable to this operand type //что-то
9)[Error] AssocUnit.pas(151): Missing operator or semicolon //тоже что и с оператором
10)[Error] AssocUnit.pas(151): Undeclared identifier: 'AT_FILEEXTENSION' //функция
11)[Error] AssocUnit.pas(151): Undeclared identifier: 'AL_EFFECTIVE' //что-то говорит о переменой или параметре
12)[Fatal Error] Unit1.pas(8): Could not compile used unit 'AssocUnit.pas' //говорит что не удается найти модуль(вытекает из всех выше ошибок
И процедура применения:
Код:
procedure TForm1.ApplyAssoc;
var
  Assoc: TAssoc;
begin
  Assoc := TAssoc.Create;
  try
    Assoc.Initilization('Music Player');
    Assoc.RegisterApp;
    Assoc.Register('.saved');
    Assoc.UpdateIcon;
  finally
    Assoc.Free;
  end;
end;
P.S. Получилось слишком много символов и поэтому пришло это писать отдельно.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось саша40; 29.10.2012 в 19:14.
саша40 вне форума Ответить с цитированием
Старый 29.10.2012, 19:41   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Из какого модуля эти функции подключаются? Проверь правильность написания самих функций

Цитата:
Incompatible types //кажись нехватает параметров
Missing operator or semicolon //отсутствует оператор
Operator not applicable to this operand type //нехватает оператора
Unit1.pas(8): Could not compile used unit 'AssocUnit.pas' //говорит что не удается найти модуль(вытекает из всех выше ошибок
Не хватает знания английского или лениво сползать в переводчик Гугля. По-порядку:
"Несовместимые типы"
Обратите внимание отдельно на or semicolon
"Оператор неприменим к операндам данного типа"
"Невозможно откомпилировать"
а не найти... Юнит-то Ваш он прекрасно находит, раз ошибки в нем видит.

Отдельной строкой выделю вот эту ошибку, ибо такое - это уже совсем:

Цитата:
'THEN' expected but identifier 'QueryCurrentDefault' found //что то с условием
Саша40, Вы вообще в курсе, что в Дельфе если кликнуть по строке с ошибкой в логе, то курсор в коде сместится на ошибочную строку?
Смотрите внимательно, у Вас там после условия THEN пропущен, о чем и написал компилятор.

И все это - только глядя в список ошибок, код я как-то пролистнул мимо.

К чему я Вам все это написал? Очень просто: имхо без правильного понимания ошибок не отыскать их причин... А без переводчика или элементарного словаря правильного понимания ошибок не будет.

Мнение субъективное, прошу сильно не пинать
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 29.10.2012, 21:42   #4
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Из какого модуля эти функции подключаются? Проверь правильность написания самих функций



Не хватает знания английского или лениво сползать в переводчик Гугля. По-порядку:
"Несовместимые типы"
Обратите внимание отдельно на or semicolon
"Оператор неприменим к операндам данного типа"
"Невозможно откомпилировать"
а не найти... Юнит-то Ваш он прекрасно находит, раз ошибки в нем видит.

Отдельной строкой выделю вот эту ошибку, ибо такое - это уже совсем:



Саша40, Вы вообще в курсе, что в Дельфе если кликнуть по строке с ошибкой в логе, то курсор в коде сместится на ошибочную строку?
Смотрите внимательно, у Вас там после условия THEN пропущен, о чем и написал компилятор.

И все это - только глядя в список ошибок, код я как-то пролистнул мимо.

К чему я Вам все это написал? Очень просто: имхо без правильного понимания ошибок не отыскать их причин... А без переводчика или элементарного словаря правильного понимания ошибок не будет.

Мнение субъективное, прошу сильно не пинать
Цытирую... Ошибки в коде указаны коментариями на том месте где ставилься курсор при клике на ошибку(посмотрите код модуля). В настоящем коде модуля коментариев- НЕТ!
Я специально указал цыфрами ошибки. Посмотрите ошибку где "по словам" компилятора нет then, оно там есть, но он что-то другое просит.
Мне бы решить основные ошибки: С невозможностью индефекации.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 29.10.2012, 21:48   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ладно, согласен - THEN он требует, потому что не видит QueryCurrentDefault, которая, видимо, из другого модуля... А сам то модуль в природе существует? Как называется, случайно не ShlObj?

UPDATE Вот я счас ради интереса скопировал Вашу строчку Uses в дельфи и в каждом модуле поискал IApplicationAssociationRegistration - нет нигде такого. Чего ж Вы еще хотите?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.10.2012 в 21:52.
Sciv вне форума Ответить с цитированием
Старый 30.10.2012, 12:10   #6
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

По идее должен быть ComObj. А ShlObj есть и делпфи его иницилизирует.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.10.2012, 13:01   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

саша40, ещё раз, внимательно, Delphi не знает, что такое IApplicationAssociationRegistration

и пока Вы ему не расскажите, что это (интерфейс, судя по имени) и откуда брать его описание, Вы будете получать те же самые ошибки при компиляции.
Откуда Вы взяли этот код, там и ищите, что за библиотека (заголовочный файл) должен быть подключён...


p.s. погуглил чуток.. судя по всему, этот интерфейс доступен только начания с Windows Vista и выше...
о чём, собственно, Вам четыре дня назад на cyberforum и написали!

Последний раз редактировалось Serge_Bliznykov; 30.10.2012 в 13:08.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.10.2012, 13:33   #8
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Мне его дали, но известно что код писался на Delphi XE3
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.10.2012, 14:09   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Мне его дали, но известно что код писался на Delphi XE3
и работать будет под Windows 7..
допускаю.

А у Вас что не получается?
Вы его под Delphi XE3 компилируете и под Windows 7 запускаете?
И всё равно ошибки?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.10.2012, 14:31   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и работать будет под Windows 7..
допускаю.

А у Вас что не получается?
Вы его под Delphi XE3 компилируете и под Windows 7 запускаете?
И всё равно ошибки?...
У меня стоит Delphi 7, а не XE 3(и никогда не будет!). В Windows 7 должно робить.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправление ошибок в программе Makson Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.12.2011 13:15
Исправление ошибок С# PROkaZZZniK Помощь студентам 5 15.11.2011 17:16
исправление ошибок toldo Microsoft Office Word 2 09.01.2011 15:22
исправление ошибок в коде Viola2208 Помощь студентам 0 12.05.2010 00:01
Исправление ошибок в проге Juhn Паскаль, Turbo Pascal, PascalABC.NET 11 16.01.2008 18:17