Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Exception "Eigenschaft existiert nicht" lösen? (https://www.delphipraxis.net/213561-exception-eigenschaft-existiert-nicht-loesen.html)

Schucki 18. Aug 2023 00:20

Exception "Eigenschaft existiert nicht" lösen?
 
Hallo Delphi Freunde,

ich verwende Delphi 2010 und habe nun, nach dem aktualisieren einiger VCL Komponenten folgendes Problem.

Meine bisherigen Projekte lassen sich ohne Probleme laden und auch kompelieren. Möchte ich die Anwendung nun laufen lassen kommt sofort eine Exception mit der Meldung "Eigenschaft existiert nicht" TAdvMemo.DoubleBuffered.

Im Objektinspektor ist die Eigenschaft wirklich nicht vorhanden!

Schaltet man nun von der Formularansicht auf die Textansicht, dann findet man diese Eigenschaft. Hier habe ich versucht diese zu löschen und erneut kompiliert und kann die Anwendung auch starten. Leider wird diese Zeile mit der Eigenschaft sofort wieder hinzugefügt sobald man wieder in die Formularansicht wechselt.

Wie von Geisterhand, ich weiß nicht wie ich das reparieren kann...

Ich bitte um eure Hilfe, ich kann so nicht an meinem Programm weitermachen.

Danke, Frank

himitsu 18. Aug 2023 01:40

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Du hast nicht zufällig eine andere Version des DesignTime-Packages dieser Komponente in der IDE,
als das Runtimepackage oder der Quellcode, mit welchem das Programm kompiliert wird?



Tja, wenn sich nach dem Upgrade (Delphi oder Fremdkomponenten) etwas ändert, dann kann es nunmal knallen.

Kompilieren lassen ist keine Garantie, da die DFM nur auf eine valide Syntax geprüft wird, bzw. wenn sie als TextDFM vorliegt, dann wird sie nach binär konvertiert und als Ressource in die EXE gelinkt.
Ob die Komponenten, Property, sonstwas wirklich "gültig" sind, ist damit also nicht gesagt.

Erst zur Laufzeit knallt es dann.
Oder eben du mußt mal alle Forms im Delphi öffnen.

Der DFM-Reader im Formdesigner ist Fehlertoleranter, bzw du hast die Wahl
* ESC, bzw. Abbrechen -> die DFM wird nicht im Designer geladen und bleibt unverändert
* manchaml wird bei ungültigen Beziehungen ein Auswahldialog gezeigt, wo man eine andere Komponente wählen kann, oder ...
* und ansonsten gibt es noch "Ignorieren", wo unbekannte Property, oder Welche die im Setter knallen, werden nicht geladen und sind beim Speichern weg
* * bzw. unbekannte Komponenten oder wo es im Constructor knallt, die würden dann auch nicht geladen/weggelasse und sind beim Speichern weg
* der Rest der DFM wird aber geladen

* da man natürlich eine Versionsverwaltung nutzt, und wenn man nicht sieht was nun genau kaputt/weg ist, nach dem Speichern, sieht man das dann im DIFF :angle2:



Was aber fieß ist (DDevExtension und Co. helfen), wenn sich die Signatur eines Event änderer, also Parameter und/oder deren Typen anders sind (Name der Parameter sind egal), dann sagt dir das die IDE beim Speichern nicht ... geänderte Typen von Komponenten (in der DFM anders, als in der PAS), das sagt dir Delphi beim Speichern und repariert es.

Schucki 18. Aug 2023 06:52

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Hallo und vielen Dank für Deine Antwort.

Den von Dir beschriebenen Dialog, bei öffnen eines vorhandenen Projektes, kenne ich und vermisse ihn in dem Fall!

Das Projekt wird anstandslos geöffnet und aööes sieht in Ordnung aus, ist es abernicht.

Kann es sein das ich diese Valid Überprüfung der Eigenschaften deaktiviert habe und wenn ja, wie aktiviert man diesen Dialog wieder? Dieses Problem habe ich noch nie gehabt und bin über 15 Jahre dabei,,, das ärgert mich schon. :(

Kann man irgendwie herausbekommen, auf welche DCU der nun installierten Packiges nun zugegriffen wird. Nicht das die alten Sachen noch irgendwo auf der Platte rumgammeln und für die IDE noch/auch sichtbar sind?

Gruß Frank

jaenicke 18. Aug 2023 08:14

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Zitat:

Zitat von Schucki (Beitrag 1525765)
Kann man irgendwie herausbekommen, auf welche DCU der nun installierten Packiges nun zugegriffen wird. Nicht das die alten Sachen noch irgendwo auf der Platte rumgammeln und für die IDE noch/auch sichtbar sind?

Mit everything kannst du Dateien sehr schnell überall auf der Festplatte finden (in wenigen Millisekunden normalerweise).

Mit dem Process Monitor kannst du, indem du im Filter Path contains und dann die gesuchten Dateinamen oder Teile davon angibst, sehen, worauf die IDE selbst zugreift, sowohl beim Starten der IDE als auch beim Kompilieren.

Ich selbst würde in solchen Fällen einfach die Konfiguration löschen und die IDE neu einrichten, habe mir aber sowohl beruflich wie auch privat entsprechende Skripte erstellt, die das automatisch machen.

Uwe Raabe 18. Aug 2023 09:56

AW: Exception "Eigenschaft existiert nicht" lösen?
 
DoubleBuffered wird in TWinControl als public deklariert und, soweit ich das aktuell nachsehen kann, im TAdvMemo schon seit vielen Jahren nicht published überschrieben. Ich gehe davon aus, dass das auch vorher nicht der Fall war. Aus diesem Grund taucht es im Object Inspector nicht auf und wird beim Einlesen aus der DFM auch nicht gefunden. In deine DFM kann es eigentlich nur dann gekommen sein, wenn es vorher mit einer modifizierten TAdvMemo Instanz gespeichert wurde. Dazu gehört aber eigentlich auch noch ein Eintrag für ParentDoubleBuffered.

Was nun genau bei dir schief läuft können wir mangels ausreichender Informationen und Überprüfungsmöglichkeiten nur raten.

Folgendes kannst du probieren: Lösch den Eintrag (bzw. beide) aus der DFM mit einem externen Editor (nicht mit der IDE). Öffne dann das Form in der IDE und wechsle in die Textdarstellung. Taucht es dann wieder auf, liegt es an dem in deinem System installierten TAdvMemo.

himitsu 18. Aug 2023 12:49

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Der Compiler kann Dependency-Infos ausgeben.
https://docwiki.embarcadero.com/RADS...ncy_File_(*.d)
In der .D-Datei steht drin, was wirklich kompiliert/gelinkt wurde, alle DCPs und DCUs.
(hab grade vergessen welche Projektoption das war, aber da ich grade lese dass dies eigentlich von für C++ ist, dann vermutlich in jenem Tab)

Oder in die .MAP-Datei schauen.
https://docwiki.embarcadero.com/RADS...le_Types_Index

Unter Menü > Hilfe > Info über ... > Versionsinfo-Knopf sieht man, welche DLLs und Packages im Delphi geladen sind, und vor allem von wo.

Schucki 18. Aug 2023 22:24

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Ich bedanke mich für alle Tips und Hinweise sowie Lösungsvorschläge!

Ich werde es durcharbeiten...

Wenn ich die DFM Datei mit einem externen Editor bearbeiten möchte, welchen könnt ihr da empfehlen?

Denn mit dem Windowseigenen sieht es so aus das irgendwelche Steuerzeichen drin sindindenZeilen, dass wird doch sicher nur schief gehen.

Gruß Frank

jaenicke 18. Aug 2023 23:26

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Hast du die DFM noch nicht im Textformat? Das sollte normaler Text sein. Das kann man irgendwo umstellen, ich glaube im Kontextmenü des Formulardesigners.

Wenn es dann eine einfache Textdatei ist, sollte es mit dem Windows Notepad genauso gehen wie z.B. mit Notepad++, das sehr gut ist.

himitsu 19. Aug 2023 00:29

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Jupp, DFMs aus alten Delphis werden nicht automatisch auf Text umgestellt, welches inzwischen die DefaultEinstellung ist (für neu erstellte Forms).

Ansonsten lässt es sich auch manuell übersetzen, wenn es innerhalb des Designers knallt.
siehe System.Classes
Delphi-Quellcode:
{ Object conversion routines }

type
  TStreamOriginalFormat = (sofUnknown, sofBinary, sofText, sofUTF8Text);

procedure ObjectBinaryToText(const Input, Output: TStream); overload;
procedure ObjectBinaryToText(const Input, Output: TStream;
  var OriginalFormat: TStreamOriginalFormat); overload;
procedure ObjectTextToBinary(const Input, Output: TStream); overload;
procedure ObjectTextToBinary(const Input, Output: TStream;
  var OriginalFormat: TStreamOriginalFormat); overload;

procedure ObjectResourceToText(const Input, Output: TStream); overload;
procedure ObjectResourceToText(const Input, Output: TStream;
  var OriginalFormat: TStreamOriginalFormat); overload;
procedure ObjectTextToResource(const Input, Output: TStream; const Name: string = ''); overload;
procedure ObjectTextToResource(const Input, Output: TStream;
  var OriginalFormat: TStreamOriginalFormat; const Name: string = ''); overload;

function TestStreamFormat(const Stream: TStream): TStreamOriginalFormat;
TReader und TWriter sind zu grundeliegenden Datenklassen (für's binäre Format)
DFM heute als Text, aber im kompilierten Programm immernoch Binär und geladen wird am Ende auch das Binäre.

dummzeuch 19. Aug 2023 07:43

AW: Exception "Eigenschaft existiert nicht" lösen?
 
... und dann gibt es noch das convert-Utility, im bin-Verzeichnis von Delphi, welches binäre dfms in Text und Text-dfms in binäre umwandeln kann.

Achtung: Es gibt auch ein convert in Windows\system32, das FAT nach NTFS konvertiert.

Schucki 1. Sep 2023 12:47

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Hallo und danke für Eure Antworten!

Ich bin nach einer gesundheitlichen Zwangspause wieder an dem Problem dran.

Die DFM ist im Textformat doch am Ende der Zeilen sind zwei Steuerzeichen zu sehen. Könnte sein das es ein Linux Format am Zeilenende ist.

Ich habe mir in der Zwischenzeit mal die Versionsinfo genauer angesehen. Da sieht es auf dem ersten Blick gut aus! Aber es ist ja wirklich irre was alles geladen wird!

Das Problem besteht nach wie vor!

Nun habe ich mir die Suchpfade in den Projekteinstellungen angesehen und da gibt es ein Punkt der nicht passt!

Es gibt Projektbezogene Suchpfade, da waren zwei Pfade drin die auf die alte Installation des Package zeigen. Die habe ich entfernt.

Leider gibt es in der unteren Box weitere Pfade die "vererbt" wurden.

Von wo wurden die "geerbt", wo stellt man das ein, wo muss ich da suchen?

Ich denke bevor ich diese Referenzen nicht entferne, bringt das editieren der DFM nichts.

Gruß Frank

BerndS 1. Sep 2023 14:42

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Die Suchpfade sollen besser gar nicht in den Projektoptionen auftauchen. (es sein denn, man verwendtet verschiedene Quellen der Komponenten in den Projekten)
Die Vererbung kannst du in den Projektoptionen über die Combobox Ziel: einstellen.

Wie das aber bei Delphi 2010 aussieht, kann ich nicht sagen. Ich habe hier nur XE7, 10.3 und 11.3 installier.
Ich habe die Suchpfade immer in Tools/Optionen eingestellt und die sollten zu den installierten Packages passen, was bei dir nicht der Fall ist.

Schucki 1. Sep 2023 15:18

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Hallo,

ich danke für Deine Antwort!
Offensichtlich habe ich das bis heute dann immer falsch gemacht. :-(

Ich schaue mir das an und muss die Pfade überprüfen und wohl unter Tools suchen wo ich diese einzutragen habe.

Danke Frank, ich berichte wenn ich weiter bin!

Uwe Raabe 1. Sep 2023 15:42

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Zitat:

Zitat von BerndS (Beitrag 1526367)
Die Suchpfade sollen besser gar nicht in den Projektoptionen auftauchen.

Es gibt eine nicht gerade kleine Gruppe die das genau andersherum sieht: Außer den Standard-Delphi-Pfaden gehören die Pfade jeder im Projekt verwendete Library (und nur die) in die Projekt-Optionen. (Das Handling unterschiedlicher Versionen der installierten Packages steht dabei auf einem anderen Blatt.)

Dieser Ansatz ist sogar zwingend erforderlich wenn die Libraries als Subrepos in der Versionsverwaltung eingebunden sind und die Pfade somit relativ zum Projekt anzugeben sind. Hattest du ja auch ungefähr so erwähnt.

Schucki 6. Sep 2023 13:51

AW: Exception "Eigenschaft existiert nicht" lösen?
 
Hallo an alle,

ich habe die Pfade in den Suchpfaden alledurchgesehen und in der Tat waren Zweideutigkeiten auf die neue sowie alte Version vorhanden.
Habe alle Verweise auf die alte Version entfernt und es funktioniert erstmal wieder!

Gibt es irgendwo ein HowTo, wo erklärt wird wie man mit diesen Pfadoptionen richtig umgeht?

MeinProblem ist als gelöst zu betrachten, ich danke Euch!

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz