Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2007
Avatar de Garry
Garry Garry is offline
Miembro
 
Registrado: nov 2007
Posts: 60
Poder: 19
Garry Va por buen camino
Voy a simplificar un poco

Lo que pretendo, por ahora, es que cada campo consultado guarde automáticamente el valor cargado en una nueva propiedad (OldText) de mi nuevo componente (TGDBEdit).

Tras Consultar y Guardar, se actualiza dicha propiedad con lo cargado; al Limpiar se actualiza con el valor vacío.

Hasta luego y gracias de nuevo por la ayuda...
Responder Con Cita
  #2  
Antiguo 11-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Perdón por tardar en contestar, al parecer se me ha perdido este hilo.

¿Acaso no hace eso ya los controles?

Si estoy editando un registro y quiero volver al valor anterior, uso Dataset.Cancel y esto volverá el registro al último valor estable.

Si doy a guardar (Dataset.Post), el nuevo valor pasa al valor del campo y el viejo se pierde.

El botón Limpiar, correspondería a la acción Dataset.Insert que traerá los valores por defecto de cada campo (establecidos en la base de datos como valores por defecto) y asignará sus valores a los DBEdits.

Para saber si un campo ha sido modificado en el DBEdit, tienes la propiedad Modified del TField.

Creo que verías más claro el asunto usando un TDBNavigator, porque te deja cancelar los cambios y volver a lo que tu llamas "valores estables".

Edito: El botón consultar tendría este código:
Código Delphi [-]
Msg := EmptyStr;

if Dataset in EditModes then // posiblemente ha sido modificado la edición
 for i:= 0 to dataset.Fields.Count -1 do
   if dataset.Fields[i].Modified then
     Msg:= msg + '- '+ dataset.fields[i].FieldName + #10#13;

  if Msg <> EmptyStr then 
  begin 
    Msg := 'Los siguientes campos han sido modificados:'+ #10#13 + Msg + ' ¿desea descartar los cambios realizados?';
    if Application.Messagebox(msg, 'Advertencia', mbyesno) = idyes then
    begin
      Dataset.Cancel;
      // consultar
    end
    else  // no hacer nada, el registro quedará en edición con los cambios realizados, dando
         // la posibilidad de guardar o cancelar.
end;

Si expongo todo esto, es porque dices que eres "nuevo en delphi" y puedes estar reinventando la rueda.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 11-12-2007 a las 14:50:16.
Responder Con Cita
  #3  
Antiguo 11-12-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Cita:
Empezado por Lepe Ver Mensaje
Si expongo todo esto, es porque dices que eres "nuevo en delphi" y puedes estar reinventando la rueda.
Vaya, a veces me asombro de otros compañeros, yo me digo no ser tan novato en esto de Delphi, pero nunca, si señor como lo leen, nunca he tenido la inteligencia o dedicación de aprender a crear un componente, alguna vez lo intente y acabe frustrado, no pude

Mejor no intento reinventar la rueda,

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 11-12-2007
Avatar de Garry
Garry Garry is offline
Miembro
 
Registrado: nov 2007
Posts: 60
Poder: 19
Garry Va por buen camino
Red face Como decía, novato... e ingenuo

Ya, egostar, pero es un intento, tal y como dices . Quizá es que empiezo por poner el carro delante de los bueyes y comienzo a lo suicida... En mi feliz ignorancia y por poner un ejemplo, se me ocurre recomendarte este curso de creación de componentes para iniciarte (todo es cuestión de empezar por algún sitio). Confieso que todo esto se me antoja bastante complicadillo...

El caso es que lo que me aporta Lepe me viene muy bien porque ya reconocí ser novatillo, así que agradezco mucho las ayudas, jeje. De todos modos, tendré que probarlo porque lo que quiero es detectar sólo cambios útiles para descartar actualizaciones en las que se "descambie" el contenido. El objetivo es evitar ir a la base de datos innecesariamente y no sé si esa propiedad que cuentas sirve porque:
  1. Cargo el valor a.
  2. Edito y pongo b (...Modified = true).
  3. Reedito "descambiando", quedando nuevamente a (si ahora ...Modified = true? no serviría).
Realmente, también quería reinventar el fuego y que el cambio lo detecte el propio componente internamente tras cada edición, para colorear cuando haya cambios y/o errores, actualizar el filtro de búsqueda sin tener que contorlar todos los cambios uno a uno...

Última edición por Garry fecha: 17-12-2007 a las 12:39:26. Razón: Error refranero
Responder Con Cita
  #5  
Antiguo 11-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Cita:
Empezado por Garry Ver Mensaje
  1. Cargo el valor a.
  2. Edito y pongo b (...Modified = true).
  3. Reedito "descambiando", quedando nuevamente a (si ahora ...Modified = true? no serviría).
en 3, no estas reeditando, porque no has guardado aún. tampoco hay valor "estable".

El valor antiguo será "a". si usas Dataset.cancel es como si no hubieras hecho nada. si usas Dataset.Post estarás actualizando un registro con los mismos valores que tenías antes. Entiendo que es lo que quieres evitar, pero sigue leyendo.

El punto aquí, sería poner una webcam, para ver el usuario cuantas veces entra y sale de un DBEdit cambiando los valores, y adivinar cual de todas esas modificaciones, considera "estable". Una letra de más, una tilde, un espacio... y todos nuestros esfuerzos por la borda.

Si un usuario hace esos 3 pasos que has indicado, yo le explico cuando debe hacer un Post y cuando un Cancel .

Como en muchas ocasiones, el problema está entre el teclado y la silla .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 13-12-2007
Avatar de Garry
Garry Garry is offline
Miembro
 
Registrado: nov 2007
Posts: 60
Poder: 19
Garry Va por buen camino
Exclamation Quizá sí, quizá no...

Cita:
Empezado por Lepe Ver Mensaje
...y adivinar cual de todas esas modificaciones, considera "estable". Una letra de más, una tilde, un espacio... y todos nuestros esfuerzos por la borda.
Tienes algo de razón, Lepe (aunque esto ronda la metafísica). No obstante, no es necesario entrar en ese debate, ya que cada uno tiene sus motivos. Cualquier cosa que retoque el usuario merece la consideración oportuna según cada caso.

En el mío, pretendo eliminar tabulaciones y espacios indeseados, autocorregir la capitalización, y comparar ese valor formateado con el original para reducir aún más los accesos a la BD, con lo que debo comparar los valores yo mismo.

Vale, puedo ser un poco maniático (quizá soy informático por ello, no sé, ), pero me parece que lo interesante sigue sin respuesta:
Cita:
¿Hay cómo recuperar el valor original sin crear un nuevo componente?
Tal vez todo el hilo se reduce a esto y quizá rayo en lo inútil, pero no deja de ser la duda que planteo. Aunque puede no parecer útil para la actualización, sí aún para lo que decía de los colores, por ejemplo.

De todas formas, el código que me diste me va a ser muy útil, claro. No daría por zanjada la cuestión , pero gracias por la sugerencia.
Responder Con Cita
  #7  
Antiguo 13-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
El DBEdit es una mera representación visual. Si quieres capturar cuando cambian los datos, antes de que los valores vayan a parar a la base de datos, o al recibirlos, tendrás que pelearte con el TFieldDataLink. Dicha clase tiene:
Código Delphi [-]
protected
    procedure ActiveChanged; override;
    procedure DataEvent(Event: TDataEvent; Info: Integer); override;
    procedure EditingChanged; override;
    procedure FocusControl(Field: TFieldRef); override;
    procedure LayoutChanged; override;
    procedure RecordChanged(Field: TField); override;
    procedure UpdateData; override;
public
    property OnDataChange: TNotifyEvent read FOnDataChange write FOnDataChange;
    property OnEditingChange: TNotifyEvent read FOnEditingChange write FOnEditingChange;
    property OnUpdateData: TNotifyEvent read FOnUpdateData write FOnUpdateData;
    property OnActiveChange: TNotifyEvent read FOnActiveChange write FOnActiveChange;

Los métodos protegidos serán los que tienes que modificar. Aparte, tendrías que crearte un nuevo TDBEdit que use tu TFieldDatalink modificado.

Espero me equivoque y haya un método más fácil. Pero dudo que sea trabajando sobre el TDBEdit, porque te dará falsos positivos (por ejemplo, al cambiar de registro, se producirá un evento DBedit.OnChange y "no podrías diferenciarlo de cuando el usuario modifica el registro" (este caso es un mero ejemplo, no lo tomes al pie de la letra, porque no he estudiado el caso a fondo).

En respuesta a tu pregunta directa:
Si, si lo hay, en el evento afterScroll de tu Dataset, pero no será viable hacerlo allí.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 13-12-2007
Avatar de Garry
Garry Garry is offline
Miembro
 
Registrado: nov 2007
Posts: 60
Poder: 19
Garry Va por buen camino
Red face ¡Bufff!

Creo que esto me supera con creces.

Y tienes razón con el DBedit.OnChange, lo había probado y salta al cargar valores, ¡rayos! Mi gozo en un pozo. Al menos, de momento. Supongo que ya volveré sobre esto, pero así me va costar demasiado avanzar...

Me pregunto si alguien se ha currado algo similar que pueda y quiera aportar alguna idea. Creo que sería un componente útil para todo en esta vida, jeje.

Un saludillo y gracias por responder tan rápidamente .
Responder Con Cita
  #9  
Antiguo 11-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
ha salido repe el mensaje...

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Calcular un valor antes de guardar en una tabla FGarcia Varios 11 21-11-2007 05:22:07
Guardar el valor de un EDIT en un fichero de texto creus Varios 2 16-01-2007 23:02:56
Guardar valor en una variable... hademon SQL 1 14-09-2005 17:16:57
Algun componente para guardar jpg en mysql? delphivan Gráficos 1 30-05-2005 16:48:08
Algun componente para solo listar el valor de un campo? nefy OOP 15 22-11-2004 14:01:36


La franja horaria es GMT +2. Ahora son las 20:42:41.


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
Copyright 1996-2007 Club Delphi