Delphi World - Использование Tools Interface
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Использование 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.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования