Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Deklaration eines Property


Karl1997 - Do 09.02.12 13:15
Titel: Deklaration eines Property
Moderiert von user profile iconMartok: Abgetrennt von [url=http://www.delphi-forum.de/viewtopic.php?p=658651]hier[/url]

danke klappt. jetzt gleich das zweite problem in der übung. wieso geht das nicht? als fehlermeldung kommt inkompatible typen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TTestbmp = class(TBitmap)
  private
    function sc(p: Integer): TBitmap;
  public
    property Scale: TBitmap read sc; //<- hier


das ist fast so wie in der übung, nur da ist es string und nicht bitmap. der zeiger bleibt hinter read sc; stehen
Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


René R.Fo. - Do 09.02.12 15:42

Karl1997

Für jedes Thema eine Frage...

PS: read muss soweit ich das noch weiß eine feste Var sein...(kann ich aber nett genau sagen)

Grüße René


Karl1997 - Do 09.02.12 16:39

Bei write gibt es die gleichen Probleme

Das funktioniert


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:
type
  TTestKlasse = class
  private
    FZugriffe: Integer;
    FText: string;
    procedure SetzeString(Neu: string);
  public
    property SchreibZugriffe: Integer read FZugriffe;   // nur lesbar
    property Text: string read FText write SetzeString; // les- und schreibbar
  end;

procedure TTestKlasse.SetzeString(Neu: string);
begin
  FText := Neu;
  Inc(FZugriffe);
end;

var
  TestKlasse: TTestKlasse;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TestKlasse := TTestKlasse.Create;
  with TestKlasse do
  begin
    Text := 'Hallo!';
    ShowMessage(IntToStr(SchreibZugriffe) + ', ' + Text);
    Text := 'Und auf Wiedersehen!';
    ShowMessage(IntToStr(SchreibZugriffe) + ', ' + Text);
  end;
  TestKlasse.Free;
end;


und das nicht


Delphi-Quelltext
1:
2:
3:
4:
5:
  private
    Fb: TBitmap;
    procedure sc(p: Integer);
  public
    property Scale: TBitmap read Fb write sc;


SvenAbeln - Do 09.02.12 17:52

Fällt dir was auf?

Delphi-Quelltext
1:
2:
3:
4:
5:
  private
    Fb: TBitmap;
    procedure sc(p: Integer);
  public
    property Scale: TBitmap read Fb write sc;

Du willst ein TBitmap lesen aber einen Integer schreiben.


Karl1997 - Do 09.02.12 22:09

Das klingt logisch und klappt jetzt auch. Nur mal prüfen ob ich das richtig kapiert habe... ist das so, dass man bei property bei read und write keine zusätzlichen Parameter mitgeschickt kann, immer nur passend? Wenn ich dem jetzt sagen will, dass ich ein 70% Bild haben will, muss ich den Umweg über einen weiteren prozent property machen? Wenn das so ist, dann habe ich das kapiert. Wie geht das aber bei sowas wie AddObject. Die haben zwei Parameter.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Ich glaube der Groschen ist gefallen... bei AddObject wird nur etwas übergeben und dazu reicht eine Prozedur. Obwohl das auch eine Eigenschaft ist, aber kein property, das wiederum Eigenschaft bedeutet. Ist noch alles etwas verwirrend.


Martok - Fr 10.02.12 04:00

user profile iconRené R.Fo. hat folgendes geschrieben Zum zitierten Posting springen:
Für jedes Thema eine Frage...

Deswegen abgetrennt. Bitte in Zukunft beachten! :zwinker:


user profile iconKarl1997 hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube der Groschen ist gefallen... bei AddObject wird nur etwas übergeben und dazu reicht eine Prozedur. Obwohl das auch eine Eigenschaft ist, aber kein property, das wiederum Eigenschaft bedeutet. Ist noch alles etwas verwirrend.

Nicht ganz: eine Prozedur eines Objekts ist eine Methode. Eine Eigenschaft ist ein Property ist eine Eigenschaft, das stimmt ;)

Grundsätzlich also: wenn etwas passieren soll, brauchst du eine Methode (procedure oder function je nachdem, ob du einen Rückgabewert brauchst). Geht es um Eigenschaften, ist ein Property gefragt.

Wenn du z.B. deine TestKlasse von weiter oben um etwas erweitern möchtest, mit dem sie sich selbst ausgeben kann, dann ist das eine Methode:

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:
type
  TTestKlasse = class
  private
    // . . .
  public
    // . . .
    procedure InfoPopup;
  end;

procedure TTestKlasse.InfoPopup;
begin
  ShowMessageFmt('Inhalte: %s, Geschrieben %d mal',[FText, FZugriffe]);
end;

var
  TestKlasse: TTestKlasse;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TestKlasse := TTestKlasse.Create;
  try   // Resourcenschutzblöcke nicht vergessen
    // with ist böse, weil unübersichtlich
    TestKlasse.Text := 'Hallo!';
    TestKlasse.InfoPopup;
    TestKlasse.Text := 'Und auf Wiedersehen!';
    TestKlasse.InfoPopup;
  finally
    TestKlasse.Free;
  end;
end;


Delphi hat zwar tatsächlich Möglichkeiten, wie man an einen Getter/Setter eines Properties noch zusätzliche Parameter übergeben kann. Aber die sind ganz und gar nicht dafür gedacht, Methoden zu ersetzten, sondern machen z.B. Sachen wie zeilenweisen Zugriff auf eine TStringList über die Eigenschaft Items oder TCanvas.Pixels möglich.