Ajout d'un élément au menu principal de l'EDI

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation d'objets natifs de l'EDI


Vous pouvez utiliser l'interface de l'API Native Tools de INTAServices pour étendre le menu principal de l'EDI avec vos propres entrées de menu.

Ajout d'un élément au menu principal

Pour ajouter une instance de TMenuItem au menu principal de l'EDI :

  1. Créez votre instance de TMenuItem avec l'objet du menu principal en tant que parent. L'objet du menu principal est la propriété MainMenu de la variable BorlandIDEServices transtypée en INTAServices.
  2. Configurez votre élément de menu. Par exemple :
    • Définissez certaines de ses propriétés, telles que Name, Caption, Hint ou ShortCut.
    • Effectuez l'une des opérations suivantes pour définir l'action de votre élément de menu :
      • Créez une action et assignez-la à la propriété Action de votre menu.
      • Fournissez un gestionnaire d'événement pour l'événement OnClick de votre menu.
    • Pour définir une icône pour votre élément de menu, ajoutez votre icône à la liste d'images de l'EDI et assignez son index à la propriété ImageIndex de votre élément de menu.
  3. Appelez AddActionMenu sur la variable BorlandIDEServices transtypée en INTAServices, puis fournissez les paramètres suivants :
    1. Une chaîne contenant le nom d'un élément de menu existant du menu principal de l'EDI, tel que "ToolsMenu" ou "HelpMenu".
    2. Ce paramètre ajoute l'action indiquée à la liste d'actions de l'EDI. Si votre élément de menu possède une action, vous pouvez la fournir pour l'ajouter à la liste d'actions de l'EDI. Sinon, fournissez la valeur nil.
    3. Votre objet élément de menu.

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 ajoute votre élément de menu après l'élément de menu existant portant le nom indiqué. Vous pouvez également placer votre menu dans un emplacement différent par rapport à l'élément de menu existant indiqué, soit à gauche de l'élément de menu, soit en tant qu'enfant de l'élément de menu.

Vous devez également veiller à libérer votre objet élément de menu lors du déchargement du package.

Recherche du nom d'un élément de menu principal existant

Pour pouvoir ajouter un élément de menu au menu principal de l'EDI, vous devez connaître le nom de l'élément de menu existant.

Pour rechercher le nom d'un élément de menu existant, vous pouvez implémenter la procédure suivante dans votre package :

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);
  }
}

Appelez ensuite FindMenuItem lors de l'initialisation de votre package, en lui transmettant un tableau des libellés qui conduisent à l'entrée de menu cible.

Par exemple, pour trouver le nom de l'élément de menu File > Open From Version Control..., appelez FindMenuItem comme suit :

Delphi :

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

C++ :

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

Lorsque vous installez un package avec cet appel dans l'EDI, le nom du menu indiqué, "OpenFromRepository1" par exemple, s'affiche dans une boîte de dialogue.

Vous devez utiliser cette fonction uniquement durant le développement de votre extension de l'EDI pour trouver les noms d'élément de menu en particulier. Du fait que vos utilisateurs peuvent exécuter l'EDI dans une langue autre que l'anglais, votre package final ne doit pas s'appuyer sur cette fonction mais indiquer le véritable nom de l'élément de menu cible que vous avez trouvé durant le développement :

Delphi :

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

C++ :

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

Spécification d'un autre emplacement relatif pour votre élément de menu

Par défaut, AddActionMenu ajoute votre élément de menu à droite de l'élément de menu existant indiqué ; cependant, vous pouvez modifier ce comportement à l'aide de quelques paramètres facultatifs.

Pour placer votre élément de menu à gauche de l'élément de menu existant indiqué, transmettez False en tant que quatrième paramètre :

Delphi :

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

C++ :

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

Pour placer votre élément de menu dans l'élément de menu existant indiqué en tant qu'élément de menu enfant, transmettez True en tant que cinquième paramètre (la valeur du quatrième paramètre est alors ignorée) :

Delphi :

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

C++ :

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

Voir aussi