Использование 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.
|
|