скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook