Autor Beitrag
baphumet
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: 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:

ausblenden 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,

ausblenden 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

ausblenden 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.


Zuletzt bearbeitet von baphumet am Sa 26.09.09 18:23, insgesamt 3-mal bearbeitet
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: 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.

ausblenden 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.

ausblenden 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;


Zuletzt bearbeitet von baphumet am Do 01.10.09 19:13, insgesamt 3-mal bearbeitet
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 17:26 
mit
ausblenden Delphi-Quelltext
1:
constructor Create(const a1, a2: Extended);					

und
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: 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.

ausblenden 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.


Zuletzt bearbeitet von baphumet am Do 01.10.09 19:14, insgesamt 1-mal bearbeitet
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 18:39 
Stimmt, da hatte ich auch letztens mal Probleme..

ausblenden 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP
Delphi 7
BeitragVerfasst: 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

ausblenden 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

ausblenden 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.