Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como hacer que las ventanas hijas MDI al abrirlas creen Boton en Toolbar (https://www.clubdelphi.com/foros/showthread.php?t=88097)

juniorSoft 12-04-2015 15:03:34

Como hacer que las ventanas hijas MDI al abrirlas creen Boton en Toolbar
 
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 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

1 Archivos Adjunto(s)
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.
Código Delphi [-]
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:


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, 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.:)


La franja horaria es GMT +2. Ahora son las 04:31:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi