Советы по Delphi

         

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


...я все еще ищу *крутой* способ отрисовки содержимого окна редактирования 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.

- Jim Poe [001061]



Содержание раздела