Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#26

AW: Bitmap soll gelegentlich unsichtbar sein

  Alt 31. Jan 2014, 14:18
Sorry für die späte Rückmeldung. Habe eigentlich schon kurz danach geantwortet, sogar einiges, aber anscheinend nicht abgeschickt.

Zum Thema: hier werden immer Tips gegeben, wofür ich dankbar bin, aber, vielleicht habe ich nicht viel drauf, aber einiges kann ich auch programmieren. Und eine Klasse in der ich die Bitmap abschalten kann, habe sogar ich drauf:
Delphi-Quellcode:
type
  TTestKlasse = class
  private
    FBitmap: TBitmap;
    FBackup: TBitmap;
    FVisible: Boolean;
  protected
    procedure SetVisible(AVisible: Boolean);
  public
    constructor Create;
    destructor Destroy; override;
    property Bitmap: TBitmap read FBitmap write FBitmap;
    property Visible: Boolean read FVisible write SetVisible;
  end;

constructor TTestKlasse.Create;
begin
  FBitmap := TBitmap.Create;
  FVisible := True;
  FBackup := nil;
end;

destructor TTestKlasse.Destroy;
begin
  FBitmap.Free;
  if FBackup <> nil then
    FBackup.Free;
end;

procedure TransparentBitmap(ABitmap: TBitmap);
var
  Brush: TBrush;
begin
  Brush := TBrush.Create;
  try
    Brush.Assign(ABitmap.Canvas.Brush);
    ABitmap.Canvas.Brush.Style := bsSolid;
    ABitmap.TransparentMode := tmFixed;
    ABitmap.Canvas.Brush.Color := ABitmap.TransparentColor;
    ABitmap.Transparent := True;
    ABitmap.Canvas.FillRect(ABitmap.Canvas.ClipRect);
    ABitmap.Canvas.Brush.Assign(Brush);
  finally
    Brush.Free;
  end;
end;

procedure TTestKlasse.SetVisible(AVisible: Boolean);
var
  Brush: TBrush;
begin
  if AVisible = FVisible then Exit;

  if AVisible then
  begin
    FBitmap.Assign(FBackup);
    FreeAndNil(FBackup);
  end
  else
  begin
    FBackup := TBitmap.Create;
    FBackup.Assign(FBitmap);
    TransparentBitmap(FBitmap);
  end;

  FVisible := AVisible;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  FilePath = 'C:\Programme\Gemeinsame Dateien\Borland Shared\Images\Splash\256Color\factory.bmp';
var
  Test: TTestKlasse;
begin
  Test := TTestKlasse.Create;
  try
    Test.Bitmap.LoadFromFile(FilePath);

    Test.Bitmap.Transparent := True;
    Canvas.Draw(0, Test.Bitmap.Height * 0, Test.Bitmap);

    Test.Visible := False;
    Canvas.Draw(0, Test.Bitmap.Height * 1, Test.Bitmap);

    Test.Visible := True;
    Canvas.Draw(0, Test.Bitmap.Height * 2, Test.Bitmap);
  finally
    Test.Free;
  end;
end;
Das Problem ist also nicht einen Schalter zu programmieren. Der Code oben funktioniert wunderbar, den habe ich als Übung bereits vor der Fragestellung geschrieben, nur er funktioniert nicht in allen Einzelheiten wie ich es mir vorgestellt habe. Was ich gesucht habe war mir eine evtl. unbekannte Eigenschaft von Bitmap. Ich kenne TBitmap zwar allgemein, aber nicht in Einzelheiten. Was ich bereits paar mal erwähnt habe ist Dormant. Wenn man sich das Beispiel anguckt, dann versteht man was mir eigentlich vorschwebte. Die Bitmap ist da, sie liefert aber nichts. Kaum aber schreibt jemand etwas rein, schon wird sie aktiviert, wird sichtbar und führt die Änderung durch.

Und das ist der Unterschied zum oberen Code. Wenn einer nicht vorher den Schalter wieder umstellt, zeichnet er ins leere. Zwar könnte man das abfangen und ein SetBitmap schreiben, aber der erste Zugriff würde immer ins Leere gehen. Es besteht also die Gefahr, dass in die falsche Bitmap geschrieben wird.

Kommen wir zu Vererbung. Entweder ich verstehe den Hinweis nicht oder man versteht nicht was mir vorschwebt. Allerdings ist die Diskussion inzwischen akademisch, da ich den Code bereits abgeliefert habe. Das bedeutet nicht, dass mich dass allgemein nicht interessiert. Trotzdem, wenn ich eine neue Klasse wollte, hätte ich sie programmiert. Aber wie ich bereits im Eingangspost gesagt habe, es soll TBitmap bleiben. Einigen wir uns vielleicht abschließend darauf, dass mir da etwas vorschwebte, mir allerdings der Wortschatz fehlt mein Problem zu beschreiben.
  Mit Zitat antworten Zitat