PDA

Ver la Versión Completa : Como hacer que las ventanas hijas MDI al abrirlas creen Boton en Toolbar


juniorSoft
12-04-2015, 15:03:34
Hola Amigos,

Estoy tratando de hacer lo Siguiente:

Creado una aplicacion MDI deseo que al abrir el formulario hijo se cree un boton en una toolbar que muestra las ventanas abiertas en vez de usar el tradicional Menú Windows donde se van colocando las ventanas que se van abriendo.

La idea es que si existe la posibilidad asociar a una toolbar que está en el formulario MDI Padre que lo haga al igual que con el menú windows de manera automatica sin tener que añadir código cada vez que cree una ventana en vez de crear una opción en el menú windows me cree el boton en la toolbar y que al cerrar el formulario este boton se destruya.

La opción de fuerza bruta es que cada vez que creo el formulario debo ocuparme de crear el boton en la toolbar y asociarlo con la accion que abre el formulario y cuando cierro el formulario debo destruir el boton, pero creo que debe existir una manera más elegante de hacerlo ya que con el menu windows no hay que ocuparse de eso.

Saludos,

dec
12-04-2015, 16:36:45
Hola,

Me temo que no voy a poder ayudar mucho, sólo comentar que el proyecto Toolbar 2000 de Jordan Russel (http://www.jrsoftware.org/tb2k.php) incluye un componente específico para trabajar con ventanas MDI de modo que estas se muestren en las barras de herramientas. Ignoro hasta qué punto podrás aprovechar dichos componentes, pero, puesto que su código fuente está disponible, tal vez quisieras echar un vistazo a ver si puedes sacar algo en claro.

juniorSoft
12-04-2015, 17:24:44
Gracias Dec Por Responder, voy a ver el link a ver que puedo hacer.

ecfisa
12-04-2015, 20:36:33
Hola JuniorSoft.

La idea que te propongo es agrupar la creación del MDIChild y del ToolButton correspondiente como hago en este ejemplo simplificado, que usa un TToolBar un TPanel (alBottom) y dentro de él tres TButton.

type
TfrmMain = class(TForm)
...
private
FChildTags: Integer;
procedure OpenMDIChild(AClass: TFormClass; const btnCaption: string; aAction: TAction );
public
property ChildTag: Integer read FChildTags;
procedure DeleteToolButton(const TagButton: Integer);
end;
...
implementation
uses Unit2, Unit3, Unit4; // MDIChilds

procedure TfrmMain.FormCreate(Sender: TObject);
begin
FChildTags := 1; // p
end;


// Crear-Mostrar MDIChilds
procedure TfrmMain.OpenMDIChild(AClass: TFormClass; const btnCaption: string; aAction: TAction);
var
i, inx: Integer;
nb: TToolButton;
begin
for i:= MDIChildCount-1 downto 0 do
if MDIChildren[i] is AClass then
begin
if MDIChildren[i].WindowState = wsMinimized then
MDIChildren[i].WindowState:= wsNormal;
MDIChildren[i].BringToFront;
Exit;
end;

with AClass.Create(Self) do
begin
Tag := FChildTags;
nb := TToolButton.Create(ToolBar1);
nb.Height := ImageList1.Height;
nb.Width := ImageList1.Width;
nb.Caption := btnCaption;
inx := ToolBar1.ButtonCount - 1;
if inx > -1 then
nb.Left := ToolBar1.Buttons[inx].Left + ToolBar1.Buttons[inx].Width
else
nb.Left := 0;
nb.Action := aAction;
nb.Parent := ToolBar1;
nb.Tag := ChildTag;
//...
Inc(FChildTags);
end;
end;

// Eliminar ToolButton
procedure TfrmMain.DeleteToolButton(const TagButton: Integer);
var
i: Integer;
begin
for i:= ToolBar1.ButtonCount-1 downto 0 do
if ToolBar1.Buttons[i].Tag = TagButton then
ToolBar1.Buttons[i].Free;
end;

// Llamada crear-mostrar MDIChilds
procedure TfrmMain.btnChild1Click(Sender: TObject);
begin
OpenMDIChild(TChild1, 'Child1', TAction(ActionList1.Actions[0]));
end;

procedure TfrmMain.btnChild2Click(Sender: TObject);
begin
OpenMDIChild(TChild2, 'Child2', TAction(ActionList1.Actions[1]));
end;

procedure TfrmMain.btnChild3Click(Sender: TObject);
begin
OpenMDIChild(TChild3, 'Child3', TAction(ActionList1.Actions[2]));
end;

// Acciones de ejemplo
procedure TfrmMain.Action1Execute(Sender: TObject);
begin
ShowMessage(TToolButton(Sender).Name);
end;

procedure TfrmMain.Action2Execute(Sender: TObject);
begin
ShowMessage(TToolButton(Sender).Name);
end;

procedure TfrmMain.Action3Execute(Sender: TObject);
begin
ShowMessage(TToolButton(Sender).Name);
end;
...


Salida:
http://s10.postimg.org/f6xje5o6x/junior.png

Como verás es sólo un ejemplo orientativo, si nos explicas mas detalladamente la situación, tal vez lo podamos ajustar.

Saludos :)

Pd: Te ajunto los archivos fuentes de la prueba.

juniorSoft
13-04-2015, 02:38:58
Excelente ecfisa, (http://clubdelphi.com/foros/member.php?u=7718)es lo que deseo hacer, así se simplifica la creacion de los formularios a una sola instruccion agrupada en un metodo y no se olvida tener que agregarle código fuera de la instruccion para crear los botones.

Gracias por la ayuda, Exito a esta comunidad.:)