PS: Ansonsten gibt es auch eine positive Sache:
Meine EXE mit RC2 übersetzt und auf virustotal.com geprüft zeigt keinen einzigen Virus oder Trojaner, dementsprechend baut Lazarus da keinen ein. Das ist schon mal SUPER! (war mit V2.2.6 ebenfalls so)
Was ist spFilterCaseExp für ein Control? Soviel ich weiß, hat Ondrej damals nur die StdCtrls angepasst (also the Events in der Property-Liste nach hinten geschoben). Diese Änderung ist auch in RC2 enthalten. Aber ExtCtrls, ComCtrls, LazControls usw. könnten immer noch die alphabetische Reihenfolge haben... Aber dann würde mich wundern, warum es zwischendurch einmal funktioniert hat.
Ich habe mal in dem ZIP 2 Test Projekte angehängt, beide lassen sich fehlerfrei übersetzen und stürzen ab bevor sich das Formular zeigt:
Mein Screenshot brauchst du nicht beachten, da der Code doch etwas größer ist.
Daher hier die Minimal-Demos mit denen sich der Fehler reproduzieren lässt. Es sind exakt die gleichen Demos, wie letztens wir auch verwendet hatten:
Ah, ich verstehe. Wenn du das lfm-Formular in einem Editor (oder auch in der IDE über Rechtsklick und "View source (.lfm)") öffnest, siehst du, dass der OnClick-Eventhandler der Checkbox wieder mitten unten den Properties steht - er sollte nach der damaligen Änderung aber hinter den Properties stehen, so dass OnClick noch nicht existiert, wenn State geladen wird und dabei OnClick aufgerufen wird. Offenbar ist das eine ältere Version des Test-Projekts.
Abhilfe: Ändere einfach eine Kleinigkeit an dem Formular, z.B. verschiebe es auf dem Monitor um ein paar Pixel, und speichere es neu - nun wird OnClick am Ende der Properties gespeichert und das Problem ist behoben.
Die Arbeit, jedes Formular deines großen Projekts zu laden und nach minimaler Änderung neu zu speichern, kann ich dir allerdings nicht abnehmen...
Übrigens, meine Bemerkung, dass damals nur die StdCtrls-Unit gefixt wurde, ist nicht richtig. Ich hatte damals am selben Tag noch alle anderen LCL-Controls-Units geprüft und ggfs korrigiert.
Hm, ja OK das funktioniert. Ich habe alle Formulare mal geöffnet und geändert und gesichert. Nun stürzt meine EXE tatsächlich nicht mehr ab.
Eigentlich könnte Lazarus das irgendwie alleine korrigieren, also vor dem übersetzen die Datei korrigieren, da in der .lfm Datei die "LCLVersion" drin steht.
Vor der Dateiänderung steht in der lfm:
LCLVersion = '2.2.6.0'
drin und danach:
LCLVersion = '3.0.0.2'
Zumindest würde ich als Anwender von Lazarus so erwarten. In meinem Programm waren es jetzt 55 Formulare (ist ja jetzt nicht wirklich ein Aufwand, wenn man es weis.). Das ist sonst ein potentielles Fettnäpfchen, das sicher den ein oder anderen Absturz verursachen wird und entsprechend viele Bugreports. Die automatische Korrektur müsste nur schauen ob die erste Zahl der LCLVersion 0 / 1 oder 2 hat und entsprechend die Formulardatei als Version 3 abspeichern.
Alternative: Beim Übersetzen merkt Lazarus dass die lfm Datei von einer früheren Version ist und zeigt ein Dialog: "Das Formular 'xxx.lfm' muss auf V3 geupdatet werden ..." [OK] [Alle] [Abbruch]
Einige Formulare hatte ich seit Jahren nicht mehr geändert, da stand noch die Version '1.2.6.0' drin. Bei größeren Anwendungen kann es da schon zu Problemen kommen, alles Läuft und funktioniert, dann kommt irgend wann einer auf die Idee eine versteckte Funktion aus zu führen, und es knallt auf einmal.
Daher, überlegt euch bitte einen Update-Mechanismus. Damit auch in Zukunft die Projekte, die mit Lazarus erstellt wurden auch weiterhin zuverlässig funktionieren.
Zuletzt geändert von MmVisual am Do 2. Nov 2023, 07:09, insgesamt 1-mal geändert.
Dazu müsstest du einen Bug-Report auf dem Lazarus-Bugtracker als Feature-Request schreiben, ich selbst mag das nicht entscheiden.
Ein mögliches Gegenargument fällt mir ein: Wenn du die Formulare eines alten Projektes in einer neuen Lazarus-Version öffnest, dann steht nach deinem Vorschlag auf jeden Fall die neue Versionsnummer im Formular (abgesehen von evtl neu vorhandenen Properties, aber das muss ja nicht sein). Wenn du nun dasselbe Projekt wieder mit einem älteren Lazarus öffnest, dann liest dieser plötzlich die neue Versionsnummer. Ich weiß nicht, was dann passiert: Entweder die alte Version weigert sich, das neue Formular zu lesen - das wäre ein deutlicher Rückschritt gegenüber jetzt, oder die alte Version ignoriert die Diskrepanz und liest das neue Formular trotzdem - aber dann wäre die Versionsnummer in der lfm-Datei eigentlich überflüssig.
Ich habe es gerade getestet, eine .lfm Datei die auf Version 3 konvertiert wurde kann Lazarus V2.2.6 ohne Mecker öffnen und die EXE wird problemlos erzeugt und funktioniert.
Von daher: Es sieht so aus als ob die LCLVersion bisher einfach nur ignoriert wurde, was ja auch OK ist so lange es keine Probleme mit der Struktur der Datei gibt.
Ich schreibe ein Bugreport damit der Update auf V3 entsprechend durchgeführt wird, denn die Abwärtskompatibilität ist ja gegeben.