Hinzufügen eines Eintrags zum Hauptmenü der IDE

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Die Hauptobjekte der IDE verwenden


Sie können mit dem nativen Tools-API-Interface INTAServices das Hauptmenü der IDE um eigene Menüeinträgen erweitern.

Hinzufügen eines Eintrags zum Hauptmenü

So fügen Sie dem Hauptmenü der IDE eine Instanz von TMenuItem hinzu:

  1. Erstellen Sie eine Instanz von TMenuItem mit dem Hauptmenü-Objekt als übergeordnetes Element. Das Hauptmenü-Objekt ist die Eigenschaft MainMenu der Variable BorlandIDEServices, die in den Typ INTAServices umgewandelt wird.
  2. Konfigurieren Sie Ihren Menüeintrag. Zum Beispiel:
    • Legen Sie einige Eigenschaften, wie Name, Caption, Hint oder ShortCut, fest.
    • Führen Sie einen der folgenden Schritte aus, um die Funktion Ihres Menüeintrags festzulegen:
      • Erstellen Sie eine Aktion, und weisen Sie sie der Eigenschaft Action Ihres Menüs zu.
      • Erstellen Sie eine Ereignisbehandlungsroutine für das Ereignis OnClick Ihres Menüs.
    • Um ein Symbol für Ihren Menüeintrag festzulegen, fügen Sie Ihr Symbol der Bilderliste der IDE hinzu, und weisen Sie dessen Index der Eigenschaft ImageIndex Ihres Menüeintrags zu.
  3. Rufen Sie AddActionMenu für die Variable BorlandIDEServices auf, deren Typ in INTAServices umgewandelt wurde, und stellen Sie die folgenden Parameter bereit:
    1. Ein String mit dem Namen eines vorhandenen Menüeintrags des Hauptmenüs der IDE, z. B. "ToolsMenu" oder "HelpMenu".
    2. Dieser Parameter fügt die angegebene Aktion der Aktionsliste der IDE hinzu. Wenn Ihr Menüeintrag über eine Aktion verfügt, können Sie sie hier angeben, damit sie der Aktionsliste der IDE hinzugefügt wird. Geben Sie andernfalls einen nil-Wert an.
    3. Ihr Menüeintrags-Objekt.

Delphi:

if Supports(BorlandIDEServices, INTAServices, NTAServices) then
begin
  MyMenuItem := TMenuItem.Create(nil);
  MyMenuItem.Caption := 'My Menu Item';
  NTAServices.AddActionMenu('ToolsMenu', nil, MyMenuItem);
end;

C++:

_di_INTAServices NTAServices;
if (BorlandIDEServices->Supports(NTAServices)) {
  MyMenuItem = new TMenuItem(NULL);
  MyMenuItem->Caption = "My Menu Item";
  NTAServices->AddActionMenu("ToolsMenu", NULL, MyMenuItem);
}

AddActionMenu fügt Ihren Menüeintrag nach dem vorhandenen Menüeintrag mit dem angegebenen Namen hinzu. Sie können Ihr Menü auch an einer anderen Position platzieren. Diese Position kann relativ zu dem angegebenen vorhandenen Menüeintrag sein, entweder links neben dem Menüeintrag oder als untergeordnetes Element des Menüeintrags.

Sie müssen auch daran denken, Ihr Menüeintrags-Objekt beim Entladen Ihres Package freizugeben.

Ermitteln des Namens eines vorhandenen Hauptmenüeintrags

Um dem Hauptmenü der IDE einen Menüeintrag hinzuzufügen, müssen Sie den Namen eines vorhandenen Menüeintrags kennen.

Zum Ermitteln des Namens eines vorhandenen Hauptmenüeintrags können Sie die folgende Prozedur in Ihr Package implementieren:

Delphi:

type
  TMenuBreadcrumbs = array of String;

procedure FindMenuItem(AMenuBreadcrumbs: TMenuBreadcrumbs);

  procedure IterateMenuItems(MenuItems: TMenuItem);
  var
    I, J: Integer;
    ArrayLength: Cardinal;
    Caption: String;
  begin
    for I := 0 To MenuItems.Count - 1 do
    begin
      Caption := StringReplace(MenuItems[I].Caption, '&', '', []);
      if Uppercase(AMenuBreadcrumbs[0]) = Uppercase(Caption) then
      begin
        ArrayLength := Length(AMenuBreadcrumbs);
        if ArrayLength = 1 then
          ShowMessage(MenuItems[I].Name)
        else
        begin
          for J := 1 to ArrayLength - 1 do
            AMenuBreadcrumbs[J - 1] := AMenuBreadcrumbs[J];
          SetLength(AMenuBreadcrumbs, ArrayLength - 1);
          IterateMenuItems(MenuItems.Items[I]);
        end;
        break;
      end;
    end;
  end;

var
  NTAServices: INTAServices;
begin
  if Supports(BorlandIDEServices, INTAServices, NTAServices) then
    IterateMenuItems(NTAServices.MainMenu.Items);
end;

C++:

void IterateMenuItems(TMenuItem* MenuItems,
                      DynamicArray<UnicodeString> &AMenuBreadcrumbs) {
  for (int i = 0; i < MenuItems->Count; i++) {
    UnicodeString Caption = StringReplace(
      MenuItems->Items[i]->Caption, "&", "", TReplaceFlags());
    if (AMenuBreadcrumbs[0].UpperCase() == Caption.UpperCase()) {
      int ArrayLength = AMenuBreadcrumbs.Length;
      if (ArrayLength == 1)
        ShowMessage(MenuItems->Items[i]->Name);
      else {
        for (int j = 1; j < ArrayLength; j++)
          AMenuBreadcrumbs[j - 1] = AMenuBreadcrumbs[j];
        AMenuBreadcrumbs.Length = ArrayLength - 1;
        IterateMenuItems(MenuItems->Items[i], AMenuBreadcrumbs);
      }
      break;
    }
  }
}

void FindMenuItems(DynamicArray<UnicodeString> AMenuBreadcrumbs) {
  _di_INTAServices NTAServices;
  if (BorlandIDEServices->Supports(NTAServices)) {
      IterateMenuItems(NTAServices->MainMenu->Items, AMenuBreadcrumbs);
  }
}

Rufen Sie dann FindMenuItem im initialization-Abschnitt Ihres Package auf, und übergeben Sie es an ein Array mit den Titeln, um den gewünschten Menüeintrag zu ermitteln.

Um beispielsweise den Namen des Menüeintrags File > Open From Version Control... zu ermitteln, rufen Sie FindMenuItem wie folgt auf:

Delphi:

FindMenuItem(['File', 'Open From Version Control...']);

C++:

FindMenuItems(DynamicArray<UnicodeString>(
  "File", "Open From Version Control..."););

Wenn Sie ein Package mit diesem Aufruf in der IDE installieren, wird in einem Dialogfeld der Name des angegebenen Menüs, z. B: "OpenFromRepository1", angezeigt.

Sie sollten diese Funktion nur bei der Entwicklung Ihrer IDE-Erweiterung verwenden, um bestimmte Namen von Menüeinträgen zu ermitteln. Da Ihre Benutzer die IDE möglicherweise in einer anderen Sprache als Englisch ausführen, sollte Ihr endgültiges Package diese Funktion nicht verwenden, sondern den tatsächlichen Namen des bei der Entwicklung ermittelten Zielmenüeintrags angeben:

Delphi:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem);

C++:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem);

Festlegen einer anderen relativen Position für Ihren Menüeintrag

Standardmäßig fügt AddActionMenu Ihren Menüeintrag rechts neben dem vorhandenen Menüeintrag hinzu, aber Sie können dieses Verhalten mit optionalen Parameter ändern.

Um Ihren Menüeintrag links neben dem angegebenen vorhandenen Menüeintrag einzufügen, übergeben Sie als vierten Parameter False:

Delphi:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem, False);

C++:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem, false);

Um Ihren Menüeintrag im angegebenen vorhandenen Menüeintrag als untergeordneten Eintrag einzufügen, übergeben Sie als fünften Parameter True (der Wert des vierten Parameter ist unerheblich):

Delphi:

NTAServices.AddActionMenu('OpenFromRepository1', nil, MyMenuItem, False, True);

C++:

NTAServices->AddActionMenu("OpenFromRepository1", NULL, MyMenuItem, false, true);

Siehe auch