| Autor |
Beitrag |
baphumet
      
Beiträge: 44
Windows XP
Delphi 7
|
Verfasst: Sa 26.09.09 16:07
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.
Zuletzt bearbeitet von baphumet am Sa 26.09.09 18:23, insgesamt 3-mal bearbeitet
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: 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 
      
Beiträge: 44
Windows XP
Delphi 7
|
Verfasst: 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; |
Zuletzt bearbeitet von baphumet am Do 01.10.09 19:13, insgesamt 3-mal bearbeitet
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: 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 
      
Beiträge: 44
Windows XP
Delphi 7
|
Verfasst: 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.
Zuletzt bearbeitet von baphumet am Do 01.10.09 19:14, insgesamt 1-mal bearbeitet
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Sa 26.09.09 18:39
|
|
baphumet 
      
Beiträge: 44
Windows XP
Delphi 7
|
Verfasst: 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.
|
|
|