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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: 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.

{/codecitation}

Добавить комментарий