Ok, vielleicht klingt mein erstes Post etwas verwirrend, vermutlich aber nur, weil ich mir einige Szenarien schon im Kopf durchgespielt habe und weiß, dass sie nicht funktionieren. Während es im ersten Moment für den Leser durchaus noch als machbar klingt. Natürlich stellt sich dann die Frage wo das Problem ist?
Ich hab gerade mein Gedankenspiel in Code umgesetzt um es zu prüfen. Hier das Problem mit einer leeren Ersatz-Bitmap.
Zuerst eine Beispielklasse:
Delphi-Quellcode:
type
TKlasseB = class
private
FBitmap: TBitmap;
FEmptyBitmap: TBitmap;
FBitmapEnabled: Boolean;
protected
function GetBitmap: TBitmap;
public
constructor Create;
destructor Destroy; override;
property Bitmap: TBitmap read GetBitmap write FBitmap;
property BitmapEnabled: Boolean read FBitmapEnabled write FBitmapEnabled;
end;
constructor TKlasseB.Create;
begin
FBitmap := TBitmap.Create;
FBitmapEnabled := True;
FEmptyBitmap := TBitmap.Create;
end;
destructor TKlasseB.Destroy;
begin
FBitmap.Free;
FEmptyBitmap.Free;
end;
function TKlasseB.GetBitmap: TBitmap;
begin
if FBitmapEnabled then
Result := FBitmap
else
begin
Result := FEmptyBitmap;
Result.Assign(FBitmap);
Result.Canvas.Brush.Style := bsSolid;
Result.Canvas.Brush.Color := Result.TransparentColor;
Result.Transparent := True;
end;
end;
Jetzt der Test
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitmap;
begin
with TKlasseB.Create do
try
Bitmap.Canvas.Brush.Color := clRed;
Bitmap.Width := 100;
Bitmap.Height := 50;
Self.Canvas.Draw(0, 0, Bitmap);
//Bis jetzt alles ok
//Jetzt das Problem
BitmapEnabled := False;
//Man denkt sich nichts böses dabei, ist ja auch erlaubt
Bmp := Bitmap;
Bmp.Canvas.Ellipse(Bmp.Canvas.ClipRect);
Self.Canvas.Draw(100, 100, Bmp);
//Nun stimmt nichts nicht überein. Wo ist die Ellipse?
BitmapEnabled := True;
Self.Canvas.Draw(200, 200, Bitmap);
finally Free end;
end;
Das Problem tritt nicht auf wenn man direkt mit der Bitmap der Klasse arbeitet. Vielleicht ist das Korinthenkacker, aber die Klasse ist in meinen Augen nicht wasserdicht. Man würde in dem Fall mit zwei verschiedenen Bitmaps arbeiten können.