2008-09-30 5 views
17

estoy realmente enfermo de este problema. Las búsquedas de Google siempre parecen sugerir "eliminar todos los bpls para el paquete", "eliminar todos los dcus". Algunas veces esto simplemente no funciona. Espero poder obtener algunas otras ideas aquí.cómo resolver de Delphi [Pascal error fatal] F2084 Error interno: LA33?

Tengo un paquete escrito en la empresa, que se había instalado sin problemas hace unos meses. Habiendo realizado algunos cambios en la fuente, pensé que era hora de recompilar/reinstalar el paquete. Ahora recibo dos errores, el primero si elijo "instalar" es

Violación de acceso en la dirección 02422108 en el módulo 'dcc100.dll'. Leer de dirección 00000000.

... o si trato de instalar/compilar el paquete, consigo

[Pascal Fatal error] Error F2084 interna: LA33

Ésta es una de esos problemas de Delphi que parecen ocurrir una y otra vez para muchos de nosotros. Sería genial si pudiéramos cotejar una respuesta algo en la línea de "uno cualquiera o una combinación de estas medidas podrían solucionarlo, pero si lo hace todos estos pasos que se solucionarlo ...."

por el momento, he eliminado todas las referencias a los archivos de BPL/DCP para este paquete, pero todavía conseguir el mismo error ...

Usando BDS2006 (Delphi)

actualización 01-oct- 2008: Logré resolver esto - ver mi publicación a continuación. Como no puedo aceptar mi propia respuesta, no estoy completamente seguro de qué hacer aquí. Obviamente, este tipo de problemas ocurren con frecuencia para algunas personas, por lo que lo dejaré abierto durante un tiempo para obtener otras sugerencias. Entonces supongo que si alguien recopila toda la información en un superpub, puedo aceptar la respuesta

+0

qué versión se debe utilizar para no enfrentar este problema? –

Respuesta

14

me las arreglé para resolver esto, el siguiente procedimiento

  1. Crear un nuevo paquete
  2. Uno por uno, añadir los componentes para el paquete, compilar & instalar, hasta que falló.
  3. Investigue la unidad que causa la falla.

Como resultado, la unidad en cuestión tenían una matriz constante de clase, por ejemplo

TMyClass = class(TComponent) 
private 
    const ErrStrs: array[TErrEnum] of string 
    = ('', //erOK 
     'Invalid user name or password', //erInvUserPass 
     'Trial Period has Expired'); //erTrialExp 
protected 
    ... 
public 
    ... 
end; 

Así que parece que Delphi no le gusta constantes de clase (o quizás de clase constantes arrays) en los componentes del paquete

actualización: y sí, esto ha sido reportado a codegear

+1

He aceptado mi propia respuesta aquí, ya que fue la que la solucionó, aunque Lars también fue muy útil. Pero a fin de no tener demasiadas preguntas abiertas innecesariamente, he hecho esto, no estoy seguro si es la forma correcta de hacer las cosas en S.O. pero lo hará por ahora ... – Graza

+1

+1 para descubrirlo; Desearía poder hacer otro +1 por informarlo en QC. –

+0

¡Arrástrese del pasado aquí, pero solo haga clic en este problema intentando compilar un paquete con una constante de matriz de clases! –

4

Estos son errores en el compilador/enlazador. Puede encontrar muchas referencias de estos errores en Internet en diferentes versiones de Delphi, pero no siempre son los mismos errores. Eso hace que sea difícil dar una solución para todos esos tipos diferentes de problemas.

soluciones generales que podrían solucionarlo son, como usted señaló:

  • Eliminar * * .dcp .dcpil * * .dcu .dcuil * * .dll .bpl
  • Vuelva a escribir el código de otra forma
  • Tinker con las opciones del compilador
  • obtener la última versión de Delphi

personalmente me encontré con uno de esos errores que hay que resolver si apagué Rang e Comprobando. Otros se resuelven si no usa genéricos de otra unidad. Y uno se resolvió si el nombre de la unidad y el nombre de la clase se renombraron para que fueran más pequeños.

Y, por supuesto, usted debe informar de cualquier problema que tenga en http://qc.codegear.com

+0

En XE4, tenía un error interno causado por métodos anónimos y al eliminar todos los archivos .dcu se solucionó el problema. Gracias. –

1

tuve un caso similar, donde la solución era eliminar el archivo desde urlmon.dcu/l ib/depurar

También funcionó para desactivar "use debug .dcus" por completo. Esto, por supuesto, no es deseable, pero puede usarlo para verificar si el problema recae en alguna de sus unidades o en cualquiera de las unidades de Delphi.

3

Quizás el siguiente paso sea la mejor solución:
Declare la matriz como un tipo y simplemente defina la constante de clase con este tipo, por ejemplo.

TMyArray = array[TErrEnum] of string; 

TMyClass = class(TComponent) 
private 
    const ErrStrs: TMyArray 
    = ('', //erOK 
     'Invalid user name or password', //erInvUserPass 
     'Trial Period has Expired'); //erTrialExp 
protected 
    ... 
public 
    ... 
end; 

Esto hace que la declaración de matriz sea explícita.

+0

+1 - Esto funcionó para mí. Gracias. :) – Shannon

2

Perdí varias horas sobre este tema, eliminando dcu's, etc. fue en vano.

Finalmente, lo que funcionó para mí fue desmarcar la verificación de desbordamiento en las opciones del compilador, reconstruir el proyecto, volver a verificar la verificación de desbordamiento y reconstruir de nuevo. Voila! el problema se ha ido. Imagínate. (sigue usando D7).

0

Para mí, en D2010 deshabilitar la opción del compilador "Emitir información de tipo de tiempo de ejecución" hizo el truco.

1

Intente limpiar el "Directorio de salida" para que Delphi no pueda sucias .DCU sucias y se fuerce a insertar el .PAS. A veces esto ayuda. En caso de que no haya configurado un "directorio de salida", intente eliminar (o mover mejor en una carpeta de copia de seguridad) todos los archivos .DCU.

0

Desactivación de "incluir símbolos de depuración remota" de las opciones del vinculador ha solucionado el problema para mí Delphi 2007, proyecto DLL

1

Delphi XE3 Actualización 2

F2084 Internal Error: URW1147

CASO 1:

problema fue que un tipo fue declarado en un procedimiento de una clase genérica.

procedure TMyClass<TContainerItem, TTarget>.Foo(); 
type 
    TCacheInfo = record 
    UniqueList: TStringList; 
    UniqueInfo: TUniqueInfo; 
    end; 
var 
    CacheInfo: TCacheInfo; 

al mover la declaración de tipo a la parte privada de la declaración de clase resolvió este problema.

CASO 2:

problema en este caso estaba relacionado con un parámetro opcional:

unit A.pas; 
interface 
type 
    TTest<T> = class 
    public 
    type 
     TTestProc = procedure (X: T) of object; 
    constructor Create(TestProc_: TTestProc = nil); 
    end; 
... 

se produjo el error de compilación interna tan pronto como una variable de la clase PRUEBA.T fue declarado en otra unidad : p.ej

unit B.pas: 

uses A; 
var 
    Test: TTest<TObject>; 

solución era hacer que el argumento del constructor de TestProc_ no opcional.

0

De las varias respuestas este error parece ser una excepción genérica no controlada por el compilador.

Mi problema se debía a llamar erróneamente function X(someString:String) : Boolean; que alteró la cadena y devuelve un valor lógico, utilizando someString := X(someString);

0

Como mi experiencia de Error interno es que, yo línea de re-escrito por línea y compilar de nuevo y se dio cuenta de que algunos if otra cosa no funciona así

error interno

if (DataType in ASet) 
    begin 
//do work 
    end 
    else if (DataType = B) 
    begin 
//do work 
    end 
    else 
    begin 
//do work 
    end; 

Cómo he resuelto:

if (DataType = B) 
     begin 
    //do work 
     end 
     else if (DataType in ASet) 
     begin 
    //do work 
     end 
     else 
     begin 
    //do work 
     end; 

Acabo de cambiar las condiciones como ejemplo.Espero que ayude.

Cuestiones relacionadas