[gelöst] ACCESS VIOLATION

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
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

Beitrag von juelin »

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
Dateianhänge
oldiesfehler.jpg
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.

Benutzeravatar
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

Beitrag von Zvoni »

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

Code: Alles auswählen

//In FormActivate
If Not Assigned(Info) Then Info:=TstringList.Create;
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
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.

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: ACCESS VIOLATION

Beitrag von theo »

@juelin
Du benutzt die falschen Events.
OnCreate und OnDestroy (von TForm) wäre das zusammengehörige und richtige Paar.

Benutzeravatar
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

Beitrag von fliegermichl »

Zvoni hat geschrieben: Do 9. Okt 2025, 12:01 FormActivate zündet jedesmal, wenn deine Form den Fokus zurückerhält.
...
Wobei das zwar einen Memoryleak erzeugen würde aber keine Access Violation.
Meine Vermutung ist eher, dass Info bereits zuvor freigegeben wurde und nicht auf nil gesetzt.

Benutzeravatar
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

Beitrag von juelin »

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

Benutzeravatar
theo
Beiträge: 11027
Registriert: Mo 11. Sep 2006, 19:01

Re: ACCESS VIOLATION

Beitrag von theo »

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.
Warum nimmst du nicht einfach die "richtigen" Events OnCreate und OnDestroy des Formulars?
Ich sehe bei einer Stringlist keinen Grund für etwas anderes.

Benutzeravatar
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

Beitrag von Zvoni »

fliegermichl hat geschrieben: Do 9. Okt 2025, 12:11
Zvoni hat geschrieben: Do 9. Okt 2025, 12:01 FormActivate zündet jedesmal, wenn deine Form den Fokus zurückerhält.
...
Wobei das zwar einen Memoryleak erzeugen würde aber keine Access Violation.
Meine Vermutung ist eher, dass Info bereits zuvor freigegeben wurde und nicht auf nil gesetzt.
Stimmt.
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.

Antworten