Autor Beitrag
Karl1997
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 09.02.12 13:15 
Moderiert von user profile iconMartok: Abgetrennt von [url=www.delphi-forum.de/...?p=658651]hier[/url]

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

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116

Win7
Delphi5 Delphi2005
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 09.02.12 16:39 
Bei write gibt es die gleichen Probleme

Das funktioniert

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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  private
    Fb: TBitmap;
    procedure sc(p: Integer);
  public
    property Scale: TBitmap read Fb write sc;
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Do 09.02.12 17:52 
Fällt dir was auf?
ausblenden 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.

Für diesen Beitrag haben gedankt: Karl1997
Karl1997 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
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:
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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."