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)