AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Accessviolation in Klassen-Prozedur
Thema durchsuchen
Ansicht
Themen-Optionen

Accessviolation in Klassen-Prozedur

Ein Thema von knusprig · begonnen am 19. Jul 2005 · letzter Beitrag vom 19. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
knusprig

Registriert seit: 8. Sep 2004
Ort: Coburg
12 Beiträge
 
Delphi 5 Enterprise
 
#1

Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:42
Hi,

ich hab ein kleines Problemchen mit meinem Programm. Es geht um folgenden Quellcode.

Delphi-Quellcode:
type TGraph = class(TObject)
  //Felder
  xlength : integer;
  ylength : integer;
  center : TPoint;
  //Methoden
  procedure DrawAxes(Canvas: TCanvas; center: TPoint; xlength, ylength: integer);
  procedure DrawHorzMarkers(Canvas: TCanvas; Left: TPoint; len: Integer);
  procedure DrawVerMarkers(Canvas: TCanvas; Top: TPoint; len: Integer);
end;

//*****************************************************************************
//Klassendefinition von TSchieber
//*****************************************************************************
type TSchieber = class(TGraph)
  //Felder
  l : real; //Vom Benutzer angegeben
  r : real; //Vom Benutzer angegeben
  a : real; //Strecke von 0 bis Berührung auf x
  b : real; //Strecke von 0 bis Berührung auf y
  px : real; //X-Wert des Punktes P
  py : real; //Y-Wert des Punktes P
  rad : real; //Radius des Kreises um den Punkt P
  richtung : boolean; //Richtung des Doppelschiebers
  //Methoden
  procedure DrawLine(Canvas: TCanvas; a: integer);
end;


implementation

.........
.........

procedure TSchieber.DrawLine(Canvas: TCanvas; a: integer);
begin
  //Berechnung der Strecken
  l := strtoint(wertsetzen.valueset.Edit_L.text);
  r := strtoint(wertsetzen.valueset.Edit_R.text);
  b := (sqrt(sqr(l)-sqr(a)));

  //Berechnung der Koordinaten
  canvas.MoveTo(center.x, center.y + trunc(b));
  canvas.LineTo(center.x + a, center.y);

end;

In der Zeile, in der l den Wert aus Edit_L zugewiesen bekommt, erhalte ich beim compilen eine Access Violation. Kann mir jemand sagen warum und was ich dagegen machen kann?
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:47
wahrscheinlich ist wertsetzen.valueset.Edit_L oder wertsetzen.valueset oder wertsetzen nil bzw. verweist ins nirvana
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:51
Es ist nicht wirklich im Sinne von OOP, dass sich eine Klasse selbstständig Parameter aus einem Formular (erst recht nicht aus der globalen Variable) heraussucht. Du solltest l und b lieber als Paramater übergeben oder Properties anlegen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
knusprig

Registriert seit: 8. Sep 2004
Ort: Coburg
12 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:52
Nein, eigentlich nicht. Das befindet sich in einem anderen Formular. Also da kann es normalerweise nicht dran liegen.

Das mit den properties hab ich mir auch schon gedacht. Hab ich auch probiert aber nicht hinbekommen. Kann mir jemand sagen wie ich das genau schreiben muss. Bin noch ein Delphi-Neuling
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#5

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:53
1. beim compilen bekommst nen EAccessViolation? das halt ich fürn gerücht eher bei der ausführung deines codes
2. hat dir mammi nich erklärt in klassen ein/ausgabe methoden von den reinen datenverarbeitenden methoden zu trennen?
3. klassenprozedur wäre was anderes "class procedure" - war etwas verwirrt beim öffnen dieses dingsens hier
4. wie man objekt orientiert programmiert - http://www.delphibasics.co.uk/Article.asp?Name=OO - das solltest dir eventuell mal zu gemüte führen
5.

Delphi-Quellcode:
type
  TGraph = class{(TObject)}
  private
    FXLength: integer;
    FYLength: integer;
    FCenter: TPoint;
    FCanvas: TCanvas;
    procedure SetXLength(const Value: integer);
    procedure SetYLength(const Value: integer);
    procedure SetCenter(const Value: TPoint);
  public
    constructor Create(ACanvas: TCanvas);
    procedure DrawAxes;
    procedure DrawHorzMarkers(Left: TPoint; Len: integer);
    procedure DrawVertMarkers(Top: TPoint; Len: integer);
    property XLength: integer read FXLength write SetXLength;
    property yLength: integer read FYLength write SetYLength;
    property Center: TPoint read FPoint write SetPoint;
    property Canvas: FCanvas write FCanvas;
  end;

implementation

constructor TGraph.Create(ACanvas: TCanvas);
begin
  inherited Create;
  FCanvas := ACanvas;
end;

procedure TGraph.SetXLength;
begin
  if FXLength <> Value then
    FXLength := Value;
end;

procedure TGraph.SetYLength;
begin
  if FYLength <> Value then
    FYLength := Value;
end;

procedure TGraph.SetCenter;
begin
  if (FCenter.X <> Value.X) or (FCenter.Y <> Value.Y) then
    FCenter := Value;
end;

procedure TGraph.DrawAxes;
begin
  if not Assigned(FCanvas) then
    Exit;
  with FCanvas do begin
    // hier der malkrams
  end;
end;

// bei den andern Draw* isses dann dasselbe, und du greifst auf FXLength, FYLength & FCenter zurück -
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 15:53
zeig mal die deklaration von diesem "wertsetzen" bzw. auch wo die variable steht.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
knusprig

Registriert seit: 8. Sep 2004
Ort: Coburg
12 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 16:00
Also erstmal sorry für evt. falsche Begriffe oder ähnliches
Hab sämtliches Delphi-Wissen aus einem Buch, und es ist jetzt schon ein bißchen her dass ich das gelesen hab.

Also in wertsetzen is bis jetzt noch nichts weiter drin als zwei Eingabefelder für die Werte l und r. Mehr ist da nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 16:02
Hmmm, ich weiß nicht wieso du das machst, aber die Variablen in deiner TGraph-Klasse sind real.
Dann weist du ihnen über StrToInt einen Wert aus einem Edit zu.
Dieses Edit solltest du vorher auf gültige Integerwerte überprüfen.
Und was mich stutzig macht: Du deklarierst die Variablen als real aber weist ihnen bloß Inter-Werte zu: Speicherverschwendung

Außerdem ist der Typ real nur noch aus Kompatibilitätsgründen da, verwende besser single, double oder extended, die sind für den Prozessor schneller verarbeitbar


Mir fällt auf: Ein Delphiprogrammierer aus Coburg *freu*
Julian J. Pracht
  Mit Zitat antworten Zitat
knusprig

Registriert seit: 8. Sep 2004
Ort: Coburg
12 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 16:15
Hm, da hast du recht. Hab das ganze schon zu real geändert. Werde jetzt mal versuchen, die Werte übergeben zu lassen.

Ui, noch ein Coburger
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Accessviolation in Klassen-Prozedur

  Alt 19. Jul 2005, 16:23
Zitat von barf00s:
Delphi-Quellcode:
procedure TGraph.SetXLength;
begin
  if FXLength <> Value then
    FXLength := Value;
end;
was bringt das denn? wenn du den wert direkt setzt ohne überprüfung, ändert sich auch nichts, und du sparst dir den vergleich. und dannn kannst du dir gleich die ganze procedure und (meiner meinung nach) auch die property sparen und direkt die variable benutzen - oder hat eine property a la
Delphi-Quellcode:
fi: Integer;
property i: integer read fi write fi;
irgend einen sinn?

edit:
Zitat von Ultimator:
Außerdem ist der Typ real nur noch aus Kompatibilitätsgründen da, verwende besser single, double oder extended, die sind für den Prozessor schneller verarbeitbar Wink
stimmt nicht so ganz - standardmäßig entspricht ein Real einem Double, d.h. du kannst ruhig Real verwenden, damit kommt die FPU von sich aus schon klar. du meisnt wahrscheinlich den alten TurboPascal-Real mit 48Bit und einem Borland-eigenen format, mit dem die FPU so nicht klarkommt und der erst umgewandelt werden muss (was natürlich zeit kostet). den gibt es unter delphi (aus welchen grunden auch immer) noch immer, er heisst Real48.

p.s.: es gibt auch einen compilerschalter, der bewirkt, dass ein Real einem Real48 entspricht.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:14 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