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
Benutzerbild von jaenicke
jaenicke

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

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

  Alt 17. Jan 2023, 01: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
Alallart

Registriert seit: 8. Dez 2015
172 Beiträge
 
#2

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

  Alt 19. Jan 2023, 16:04
Ich habe den Tipp von Gausi umgesetzt, der Code sieht nun so aus (bzw. die Erweiterung):

Delphi-Quellcode:
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;
Es funktioniert. GetBmp wird so nicht aufgerufen, womit das Problem gelöst scheint.

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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 19. Jan 2023, 16:26
Ich dachte, dass read ausreicht, damit das nicht passiert.
read bedeutet in Deinem Fall, von außerhalb hat man auf dein FBmp keinen Schreibzugriff, da Du aber intern darauf zugreifst, stehst Du Dir hier selbst im Weg
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 19. Jan 2023, 17:27
Oder vielleicht so?
Delphi-Quellcode:
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;
// updated, jaenickes Vorschlag integriert.
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Jan 2023 um 20:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 19. Jan 2023, 20:18
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)
Ein Therapeut entspricht 1024 Gigapeut.
  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 13:50 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