Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletztung nach Methodenaufruf (https://www.delphipraxis.net/209889-zugriffsverletztung-nach-methodenaufruf.html)

OptPrime 4. Feb 2022 11:04

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:
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();
Die Methoden werden zum Start aufgerufen.

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 ?

Bernhard Geyer 4. Feb 2022 11:16

AW: Zugriffsverletztung nach Methodenaufruf
 
ist den m_pCDeviceWerkzeugauswahl angelegt worden
Delphi-Quellcode:
m_pCDeviceWerkzeugauswahl := CDeviceWerkzeugauswahl.Create;

himitsu 4. Feb 2022 11:29

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:
CDeviceWerkzeugauswahl.Create;
hätten Viele wohl erst gedacht, du nimmst
Delphi-Quellcode:
Variable.Create
anstatt
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.

jaenicke 5. Feb 2022 21:41

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?

archimedix 6. Feb 2022 10:28

AW: Zugriffsverletztung nach Methodenaufruf
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1501702)
ist den m_pCDeviceWerkzeugauswahl angelegt worden
Delphi-Quellcode:
m_pCDeviceWerkzeugauswahl := CDeviceWerkzeugauswahl.Create;

wenn das tatsächlich so angelegt wurde und m_pCDeviceWerkzeugauswahl der Pointer ist, ist das der Fehler!

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:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz