unit exmpl_05;
{ ОПРЕДЕЛЕНИЕ ПОЗИЦИИ КУРСОРА }
interface
uses
SysUtils, Classes, Dialogs, Toollntf, Exptlntf, Editlntf, Menus;
type
{ класс эксперта является потомком базового класса TIExpert }
TEMyExpert = class (TIExpert)
private
Menultem: TIMenuItemlntf;
public
constructor Create;
destructor Destroy; override;
function GetName: string; override;
function GetStyle: TExpertStyle; override;
function GetlDString: string; override;
procedure MenuItemClick(Sender: TIMenuItemlntf);
function GetCursorPos: TEditPos;
end;
procedure Register;
{ функция, добавляющая пункт в главное мены IDE Delphi }
function AddlDEMenuItem (const Caption, Name, PreviousItemName: string;
const ShortCutKey: Char; OnClick: TIMenuClickEvent): TIMenuItemlntf;
implementation
constructor TEMyExpert.Create;
begin
inherited Create;
{ добавляем пункт в главное меню IDE Delphi }
Menultem := AddlDEMenuItem ('Simple Expert 5', 'ViewMyExpertltem5',
'ViewWatchltem', '5', MenuItemClick);
end;
destructor TEMyExpert.Destroy;
begin
Menultem.Free;
inherited Destroy;
end;
procedure TEMyExpert.MenuItemClick;
var CurPos: TEditPos;
begin
CurPos := GetCursorPos;
if CurPos.Line > 0 then
MessageDlg('Current file: ' + ToolServices.GetCurrentFile + #13 +
'Current cursor position: ' + IntToStr(CurPos.Line) +
', ' + IntToStr(CurPos.Col), mtlnformation, [mbOk], 0);
end;
function TEMyExpert.GetCursorPos;
var ModuleInter face: TIModulelnterface;
EditorInterface: TIEditorInterface;
EditView: TIEditView; FileName: string;
begin
{ определяем имя активного файла }
FileName := ToolServices.GetCurrentFile;
Result.Line := 0;
Result.Col := 0;
{ для простоты: определяем позицию только в pas - файлах }
if ExtractFileExt(FileName) = '.pas' then
try
{ получаем интерфейс модуля }
ModuleInterface := ToolServices.GetModuleInterface(FileName);
try
{ получаем интерфейс редактора кода }
Editorlnterface := Modulelnterfасе.GetEditorInterface;
try
{ получаем интерфейс представления модуля в редакторе, передавая
методу GetView индекс нужного нам представления;
если файл открыт в нескольких окнах редактора кода, то для
простоты берем первое (хотя, конечно, это не совсем правильно) }
EditView := Editorlnterface.GetView(0);
{ получаем позицию курсора }
Result := EditView.CursorPos;
finally
{ не забываем освободить полученные интерфейсы }
EditView.Free;
end;
finally
Editorlnterface.Free;
end;
finally
ModuleInter face. Free;
end;
end;
end.