¿Has probado TMainMenu o TPopUpMenu?
Saludos.
Me parece que drooper lo que busca es justamente recrear un menú vertical. Porque el componente que menciona imita justamente el diseño del menú emergente del estilo de XP que aparece al costado izquierdo.
Y en la imagen que adjuntó se ve una especie de menú resaltado con los bordes.
Dropper, una posible alternativa (aunque requiere de un poco de trabajo) es disponer de tantos TButton como necesites, uno abajo del otro, aprovechando el uso de Aling y los Frames. Como te enseñé en otro momento.
Luego es cosa de jugar con los eventos OnMouseMove, OnMouseLeave, OnMouseUp, OnMouseDown, etc y cambiar el color, la fuente, o darle algún toque visual como para resaltar cuando el mouse pasa por encima de éstos, se hace clic, etc. No necesitas implementar el mismo código como respuesta a los eventos por cada uno. Simplemente puedes crear tu propia respuesta para evento de interés y luego asignarles éste a cada botón.
Cuando sos relativamente pocos basta algo como por ejemplo:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button1MouseLeave(Sender: TObject);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Se hizo clic en ' + (Sender as TButton).Name);
end;
procedure TForm1.Button1MouseLeave(Sender: TObject);
begin
(Sender as TButton).Color:= clDefault;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
(Sender as TButton).Color := clSkyBlue;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.OnMouseLeave:= Button1.OnMouseLeave;
Button2.OnMouseMove:= Button1.OnMouseMove;
Button2.OnClick:= Button1.OnClick;
Button3.OnMouseLeave:= Button1.OnMouseLeave;
Button3.OnMouseMove:= Button1.OnMouseMove;
Button3.OnClick:= Button1.OnClick;
end;
end.
En esa muestra simplemente implementé el evento OnMouseClick, OnMouseLeave y OnMouseMove en Button1 y por código al crearse el form le asigné estas mismas implementaciones para Button2 y Button3. El form es muy básico, en tiempo de diseño dispuse 3 botones con su propiedad Aling en alTop.
Prueba el código, observa como cambian de colores según como el mouse pasa por encima de ellos. Haz clic en cualquiera. Notarás que si bien la implementación es única es posible identificar a cada uno.
Esto se puede llevar al siguiente nivel obviamente, y crear botones de forma dinámica, tener una implementación ya definida para ciertos eventos y asignar en tiempo de ejecución.
A lo que voy es que hay opciones, con un poco de maña se puede llegar a resultados notables.
Mi mayor consejo, leyendo un repaso por los hilos en donde hemos intervenido, es que en cuestiones de interfaz no vale la pena destinar mucho esfuerzo. Es más importante que lo de adentro funcione. Un programa podrá tener muchas lucecitas, pero si tiene defectos y errores internos, de nada sirve. Controla la lógica, luego ya piensa en la intefaz y en cómo ésta se comunica con la lógica y presenta los resultados, etc. Si seguimos el Principio de Pareto: destinar 80% del esfuerzo en la Lógica, 20% en la Intefaz.
Saludos,