PDA

Ver la Versión Completa : Toolbars Y MDIForms


jorllazo
27-09-2006, 12:16:32
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:


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:


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:


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:


// 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.