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