![]() |
Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Hier eine kleine Beispielklasse, ohne tieferen Sinn. Ich habe sie konstruiert, weil mir so was in einer anderen Klasse aufgefallen ist. Wie man sieht habe ich eine einfache Klasse, in der eine Bitmap genutzt wird. Die Bitmap wird in Create erstellt, und in Destroy freigegeben. Sie hat die Eigenschaft Bmp, die auf die Funktion GetBmp über read zugreift. Soweit, so gut.
Nun will ich in der Prozedur Button1Click die Bmp Eigenschaft Transparent eigentlich nur auf True setzten. Nun wird dabei aber auch die Funktion GetBmp ausgeführt. Zum Beweis zählt die Bmp von 0 bis Integer-Ende. Beim der ersten Ausgabe sollte eingentlich die Zahl 0 ausgegeben werden, wird aber die 1 ausgegeben. Das Zeichen, das beim setzen von Transparent bereits hochgezählt wurde. Mir ist schon klar, dass wenn ich etwas mit Bmp mache, sie auch aufgerufen wird, aber mir war nicht klar, dass es bereits das Setzten eine Eigenschaft ist.
Delphi-Quellcode:
type
TTest = class private FBmp: TBitmap; FIndex: Integer; function GetBmp: TBitmap; public constructor Create; destructor Destroy; override; property Bmp: TBitmap read GetBmp; end; implementation constructor TTest.Create; begin inherited; FBmp := TBitmap.Create; FBmp.Width := 32; FBmp.Height := 32; FIndex := 0; end; destructor TTest.Destroy; begin FBmp.Free; inherited end; function TTest.GetBmp: TBitmap; begin FBmp.Canvas.TextOut(0, 0, IntToStr(FIndex)); Inc(FIndex); Result := FBmp; end; procedure TForm1.Button1Click(Sender: TObject); var Test: TTest; begin Test := TTest.Create; try Test.Bmp.Transparent := True; //ruft die Eigenschaft Bmp auf Canvas.Draw(0, 0, Test.Bmp); finally Test.Free; end; |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Mit Test.Bmp rufst Du das property auf welches die Funktion GetBmp aufruft. Was soll sonst passieren?
Ich verstehe Deine Frage nicht. Wenn Du das nicht willst musst Du FBmp.Transparent:= True aufrufen. |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Stimmt, nur ist FBmp private (sorry, habe es nachträglich im ersten Post korrigiert).
Ich will die Eigenschaft der Bitmap ändern (Transparent), ohne dass dadurch die Eigenschaft der Test-Klasse aufgerufen wird. Mir war nicht bewusst, dass wenn ich die Eigenschaften eines Objekts in einem Objekt ändere, dabei auch gleich die Eigenschaft der Klasse aufgerufen wird. |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Dann mach doch ohne Getter? :gruebel:
|
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Oder spendiere der Klasse eine zusätzliche Property
Delphi-Quellcode:
mit passendem Getter und Setter, der die Eigenschaft des privaten Bitmaps setzt bzw. zurückliefert. Also sowas in der Art (für den Setter):
Transparent
Delphi-Quellcode:
procedure TTest.SetTransparent(Value: Boolean);
begin FBmp.Transparent := Value; end; |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Ein Getter sollte auch nur als Getter fungieren.
Du könntest z.B. eine Funktion GenerateBitmap verwenden oder so ähnlich. |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Ich habe den Tipp von Gausi umgesetzt, der Code sieht nun so aus (bzw. die Erweiterung):
Delphi-Quellcode:
Es funktioniert. GetBmp wird so nicht aufgerufen, womit das Problem gelöst scheint.
type
TTest = class FBmp: TBitmap; FIndex: Integer; function GetBmp: TBitmap; procedure SetTransparent(Value: Boolean); //<<<<<<< neu dazugekommen public constructor Create; destructor Destroy; override; property Transparent: Boolean write SetTransparent; property Bmp: TBitmap read GetBmp; end; implementation {$R *.dfm} //... procedure TTest.SetTransparent(Value: Boolean); //<<<<<<< neu dazugekommen begin FBmp.Transparent := Value; end; Trotzdem gefällt mir der Weg nicht. Ich empfinde das nicht als elegant. Ich verstehe auch was jaenicke sagt: "Ein Getter sollte auch nur als Getter fungieren", aber wenn da eine Eigenschaft ist, die Bitmap ausgibt, dann besteht immer die Gefahr, dass einer so zugreift wie ich. Ich dachte, dass read ausreicht, damit das nicht passiert. Ich denke ich muss noch etwas nachdenken wie ich es anders löse. |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Zitat:
alternative Lösung: nutze doch einfach 2 FBmps, eins hat die Transparenz Eigenschaft und das andere nicht, dem FIndex ist es Wurst von wo aus er hochgezählt wird. |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Oder vielleicht so?
Delphi-Quellcode:
// updated, jaenickes Vorschlag integriert.
type
TTest = class strict private FBmp: TBitmap; FIndex: Integer; private procedure GenerateBmp; function GetSolid: TBitmap; function GetTransparent: TBitmap; public constructor Create; destructor Destroy; override; public property Solid: TBitmap read GetSolid; property Transparent: TBitmap read GetTransparent; property Index: Integer read FIndex write FIndex; end; implementation constructor TTest.Create; begin inherited Create; FBmp := TBitmap.Create; FBmp.Width := 32; FBmp.Height := 32; FIndex := 0; end; destructor TTest.Destroy; begin FBmp.Free; inherited Destroy; end; procedure TTest.GenerateBmp; begin FBmp.Canvas.TextOut(0, 0, IntToStr(FIndex)); FBmp.Dormant; FBmp.FreeImage; Inc(FIndex); end; function TTest.GetSolid: TBitmap; begin FBmp.Transparent := False; GenerateBmp; Result := FBmp; end; function TTest.GetTransparent: TBitmap; begin FBmp.Transparent := True; GenerateBmp; Result := FBmp; end; |
AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Hier mußt du bedenken, dass wenn Zwei "gleichzeitig" sich ein transparentes und ein untransparentes Bild holen, dass du dann das Bild des Ersten mit änderst.
function GenerateTransparent: TBitmap; und function GenerateSolid: TBitmap; Darin wird jeweil eine neue TBitmap-Instanz erstellt und FBmp draufgemalt (oder ohne FBmp und jedes Mal neu gemalt, also GenerateBmp zählt nur hoch und die Anderen malen). Natürlich muß dann jeder, der sich ein Bitmap holt, es auch selber wieder freigeben. Oder zwei FBmp's intern (transparent sowie untransparent) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz