Autor Beitrag
1aa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: Do 17.01.13 00:44 
Arbeite mich gerade etwas weiter in die OOP ein und dazu jetzt eine frage:

ausblenden volle Höhe 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...

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:

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

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 176
Erhaltene Danke: 44



BeitragVerfasst: Do 17.01.13 10:56 
Der Setter sollte den Record-Parameter schon als "const" übergeben bekommen.
ausblenden 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:
ausblenden 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:
ausblenden 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;

Für diesen Beitrag haben gedankt: 1aa
1aa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: 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