Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Bitmap soll gelegentlich unsichtbar sein

  Alt 22. Jan 2014, 10:24
Volker Z. hat imho schon die OOP-ige Lösung gegeben. Mal in Quasicode:
Delphi-Quellcode:
type
  TLayeredDingsbums = class
  private
    FEmptyBitmap: TBitmap;
    FLayers: TBitmapList;
    FLayerVisibility: TBooleanList;
  public
    function GetLayer(aLayerIndex: Integer): TBitmap;
  end;

implementation

function TLayeredDingsbums.GetLayer(aLayerIndex: Integer): TBitmap;
begin
  if FLayerVisibility[aLayerIndex] then
    result := FLayers[aLayerIndex]
  else
  begin
    if Assigned(FEmptyBitmap) then FreeAndNil(FEmptyBitmap);
    FEmptyBitmap := TBitmap.Create;
    FEmptyBitmap.Assign(FLayers[aLayerIndex]); // Um die Properties des Layers zu bekommen - billiger geht's natürlich mit einer eigenen Methode, die nur de gebrauchten übernimmt und nicht gleich alle Pixeldaten mit kopiert
    PaintTransparent(FEmptyBitmap);
    result := FEmptyBitmap;
  end;
end;
Ich habe das FEmptyBitmap als Feld der Klasse gewählt, damit nicht der Caller immer wieder Kopien freigeben muss, sondern die Bezitzerklasse konsistent sowohl ihre Layer als auch das gerade aktuelle "Leerbild" unter seiner Freigabegewalt hat. Man kann das sicherlich noch mit mehr "fancy" machen, aber das wäre mein Q&D Ansatz, der für den Caller völlig transparent (haha) ist.
Eine erste Besserung wäre z.B. dass man statt einer TBitmapList eine eigene kleine Klasse macht, die ein Bitmap und ein Bool enthält, und von dieser dann nur eine Liste zu verwalten braucht. (Das würde ich in der Realität glaube ich deutlich bevorzugen.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (22. Jan 2014 um 10:26 Uhr)
  Mit Zitat antworten Zitat