Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
Другой Дмитрий   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
2-1134568860
floxi
2005-12-14 17:01
2006.01.01
MonthCalendar &amp; Memo


14-1134312547
Antonn
2005-12-11 17:49
2006.01.01
Промышленное предприятие как объект организации производства


9-1122544019
java73
2005-07-28 13:46
2006.01.01
поиск пути


14-1134213595
Alexey31
2005-12-10 14:19
2006.01.01
программа которая отслеживает действия другой программы


1-1133521902
bogdan
2005-12-02 14:11
2006.01.01
Организация авторана





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский