Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asignacion de evento OnEditValueChanged (https://www.clubdelphi.com/foros/showthread.php?t=90642)

joel hernandez 01-08-2016 17:46:24

Asignacion de evento OnEditValueChanged
 
Buenos dias.

Primero que nada Quiero presentarme, soy nuevo en este foro, y con delphi igual.

Tengo un detalle con el cual espero me puedan ayudar.

estoy construyendo un cxGrid con columnas dinamicas, entre ellas tengo 3 columnas (teorico, fisico, diferiencia) de las cuales Fisico es editable, lo que requiero es que al editar el valor de esta columna se realice una operacion de la diferiencia entre teorico y fisico, y el resultado este en la columna Diferiencia.

Esa es la idea. y el codigo que estoy ocupando cara asignar ese evento a la columna fisico.
Código Delphi [-]
procedure TFrmPreInventario.pHabilitaColumnaEdicion;
  begin
      if cxCol_Mod <> nil then
      begin
        cxCol_Mod.Options.Editing := True;
        cxCol_Mod.Options.Focusing:= True;
        cxCol_Mod.Focused:=True;
        cxCol_Mod.Properties.OnEditValueChanged:= Diferiencias;
      end;
  end;
En funcion Diferencias lo unico que hago es setear una variable, antes le habia puesto un mensage de dialogo, crei que ese era el problema asi que lo cambie por el seteo de una variable.
Código Delphi [-]
 procedure TFrmPreInventario.Diferiencias(Sender: TObject);
    var
    ant  : string;
    begin
        ant   := cxCol_Mod.EditValue;
     end;
El problema es me manda un mensaje de acces violation, que estaré haciendo mal ? ya que si asigno otro evento como por ejemplo OnMosueClk funciona correctamente.

De antemano agradezco la ayuda que puedan brindarme.

gatosoft 01-08-2016 22:45:07

Creo que lo que intentas hacer se explica en éste link.

Principalmente veo que debes trabajar con el Sender que es de tipo TcxCustomEdit, asi:

Código Delphi [-]
Var
Edit: TcxCustomEdit;
Ant: String;
y dentro de tu código "typecastearlo" asi:

Código Delphi [-]
Edit := Sender as TcxCustomEdit;
Ant:= Edit.EditingValue;

Por otro lado, veo que se sugiere utilizar una variable variant para recibir el valor "por si acaso", para que no te de un problema de conversión en caso que no pueda transformarse en string, algo asi:

Código Delphi [-]
 var
 Edit: TcxCustomEdit;
 ANT: Variant;

begin
 Edit := Sender as TcxCustomEdit;
 ANT := Edit.EditingValue;

Espero que te sirva... pues no he utilizado estos componentes

joel hernandez 02-08-2016 16:00:23

Buenos dias creo que ese no es problema para obtener los valores y realizar la operación, el problema es al momento de asignarle un proceso al evento que estoy creándole a esa columna.


cxCol_Mod.Properties.OnEditValueChanged:= Diferiencias;

Específicamente en esa linea de codigo, ya intente ponerla al momento de crear el grid. pero marca el mismo error de Acces violation.
el problema es que si pongo otro evento si se crea correctamente el evento y se manda a llamar.

gatosoft 03-08-2016 16:14:40

Si el error es en esa línea,

Código Delphi [-]
cxCol_Mod.Properties.OnEditValueChanged:= Diferiencias;

entonces hay tres posibilidades:

1) Que el objeto cxCol_Mod no esté instanciado, lo cual no es cierto, pues lineas antes ya hiciste otras asignaciones
2) Que el objeto cxCol_Mod.Properties no esté instanciado, lo cual tampoco creo, pues este objeto se debe crear al momento de instanciarse el objeto cxCol_Mod
3) Por último, está el procedimiento diferencias, que debiste haber definido dentro de algún objeto :

Procedure OnEditValueChanged(Sender:Tobject) of object

Lo único que se me ocurre es que éste procedimiento se haya definido dentro de un objeto que al momento de la asignación aun no esté instanciado.

saludo

joel hernandez 03-08-2016 18:16:34

Podrias explicarme un poco mas sobre esto como podria solucionarlo. en caso de que este fuera mi erro.


Cita:

Empezado por gatosoft (Mensaje 507357)
Si el error es en esa línea,

Código Delphi [-]
cxCol_Mod.Properties.OnEditValueChanged:= Diferiencias;

entonces hay tres posibilidades:

1) Que el objeto cxCol_Mod no esté instanciado, lo cual no es cierto, pues lineas antes ya hiciste otras asignaciones
2) Que el objeto cxCol_Mod.Properties no esté instanciado, lo cual tampoco creo, pues este objeto se debe crear al momento de instanciarse el objeto cxCol_Mod
3) Por último, está el procedimiento diferencias, que debiste haber definido dentro de algún objeto :

Procedure OnEditValueChanged(Sender:Tobject) of object

Lo único que se me ocurre es que éste procedimiento se haya definido dentro de un objeto que al momento de la asignación aun no esté instanciado.

saludo


Kipow 03-08-2016 19:05:57

Una solucion mas simple podria ser, agregar un campo calculado (Diferencia) al dataset

joel hernandez 03-08-2016 19:27:33

Claro Gracias, esta seria la solucion si los calculos no se hicieran en tiempo d eejecucion.

es decir yo edito la columna Fisico y en el evento OnEditValueChange se deve hacer el calculo de Fisico menos Teorico = Diferencia que debe colocarse en dicha columna.

Si me doy a entender?

Cita:

Empezado por Kipow (Mensaje 507369)
Una solucion mas simple podria ser, agregar un campo calculado (Diferencia) al dataset


Kipow 03-08-2016 19:57:15

Cita:

Empezado por joel hernandez (Mensaje 507373)
Claro Gracias, esta seria la solucion si los calculos no se hicieran en tiempo d eejecucion.

es decir yo edito la columna Fisico y en el evento OnEditValueChange se deve hacer el calculo de Fisico menos Teorico = Diferencia que debe colocarse en dicha columna.

Si me doy a entender?

Exactamente para eso existe el campo calculado de los dataset, cada vez que se realiza un cambio en la data se ejecuta. probalo.

joel hernandez 03-08-2016 20:41:27

Vale me parece una buena opción si esto funciona cada vez que tecleo algo en la celda del grid.


en ese caso me puedes ayudar con un ejemplo estoy ocupando un TAdoStoreProc y un TrvDataSetConnection, para obtener los datos de mi BD

Lo que estuve revisando son ejemplos con un ADOQuery y en modo diseño.


Gracias.


La franja horaria es GMT +2. Ahora son las 15:25:13.

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