2008-09-30 11 views
17

Ich bin wirklich krank von diesem Problem. Bei Google-Suchen wird immer vorgeschlagen, "alle bpls für das Paket zu löschen", "alle dcus löschen". Manchmal funktioniert das einfach nicht. Hoffentlich kann ich hier noch ein paar Ideen bekommen.So lösen Sie Delphi [Pascal Fatal Error] F2084 Interner Fehler: LA33?

Ich habe ein Paket inhouse geschrieben, das vor ein paar Monaten ohne Probleme installiert wurde. Nachdem ich einige Änderungen an der Quelle vorgenommen hatte, dachte ich, es wäre an der Zeit, das Paket neu zu kompilieren. Jetzt bekomme ich zwei Fehler, die erste, wenn ich "installieren" wählen ist

Zugriff auf die Adresse 02422108 in Modul 'dcc100.dll'. Lesen von Adresse 00000000.

... oder wenn ich versuche, das Paket zu erstellen/kompilieren, erhalte ich

[Pascal Fatal Error] F2084 Interner Fehler: LA33

Dies ist einer der diese Delphi-Probleme, die für viele von uns immer wieder auftauchen. Wäre toll, wenn wir eine Antwort etwas entlang der Linien von collate könnte „irgendeiner oder einer Kombination dieser Schritte könnte es beheben, aber wenn Sie tun alle diese Schritte es wird fix it ....“

im Moment habe ich für dieses Paket alle Verweise auf die BPL/dcp-Dateien entfernt, aber immer noch die gleichen Fehler ...

Mit BDS2006 (Delphi)

Update-01-Monaten Oktober 2008: Ich habe es geschafft, dies zu lösen - siehe meinen Beitrag unten. Da ich meine eigene Antwort nicht akzeptieren kann, bin ich mir nicht ganz sicher, was ich hier tun soll. Offensichtlich treten diese Arten von Problemen häufig für einige Leute auf, so dass ich es für eine Weile offen lasse, um andere Vorschläge zu bekommen. Dann denke ich, wenn jemand alle Informationen in einen Super-Post zusammenträgt, kann ich die Antwort akzeptieren

+0

welche Version sollte verwendet werden, um dieses Problem nicht zu begegnen? –

Antwort

14

ich es geschafft, dieses Problem zu lösen, nach dem folgenden Verfahren

  1. Erstellen Sie ein neues Paket
  2. Einer nach dem anderen, fügen Sie die Komponenten Kompilieren Sie das Paket &, bis es fehlschlägt.
  3. Untersuchen Sie das Gerät, das den Fehler verursacht hat.

Wie sich herausstellte, hatte die fragliche Einheit eine Klasse konstante Array, zB

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; 

So scheint es, dass Delphi nicht Klassenkonstanten mag (oder vielleicht konstante Klasse Arrays) in Paketkomponenten

Update: und ja, wird dies CodeGear berichten

+1

Ich habe meine eigene Antwort hier akzeptiert, da es die war, die es reparierte, obwohl Lars auch sehr hilfreich war. Aber im Interesse, nicht zu viele unnötig offene Fragen zu haben, habe ich das getan - nicht sicher, ob es der richtige Weg ist, Dinge auf S.O. aber es wird für jetzt tun ... – Graza

+1

+1 um es herauszufinden; Ich würde mir wünschen, ich könnte noch einmal +1 für die Berichterstattung in QC tun. –

+0

Blast von der Vergangenheit hier - aber nur dieses Problem zu versuchen, ein Paket mit einer Klasse Array-Konstante zu kompilieren! –

4

Dies sind Fehler im Compiler/Linker. Sie können viele Referenzen dieser Fehler im Internet in verschiedenen Delphi-Versionen finden, aber sie sind nicht immer die gleichen Fehler. Das macht es schwierig, für all diese unterschiedlichen Probleme eine Lösung zu finden.

Allgemeine Lösungen, die beheben könnte es sind, wie Sie bemerkt:

  • Remove * .DCP- * .dcpil * .dcu * .dcuil * .bpl * .dll
  • Ihr Code in einer anderen Art und Weise Rewrite
  • Tinker mit Compiler-Optionen
  • die neueste Delphi-Version

ich persönlich fand einen solchen Fehler Erhalten gelöst werden, wenn ich Rang ausgeschaltet e Überprüfung. Andere sind gelöst, wenn Sie keine Generika von einer anderen Einheit verwenden. Und eine wurde gelöst, wenn der Name der Einheit und der Klassenname umbenannt wurde, um kleiner zu sein.

Und natürlich Sie irgendein Problem auf Sie berichten sollten http://qc.codegear.com

+0

Unter XE4 hatte solche internen Fehler durch anonyme Methoden verursacht, und das Löschen aller .dcu-Dateien löste das Problem. Vielen Dank. –

1

ich einen ähnlichen Fall hatte, wo die Lösung die Datei urlmon.dcu von/l zu entfernen war ib/debuggen.

Es funktionierte auch, um "debug .dcus" insgesamt zu deaktivieren. Dies ist natürlich nicht wünschenswert, aber Sie können es verwenden, um zu überprüfen, ob das Problem bei einer Ihrer eigenen Einheiten oder mit einer der Einheiten von Delphi liegt.

3

Vielleicht ist der folgende Schritt eine bessere Lösung:
Deklarieren Sie das Array als einen Typ und definieren Sie einfach die Klassenkonstante mit diesem Typ, z.

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; 

Dies macht die Array-Deklaration explizit.

+0

+1 - Das hat bei mir funktioniert. Vielen Dank. :) – Shannon

2

Ich verschwendete mehrere Stunden zu diesem Thema, löschte dcu's usw. ohne Erfolg.

Schließlich funktionierte für mich das Deaktivieren der Überlaufprüfung in den Compiler-Optionen, das erneute Erstellen des Projekts, erneutes Überprüfen der Überlaufprüfung und das erneute Erstellen. Voila! Das Problem ist weg. Stelle dir das vor. (immer noch mit D7).

0

Für mich in D2010 die Deaktivierung der Compiler-Option "Emit Runtime Typ Information" hat den Trick.

1

Versuchen Sie, das "Output Directory" zu bereinigen, damit Delphi keine .DCUs verschmutzen kann und die .PAS erzwungen wird. Manchmal hilft das. Falls Sie kein "Ausgabeverzeichnis" konfiguriert haben, versuchen Sie, alle .DCU-Dateien zu löschen (oder besser in einen Sicherungsordner zu verschieben).

0

Deaktivieren "Include Remote-Debug-Symbole" aus den Linker Optionen, um das Problem für mich Delphi 2007,

1

Delphi XE3 Update-DLL-Projekt 2

F2084 Internal Error: URW1147

CASE 1 festgelegt:

Problem war, dass ein Typ in einer Prozedur einer generischen Klasse deklariert wurde.

Das Verschieben der Typdeklaration in den privaten Teil der Klassendeklaration löste dieses Problem.

CASE 2:

Problem in diesem Fall mit einem optionalen Parameter verwendet war:

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

der interne Compiler-Fehler aufgetreten ist, sobald eine Variable der TTest Klasse in einer anderen Einheit erklärt wurde : z.B

unit B.pas: 

uses A; 
var 
    Test: TTest<TObject>; 

Lösung war, die Konstruktorargument von TestProc_ nicht optional zu machen.

0

Aus den verschiedenen Antworten scheint dieser Fehler eine generische unbehandelte Ausnahme durch den Compiler zu sein.

Mein Problem durch versehentlich verursacht wurde function X(someString:String) : Boolean; Aufruf, die die Zeichenfolge geändert und einen boolean zurück, ist someString := X(someString);

0

Wie meine Erfahrung von Interner Fehler mit, dass ich Zeile für Zeile erneut geschrieben und kompiliert wieder und erkannte, dass einige wenn else-Anweisung funktioniert nicht wie

Interner Fehler tritt

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

Wie ich gelöst:

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

Just wechselte die Bedingungen als Beispiel.Hoff es hilft.