Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
Invalid Variant Type

Siento pediros ayuda sobre este trucazo que editó Marcos Zorrilla. Estoy compilando en D6 con el BDE y al asignar el primer valor de tipo text en el campo 0 del registro Table1.Fields[n].AsVariant se colapsa el for por "Invalid Type Variant"
Cita:
Empezado por marcoszorrilla
A ver si te sirve este truco de Trucomania:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
 
type 
{Tipos para array dinámico de variants}
TRecuerda = array[0..0] of variant;
PRecuerda = ^TRecuerda;
var 
Recuerda:PRecuerda;
n:integer;
Campos:integer;
begin 
{Reservamos memoria para el array}
Campos:=Table1.FieldCount;
GetMem(Recuerda, Campos * SizeOf(variant));
 
{Vamos al ultimo registro}
Table1.Last;
{Recordamos los campos}
for n:=0 to Table1.FieldCount-1 do 
begin 
Recuerda^[n]:=Table1.Fields[n].AsVariant;
//error de Invalid Variant Type
end;  
...
FreeMem(Recuerda, Campos * SizeOf(Variant));
end;
Lo increible es que al poner el punto de interrupción en la línea, leo el valor del Table1.Fields[0].asVariant='NOMBRE' (pasa un simple valor tipo string), y por tanto, creo q es el Recuerda^[0] no acepta este valor.Buscando en Gogle por "EVariantBadVarTypeError", q acompaña el mensaje del compilador, encuentro esta página http://qc.borland.com/wc/qcmain.aspx?da=42 y selcciono el enlace 5239 (http://qc.borland.com/wc/qcmain.aspx?d=5239) donde parece q la solución esta en rescribir la unidad Variants.pas. después del login, menciona un atachement, pero no hay enlace para descargarlo.
¿Tenéis alguien esta unidad corregida?
¿No habría otra solución?
Si podéis tener alguna sugerencia... GRACIAS A TODOS
...quizás sería preferible abrir un nuevo hilo...
Responder Con Cita
  #2  
Antiguo 12-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Hombre, está sacado de trucomania, que esperabas .
Así queda mejor, nos quitamos punteros y reserva de memoria.

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
 
type 
{Tipos para array dinámico de variants}
TRecuerda = array of variant;
var 
Recuerda:TRecuerda;
n:integer;
Campos:integer;
begin 
{Reservamos memoria para el array}
  Campos:=Table1.FieldCount;
  SetLength(Recuerda,Campos);
 
{Vamos al ultimo registro}
Table1.Last;
{Recordamos los campos}
for n:=0 to Table1.FieldCount-1 do 
begin 
Recuerda[n]:=Table1.Fields[n].AsVariant;

{Añadimos un registro}
    Table1.Append;
    {Lo rellenamos}
    for n:=0 to Table1.FieldCount-1 do 
    begin 
      Table1.Fields[n].AsVariant:=Recuerda[n];
    end; 
    {Lo grabamos}
    Table1.Post;
// no tenemos que liberar la memoria, al ser una variable local, se libera
// al salir
  end;  

end;

[saludos] y más [/saludos]
Responder Con Cita
  #3  
Antiguo 12-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
¡Que es fista!

Jod..., Lepe, q es fiesta. Te me has adelantada porque es exactamente como lo he solucionado. Pero las gracias te las mereces igualmente o más. Yo lo había escrito así:
Código Delphi [-]
procedure TfmPal.ToolButton3Click(Sender: TObject);
 var
    Recuerda : array of variant;
    n:integer;
 begin
    {Reservamos memoria para el array}

    SetLength(Recuerda,Table1.FieldCount);
    {Vamos al ultimo registro}
    Table1.Last;
    {Recordamos los campos}
    for n:=0 to Table1.FieldCount-1 do
    begin
      Recuerda[n]:=Table1.Fields[n].AsVariant;
    end;
    {Añadimos un registro}
    Table1.Append;
    {Lo rellenamos}
    for n:=0 to Table1.FieldCount-1 do
    begin
      Table1.Fields[n].AsVariant:=Recuerda[n];
    end;
    {Lo grabamos}
    Table1.Post;
    Recuerda:=nil;
end;
El nil era por si acaso, pero ya me queda claro con tu comentario q es redundante. También he quitado la asignación Type, y me funciona estupendo. Ya lo estoy implementando en mi componente del DBX.pas, de modo q al crear un nuevo registro (a través del evento del DBNavigator BeforeAction, ya q el TTable está en mi DataModule y no puedo sobrescribir su BeforeInsert (q ya está escito desde el DM), asigno los valores actuales a este array de variants), para poder insertar los valores de cada campo iguales al anterior por medio de F4 (en mi caso: antiguo usuario Magic). Aún me falta cuando el DBeditor es un DBLookUpComboBox. Pero como también soy usuario de mis programas, me lo voy a agradecer mucho.
Pero no entiendo porque en el código del que extrajimos este procedimiento, se cuelga en la Variant.pas, y no en la asignación de los punteros. Desde luego así es mucho más legible y comprensible, pero veo código por ahí q con los punteros consiguen todo. No te molestes en contestar aquí lo de los punteros, porque realmente no pertenecia a este hilo SQL, ya mi pregunta anterior. Cuando pueda ya buscaré por aquí a ver q entiendo, y si me lanzo a usarlos algo más. Gracias por tus ayudas, ... piensate lo de la fotillo, aunque la CCC también vale!
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


La franja horaria es GMT +2. Ahora son las 04:44:10.


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