Как перечислить формы IDE от эксперта Delphi IDE - PullRequest
4 голосов
/ 30 мая 2011

Я работаю в Delphi IDE expert, и мне нужно перечислить все формы, отображаемые в Delphi IDE, в настоящее время я использую свойство Screen.Forms, но мне интересно, существует ли другой способ сделать это с помощью OTA. потому что использование Screen.Forms работает только тогда, когда мой эксперт является BPL, но сейчас я перехожу на dll expert.

Ответы [ 2 ]

8 голосов
/ 30 мая 2011

Screen.Forms все еще должен работать из DLL. Просто убедитесь, что вы компилируете свою DLL с выбранным параметром компоновщика «use runtime packages». Таким образом, ваша DLL будет использовать тот же экземпляр VCL, что и IDE, и у вас будет доступ ко всем тем же глобальным переменным, включая Screen.

2 голосов
/ 30 мая 2011

Это вполне возможно с OpenToolsAPI.

Чтобы извлечь список всех открытых форм в IDE, вы можете использовать что-то вроде этого:

procedure GetOpenForms(List: TStrings);
var
  Services: IOTAModuleServices;
  I: Integer;
  Module: IOTAModule;
  J: Integer;
  Editor: IOTAEditor;
  FormEditor: IOTAFormEditor;
begin
  if (BorlandIDEServices <> nil) and (List <> nil) then
  begin
    Services := BorlandIDEServices as IOTAModuleServices;
    for I := 0 to Services.ModuleCount - 1 do
    begin
      Module := Services.Modules[I];
      for J := 0 to Module.ModuleFileCount - 1 do
      begin
        Editor := Module.ModuleFileEditors[I];
        if Assigned(Editor) then
          if Supports(Editor, IOTAFormEditor, FormEditor) then
             List.AddObject(FormEditor.FileName,
               (Pointer(FormEditor.GetRootComponent)));
      end;
    end;
  end;
end;

Обратите внимание, что указатель в этом StringList является IOTAComponent. Чтобы разрешить это для экземпляра TForm, вы должны копать глубже. Продолжение следует.

Также можно отслеживать все формы, открытые в IDE, добавив в IOTAServices средство уведомления типа IOTAIDENotifier, как указано ниже:

type
  TFormNotifier = class(TNotifierObject, IOTAIDENotifier)
  public
    procedure AfterCompile(Succeeded: Boolean);
    procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
    procedure FileNotification(NotifyCode: TOTAFileNotification;
      const FileName: String; var Cancel: Boolean);
  end;

procedure Register;

implementation

var
  IdeNotifierIndex: Integer = -1;

procedure Register;
var
  Services: IOTAServices;
begin
  if BorlandIDEServices <> nil then
  begin
    Services := BorlandIDEServices as IOTAServices;
    IdeNotifierIndex := Services.AddNotifier(TFormNotifier.Create);
  end;
end;

procedure RemoveIdeNotifier;
var
  Services: IOTAServices;
begin
  if IdeNotifierIndex <> -1 then
  begin
    Services := BorlandIDEServices as IOTAServices;
    Services.RemoveNotifier(IdeNotifierIndex);
  end;
end;

{ TFormNotifier }

procedure TFormNotifier.AfterCompile(Succeeded: Boolean);
begin
  // Do nothing
end;

procedure TFormNotifier.BeforeCompile(const Project: IOTAProject;
  var Cancel: Boolean);
begin
  // Do nothing
end;

procedure TFormNotifier.FileNotification(NotifyCode: TOTAFileNotification;
  const FileName: String; var Cancel: Boolean);
begin
  if BorlandIDEServices <> nil then
    if (NotifyCode = ofnFileOpening) then
    begin
      //...
    end;
end;

initialization

finalization
  RemoveIdeNotifier;

end.
...