PDA

Ver la Versión Completa : Consulta sobre Formularios


Gustavo Gowdak
09-12-2004, 18:51:01
Hola tengo una consulta, es que quiero saber si puedo invocar un procedimiento de un formulario X a un formulario B, con solo escriber guardar().
Bueno les cuento, tengo un formulario pedidos y para obtener los datos de mis cliente invoco la ventana clientes, lo que yo quiero hacer es un doble click en codigo cliente y me ejecute un procedimiento guardar() en la ventana pedidos, el problema es que varias ventanas invocan a la ventana cliente y todas pueden realizar el mismo procedimiento y no siempre con la misma linea de codigo.
Me entiendes.... Desde ya gracias.....

roman
09-12-2004, 19:26:32
Nececitas incluir la unidad del formulario pedidos en la del formulario clientes y ejecutar:

Pedidos.Guardar();

Ahora, por lo que escribes me parece que varias ventanas tienen un método guardar() que no necesariamente es el mismo y de ahí que quieras omitir la referencia a pedidos.

Pero tal omisión sólo es visual ya que el compilador necesita saber a cuál método de qué ventana llamar. Si simplemente ve

guardar();

pues no sabrá dónde está ese método.

Una opción sería que todas las ventanas que tienen un método guardar tengan un ancestro común (digamos con herencia visual) que tenga un método virtual guardar que redefines según convenga en cada descendiente.

A la ventana de clientes tienes entonces que pasarle una referencia al formulario que la invoca, digamos:


procedure TClientes.Mostrar(Invocador: TVentanaComun);


donde TVentanaComun es la clase ancestra comun que define el método guardar().

Así, si TPedidos desciende de TVentanaComun entonces puede llamar a la ventana de clientes así:

Clientes.Mostrar(Self);

y la ventana de clientes usaría

Invocador.guardar()

Bueno, pero todo esto es muy complicado e innecesario.

La ventana clientes, al menos para los efectos que describes, tiene como tarea proporcionar el código de un cliente a quien sea que la llame, de forma similar (pongo énfasis en la analogía) a como un diálogo OpenFileDialog proveee un nombre de archivo. Un cuadro de diálogo puede ser usado en infinidad de contextos y el cuadro en sí no tiene ni la menor idea acerca de ningún contexto en específico; simplemente proporciona una interfaz para seleccionar un archivo y devuleve éste a quien lo haya llamado.

De la misma forma, la ventana de clientes no tiene porque tener idea de quién ni en qué circunstancias la llama, simplemente proporciona la interfaz para seleccionar un cliente y devuelve el código del cliente.

En resumen yo te sugiero que cambies la forma de enfocar el problema.

Pon una propiedad pública en la ventana de clientes que sea el código:


type
TClientes = class(TForm)
private
function GetCodigoCliente: Integer;

public
property CodigoCliente: Integer read GetCodigoCliente;
end;


La función GetCodigoCliente se encarga de devolver el valor adecuado (por ejemplo tomándolo directamente de la base de datos).

De esta forma, la ventana de pedidos haría algo como:


var
CodigoCliente: Integer;

begin
if Clientes.ShowModal = ID_OK then
begin
CodigoCliente := Clientes.CodigoCliente;
Guardar(CodigoCliente);
end;
end;


Y lo mismo haría cualquier otra ventana que requiera un código de cliente. La ventana de clientes no tiene entonces que lidiar con cada posible uso del código y es quien la usa el que hace cualquier cosa que requiera con dicho código.

// Saludos

Gustavo Gowdak
09-12-2004, 19:40:44
El tema es que no solo el codigo en el datos a mandar, en otros ventanas envia mas datos del cliente, me puedes mandar un ejemplo mas explicito por favor si no es mucha molestia??