Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evento de DBCheckBox para modificar datos (https://www.clubdelphi.com/foros/showthread.php?t=66018)

tgsistemas 27-01-2010 23:51:46

Evento de DBCheckBox para modificar datos
 
Hola a todos,

trabajo con D7 y SQL 2005 Express, en un form muestro los datos de un qry, entre ellos un DBCheckBox el cual tiene el siguiente código en el evento onclick :
Código Delphi [-]
procedure TFEdtarPARTESLIN.DBCheckEXTRAClick(Sender: TObject);
begin
  if DBCheckEXTRA.Checked then
  begin
    if MessageDlg('Atención !!!!'+#13+#10+''+#13+#10+
       'Se asignarán todas las Horas como Horas Extras.'+#13+#10+''+#13+#10+
       '¿ Desea continuar ?', mtWarning, [mbYes, mbNo], 0) = mrYes then
      CalculaHoras;
  end;
end;
la rutina CalculaHoras calcula y distribuye los valores calculados en diferentes campos, eso funciona perfectamente.

Lo curioso, o al menos a mí me lo parece, es que al mostrar el form con showmodal se ejecuta ese código, con lo cual entiendo que se está disparando el evento TFEdtarPARTESLIN.DBCheckEXTRAClick y no lo encuentro muy normal... o si ??

La aplicación calcula partes horarios de trabajadores, distribuye las horas en función de un calendario laboral y unos turnos de trabajo, pero necesitan un proceso manual para "asignar" determinadas horas como horas extras :eek:, si, si... a mí también me gustaría un jefe así :D

Así que añadí un campo boolean a la tabla para determinar si esas horas eran "asignadas manualmente" como extras y es ese el campo del DBCheckBox.

Si a alguien se le ocurre otra forma mejor de solventarlo, se admiten propuestas :D:D

Saludos y Gracias:cool:

Neftali [Germán.Estévez] 28-01-2010 12:45:35

Cita:

Empezado por tgsistemas (Mensaje 352057)
Lo curioso, o al menos a mí me lo parece, es que al mostrar el form con showmodal se ejecuta ese código, con lo cual entiendo que se está disparando el evento TFEdtarPARTESLIN.DBCheckEXTRAClick y no lo encuentro muy normal... o si ??

Supongo que la rutina salta debido a la carga de datos desde la Base de Datos. Igual que si programas el evento OnChange de un campo de texto.

A mi a prori tampoco me parece normal, pero me da la impresión de que así es.

tgsistemas 28-01-2010 14:46:53

Hola de nuevo Neftali, lo siento debo ser tu cruz :eek: ;);)

he probado esto
Código Delphi [-]
 
procedure TFEdtarPARTESLIN.DBCheckBoxPLUSIDIOMASClick(Sender: TObject);
begin
MessageDlg('si se ve esto... algo va mal !!!', mtWarning, [mbOK], 0);
end;
y no se dispara al mostrar el form !!!! no entiendo nada.

Abusando de tu buen hacer, se te ocurre otra alternativa para lo comentado de las horas extras ??

Saludos y Muchas Gracias

Neftali [Germán.Estévez] 28-01-2010 16:34:06

Cita:

Empezado por tgsistemas (Mensaje 352109)
y no se dispara al mostrar el form !!!! no entiendo nada.
Abusando de tu buen hacer, se te ocurre otra alternativa para lo comentado de las horas extras ??

Más que al mostrar el form me da laimpresión de que debe ser al abrir la Query/tabla lo que provoca que se rellenen los controles DataAware.

Yo en algun caso lo que he hecho es levantar un flag antes de abrir, y bajarlo una vez abierta la consulta. En los eventos se filtran todos aquellos que llegan mientras el flag está activo.
No se si esta solución te puede servir a tí.

Neftali [Germán.Estévez] 28-01-2010 16:44:58

Otra opción que acabo de ver en la web de About.com es que puedes desactivar "temporalmente" el evento OnClick. El efecto sería el comentado en el mensaje anterior.

link.

rgstuamigo 28-01-2010 17:23:09

El problema es que el evento OnClick del DBCheckBox se va a ejecutar cuando al navegar por los registros, se haga el cambio de estado, algo asi como un evento OnChange. Eso se puede verificar en el codigo de la VCL del mismo componente, mas concretamente en la clase ancestra del TDBCheckBox.;)
Cita:

Sacado de la VCL->
Código Delphi [-]
procedure TCustomCheckBox.Click;
begin
  inherited Changed;//<----He aqui el Problema ;);)
  inherited Click;
end;

.
Saludos...:)

Neftali [Germán.Estévez] 28-01-2010 18:06:01

En ese caso tal vez se podría combinar con el State del Dataset para verificar que se está modificando el valor y no cargándolo.

Supongo que habrá diferencia de estado cuendo se está navegando a cuando realmente el usuario lo modifica (edita).

Al González 28-01-2010 21:10:19

Cita:

Empezado por Neftali (Mensaje 352146)
En ese caso tal vez se podría combinar con el State del Dataset para verificar que se está modificando el valor y no cargándolo.

Supongo que habrá diferencia de estado cuando se está navegando a cuando realmente el usuario lo modifica (edita).

Concuerdo contigo, Germán. Pensando en una solución simple, basta con agregar una condición más al If del manejador de evento.

Código Delphi [-]
procedure TFEdtarPARTESLIN.DBCheckEXTRAClick(Sender: TObject);
begin
  if DBCheckEXTRA.Checked And (ConjuntoDeDatos.State In dsEditModes) then
  begin
    if MessageDlg('Atención !!!!'+#13+#10+''+#13+#10+
       'Se asignarán todas las Horas como Horas Extras.'+#13+#10+''+#13+#10+
       '¿ Desea continuar ?', mtWarning, [mbYes, mbNo], 0) = mrYes then
      CalculaHoras;
  end;
end;

Saludos.

Al González. :)

tgsistemas 30-01-2010 18:07:33

Neftali, rgstuamigo y [Al González] gracias por la ayuda ;)

efectivamente el estado del conjunto de datos dispara ese evento así que siguiendo vuestro sabio consejo lo he dejado así :
Código Delphi [-]
  if  (DataSource.State In dsEditModes) then
  begin
    if (DBCheckEXTRA.Checked = True) then
    begin
      if MessageDlg('Atención !!!!'+#13+#10+''+#13+#10+
               'Se asignarán todas las Horas como Horas Extras.'+#13+#10+''+#13+#10+
               '¿ Desea continuar ?', mtWarning, [mbYes, mbNo], 0) = mrYes then
        CalculaHoras;
    end else begin
      if MessageDlg('Atención !!!!'+#13+#10+''+#13+#10+
               'Las Horas dejarán de considerarse como Horas Extras y se distribuirán normalmente.'+#13+#10+''+#13+#10+
               '¿ Desea continuar ?', mtWarning, [mbYes, mbNo], 0) = mrYes then
        CalculaHoras;
    end;
  end;

de esa forma sólo se ejecuta al editar, en función del Checked o Unchecked muestro un mensaje diferente pero ambos pasan por la rutina de distribución de horas.

Muchas Gracias por la ayuda, por mi parte la duda queda resuelta.

Saludos


La franja horaria es GMT +2. Ahora son las 04:48:51.

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