Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit record


1aa - Do 17.01.13 00:44
Titel: Problem mit record
Arbeite mich gerade etwas weiter in die OOP ein und dazu jetzt eine frage:


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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
unit U_Personen;

[...]
Type
  TStamm = Record
    Anrede : String;
    Nachname : String;
    Vorname : String;
    Geburtsname : String;
    Geburtsdatum : TDate;
    Namenszusatz : String;
  end;

[...] 
  
  End;

  TPersonen = Class 
    Private
[...]
      iStamm : TStamm
                     
    Protected
      function getStamm: TStamm;
      procedure SetStamm(Const Value :TStamm);
    public
[...]
      property Stamm : TStamm read getStamm write setStamm;        
  end;                                

implementation

[...]

Function TPersonen.getStamm:TStamm;
begin
 result.Anrede:='';
end;

Procedure TPersonen.SetStamm;
begin
//
end;

[...]


wenn ich jetzt versuche einen wert zu setzen bekomme ich die fehlermeldung der linken seite kann nichts zu gewiesen werden...


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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
unit Unit1;

interface

uses
 U_Personen
[...]

type
  TForm1 = class(TForm)
    Button1: TButton;
    [...]
    procedure Button1Click(Sender: TObject);
[...]
  private
[...] 
  public
    Personen : TPersonen;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin    
 Personen:=TPersonen.create;
 Personen.Stamm.Anrede := Edit1.text; 

end;

[...]


bestimmt nur wieder ein Denkfehler....
danke für eure Hilfe


Tranx - Do 17.01.13 05:40

user profile icon1aa hat folgendes geschrieben Zum zitierten Posting springen:
Arbeite mich gerade etwas weiter in die OOP ein und dazu jetzt eine frage:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Function TPersonen.getStamm:TStamm;
begin
 Result := iStamm;
end;

Procedure TPersonen.SetStamm(Value : TStamm);  //identisch in der Deklarationszeile!!!
begin
  iStamm := Value;
end;

[...]


Versuche es mal damit.

Am Besten nach dem Schreiben der Property-Zeile in der Klasse CTRL+SHIFT+C drücken. Dann werden sowohl die notwendigen Deklarationen von ReadStamm und SetStamm erzeugt, sowie im Implementation-Teil die Funktion und Prozedur (leer) angelegt.

Und das mit dem Result.Anrede := '' bitte weglassen, weil es dann bei dem Aufruf Stamm := jedesmal sofort die Anrede löscht. Das heißt, dass eine Zuweisung Stamm.Anrede := 'Frau ' nicht funktionert, vor allem, wenn nachher Stamm.Vorname := 'Vera' steht. Du hast a) bei der Funktion nicht wirklich iStamm übergeben und b) dem Wert iStamm etwas übergeben.


Blup - Do 17.01.13 10:56

Der Setter sollte den Record-Parameter schon als "const" übergeben bekommen.

Delphi-Quelltext
1:
procedure SetStamm(const Value: TStamm);                    

Sonst wird zwei mal eine Kopie von TStamm erzeugt, einmal beim Aufruf der Funktion und einmal bei der Zuweisung von iStamm.
Membervariablen werden üblicherweise mit einem "F" am Anfang gekennzeichnet (also eigentlich FStamm).

Diese Zuweisung kann aber dennoch nicht funktionieren:

Delphi-Quelltext
1:
 Personen.Stamm.Anrede := Edit1.text;                    

Es erfolgt keine direkte Zuweisung auf Personen.Stamm, deshalb wird hier nur der Getter aufgerufen.
Dieser erzeugt eine Kopie von iStamm und die Anrede der Kopie würde verändert werden, nicht die von iStamm.
Aktuelle Delphiversionen erkennen das als Unfug und zeigen eine Fehlermeldung.

Wenn TStamm ebenfalls eine Klasse währe, würde die direkte Zuweisung auf Anrede funktionieren, da Objekte immer als Referenz übergeben werden.

Eine Möglichkeit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  lStamm: TStamm;
begin
  lStamm := Personen.Stamm; // Getter aufrufen
  lStamm.Anrede := Edit1.text; // Kopie verändern
  Personen.Stamm := lStamm; // Setter aufrufen
end;


1aa - Do 17.01.13 14:48

Danke jetzt Funktioniert es....

Zitat:
Membervariablen werden üblicherweise mit einem "F" am Anfang gekennzeichnet (also eigentlich FStamm)

wusste ichs doch.... bin immer noch zu blöd zum lesen.... :D ... gleich mal mit korrigiert