Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mensaje antes de salir (https://www.clubdelphi.com/foros/showthread.php?t=44366)

jorgegetafe 05-06-2007 00:03:00

Mensaje antes de salir
 
Leí hace tiempo que habia una función para mostrar un mensaje antes de cerrar la aplicación.

Me explico mejor con un ejemplo: Cuando estamos por ejemplo con el block de notas y damos a salir, nos sale un mensaje que dice "¿Desea usted guardar los cambios antes de salir?" pues bien, eso es lo que quiero hacer yo, que se muestre ese mensaje con los botoncitos respectivos de aceptar y cancelar. Lo tengo que hacer creando una form nueva a mano, o hay algo que te lo de.

gracias y un saludo.

Delphius 05-06-2007 00:09:36

En el evento OnCloseQuery se suministra un parámetro booleano (CanClose). Este parámetro determina si el formulario debe o no cerrarse.

Investiga un poco sobre este evento. Busca en los foros por onCloseQuery y obtendras buenos resultados.

tu deberás hacer algo como:

Código Delphi [-]
if Respuesta_usuario = OK
   then CanClose := TRUE
   else CanClose := FALSE

No tengo Delphi a mano.
Saludos,

jorgegetafe 05-06-2007 00:11:01

Vale buscare, gracias.

Caral 05-06-2007 00:23:47

Hola
Para salir del programa en el evento onclose:
Código Delphi [-]
if MessageDlg('¿Está seguro que desea salir del Programa?', mtConfirmation,
       [mbYes, mbNo], 0) = mrYes then
       Action := caFree
     else
       Action := caNone;
Para validar o guardar etc:
Código Delphi [-]
If MessageDlg('¿Desea guardar los cambios',mtConfirmation,[mbYes,mbNo],0) = mrYes 
then
// lo que sea
else
// lo contrario
Bueno me imagino que es asi.
Saludos

sinalocarlos 05-06-2007 00:47:21

Caundo usas formas heredadas es facil utilizar en la forma base:

Código Delphi [-]
procedure formabase_frm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
i,opcionelegida:integer;
begin
  inherited;
  i:=0;
  opcionelegida:=-1;
  while (i<=ComponentCount - 1) do
  begin
    if (Components[i] is Tdatasource) then
    begin

        if TdataSource(Components[i]).State in [dsedit, dsinsert] then
        begin

           if opcionelegida = -1 then
              opcionelegida:=Application.MessageBox('Existen Datos sin guardar, Desea Grabar los Cambios',
                              'Guardar', MB_YESNOCANCEL + MB_ICONINFORMATION );
           if opcionelegida <> -1 then
           begin
              case opcionelegida of
                  ID_NO:begin
                          TdataSource(Components[i]).DataSet.Cancel;
                  end;//ID_NO
                  ID_YES:begin
                          TdataSource(Components[i]).DataSet.Post;
                  end;//IS_YES
                  ID_CANCEL: begin
                          CanClose := False;

                  end;
              end;//case
           end;//if opcionelegida<>-1 then
        end;//if Tdatasorce
    end;//if components [i]
    inc(i);
 end;//while
end;//proc


Con lo cual Validas todos los datasources de tu forma, que porque datasource y no dataset, es por los que usamos los datasets en un modulo

Espero te sirva de algo

jorgegetafe 05-06-2007 00:52:07

Gracias, despues de ponerlo ha quedado muy chulo jejeje

jorgegetafe 05-06-2007 02:16:05

Como podría poner el mismo mensaje pero con aparte de 'si' y 'no' poniendo la opcion de 'cancelar'?

Delphius 05-06-2007 05:37:28

Para hacer que la combinación sea SI,NO,CANCELAR existe la constante MB_YESNOCANCEL.

Fijate en el ejemplo que te expongo:

Código Delphi [-]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Res: integer;
begin
 Res := MessageBox(0, '¿Desea guardar los cambios antes de salir?', 'Advertencia', MB_ICONINFORMATION or MB_YESNOCANCEL);
 case Res of
 IDYES: begin
         CanClose := True;
         ShowMessage('Se ha presionado SI');
        end;
 IDNO: begin
         CanClose := False;
         ShowMessage('Se ha presionado NO');
       end;
 IDCANCEL: begin
              CanClose := False;
              ShowMessage('Se ha presionado CANCEL');
           end;
  end;
end;
Como notarás, no sólo establezco que dicha constante sino que además, le indico que en la apariencia de cuadro de díalogo aparezca un globo de información.

Te sugiero que veas ayuda sobre el MessageBox() para que conozcas cada constante de parámetro y de salida. Como asi para entender mejor el funcionamiento de MessageBox().

Saludos,

Caral 05-06-2007 06:04:09

Hola
Para que ya no tengas que estar pensando en los mensajes.
El programa (Constructor.zip) que esta aqui: http://www.terawiki.clubdelphi.com/D.../Herramientas/
Te ayudara a hacer los mensajes como los quieres, es simplisimo de usar y no se tiene que instalar ni nada, solo le das click y ya.
Una vez hecho el mensaje, copias el codigo (que genera el programa) y lo pegas en delphi, mas simple nada.
Saludos

Delphius 05-06-2007 06:21:25

Y como alternativa, puedes emplear Message Dialog de la GExperts. Sitúa el cursor donde quieres poner el código de tu mensaje. Te vas a Message Dialog, le indicas el texto, las contantes.. OK y ¡Listo! ya tienes tu messagebox().

Saludos,

Caral 05-06-2007 06:26:46

Hola
Esto lo unico que demuestra es que somos unos perezosos para hacer los mensajes a mano y nos buscamos alternativas, a que no.:D
Saludos

jorgegetafe 05-06-2007 10:33:36

:D Gracias una vez mas (esta debe de ser la numero 1000) jajaja
De eso se trata, pensar más para hacer menos. :D

jorgegetafe 05-06-2007 10:45:07

Vale ya le he pillado el truco a esto, no es tan dificil, pero una cosilla más, esto se puede hacer para que no cierren el programa de golpe? (evitar que presionen la x de cerrar el programa).

Delphius 05-06-2007 17:10:18

El evento onCloseQuery está precisamente para evitar cerrar un formulario.
Cuando tu presionas en la X se dispara primero el evento onCloseQuery, si tiene asignado algún código en este evento se ejecutará. De otro modo se procede con onClose.

Es decir el orden es:

1). "Preguntar si tiene asignado onCloseQuery": que hacer al momento de recibir la orden de cierre.
2). "Preguntar si tiene asignado onClose": que hacer al momento del cierre.

Ahora, si lo que tu quieres es deshabilitar la X hay varias maneras de hacerlo. Una manera es seteando la propiedad BorderIncons en vacio.
Hay otros trucos para conseguirlo (que en este momento no recuerdo), pero en lo personal no prefiero ocultar dicho botón.

Saludos,

jorgegetafe 05-06-2007 17:31:39

Lo único que quiero es que cuando se presione la X, salga el típico mensaje de ¿Quiere usted guardar antes de salir? y no que directamente se cierre el programa perdiendo todo...

Lo del mensaje se hacerlo, pero no se como utilizar el onCloseQuery.

Delphius 05-06-2007 17:47:54

El código que te expuse son un ejemplo de como se usa en OnCloseQuery.

Lo que tu necesitas hacer es una combinación del onCloseQuery y OnClose.
Si lo que deseas es que el formulario se cierre independientemente si debe o no guardar los cambios deberás hacerlo empleando una variable pública o global que te permita decidir si debe guardar o no. CanClose Deberá ser True.

De modo que que debes hacer algo por el estilo:

Código Delphi [-]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Rta: integer;
begin
 Rta := MessageBox(0, '¿Quiere usted guardar antes de salir?', 'Advertencia', MB_ICONQUESTION or MB_YESNO);
 if Rta = IDYES
    then DebeGuardar := True
    else DebeGuardar := False;

 CanClose := True; //De cualquier modo debe cerrarse. False para que no se cierre
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if DebeGuardar
     then GuardarCambios;
  Action := caFree; //caFree para que libere la memoria ocupada
end;

procedure TForm1.GuardarCambios;
begin
 // Lo que debas hacer...
end;

Espero haber sido más claro.
Saludos,

jorgegetafe 05-06-2007 17:55:18

Vale gracias, esta tarde si tengo tiempo lo pondré ;-)

egostar 05-06-2007 18:15:22

Cita:

Empezado por jorgegetafe
Vale gracias, esta tarde si tengo tiempo lo pondré ;-)

Hola, puede ser que hoy amanecí muy sensible y me has de perdonar estimado jorgegetafe, pero me parece una respuesta no muy cordial de alguien que si se tomo el tiempo de contestar, pero como te digo, se me hace que no dormi bien.

Salud OS.

jorgegetafe 05-06-2007 18:19:38

Cita:

Empezado por egostar
Hola, puede ser que hoy amanecí muy sensible y me has de perdonar estimado jorgegetafe, pero me parece una respuesta no muy cordial de alguien que si se tomo el tiempo de contestar, pero como te digo, se me hace que no dormi bien.
Salud OS.

:-( Se lo he agradecido y le he dicho que en cuanto pueda lo probaré... ahora mismo no puedo... creo que no hago daño a nadie...

egostar 05-06-2007 18:23:53

Cita:

Empezado por jorgegetafe
:-( Se lo he agradecido y le he dicho que en cuanto pueda lo probaré... ahora mismo no puedo... creo que no hago daño a nadie...

Perdona como te dije, por supuesto que le agradeces y hasta ahi hubiese estado bien, pero eso de que si tienes tiempo lo pones es lo que me parece no tan cordial.

No me hagas caso, como te digo, amaneci muy susceptible. sea la paz.;)

Salud OS.


La franja horaria es GMT +2. Ahora son las 22:58:20.

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