![]() |
Delphi-Version: 10.1 Berlin
Zugriffsverletztung nach Methodenaufruf
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,
ich habe ein Problem und weiß einfach nicht mehr weiter. Ich greife von einer UNIT auf eine Methode in einer anderen UNIT über einen Pointer zu:
Code:
Die Methoden werden zum Start aufgerufen.
m_dlg.lblWerkzeug1.Caption := m_pCDeviceWerkzeugauswahl.GetWerkzeug1();
m_dlg.lblWerkzeug2.Caption := m_pCeviceWerkzeugauswahl.GetWerkzeug2(); //m_dlg.lblWerkzeug3.Caption := m_pCDeviceWerkzeugauswahl.GetWerkzeug3(); //m_dlg.lblWerkzeug4.Caption := m_pCDeviceWerkzeugauswahl.GetWerkzeug4(); Bei Methode GetWerkzeug1() und GetWerkzeug2() startet meine Anwendung ganz normal. Jedoch sobald ich GetWerkzeug3() oder ...4() aufrufen möchte (im Code ausgekommentiert), erscheint unten stehender Fehler (siehe png im Anhang). Ich weiß nicht was ich falsch mache. Die Methoden sind alle in der DeviceWerkzeugauswahl vorhanden. Wird hier auf eine eine DCU im Cache zugegriffen? Ich habe alle DCUs gelöscht und neu erzeugt. Hier noch einmal die UNIT auf die ich zugreifen möchte:
Code:
unit UntDeviceWerkzeugauswahl;
interface uses UntDevice, UntExtBoolean, UntUtilities, StrUtils, SysUtils, Types, Classes; const _cl = $00663300; _strSectionPrefix = 'Prog_'; _nMinLengthFA = 7; _nLengthTLNr = 2; _nMaxDescLength = 40; _strAlowedChars = '0123456789-'; _splitChar = '#|#'; _splitChar2 = '#~#'; type pCDeviceWerkzeugauswahl = ^CDeviceWerkzeugauswahl; CDeviceWerkzeugauswahl = class(CDevice) private m_strWerkzeug1 : String; m_strWerkzeug2 : String; m_strWerkzeug3 : String; m_strWerkzeug4 : String; public constructor Create(); reintroduce; destructor Destroy(); override; function GetWerkzeug1():String; procedure SetWerkzeug1(i_strWerkzeug1: String); function GetWerkzeug2():String; procedure SetWerkzeug2(i_strWerkzeug2: String); function GetWerkzeug3():String; procedure SetWerkzeug3(i_strWerkzeug3: String); function GetWerkzeug4():String; procedure SetWerkzeug4(i_strWerkzeug4: String); end; implementation constructor CDeviceWerkzeugauswahl.Create(); begin inherited Create(); ResetData(); end; destructor CDeviceWerkzeugauswahl.Destroy(); begin inherited Destroy(); end; procedure CDeviceWerkzeugauswahl.SetWerkzeug1(i_strWerkzeug1: String); begin m_strSetWerkzeug1 := i_strWerkzeug1; end; function CDeviceWerkzeugauswahl.GetWerkzeug1: String; begin result := m_strWerkzeug1; end; ....restlichen Methoden GetWerkzeug1 SetWerkzeug1 GetWerkzeug2 SetWerkzeug2 GetWerkzeug3 SetWerkzeug3 end. Den selben Fehler hatte ich auch schon einmal, als ich in der selben UNIT eine Zeile mit einer neuen Variable hinzugefügt habe. Als ich die Zeile wieder entfernt habe war der Fehler wieder weg. Was könnte das nur sein ? |
AW: Zugriffsverletztung nach Methodenaufruf
ist den m_pCDeviceWerkzeugauswahl angelegt worden
Delphi-Quellcode:
m_pCDeviceWerkzeugauswahl := CDeviceWerkzeugauswahl.Create;
|
AW: Zugriffsverletztung nach Methodenaufruf
Jupp, dass $000000xx ist schon ein Hinweis auf ein nil (nil+offset).
Warum die Klasse nicht mit T? Bei
Delphi-Quellcode:
hätten Viele wohl erst gedacht, du nimmst
CDeviceWerkzeugauswahl.Create;
Delphi-Quellcode:
anstatt
Variable.Create
Delphi-Quellcode:
.
TKlasse.Create
Klassen/KlassenInstanzen sind intern bereits "Zeiger" Lass den Mist mit Pointern weg. Beim Pointer zeigst du auf die Variable, wo der Objektzeiger gespeichert wurde, nicht auf das Objekt. Und war die Variable z.B. eine Lokale, dann gibt es sie später garnicht mehr. PS: Alt+Druck, kopiert nur das aktive Fenster, aber lass hier das Bild auch weg. Strg+C kopiert den Dialog-Inhalt als Text und dann einfach hier ein Strg+V mit [QUOTE]...[/QUOTE] drumrum. |
AW: Zugriffsverletztung nach Methodenaufruf
Passiert das auch, wenn du das Programm im Debugger startest?
Wenn ja... Wie sieht denn der Stacktrace in Delphi aus, wenn der Fehler auftritt? Und in welcher Zeile wird die Exception ausgelöst? |
AW: Zugriffsverletztung nach Methodenaufruf
Zitat:
Der Zeiger auf die Objektreferenz ist was anderes als die Objektreferenz. Obiger Code schreibt die Objektrefenz in den Zeiger auf die Objektreferenz. Wie Himitsu würde ich auch raten, den "Pointer-Mist" wegzulassen. Macht es nur unnötig kompliziert. Man braucht z.B. noch eine weitere Variable, auf der Pointer dann zeigt. Diese darf dann z.B. auch nicht auf dem Stack liegen bzw. gelegen haben..., sonst steht da schnell wieder was anderes drin. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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-2025 by Thomas Breitkreuz