Ver Mensaje Individual
  #10  
Antiguo 23-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Creo que estas intentanto programar sin haber diseñado antes la lógica y ahí está el problema, no es un reproche, suele pasar, pero en esos momentos debemos abstraernos de los pequeños problemas pensar globalmente.

La VCL suele mantener un identificador de la ventana que ha de enviar datos, por ejemplo:
Código Delphi [-]
Ventana de clientes:

TCliente = class(TForm);

private
   Reservas : TReservas;
...
Ahora si, cada ventana Clientes tendrá su propia referencia a la ventana Reservas que creará, de forma que puede enviarle datos y cualquier cosa que se le antoje.

Si Una ventana de Clientes, puede tener abiertas varias ventanas de reserva al mismo tiempo, en lugar de usar una variable, usarías un array de TReservas o un TObjectList.

El tema de propiedades es un problema totalmente distinto a lo que hablamos, pero simplifica muchisimas cosas, por ejemplo:
Código Delphi [-]
TReservas = Class(TForm)

private
   FLlamador :TForm;
   procedure SetLlamador (Value:TForm);

public
   property LLamador:TForm read FLlamador write SetLlamador;
end;

procedure TReservas.SetLlamador(Value:TForm);
begin
  if FLlamador <> Value then
  begin
    FLLamador := Value;
    If Fllamador is TForm2 then
       Self.Caption := 'Tform2 me ha llamado'
    else if Fllamador is TForm3 then
       Self.Caption:= 'TForm3 me ha llamado';
  end;
end;
Ahora desde la ventana de Clientes, creamos un TREservas:
Código Delphi [-]
   FReservas := TReservas.Create(Self);
   FReservas.LLamador := Self;
Cuando se ejecuta la última línea, estamos escribiendo (write) en la propiedad LLamador, por tanto, se ejecuta el procedimiento TReservas.SetLLamador que actualiza la variable privada FLLamador y cambia el Caption de la ventana Reservas.

Otro ejemplo del mismo estilo: Tu famoso IBDatsetCAmpo.Value, no te compliques tanto la vida y hazlo así:
Código Delphi [-]
TForm1 = Class(TForm);
private
  function GetValorCAmpo:Variant;
  procedure SetValorCampo(Value:Variant);

public
  property VAlorCampo: Variant read GetValorCampo write SetVAlorCampo;
end;

function TForm1.GetVAlorCampo:Variant;
begin
  if ibdataset1.Active then
     Result := ibdataset1CAmpo.Value;
  else
     Result := unassigned;
end;

procedure TForm1.SetValorCAmpo(Value :Variant);
begin
   if (ibdataset1.Active) and (Value <> unassigned) then
     ibdataset1.Locate('codigo', Value,[]);
  end;
end;
Cuando hagas un " Aux := TForm1.ValorCAmpo" estas leyendo (read) de la propiedad ValorCampo, por tanto se ejecuta la funcion GetValorCampo que devuelve el ibdataset1Campo.Value, y en Aux, tendrás ese valor.

Como ves también controla errores, ya que si no está abierto el IbDataset1, devuelve el valor especial "unassigned" de todo Variant, que indica que no hay valor asignado.

Lo mismo harías en Form3, crear una propiedad llamada ValorCampo, CodigoCliente o como quieras llamarla y el proceso se simplifica y queda más claro:
Código Delphi [-]
  Self.CodigoCliente:= TForm1(Aowner).CodigoCliente;
    Form3 := TForm3.Create(self);
  Form3.CodigoCliente := Self.CodigoCliente;

Todo este rollo permite que al tener una ventana de Cliente y te muevas de cliente, si hay una ventana de reservas abierta al mismo tiempo, se sincronicen los datos automáticamente de las 2 ventanas (esto no lo habías pensado hasta ahora ).

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 23-02-2007 a las 13:51:43.
Responder Con Cita