AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

Ein Thema von Alallart · begonnen am 16. Jan 2023 · letzter Beitrag vom 19. Jan 2023
Antwort Antwort
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#1

Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 16. Jan 2023, 14:12
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;

Geändert von Alallart (16. Jan 2023 um 14:38 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
535 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 16. Jan 2023, 14:19
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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Alallart

Registriert seit: 8. Dez 2015
155 Beiträge
 
#3

AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 16. Jan 2023, 14:44
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 16. Jan 2023, 14:47
Dann mach doch ohne Getter?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi
Online

Registriert seit: 17. Jul 2005
901 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 16. Jan 2023, 14:58
Oder spendiere der Klasse eine zusätzliche Property Transparent mit passendem Getter und Setter, der die Eigenschaft des privaten Bitmaps setzt bzw. zurückliefert. Also sowas in der Art (für den Setter):
Delphi-Quellcode:
procedure TTest.SetTransparent(Value: Boolean);
begin
  FBmp.Transparent := Value;
end;
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.896 Beiträge
 
Delphi 12 Athens
 
#6

AW: Was mache ich falsch? Es wird die falsche Eigenschaft aufgerufen

  Alt 17. Jan 2023, 02:01
Ein Getter sollte auch nur als Getter fungieren.

Du könntest z.B. eine Funktion GenerateBitmap verwenden oder so ähnlich.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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