Eine EAccessviolation die ich mir nicht erklären kann

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
multiplatform-coder
Beiträge: 59
Registriert: Do 20. Apr 2023, 18:25

Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von multiplatform-coder »

Hier habe ich eine EAccessViolation dokumentiert, deren Ursprung ich mir nicht erklären kann, zumal die bei einer Vergleichsoperation geworfen wird, nicht bei der eigentlichen Zugriffsverletzung:
https://disk.yandex.com/i/Q6d99XBXaQMxlg

Code: Alles auswählen

x:=10;
y:=10;
tycoonTUIbox := MyComponent.Create(Application,MyDesktop.Create(vscreen,AppFont),30,30,500,300,'Stammfenster');
//MyComponent.UseFont('c:\Users\Konta\Desktop\myCode\userinterface-code\src\arial.ttf',20);
//MyComponent.Desktop := Application.Desktop;
Application.CreateWindow(MyComponent);
Application.Run; 

///////Hier bei Application.Run wird die Exception geworfen, ich komme auch mit F7 gar nicht erst in die   
///////Procedure Run rein, um zu sehen was dort passiert, kann also auch DoRun nicht aufrufen.

//vscreen ist für das Versändnis des Debug Vorganges nicht nötig, Desktop auch nicht
//ich verstehe nur nicht wieso die Exception zum Zeitpunkt des Vergleiches und nicht während des 
//Zugriffsversuches geworfen wird.

Zuletzt geändert von multiplatform-coder am Do 5. Sep 2024, 16:36, insgesamt 1-mal geändert.

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

Re: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von theo »

1. Wieso tust du das Bild auf Yandex? Das kannst du einfach hier anhängen.
2. Aus dem Bild kann ich nichts schliessen. Schau doch mal den Aufrufstack an.

multiplatform-coder
Beiträge: 59
Registriert: Do 20. Apr 2023, 18:25

Re: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von multiplatform-coder »

@theo:

weil ich einen Scrennshot gemacht habe der auf Yandex gespeichert ist. Ich will eine Erklärung für diese Exception, allgemein, nicjt projektbezogen und habe daher keine Lust, hetzt erst rumzubasteln um das Bild von Yandes auf meinen Rechner offlinr zu kriegen. Habe doch das Bild hochgeladen, wo das Proble dargestellt ist bei dem Ich Hilfe brauche. Aber gut, für das nächste Mal, wie krige ich das dann hin?

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

Re: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von theo »

Es gibt keine "allgemeinen Erklärungen" für Zugriffsverletzungen. Da muss man den Code anschauen und z.B. den Aufrufstack.
Grundsätzlich greifst du auf etwas zu, wofür kein Speicher reserviert wurde oder wo der Speicher schon freigegeben wurde.
Was ist denn bei dir "MyComponent"? Das müsste nach den Regeln "TMyComponent" heissen bei Create.
Bilder kannst du bei "Dateianhänge" hochladen.

multiplatform-coder
Beiträge: 59
Registriert: Do 20. Apr 2023, 18:25

Re: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von multiplatform-coder »

Okeeee, dann bleibt mir wohl nichts anderes übrig, als meinen Quellcode noch mal Stück für Stück zu durchforsten. Blöd nur dass der Debugger da nicht immer weiter hilft. Ich habe eine eigene DoRun Methode geschrieben, Run ruft die auf, aber nur DoRun ist virtual, Run aber nicht und wird deshalb nicht überschrieben, nur DoRun, die wird aber intren von Run aufgerufen. Wenn dann TCustomApplication ohne DebugInfo übersetzt ist, kann ich lange suchen, nur mein eigener Quellcode hat Debuginfo. Nun gut, Danke dennoch, da muss ich halt selber gucken. :(

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von af0815 »

Für so tiefe Zwecke kann man die LCL und Lazarus auch mit Debugginnginfos erstellen. Ich würde mir da einfach eine neue Umgebung einrichten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 363
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: Eine EAccessviolation die ich mir nicht erklären kann

Beitrag von Zvoni »

Du erzeugst eine tycoonTUIBox, indem du den Create-Constructor deines Klassen-Typs "MyComponent" aufrufst, und das Ergebnis an tycoonTUIBox zuweist.
In den auskommentierten Zeilen weist du der Klassen-Variablen "Desktop" deines Klassen-Typs (!!) den Application.Desktop zu?

und in Application.CreateWindow übergibst du den Klassen-Typ anstatt der instanzierten tycoonTUIBox?

EDIT: Und wo machst du einen Vergleich?
Unabhängig davon: In der Zeile in der du die tycoonBox erzeugst, erzeugst du innerhalb der Parameter auch eine MyDesktop-Instanz.
Das riecht nach einem Speicherleck, es sei denn du verwaltest diese Instanz innerhalb von MyComponent (und gibst sie ggfs. dort wieder frei)
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