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
  //mach irgendetwas

  result:=TKlasse3.Create(a1,Korrektur(a2)); //funzt nicht
end;


aber so schon


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function TKlasse3.M1(a1,a2: TKlasse):TKlasse;override;
begin
  //mach irgendetwas
  a2:=Korrektur(a2);
  result:=TKlasse3.Create(a1,a2); //funzt
end;


aber Korrektur ist eine Funktion die einen Rückgabetyp hat und es müsste doch funktionieren, oder nicht?

Moderiert von user profile iconNarses: Ü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); //funzt auch nicht
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);
  //Anschließende Ausgabe=(4,1.858)
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>0then 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>180or (alpha1<=-180then begin
            alpha1:=alpha1-360*(int(alpha1/360));
            if ((ABS(alpha1)>180or (alpha1=-180)) then
                if (alpha1=-180then 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; // Haltepunkt hier: y hat den richtigen Wert
end;

var
  z: Irgendwas;
begin
  b(z);
  Beep; // Haltepunkt hier: z ist undefiniert, wurde also nicht richtig zurückgegeben
        // Ich sag mal "Bug"  
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); // jetzt stimmt 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
  //mach irgendetwas
  result:=TPolarform.Create(a1,Winkelkorrektur(a2)); //funzt nicht
end;


dieses Konstrukt


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function TPolarform.M1(a1,a2: TKlasse):TKlasse;override;
begin
  //mach irgendetwas
  a2:=Winkelorrektur(a2);
  result:=TPolarform.Create(a1,a2);
 //funzt
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.