Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Controlar cuando se ha pulsado un botón en otra unidad (propiedades) (https://www.clubdelphi.com/foros/showthread.php?t=50404)

David 16-11-2007 18:03:45

Controlar cuando se ha pulsado un botón en otra unidad (propiedades)
 
Hola

Tengo un DataModule con una función que me crea un formulario Modal , luego
en ese formulario cuando puso el botón aceptar tiene que realizar una función del datamodule, esto lo estaba haciendo con ModalResult = mrOk, pero esta forma ya no vale pues me desaparece la ventana, y queria algo parecido pero que la ventana no desapareciera.

Pongo como estaba antes más o menos.

Código Delphi [-]

// En el DataModule

procedure TDataModule.EjemploA;
begin
  Form1 := TForm1.Create(self);
  with Form1 do
  begin
     // Algunas cosas
    ShowModal;
    if ModalResult = mrOk then // si pulsa el botón correspondiente

       ProcedureEjemploB;
  end;

end;

procedure TDataModule.ProcedureEjemploB;
begin
  // código para mostrar un informe
end;

el caso es que quiero cambier el ModalResult = mrOk por otra cosa, quizás una propiedad o algo que me diga lo mismo, pero de tal manera que la ventana no desaparezca y se quede ahí, de tal manera que pueda pulsar al botón una y otra vez para sacar informes según criterio del usuario.

Si la mejor forma de hacerlo es con propiedades, como no las he usado, me gustaria saber de que forma lo tengo que hacer, si hay otra forma mejor, pues con hacer esa también esta bien.

Saludos

jhonny 16-11-2007 18:13:45

Suponiendo que el procedimiento ProcedureEjemploB; esta en una unidad distinta a la del datamodulo y a la del form modal podrias llamar el ProcedureEjemploB; desde el form modal y listo, quedando el datamododule asi:
Código Delphi [-]
procedure TDataModule.EjemploA;
begin
  Form1 := TForm1.Create(self);
  with Form1 do
  begin
     // Algunas cosas
    ShowModal;
    Release;
  end;
end;

Y en el OnClik del boton que Aceptar que esta en el Form modal asi:

Código Delphi [-]
  ProcedureEjemploB;

Eso si, dicho boton ya no debe tener el ModalResult := mrOk para que no se cierre, pero a cambio de eso tendras que idear un mecanismo para que el usuario cierre el formulario cuando no lo necesite mas (Podria ser un nuevo boton para cerrar) ;).

David 16-11-2007 18:22:39

El procedimiento B, esta en el mismo DataModule que el procedimientoA.

Y no se debe de llamar directamente desde el botón, por que igual hay que pasarle unos parametros del formulario o igual no hay que pasarselos.

Es decir :

En el botón del formulario no se debe de poner : ModuloDatos.ProcedureEjemploB;

sino que

Código Delphi [-]

procedure TDataModule.EjemploA;
begin
 //Código
 if ModalResult = mrOk then
 miArray[0] := edit1.Text;
 miArray[1] := edit2.Text;

 procedureEjemploB(MiArray:Variant);
//etc,etc.....

end

procedure TDataModule.EjemploB(MiArray:Variant);
begin
 // mostrar informe
end;

Así es más o menos el código, lo que pasa es que con el ModalResult desaparece y no es lo que quiero. Igual alguno podría pensar, pues que ponga lo de MiArray[0] := edit1.Text , en el B , pero No puede ser, por que igual se puede llamar al B, desde el formulario o desde fuera directamente, pasandole el array directo.

Saludos

David 16-11-2007 22:56:18

¿Nadie sabe la respuesta ?:confused:

jhonny 16-11-2007 22:58:37

Cita:

Empezado por David (Mensaje 246742)
¿Nadie sabe la respuesta ?:confused:

Sinceramente me haz enredado con la segunda intervención, si tal vez la explicaras un poco mejor podria colaborarte.

Chris 16-11-2007 23:55:21

Simplemente quitale la propiedad ModalResult al botón, con esto devería de resolverse tu problema.

PD: ponlo a mrNone.

David 17-11-2007 00:27:46

1 Archivos Adjunto(s)
pero si el botón no tiene la propiedad modalresult puesta.

Si ese no es el tema, el tema es que hago un ShowModal en el Datamodule, después espero a que pulse el botón y entonces tiene que hacer un código después del ShowModal y es llamar al otro procedure.

Código Delphi [-]
// Código del Datamodule

Form1 := TForm1.Create(Self);
With Form 1 do
begin
// código
ShowModal;

if (pulsa el botón) then

procedure B;
end;

El tema es que ahora donde pone (pulsa el botón) , tengo puesto if ModalResult = mrOk then

Y en el botón del formulario , hace comprobaciones , y si todo va bien , en código hago un ModalResult = mrOk.

Pero si no hago el ModalResult = mrOK dentro del código del botón, no ejecuta el procedure B.

Bueno lo que he hecho finalmente es hacer un pequeño ejemplo, en Delphi 6 , algo sencillo, esquematico, para explicarme mejor, voy a subir el código, lo añado. Lo llamo EjemploSimple.

A ver si alguien puede mirarlo.

Saludos

Chris 17-11-2007 00:39:51

Comenta la línea
ModalResult := mrOk;
y veras que ya no se te cierra el form.

Mejor utiliza otro metodo, emplea una variable, como por ejemplo
Aceptado : Boolean; .... if aceptado then ....

Estos son problemas, pequeños que se resuelven de una manera muy fácil. Si la montaña no va a Mahoma, Mahoma va a la montaña, es algo simple.

Saludos.

Chris 17-11-2007 00:47:52

Problema resuleto.
 
1 Archivos Adjunto(s)
Mira, aca te devuelvo tu ejemplo, con el inconveniente resuelto.

Saludos

Al González 17-11-2007 21:08:45

David:

Considera que una llamada al método ShowModal espera hasta que la forma se cierra.

Sinceramente no veo cuál sea el problema de que la forma se cierre y el proceso continúe. La forma puede quedar invisible (sin destruirse) para que las sentencias siguientes accedan sin problemas a los datos que se capturaron en ella. Y cuando ya no la necesites le haces un Form1.Free;.

Claro, lo ideal es que existiera una segunda versión de ShowModal que se pudiera llamar así:

Código Delphi [-]
Var
  V :Variant;
Begin
  If Form1.ShowModal (V) = mrOK Then

Siendo V un parámetro por variable para traerse valores de resultado. Esto me ha dado una idea de biblioteca...:cool:

Otra solución sería colocar en alguna variable o campo del módulo de datos, los valores capturados en la ventana de diálogo. Haciendo eso en el evento OnClick del botón de cierre.

No dejes de comentarnos.

Al González. :)


La franja horaria es GMT +2. Ahora son las 16:09:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi