Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   error con state (https://www.clubdelphi.com/foros/showthread.php?t=38443)

Jheysson13 14-12-2006 20:41:34

error con state
 
hola.
por que este codigo me da un error

Código Delphi [-]
if not (datamodule2.Table1.State in Insert) then 
begin
datamodule2.Table1.Refresh; 
end;

que estoy haciendo mal:( si hasta en los ejemplo de delphi esta mas o menos asi.
este codigo lopongo en elevento ontimer de un tTimer para que si ta tabla no esta en modo inser se actualiza
gracias.

:confused:puede alguien orientarme. gracias

delphi.com.ar 14-12-2006 22:14:26

El problema radica en que la propiedad State es un TDataSetState que no es un conjunto (set), sino un tipo enumerado. Los tipos solo pueden un valor a la vez, en cambio los conjutos tienen la propiedad de poder tener varios estados simultáneos.
Ejemplo:
Código Delphi [-]
type
  TTipo = (Valor1, Valor2, Valor3);   { Es un tipo enumerado con tres valores }
  TConjunto = set of TTipo; { Es un conjunto basado en TTipo}
  TConjunto2 = set of (ValConj1, ValConj2, ValConj3); { Es un conjunto}
var
  Tipo: TTipo;
  Conjunto: TConjunto;
  Conjunto2: TConjunto2;
begin
  Tipo := Valor1;
  Conjunto := [Valor1, Valor2];
  Conjunto2 := [];
  ...
end;


En tu caso en particular la solución sería:
Código Delphi [-]
if datamodule2.Table1.State <> dsInsert then 
  datamodule2.Table1.Refresh;

Saludos!

Jheysson13 14-12-2006 22:48:30

gracias por tu respuesta pero, ya lo habia intentado de esa manera y me dice
"indeclared indefiert" 'dsinser' en el lugar donde esta
Código Delphi [-]
<> dsinsert
,
error que da cuando no esta declarada la variable.
alguna idea de lo que ocurre aki:confused:

delphi.com.ar 14-12-2006 22:50:46

Fíjate si estas utilizando la unit DB en la unit que tiene ese código.

Saludos!

sinalocarlos 15-12-2006 01:45:25

Cita:

Empezado por delphi.com.ar
Fíjate si estas utilizando la unit DB en la unit que tiene ese código.

Saludos!

Esto es correcto al marcarte como no declarado dsinsert lo mas seguro es que no tengas la unidad BD en tu clausula Uses

mas con el primer post de "delphi.com.ar" estoy en desacuerdo el error es devido a que al momento de hacer el IN para comparar deves de poner el dsinsert en entre corchetes algo asi como:

Código:

if dataset.state in [dsinsert] then
mas sin embargo te recomiendo esto ultimo solo si intentas averiguar si el estado del dataset esta entre varios valores esto es:

Código:

if dataset.state in [dsinsert,dsedit] then
y a como lo comentas, si lo que intentas hacer es refrescar despues de un tiempo, deves mirar tambien si no lo esta editando el usuario

Lepe 15-12-2006 14:53:13

Ni delphi.com.ar ni sinalocarlos llevan razón, esa me la llevo yo :D :p

Código Delphi [-]
if tabla.state in dsEditModes then
:D
Saludos

delphi.com.ar 15-12-2006 19:57:23

Cita:

Empezado por sinalocarlos
mas con el primer post de "delphi.com.ar" estoy en desacuerdo el error es devido a que al momento de hacer el IN para comparar deves de poner el dsinsert en entre corchetes algo asi como

En este caso estas evaluando si un valor de un tipo enumerado esta dentro de un conjunto "dinámico" definido al poner los corchetes, lo cuál es algo mas costoso para el procesador. En el caso de no ser necesario un conjunto, por ejemplo en este caso que tiene solo un elemento, recomiendo la comparación directa.

Saludos!

Jheysson13 15-12-2006 20:00:54

gracias a todos por sus respuestas, en realidad sinalocarlos fue quien mas acerto claro que tambien delphi.com.ar acerto cuando me dijeron que no tenia la unidad DB en de la unit.

se que se trataba de solo un elemento y por eso elijiste la comparacion directa delphi.com.ar, yo tambien lo estaba haciendo de esa manera, pero luego recorde (error mio olvidarlo) que tambien se podria encontrran em modo de edit. y seria mas complejo una comparacion directa. perdon por no recordar eso.

aunke tambien lo habia intentado como dices lepe y esta correcto pero no era ese el problema.gracias de todos modos.

para solucionarlo lo mejor que seme ocurrio es porne el codigo en elmismo datamodule agregandole un ttimer
utileze este codigo:

en su evento ontimer con un intervalo de 500.
Código Delphi [-]
if NOT (datamodule2.Table1.State in [DSInsert,DSEDIT]) then begin
datamodule2.Table1.Refresh; end;

y me funciono perfectamente.
gracias y salu2 para todos.:):)


La franja horaria es GMT +2. Ahora son las 06:16:08.

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