Недавно добавленные исходники

•  TDictionary Custom Sort  535

•  Fast Watermark Sources  900

•  3D Designer  1 828

•  Sik Screen Capture  1 474

•  Patch Maker  1 482

•  Айболит (remote control)  1 406

•  ListBox Drag & Drop  1 175

•  Доска для игры Реверси  21 820

•  Графические эффекты  1 354

•  Рисование по маске  1 295

•  Перетаскивание изображений  1 096

•  Canvas Drawing  968

•  Рисование Луны  814

•  Поворот изображения  770

•  Рисование стержней  814

•  Paint on Shape  493

•  Генератор кроссвордов  762

•  Головоломка Paletto  667

•  Теорема Монжа об окружностях  855

•  Пазл Numbrix  617

•  Заборы и коммивояжеры  848

•  Игра HIP  557

•  Игра Go (Го)  527

•  Симулятор лифта  548

•  Программа укладки плитки  509

•  Генератор лабиринта  565

•  Проверка числового ввода  524

•  HEX View  600

•  Физический маятник  528

•  Задача коммивояжера  560

 
скрыть


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

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



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





Похожие по теме исходники

Web Tools

SEO Tools

wzsTools

CD Tools

 

Panel Tools

Enum Net Interfaces




Copyright © 2004-2022 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

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