AGB  ·  Datenschutz  ·  Impressum  







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

Zugriffsverletzung - Warum?

Ein Thema von hagi2 · begonnen am 24. Mär 2004 · letzter Beitrag vom 25. Mär 2004
Antwort Antwort
hagi2

Registriert seit: 21. Dez 2003
16 Beiträge
 
#1

Zugriffsverletzung - Warum?

  Alt 24. Mär 2004, 18:52
Steht die Deklaration von SpielfeldF in Unit2 in der Procedure (ich hab es jetzt mal mit Kommentar markiert), dann läuft alles. Verschieb ich die Deklaration in die Klasse TTest, dann kommt eine Zugriffsverletzung. Warum? Was ist da falsch? Wär nett, wenn mir das jemand sagen könnte...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Test: TTest;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Test.anzeigen(Form1, Form1);
end;

end.
Delphi-Quellcode:
unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
TTest = class
  procedure anzeigen(Formular: TComponent; Kontrolle: TWinControl);
  end;



implementation
procedure TTest.anzeigen(Formular: TComponent; Kontrolle: TWinControl);
var
//SpielfeldF: TImage;
begin
SpielfeldF := TImage.Create(Formular);
SpielfeldF.Parent := Kontrolle;
SpielfeldF.Width := 200;
SpielfeldF.Height := 400;
SpielfeldF.Top := 100;
SpielfeldF.Left := 200;
SpielfeldF.Visible := true;

SpielfeldF.Canvas.Pen.Color := RGB(100,100,100);
SpielfeldF.Canvas.Rectangle(0,0,SpielfeldF.Height, SpielfeldF.Width);
end;
 end.
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#2

Re: Zugriffsverletzung - Warum?

  Alt 24. Mär 2004, 19:09
hallo hagi2,

so vom blosen Hingucken: du mußt die Instanz Test vom Typ TTest erst erzeugen, z.B. mit

  Test := TTest.Create(nil); wobei die Frage berechtigt ist, warum es eine AV gibt, wo TTest keine Variablen besitzt, die Methoden aber bekannt sein müßten, auch wenn Test nil ist ?!?

Roderich
  Mit Zitat antworten Zitat
hagi2

Registriert seit: 21. Dez 2003
16 Beiträge
 
#3

Re: Zugriffsverletzung - Warum?

  Alt 24. Mär 2004, 20:44
Moment. So wies jetzt da steht funktionierts ja. Da gehts auch ohne Create und TTest besitzt wirklich keine Variablen.
Aber: Ich will ja, dass die Deklaration "SpielfeldF: TImage;" direkt in TTest steht.
Dann hat TTest eine Variable und dann funktionierts nicht mehr(Acess Violation)! Ich weiss nicht warum und hab scho mehrmals dran rumgebastelt, aber es ändert nix.
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#4

Re: Zugriffsverletzung - Warum?

  Alt 24. Mär 2004, 21:29
hallo,

Mich wundert es stark, dass es ohne Create gehen soll. Du musst doch Test erzeugt haben.
Schau mal was passiert, wenn SpielFeldF eine Klassenvariable ist und du Test erzeugst

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Zugriffsverletzung - Warum?

  Alt 24. Mär 2004, 23:15
Moin Hagi,

Zitat von hagi2:
So wies jetzt da steht funktionierts ja.
das stimmt zwar (ich hab's mal ausprobiert), aber ich kann mir beim besten Willen nicht erklären warum
Eigentlich müsste der Aufruf eine Exception erzeugen (Acces Violation), da die Variable Test den Wert nil enthält.
Da scheint der Compiler "Gnade vor Recht" ergehen zu lassen
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
hagi2

Registriert seit: 21. Dez 2003
16 Beiträge
 
#6

Re: Zugriffsverletzung - Warum?

  Alt 25. Mär 2004, 13:08
Ok, aber was ist jetzt wenn ich die Deklaration direkt in die Klasse verschieb. Warum gehts dann nicht mehr, und wie gehts wieder?
  Mit Zitat antworten Zitat
hagi2

Registriert seit: 21. Dez 2003
16 Beiträge
 
#7

Re: Zugriffsverletzung - Warum?

  Alt 25. Mär 2004, 18:04
Jetzt hats doch noch funktioniert. Danke für eure Hilfe
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Zugriffsverletzung - Warum?

  Alt 25. Mär 2004, 18:13
Zitat von Christian Seehase:
das stimmt zwar (ich hab's mal ausprobiert), aber ich kann mir beim besten Willen nicht erklären warum
Eigentlich müsste der Aufruf eine Exception erzeugen (Acces Violation), da die Variable Test den Wert nil enthält.
Da scheint der Compiler "Gnade vor Recht" ergehen zu lassen
Er läßt nicht Gnade vor Recht ergehen, sondern der Code greift nicht auf Self zu, welches NIL ist.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#9

Re: Zugriffsverletzung - Warum?

  Alt 25. Mär 2004, 18:46
Neolithos hat Recht (was ich auch vermutet hatte): dieser Code erzeugt keine AV:

Delphi-Quellcode:
MyClass := nil;
MyClass.CallMyProcedure(Dingens);
Da die Methode immer im Code-Segment vorhanden ist, braucht MyClass nicht assigned zu sein. Knatschen würde dagegen

Delphi-Quellcode:
MyClass := nil;
MyClass.MyProp := 0;
sauber fänd ich es trotzdem nicht, die Instanz nicht zu erzeugen, aber ihre Methoden aufzurufen.

Roderich
  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 13:21 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