Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Toolbars Y MDIForms (https://www.clubdelphi.com/foros/showthread.php?t=35959)

jorllazo 27-09-2006 12:16:32

Toolbars Y MDIForms
 
Hola Amigos..
Tengo una duda y a pesar de haber pasado un buen rato buscando en los foros, no encuentro la respuesta, he visto algo parecido pero...

En una aplicacion MDI, el formulario principal tiene una Toolbar, pero como se puede hacer para que esta toolbar responda a ciertos eventos dependiendo del MDIChild que se encuentre activo en ese momento ?

POr ejemplo, si al presionar sobre el boton añadir esta el form de clientes activo, pues que me añada un cliente.

Lo unico que se me ha ocurrido, es poner un actionList en cada uno de los hijos y en el Evento onActivate de Estos, sustituir la Propiedad Action de cada toolbar button del formulario padre por la correspondinente del hijo, pero no se si esto es lo mejor o lo mas efectivo o hay (que seguro que lo hay) otra manera mas sencilla de hacerlo.

Gracias de nuevo.

roman 27-09-2006 16:02:38

Yo veo bien la opción que mencionas, incluso la veo elegante ;) Otra forma, no necesariamente mejor, sería que derivaras tus formularios hijos de un formulario base común:

Código Delphi [-]
type
  TBaseChildForm = class(TForm)
  public
    procedure Add; virtual; abstract;
  end;

en el que declaras los métodos (acciones) que vayas a usar. Cada formulario descendiente, define tales métodos como convenga. De esta manera, el formulario padre, simplemente llama al método Add del formulario activo:

Código Delphi [-]
TBaseChild(ActiveMDIChild).Add;

// Saludos

jorllazo 27-09-2006 18:21:58

Pues casi que esto incluso ahorra alguna linea de codigo, me refiero al hecho de tener que unir los botones con su respectiva accion...

Voy a sopesar....y ver incluso...despues que codigo sera menos tedioso de mantener, a la hora de ampliar botones y acciones ....a ver posibilidades...

Gracias...

jorllazo 28-09-2006 12:30:25

Hola
Al final, me decidi por las Acciones y sustituir en el mainForm las acciones de los botones, me ha resultado este codigo:

Código Delphi [-]
procedure TGlobals.setRecordToolbarActions(aList: TActionList);
  var
    tb : TToolButton;
    begin
      tb := Application.MainForm.FindComponent('tbFirst') as TToolButton;
      tb.Action := aList.Actions[0] ;
      tb.ImageIndex := 0;
      tb := Application.MainForm.FindComponent('tbPrev') as TToolButton;
      tb.Action := aList.Actions[1];
      tb.ImageIndex := 1;
      tb := Application.MainForm.FindComponent('tbNext') as TToolButton;
      tb.Action := aList.Actions[2];
      tb.ImageIndex := 2;
      tb := Application.MainForm.FindComponent('tbLast') as TToolButton;
      tb.Action := aList.Actions[3];
      tb.ImageIndex := 3;
      tb := Application.MainForm.FindComponent('tbAdd') as TToolButton;
      tb.Action := aList.Actions[4];
      tb.ImageIndex := 4;
      .
      .
      .
      tb := Application.MainForm.FindComponent('tbFind') as TToolButton;
      tb.Action := aList.Actions[8];
      tb.ImageIndex := 8;
    end;

Se os ocurre otro modo mas eficiente?
he probado a usar FindChildControl. pero no me funciona ni a la de mil estoy con la version 2006 y lei en un post de Roman que no funcionaba igua a partir de la version 7.

Gracias.

roman 28-09-2006 14:35:06

¿Para qué usas FindComponent en lugar de acceder directamente a los ToolButtons? Cada FindComponent hace un ciclo sobre todos los componentes del formulario para buscar uno que coincida con el nombre que se pasa, de manera que recorres tdos los componentes tantas veces como botones tengas.

// Saludos

jorllazo 28-09-2006 16:06:49

he usado esto por que no podia acceder al formulario padre como tal,
cuando intentaba poer el nombre de la Unit en la clausula Uses, me daba un error de compilacion "Circular Data links not Allowed", con lo que he probado de muchas maneras y esta es la unica que me ha funcionado.
Por que de que otro modo podria ser? desde el MDIChild como te comento, no he podido (sabido) acceder a los controles del Padre directamente, o quiza bien accediendo al Indice Directamente?

maeyanes 28-09-2006 16:20:33

Y yo me pregunto, por que no pruebas la solución que te dio Román unos mensajes arriba?

Creas una forma base con métodos públicos virtuales o abstractos con el nombre de las acciones que quieras que ejecuten las formas MDIChild.

Luego en las formas heredadas, redefines estos métodos para tener la funcionalidad de la forma en cuestion y desde tu forma principal solo haces la llamada:

Código Delphi [-]
// Ejemplo de un TAction con nombre Add, ejecutando el método Add de la forma MDIChild activa:
procedure TForm1.AddExecute(Sender: TObject);
begin
  TFormaBase(ActiveMDIChild).Add
end;

Al hacerlo así, no te preocupas de como acceder a los controles de la forma principal desde las formas hijas, solo en implementar los métodos con las acciones que quieras que ejecuten estas...



Saludos...

jorllazo 28-09-2006 16:38:59

Pruebo a ver... pero no os parece mas tedioso de mantener?

jorllazo 29-09-2006 06:44:22

Hola Amigos.
Una vez mas me rindo ante la evidencia, he probado la solucion que ofrecia Roman y no solo funciona a la perfeccion si no que es perfectamente mantenible adaptable y ampliable. Igual me obceque demasiado en mi idea

Muchas gracias de nuevo por ayudarme, espero poder devolveros eso con creces.


La franja horaria es GMT +2. Ahora son las 21:18:52.

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