Hallo,
ich habe Lazarus 4.2 mit FPC 3.2.2 unter Windows 11.
Mein Programm hat eine TForm und eine TFrame.
In der TForm habe ich eine globale Variable "INFO: TStringList" declariert.
In der Procedure "TForm1.FormActivate" aktiviere ich die Variable "Info:=TStringList.Create".
In der Procedure "TForm1.FormClose" gebe ich die Variable wieder frei "Info.Free".
TForm1 siehe Anhang Bild1.
TFrame1 siehe Anhang Bild2.
Wenn ich nun das Programm starte (TForm) und dann gleich wieder beende (Button Programm-Ende)
läuft alles ohne Probleme.
Wenn ich nun das Programm starte (TForm) und dann mit Button "Erfassen Info und Bild" zum TFrame
gehe
und in TFrame gleich wieder mit Button "zurück zum Verwalten Songs" zu TForm zurück gehe
und dann in TForm den Button "Programm-Ende" drücke
bekomme ich die Fehlermeldung (siehe Anhang oldiesfehler).
Das ganze passiert in der Procedure "TForm1.FormClose" auf dem Befehl Info.Free.
Keine Ahnung warum. Weiss da Jemand mehr?
Danke und Gruß
Jürgen
[gelöst] ACCESS VIOLATION
- juelin
- Beiträge: 326
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
[gelöst] ACCESS VIOLATION
- Dateianhänge
-
- oldiesfehler.jpg (16.84 KiB) 325 mal betrachtet
-
Bild2.jpg
- (264.74 KiB) Noch nie heruntergeladen
-
Bild1.jpg
- (338.25 KiB) Noch nie heruntergeladen
Zuletzt geändert von juelin am Do 9. Okt 2025, 14:47, insgesamt 2-mal geändert.
- Zvoni
- Beiträge: 457
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: ACCESS VIOLATION
FormActivate zündet jedesmal, wenn deine Form den Fokus zurückerhält.
Also auch wenn du z.B. den Windows-Explorer startest, um was nach zuschauen, und du dann in der Taskbar wieder auf dein Programm zurückkehrst
Heisst: Du versuchst "Info:=TStringList.Create" auszuführen, obwohl "Info" bereits "created" ist
Verschieb den Code mit "Info:=TStringList.Create" nach FormCreate.
Eine Alternative wäre
was aber meiner Meinung nach Overkill ist.
Faustregel:
Wenn eine Variable diesselbe Lebenszeit hat wie deine Form (du nennst die Variable "Global") hat, dann erzeugst du diese Variable in einem Ereignis, was dann auch tatsächlich nur einmal ausgeführt wird.
In diesem Fall: FormCreate
Also auch wenn du z.B. den Windows-Explorer startest, um was nach zuschauen, und du dann in der Taskbar wieder auf dein Programm zurückkehrst
Heisst: Du versuchst "Info:=TStringList.Create" auszuführen, obwohl "Info" bereits "created" ist
Verschieb den Code mit "Info:=TStringList.Create" nach FormCreate.
Eine Alternative wäre
Code: Alles auswählen
//In FormActivate
If Not Assigned(Info) Then Info:=TstringList.Create;
Faustregel:
Wenn eine Variable diesselbe Lebenszeit hat wie deine Form (du nennst die Variable "Global") hat, dann erzeugst du diese Variable in einem Ereignis, was dann auch tatsächlich nur einmal ausgeführt wird.
In diesem Fall: FormCreate
Zuletzt geändert von Zvoni am Do 9. Okt 2025, 12:29, insgesamt 1-mal geändert.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: ACCESS VIOLATION
@juelin
Du benutzt die falschen Events.
OnCreate und OnDestroy (von TForm) wäre das zusammengehörige und richtige Paar.
Du benutzt die falschen Events.
OnCreate und OnDestroy (von TForm) wäre das zusammengehörige und richtige Paar.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1697
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: ACCESS VIOLATION
Wobei das zwar einen Memoryleak erzeugen würde aber keine Access Violation.Zvoni hat geschrieben: Do 9. Okt 2025, 12:01 FormActivate zündet jedesmal, wenn deine Form den Fokus zurückerhält.
...
Meine Vermutung ist eher, dass Info bereits zuvor freigegeben wurde und nicht auf nil gesetzt.
- juelin
- Beiträge: 326
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: ACCESS VIOLATION
Hi,
natürlich habe ich Vorkehrung getrofen, das der Befehl "Info:=TStringList.Create"
in der Procedure TForm1.FormActivate nur einmal ausgeführt wird.
Aber ich habe fest gestellt, das wenn ich nach der Rückhehr aus TFrame
den Befehl "Info:=TStringList.Create" nochmal absetzte, die Fehlermeldung
ACCESS VIOLATION nicht mehr kommt.
Gruß Jürgen
natürlich habe ich Vorkehrung getrofen, das der Befehl "Info:=TStringList.Create"
in der Procedure TForm1.FormActivate nur einmal ausgeführt wird.
Aber ich habe fest gestellt, das wenn ich nach der Rückhehr aus TFrame
den Befehl "Info:=TStringList.Create" nochmal absetzte, die Fehlermeldung
ACCESS VIOLATION nicht mehr kommt.
Gruß Jürgen
Re: ACCESS VIOLATION
Warum nimmst du nicht einfach die "richtigen" Events OnCreate und OnDestroy des Formulars?juelin hat geschrieben: Do 9. Okt 2025, 12:17 natürlich habe ich Vorkehrung getrofen, das der Befehl "Info:=TStringList.Create"
in der Procedure TForm1.FormActivate nur einmal ausgeführt wird.
Ich sehe bei einer Stringlist keinen Grund für etwas anderes.
- Zvoni
- Beiträge: 457
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
- CPU-Target: 32Bit
- Wohnort: BW
Re: ACCESS VIOLATION
Stimmt.fliegermichl hat geschrieben: Do 9. Okt 2025, 12:11Wobei das zwar einen Memoryleak erzeugen würde aber keine Access Violation.Zvoni hat geschrieben: Do 9. Okt 2025, 12:01 FormActivate zündet jedesmal, wenn deine Form den Fokus zurückerhält.
...
Meine Vermutung ist eher, dass Info bereits zuvor freigegeben wurde und nicht auf nil gesetzt.
FormClose hat ja bekanntlich "CloseAction", wo man das Schliessen eines Fensters abbrechen kann.
Wenn da Info freigegeben wird, knallts natürlich
Jepp. "Info.Free;" in FormDestroy und gut ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.