Frage

Wir haben eine Delphi 5-Anwendung, die ohne Laufzeit-Packages, dlls oder externe Ressourcen aufgebaut ist (das heißt eine einzige ausführbare). wenn wir es auf einem Kunden-PC installieren erhalten wir die folgenden Fehlermeldungen:

  

Klasse TListView nicht gefunden

oder

  

Klasse TImage nicht gefunden

Wir haben es auf Dutzende von PCs ohne Zwischenfälle vor installiert, aber diese neueste installieren, ist problematisch.

Der Ziel-PC ist eine Neuinstallation von Windows XP (Service Pack 3) ohne weitere Software installiert ist.

Es beschwert sich nicht über alle Klassen aber nur ein oder zwei. zum Beispiel TPanel / TForm / TEdit sind alle in Ordnung.

Kann jemand denken, was ist der Grund dafür?

Bearbeiten

Die exe auf dem neuen PC ist auf 30 oder so andere PCs, die ich kenne, die von Windows XP Sp1,2,3, Windows Vista und Windows Embedded. sowohl alte als auch neue PCs wurden mit einer alten Version installiert und dann mit der neuesten Version aktualisiert. Der einzige Unterschied ist, dass der Versionssprung höher war für die neuesten installieren.

War es hilfreich?

Lösung

Re0sless,

Ich schlage vor, Sie öffnen und jede Form der Anwendung schließen und einen neuen Build danach tun. Wenn der Speicher mich gut bedient, das war die Lösung, wenn wir ähnliche Probleme.

Sie können auch einen Blick auf DFM prüfen zu öffnen und schließen Sie alle Ihre dfm der automatisch und unter CnPack , um Ihre uses-Klausel reinigen .

Grüße, Lieven

Andere Tipps

Dies ist normalerweise ein Fehler während des Streamings eines .DFM. Normalerweise ist dieser Fehler tritt bei TLabel Komponenten, weil viele Leute die TLabel Felder aus dem Formular oder Frame entfernen, um auf der Unordnung zu reduzieren und die Instanz Größe des Formulars zu reduzieren. Die gemeinsame und verwirrend Fehler, den sie machen, ist jedoch, dass in ihrem Übereifer, sie entfernen alle TLabel Referenzen. Das ist, wenn schlimme Dinge zu passieren beginnen. Lassen Sie uns laufen nach unten, wie das Streaming-System einer Komponente Klasse lokalisiert.

Beachten Sie, dass die Klassenreferenz in der DFM ist nur eine Zeichenfolge . Das Streaming-System hat diese Zeichenfolge in eine Klassenreferenz (TComponentClass) zu konvertieren. Es gibt zwei Mechanismen, die das Streaming-System, dies zu tun verwendet. Die erste ist sehr einfach und erfordert eine globale Liste von Klassenreferenzen. Sie können Register oder RegisterClasses rufen explizit das Streaming-System bewusst zu machen. Die zweite ist viel subtiler und nicht sehr gut bekannt; in der Tat ist es alles Teil der „Magie“ von Delphi :-). Wenn der Compiler die Form aufbaut, werden alle Felder, die die Komponenten auf der Form darstellen, werden verarbeitet und eine interne Tabelle wird als Teil des RTTI oder Metadaten für das Formular / Frame / Datamodule selbst eingebaut. Diese Tabelle enthält eine Liste von Verweisen auf alle einzelnen Komponententypen durch die Komponentenfelder dargestellt. Also selbst wenn eine Komponente nicht in der globalen Liste, es kann immer noch durch das Scannen durch diesen Compiler erzeugten Tabelle. Das ist, was die Classes.TReader.GetFieldClass () -Methode der Fall ist.

Zurück zu meinem TLabel Beispiel dieses Problem leicht durch einfache fixiert ist sicherzustellen, dass mindestens ein von einem bestimmten Komponententyp ein Feld hat. Also, solange es mindestens Feld vom Typ ist TLabel, alle die anderen TLabels lädt einfach gut. Also in Ihrem Fall, stellen Sie sicher, haben die TListView oder TImage Felder nicht gelöscht.

Ich denke, Lieven ist definitiv auf dem richtigen Weg: einfache Basisklassen nicht während der Laufzeit sind ein Delphi (Linker) Problem gefunden wird. Diese Ausnahme ist nicht , die durch das Betriebssystem.

Meine Erfahrung mit ähnlichen Problemen: der Linker erzeugt ein Projekt mit den Einheiten falsch angeordnet
. Beispiel: Eine Formeinheit ist, bevor die Basiseinheiten in verknüpft. das Projekt zu zwingen, sich zu völlig neu kompilieren / neu verknüpfen diese Ausnahme auch weggehen.

Ein einfaches [Alles neu erstellen] wird wahrscheinlich nicht ausreichen. Sie könnten versuchen, ohne Optimierungen neu zu kompilieren.

Ich habe versucht, diesen Fehler zu reproduzieren, aber ich habe nicht in der Lage gewesen. Der Delphi-Compiler / Linker ist einer der besten - Geschwindigkeit der Kompilierung / Geschwindigkeit von kompilierten EXE-Dateien -. Aber dieser Fehler ist auf jeden Fall eine Show Stopper

  

Hinweis: Ich habe nur erfahren   dieser Fehler in D5. Hat jemand anderes   diesen Fehler mit anderen erfahren   Delphi-Versionen?

Ich habe ein ähnliches Problem aufgrund eines Dateikopierfehler gesehen. Erschwerend kommt noch verwirrender, war der Fehler auf einem Zwischenmediengerät. Das Problem durch einfaches Umkopieren der Datei aus dem bestehenden Release-Build aufgelöst wurde.

Es ist wahrscheinlich unmöglich, jetzt zu bestätigen, aber es ist durchaus möglich, dass das Problem ‚gelöst‘ wurde; nicht wegen der Entfernung eines unnecessay Klausel Artikel verwendet, sondern weil es auch eine neue Kopie der ausführbaren Datei beteiligt sind.

Ich hatte das gleiche Problem. Klasse TCheckBox nicht gefunden. I bearbeiten Regel große Menge von Komponenten durch .DFM der Form (beispielsweise große Menge an Komponente Umbenennen). Dieser Fehler kommt, wenn ich alle CheckBox auf meiner Form durch .DFM umbenennen.

ich all das Kontrollkästchen nur schneiden und wieder einfügen (So .DFM Datei aktualisiert wird). Der Fehler verschwunden.

Die Lösung für alle Fehler dieser Art „Class XXX nicht gefunden“ ist einfach. Öffnen DFM-Datei eines Formulars in Texteditor und entfernen manualy die Definition des XXX Objekt in es.

Ändern Sie den Namen des Formulars und die .pas mit anderen Namen speichern. Ändern Sie alle Verweise der neuen Gerätenamen zu erstellen, wenn diese in anderen Einheiten verwendet wird. Alle erstellen. Damit verschwand der Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top