Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit Objekten
baphumet - Sa 26.09.09 16:07
Titel: Probleme mit Objekten
Hi,
alle zusammen, ich hab ein etwas größeres Projekt geschrieben und in Units unterteilt und benutze dabei Delphi Version 7. Das grafische funktioniert einwandfrei doch das worauf es ankommt nicht.
Ich besitze 4 Klassen, jeweils drei sind von der ersten Klasse abgeleitet, die erste ist sozusagen eine abstrakte Klasse, die Methoden werden entsprechenden später implementiert und besitzt 6 Attribute auf die die abgeleiteten Klassen zugreifen können.
Es sieht wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| TKlasse=class private a,b,c,d,e,f: EXTENDED; public function M1(a1,a2: TKlasse):TKlasse:virtual;abstract; function M2(a1,a2: TKlasse):TKlasse:virtual;abstract; ...
TKlasse2=class(TKlasse) public constructor create(a1,a2: EXTENDED); function M1(a1,a2: TKlasse):TKlasse;override; function M2(a1,a2: TKlasse):TKlasse;override; ...
TKlasse3=class(TKlasse) public constructor create(a1,a2: EXTENDED); function Korrektur(a1: EXTENDED):EXTENDED; function M1(a1,a2: TKlasse):TKlasse;override; function M2(a1,a2: TKlasse):TKlasse;override; ... TKlasse4=class(TKlasse) public constructor create(a1,a2: EXTENDED); function Korrektur(a1: EXTENDED):EXTENDED; function M1(a1,a2: TKlasse):TKlasse;override; function M2(a1,a2: TKlasse):TKlasse;override; |
Desweiteren befindet sich eine Methode nur in den Klassen TKlasse3 und TKlasse 4, diese wird nur dort benötigt und deshalb habe ich Sie dort deklariert, mit dieser gibt es Probleme, rufe ich Sie nämlich wie folgt auf kommt nicht das erwartete Ergebnis, als wäre die Methode Korrektur nie aufgerufen worden.
Hier ein Beispiel,
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function TKlasse3.Korrektur(a1: EXTENDED):EXTENDED; begin a1:=2*a1+3; result:=a1; end;
function TKlasse3.M1(a1,a2: TKlasse):TKlasse;override; begin result:=TKlasse3.Create(a1,Korrektur(a2)); end; |
aber so schon
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function TKlasse3.M1(a1,a2: TKlasse):TKlasse;override; begin a2:=Korrektur(a2); result:=TKlasse3.Create(a1,a2); end; |
aber Korrektur ist eine Funktion die einen Rückgabetyp hat und es müsste doch funktionieren, oder nicht?
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Tryer - Sa 26.09.09 16:39
Du kannst die Parameter an den Constructor als "const" übergeben. Korrektur hat zwar einen Rückgabewert, aber Delphi mag nicht das die Möglichkeit besteht an a2 (und somit an die Funktion) etwas zuzuweisen. Bei "const" - Parametern geht das eh nicht, darum darf die Funktion da dann stehen.
baphumet - Sa 26.09.09 17:16
Also funktioniert das auf diese Weiße nicht wie ich mir das vorgestellt habe? Dann habe ich anstatt in jeder Methode meine Winkelkorrektur aufzurufen dies in den Constructor verlegt, das sieht dann so aus.
Delphi-Quelltext
1: 2: 3: 4:
| constructor TKlasse3.create(a1,a2: EXTENDED); begin a2:=Winkelkorrektur(a2); end; |
Es funktioniert nicht wenn ich alles zusammen starte, also Methoden aufgerufen werden wie (M1,M2,...) und diese als Rückgabewert Objekt vom Typ TKlasse3 zurückgeben. Behalte ich den obigen Code bei anstatt des anderen aus dem ersten Post dann funktioniert es, das heißt für mich der Fehler muß bei den Methoden (M1,M2,...) an dem Punkt liegen wo etwas zurückgegeben wird, also genauso schlau wie vorher.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Form1.Button1Cick(Sender: TObject); var z1: TKlasse1; begin z1:=TKlasse4.Create(4,5); end; |
Tryer - Sa 26.09.09 17:26
mit
Delphi-Quelltext
1:
| constructor Create(const a1, a2: Extended); |
und
Delphi-Quelltext
1: 2: 3: 4:
| function TKlasse3.Korrektur(const a1: Extended): Extended; begin Result := 2 * a1 + 3; end; |
sollte es doch eigentlich klappen
baphumet - Sa 26.09.09 18:09
Nee, das klappt auch nicht, egal was ich eingebe als Ergebnis erhalte ich immer eine Null, hier mein richtiger Quelltext, das andere waren Beispiele. Ich habe zwei Zahlen a und b diese bilden ein Wertepaar, der Teil b stellt einen Winkel dar und dieser soll normalisiert werden, deshalb meine Funktion mit entsprechendem Namen Winkelkorrektur, handelt sich um Polarform Komplexer Zahlen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| constructor TPolarform.Create(r1,alpha1: EXTENDED); begin if (r1>0) then begin r:=r1; alpha:=alpha1; end else raise ERangeError.Create('Betrag hat den Wert 0'); end;
function TPolarform.Winkelkorrektur(alpha1: EXTENDED):EXTENDED; begin if (alpha1>180) or (alpha1<=-180) then begin alpha1:=alpha1-360*(int(alpha1/360)); if ((ABS(alpha1)>180) or (alpha1=-180)) then if (alpha1=-180) then alpha1:=180 else alpha1:=alpha1-360*ABS(alpha1)/alpha1; end; result:=alpha1; end; end; |
Die anderen Funktionen rufen dann diese beiden Funktionen auf.
Tryer - Sa 26.09.09 18:39
Stimmt, da hatte ich auch letztens mal Probleme..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure a(var x: Irgendwas); begin x := x + abc; end;
procedure b(var y: Pointer); begin a(y); Beep; end;
var z: Irgendwas; begin b(z); Beep; end; |
das ganze hab ich dann darüber gelöst das ich an Stelle der var - Parameter Funktionen genommen habe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function a(const x: Irgendwas): Irgendwas; begin Result := x + abc; end;
procedure b(var y: Pointer); begin y := a(y); end;
var z: Irgendwas; begin b(z); end; |
baphumet - So 27.09.09 17:19
Hi,
hab das Problem wie folgt gelöst, so wie in meinem ersten Post, der Constructor und die Winkelkorrektur bleiben so wie Sie sind und in der entsprechenden Methode nutze ich statt
Delphi-Quelltext
1: 2: 3: 4: 5:
| function TPolarform.M1(a1,a2: TKlasse):TKlasse;override; begin result:=TPolarform.Create(a1,Winkelkorrektur(a2)); end; |
dieses Konstrukt
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function TPolarform.M1(a1,a2: TKlasse):TKlasse;override; begin a2:=Winkelorrektur(a2); result:=TPolarform.Create(a1,a2); end; |
und es funktioniert und das Problem ist aus dem Weg.
Danke für deine Mühe und Hilfe, ich weiß das sehr zu schätzen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!