![]() |
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. |
Re: Accessviolation in Klassen-Prozedur
es kann ja sein das er in einer späteren version seines programmes IRGENDeinen vergleich braucht, um fehler zu vermeiden - und - ich habe im implementation teil einfach die parameter weggelassen weil ich zu faul zum tippsen war -
[edit] Zitat:
[/edit |
Re: Accessviolation in Klassen-Prozedur
Zitat:
aber so eine property wie ich sie gepostet habe (die also per read und write direkt mit einer variablen verbunden ist) macht doch aber tatsächlich keinen sinn, oder? Zitat:
|
Re: Accessviolation in Klassen-Prozedur
Also ich übergeb jetzt die Werte in die procedure. Die sieht jetzt so aus:
Delphi-Quellcode:
Jetzt hab ich zum einen noch das Problem dass die Werte a und b Integer sein müssen. Sollte ich vielleich runden?!? Aber nun hab ich das Problem "Ungültige Gleitkommaoperation in der Zeile wo b berechnet wird....
procedure TSchieber.DrawLine(Canvas: TCanvas; a,l,r: double);
begin //Berechnung der Strecken b := sqrt(sqr(l)-sqr(a)); //Berechnung der Koordinaten canvas.MoveTo(center.x, center.y + b); canvas.LineTo(center.x + a, center.y); end; :( |
Re: Accessviolation in Klassen-Prozedur
Zitat:
btw: Selbst eine Property, die per "read fFeld" deklariert ist, sollte im Code auch nur als Property und nicht als Feld verwendet werden. Es sollte dadurch keine Performanceprobleme geben und du hast wieder die Verwendung soweit vom Feld getrennt, das spätere Änderungen in einem Getter möglich sind... Ist es eine readonly Property muss man natürlich das Feld zum Schreiben nehmen. ;) Außerdem könnte man die Property in den published Teil schieben, wenn man das Delphi streaming system bzw. RTTI verwenden will. ;) kurz gesagt: Barfoos hat das schon ganz richtig gemacht. Und es sieht hübscher aus... :mrgreen: |
Re: Accessviolation in Klassen-Prozedur
Zitat:
Grüße vom marabu PS: Berechnung einer Strecke? Sqrt(Abs(...)) |
Re: Accessviolation in Klassen-Prozedur
Zitat:
|
Re: Accessviolation in Klassen-Prozedur
Zitat:
Zitat:
p.s.: [OT] ist das normal dass beim Firefox im eingabefeld (also da wo ich jetzt gerade tippe) der cursor so "laggt"? das nervt allmählich wie sau! :kotz: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 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