Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Использование Tools Interface

Автор: Jim Poe

Для приманивания программиста необходима любая деталь, которую вы сможете открутить от заранее купленного компьютера. Небрежно помахивая ею, приближайтесь к намеченной особи, бормоча какие-либо компьютерные термины. После этого попросите починить ваш якобы случайно сломавшийся компьютер. Программист пойдет за вами, как бы впав в состояние транса. Дома угостите его сардельками и пивом. Скорее всего, программист уже никуда не уйдет.

...я все еще ищу *крутой* способ отрисовки содержимого окна редактирования IDE, и уже добрался до списка дескрипторов окон. Я так понял, что для этого нужно использовать инструментальный интерфейс (Tools Interface), только c помощью него, да? Ну и как этим чудом воспользоваться?

Приведенный ниже код может использоваться для включения заголовка исходного кода, представляющего собой шапку с информацией об авторских правах, авторе, версии и пр. при добавлении нового модуля или формы к вашему проекту. TIAddInNotifier - класс, реализованный в ToolIntf и позволяющий "захватывать" такие события, как открытие файлов, их закрытие, открытие и закрытие проекта и др. Я перекрыл процедуру FileNotification для захвата событий AddedToProject и RemovedFromProject. В обработчике события AddedToProject вы можете получить доступ к новому модулю проекта, особенно это касается процедуры InsertHeader. Я создал наследника класса TIEditorInterface, расположенного в файле EditIntf.pas, и создал собственную процедуру InsertHeader.

VCSNotifier создается в другом модуле и здесь не показан. Приведенный ниже код является частью моей программы, осуществляющей контроль версий dll. При создании код "живет" до тех пор, пока работает Delphi. При получении кода AddedToProject, я проверяю наличие файла (должен быть новым), и что он является .pas-файлом. Затем я создаю VCSEditorInterface, мой унаследованный интерфейс, и использую мою процедуру InsertHeader.

В самой процедуре InsertHeader я создаю экземпляр TIEditReader для чтения нового модуля и TIEditWriter для его изменения.


 unit VCSNtfy;
 
 interface
 
 uses SysUtils, Dialogs, Controls, ToolIntf, EditIntf;
 
 type
 
   TIVCSNotifier = class(TIAddInNotifier)
   public
     procedure FileNotification(NotifyCode: TFileNotification; const FileName:
       string; var Cancel: Boolean); override;
   end;
 
   TIVCSEditorInterface = class(TIEditorInterface)
   public
     procedure InsertHeader;
   end;
 
 var
 
   VCSNotifier: TIVCSNotifier;
   VCSModuleInterface: TIModuleInterface;
   VCSEditorInterface: TIVCSEditorInterface;
 
 implementation
 
 uses FITIntf, FITStr, Classes;
 
 { *************************   Начало VCSNotifier  **************************** }
 
 procedure TIVCSNotifier.FileNotification(NotifyCode: TFileNotification; const
 
   FileName: string; var Cancel: Boolean);
 var
 
   TmpFileName: string;
 
 begin
 
   case NotifyCode of
     fnRemovedFromProject: VCSProject.Remove(LowerCase(ExtractFileName(
         FileName)));
     fnAddedToProject:
       begin
         if (not FileExists(FileName)) and
           (ExtractFileExt(FileName) = '.pas') then
         begin
           { новый файл с исходным кодом }
           VCSModuleInterface := ToolServices.GetModuleInterface(FileName);
           if VCSModuleInterface <> nil then
           begin
             VCSEditorInterface := TIVCSEditorInterface(
               VCSModuleInterface.GetEditorInterface);
             VCSEditorInterface.InsertHeader;
             VCSEditorInterface.Free;
           end;
           VCSModuleInterface.Free;
         end;
 
         TmpFileName := LowerCase(ExtractFileName(FileName));
         if VCSProject.RecycleExists(TmpFileName) then
         begin
           if MessageDlg('Вы хотите извлечь текущие ' +
             ' записи из таблицы Recycle' +
             #13 + #10 + '           ' +
             VCSProject.ProjectName + '/' +
             TmpFileName + '?', mtConfirmation,
             [mbYes, mbNo], 0) = mrYes then
           begin
             VCSProject.Recycle(TmpFileName);
           end;
         end;
       end;
   end;
 end;
 
 { *************************    Конец TIVCSNotifier   *************************** }
 
 { *********************   Начало TIVCSEditorInterface  ************************ }
 
 procedure TIVCSEditorInterface.InsertHeader;
 var
 
   Module, TmpFileName, UnitName, InsertText, Tmp: string;
   Reader: TIEditReader;
   Writer: TIEditWriter;
   APos: Integer;
   F: TextFile;
 begin
 
   TmpFileName := ExtractFileName(FileName);
   UnitName := SwapStr(TmpFileName, '.pas', '');
 
   SetLength(Module, 255);
   Reader := CreateReader;
   try
     Reader.GetText(0, PChar(Module), Length(Module));
   finally
     Reader.Free;
   end;
 
   APos := Pos('unit ' + UnitName, Module);
   if APos > 0 then
   begin
     try
       InsertText := '';
       AssignFile(F, VCSConfig.HeaderFileLocation);
       Reset(F);
       while not EOF(F) do
       begin
         Readln(F, Tmp);
         InsertText := InsertText + #13 + #10 + Tmp;
       end;
       CloseFile(F);
 
       InsertText := InsertText + #13 + #10;
 
       Writer := CreateWriter;
       try
         Writer.CopyTo(APos - 1);
         Writer.Insert(PChar(InsertText));
       finally
         Writer.Free;
       end;
     except
       on E: EStreamError do
         MessageDlg('Не могу создать шапку', mtInformation, [mbOK], 0);
     end;
   end;
 
 end;
 { *********************   Конец TIVCSModuleInterface  ************************** }
 end.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS