Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Мне необходимо отследить переименование проекта, для чего...   Найти похожие ветки 

 
Другой Дмитрий   (2005-06-23 10:59) [0]

Мне необходимо отследить переименование проекта, для чего пишу эксперт. Воспользовался примером ModuleNotifiers (http://www.devrace.com/files/tools_api_examples.zip) из статьи Андрея Семака (http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=899).
После установки примера, открываю проект через "File->Open". Не закрывая этот, открываю другой (проекты демонстрационные состоят из одной формы).
Повторяю несколько раз и жму "File->Close All" и получаю "AV in module coreide60.bpl", иногда в rtl60.bpl  и периодически появляется сообщение "Invalid Index".
После этого при попытке доступа к любому пункту меню Delphi появляется "AV in module coreide60.bpl".
Может кто нибудь подскажет, что там не доделано или это только у меня такой глюк?


 
Юрий Зотов ©   (2005-06-23 12:41) [1]

> Другой Дмитрий   (23.06.05 10:59)

Предположение такое - где-то перечисляются проекты группы (или модули проекта, или еще что-то в этом духе) - причем перечисление идет в цикле for и в возрастающем порядке (от 0 до Count-1). В цикле for верхний предел вычисляется один раз, при его инициализации - поэтому, если во время выполнения цикла количество элементов по каким-то причинам уменьшилось, то произойдет обращение к несуществующему элементу и получим сообщение об ошибке индексации. И, поскольку исключение происходит фактически в самой IDE (это же эксперт, как-никак), то далее возможны нарушения ее работы.

Если приведете код, можно будет попытаться сказать точнее. Либо походите отладчиком. Для этого деинсталлируете пакет эксперта, назначаете ему host application в виде Delphi32.exe и "запускаете" из IDE - получаем 2 экземпляра IDE, причем первый будет отлаживать второй. В этом втором экземпляре инсталлируете пакет и производите все манипуляции - а в первом ведете обычную отладку, с брейкпойнтами и пр.


 
Другой Дмитрий   (2005-06-23 14:35) [2]

Привожу код:


unit FirstExpClass;

interface

uses
 ToolsApi, Dialogs, SysUtils;

type
 TFirstModuleExpert = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
 private
   FNotifierIndex: integer;
 public
   constructor Create;
   destructor Destroy; override;
   function GetIDString: string;
   function GetName: string;
   function GetState: TWizardState;
   procedure Execute;
   function GetMenuText: string;
 end;

 TIDENotifier = class(TNotifierObject, IOTANotifier, IOTAIDENotifier)
   {From IOTANotifier}
   procedure AfterSave;
   procedure BeforeSave;
   procedure Destroyed;
   procedure Modified;
   {From IOTAIDENotifier}
   procedure FileNotification(NotifyCode: TOTAFileNotification;
     const FileName: string; var Cancel: Boolean);
   procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
     overload;
   procedure AfterCompile(Succeeded: Boolean); overload;
 end;

 TModuleNotifier = class(TNotifierObject, IOTANotifier, IOTAModuleNotifier)
 private
   FFileName: string;
 protected
   {From IOTANotifier}
   procedure AfterSave;
   procedure BeforeSave;
   procedure Destroyed;
   procedure Modified;
   {From IOTAModuleNotifier}
   function CheckOverwrite: Boolean;
   procedure ModuleRenamed(const NewName: string);
 public
   constructor Create(FileName: string);
   destructor Destroy; override;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterPackageWizard(TFirstModuleExpert.Create);
end;

function OTAServices: IOTAServices;
begin
 Result := (BorlandIDEServices as IOTAServices);
end;

function OTAMessageServices: IOTAMessageServices;
begin
 Result := (BorlandIDEServices as IOTAMessageServices);
end;

function OTAModuleServices: IOTAModuleServices;
begin
 Result := (BorlandIDEServices as IOTAModuleServices);
end;

{ TFirstExpert }

constructor TFirstModuleExpert.Create;
begin
 FNotifierIndex := OTAServices.AddNotifier(TIDENotifier.Create);
end;

destructor TFirstModuleExpert.Destroy;
begin
 if FNotifierIndex <> -1 then
   OTAServices.RemoveNotifier(FNotifierIndex);
 inherited;
end;

procedure TFirstModuleExpert.Execute;
begin
 OTAMessageServices.AddTitleMessage(Format("%s запущен", [GetName]));
end;

function TFirstModuleExpert.GetIDString: string;
begin
 Result := "MY.FIRST.MODULE.EXPERT";
end;

function TFirstModuleExpert.GetMenuText: string;
begin
 Result := "Execute MyFirstModuleExpert";
end;

function TFirstModuleExpert.GetName: string;
begin
 Result := "MyFirstModuleExpert";
end;

function TFirstModuleExpert.GetState: TWizardState;
begin
 Result := [wsEnabled];
end;

{ TIDENotifier }

procedure TIDENotifier.AfterCompile(Succeeded: Boolean);
begin

end;

procedure TIDENotifier.AfterSave;
begin

end;

procedure TIDENotifier.BeforeCompile(const Project: IOTAProject;
 var Cancel: Boolean);
begin

end;

procedure TIDENotifier.BeforeSave;
begin

end;

procedure TIDENotifier.Destroyed;
begin

end;

procedure TIDENotifier.FileNotification(NotifyCode: TOTAFileNotification;
 const FileName: string; var Cancel: Boolean);
var
 Module: IOTAModule;
begin
 {файл открыт в редакторе IDE?}
 if NotifyCode = ofnFileOpened then
 begin
   {ищем модуль по имени}
   Module := OTAModuleServices.FindModule(FileName);
   {если модуль найден - присоединить нотификатор}
   if assigned(Module) then
     Module.AddNotifier(TModuleNotifier.Create(Filename));
 end;
end;

procedure TIDENotifier.Modified;
begin

end;

{ TModuleNotifier }

procedure TModuleNotifier.AfterSave;
begin
 OTAMessageServices.AddTitleMessage("AfterSave " + FFileName);
end;

procedure TModuleNotifier.BeforeSave;
begin
 OTAMessageServices.AddTitleMessage("BeforeSave " + FFileName);
end;

function TModuleNotifier.CheckOverwrite: Boolean;
begin
 Result := True;
end;

constructor TModuleNotifier.Create(FileName: string);
begin
 inherited Create;
 FFileName := Filename;
end;

destructor TModuleNotifier.Destroy;
begin
 OTAMessageServices.AddTitleMessage("Closed " + FFileName);
 inherited;
end;

procedure TModuleNotifier.Destroyed;
begin

end;

procedure TModuleNotifier.Modified;
begin
 OTAMessageServices.AddTitleMessage("Modified " + FFileName);
end;

procedure TModuleNotifier.ModuleRenamed(const NewName: string);
begin
 OTAMessageServices.AddTitleMessage("File " + FFileName + " renamed to " +
   NewName);
 FFileName := NewName;
end;

end.



 
Другой Дмитрий   (2005-06-27 08:59) [3]

После переустановки Delphi6 Update Pack 2, проблема разрешилась.



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
3-1131592515
antoxa2005
2005-11-10 06:15
2006.01.01
ПОМОГИТЕЕсли я перевожу ADOTable CursorLocation в clUseClient, то


14-1133938437
Bobsley
2005-12-07 09:53
2006.01.01
Мобилы


6-1126594397
VS
2005-09-13 10:53
2006.01.01
Интернетпочта


2-1134257176
BugFix
2005-12-11 02:26
2006.01.01
Этот код вешает компьютер :


14-1133966671
Ксардас
2005-12-07 17:44
2006.01.01
Задачи по программированию