![]() |
Accessviolation in Klassen-Prozedur
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? |
Re: Accessviolation in Klassen-Prozedur
wahrscheinlich ist wertsetzen.valueset.Edit_L oder wertsetzen.valueset oder wertsetzen nil bzw. verweist ins nirvana
|
Re: Accessviolation in Klassen-Prozedur
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.
|
Re: Accessviolation in Klassen-Prozedur
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 :) |
Re: Accessviolation in Klassen-Prozedur
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 - ![]() 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 - |
Re: Accessviolation in Klassen-Prozedur
zeig mal die deklaration von diesem "wertsetzen" bzw. auch wo die variable steht.
|
Re: Accessviolation in Klassen-Prozedur
Also erstmal sorry für evt. falsche Begriffe oder ähnliches :oops:
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. |
Re: Accessviolation in Klassen-Prozedur
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* :) |
Re: Accessviolation in Klassen-Prozedur
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 :) |
Re: Accessviolation in Klassen-Prozedur
Zitat:
Delphi-Quellcode:
irgend einen sinn?
fi: Integer;
property i: integer read fi write fi; edit: Zitat:
p.s.: es gibt auch einen compilerschalter, der bewirkt, dass ein Real einem Real48 entspricht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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