PDA

Ver la Versión Completa : dudas con eventos y variables


ercrizeporta
03-05-2007, 12:18:24
hola!!tengo el siguiente problema, estoy realizando una aplicacion MDI, cuanod desde la ventana padre llamo a la ventana hijo, justo depues de crear al hijo le modifico los valores de unas variables globales que necesito en el hijo.

childwindow:=TFormSelCantPedCli.create(application);
childwindow.numaux:=numaux; //variable globar hijo
childwindow.caption:=caption+ ' - Seleccionar Cantidad';
childwindow.numped:=queryPedidos['num']; //variable global hijo
childwindow.numlin:=tblinped['numlin']; //variable globar hijo


El problema surge cuando tengo que hacer uso de estas variables en el evento 'onactivate' de la ventana hijo, ya que la primera vez que se activa no tienen valor ya que se activa la ventana y posteriormente le da el valor el padre a las variables. Para que funcione bien tengo que salirme de la ventana y volver a entrar , para que haga el evento onactivate con los nuevos valores. Sabe alguien alguna forma de solucionar esto?????

muchas gracias!!

Lepe
03-05-2007, 13:21:20
Siguiendo la POO:

Tu ventana hija debería ser así (centrate en GetCaption, SetCaption y Mostrar, cuando funcione, añade más propiedades):

type Tformahija = class(Tform)

private
FCaption: string; // el caption de la ventana que siempre es fijo.
FnumAux : integer;
procedure SetnumAux(Value:integer);

function GetCaption:string;
procedure SetCaption(Value:string);
public

property numAux:integer read FnumAux write SetnumAux;
property Mostrar:string read GetCaption write SetCaption;
end;

implementation

procedure Tformahija.formahijaCreate(...); // evento de crear la ventana
begin
FnumAux := 0 ; // por defecto este valor.
FCaption := 'Ventana de productos';
end;

procedure Tformahija.SetNumAux(value:integer);
begin
// value es el valor que se quiere asignar a numAux.
// FnumAux es el valor que tiene actualmente la propiedad numAux.
if FnumAux <> Value then
begin
FnumAux := VAlue;
// hacer otras cosas cuando se asigne esta propiedad.
end;
end;

// aquí estaba el error, Value era de tipo integer, cuando en realidad es un string.
procedure Tformahija.SetCaption(value:string);
begin
Caption := Fcaption + ' - ' + Value;
end;

function TFormahija.GetCaption:string;
var idx:integer;
begin
// devolver solo la cadena ' - Seleccionar cantidad'
idx := length(Fcaption);
Result := Copy(Fcaption, idx+3, 255);
end;

Ahora, cuando hagas esta asignación:

childwindow.Mostrar := 'Seleccionar Cantidad';

automáticamente se ejecuta el procedimiento Set (SetCaption) que modifica el caption de la ventana inmediatamente.

Cuando hagas una lectura de la propiedad:

mistring := formahija.Mostrar

Se ejecuta la función Get (GetCaption), que devolverá solo la parte derecha del caption.

Saludos

ercrizeporta
03-05-2007, 14:37:27
muchas gracias, ahora probaré a ver que tal va con esa solución. La solución que se me había ocurrido a mi era hacer que justo despues de pasarle los valores a las variables obligo a que ocurra el evento onactivate. pero veo la tuya es mas 'bonita'.

gracias!!

Lepe
03-05-2007, 18:17:50
Hombre, muchas gracias por el alago, pero reconozco que la solución ni es "mía" ni es "bonita", es la forma en que delphi está hecho, mira por ejemplo el código fuente de un label y verás a lo que me refiero.

PD: acabo de ver que SetCaption está mal declarada (porque pasa un integer en lugar de un string), he editado mi mensaje para corregir el error.

Saludos