AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletztung nach Methodenaufruf

Ein Thema von OptPrime · begonnen am 4. Feb 2022 · letzter Beitrag vom 6. Feb 2022
Antwort Antwort
OptPrime

Registriert seit: 10. Mär 2021
3 Beiträge
 
#1

Zugriffsverletztung nach Methodenaufruf

  Alt 4. Feb 2022, 11:04
Delphi-Version: 10.1 Berlin
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 ?
Miniaturansicht angehängter Grafiken
fehler.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Zugriffsverletztung nach Methodenaufruf

  Alt 4. Feb 2022, 11:16
ist den m_pCDeviceWerkzeugauswahl angelegt worden
m_pCDeviceWerkzeugauswahl := CDeviceWerkzeugauswahl.Create;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zugriffsverletztung nach Methodenaufruf

  Alt 4. Feb 2022, 11:29
Jupp, dass $000000xx ist schon ein Hinweis auf ein nil (nil+offset).

Warum die Klasse nicht mit T?
Bei CDeviceWerkzeugauswahl.Create; hätten Viele wohl erst gedacht, du nimmst Variable.Create anstatt 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Feb 2022 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Zugriffsverletztung nach Methodenaufruf

  Alt 5. Feb 2022, 21:41
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?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
18 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zugriffsverletztung nach Methodenaufruf

  Alt 6. Feb 2022, 10:28
ist den m_pCDeviceWerkzeugauswahl angelegt worden
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.

Geändert von archimedix ( 6. Feb 2022 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 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