Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Verwendung von TBrush.Bitmap (https://www.delphipraxis.net/93258-verwendung-von-tbrush-bitmap.html)

Meflin 3. Jun 2007 14:00


Verwendung von TBrush.Bitmap
 
Moin moin!

Ich versuche gerade, mir eine Art Balkenkomponente zu schreiben. Dieser Balken soll diagonal schraffiert sein und was Delphi da an hauseigenen BrushStyles mitbringt sieht mir persönlich einfach zu dämlich aus!

Deshalb muss ein eigener BrushStyle her, schön und gut, mit der TBrush.Bitmap property sollte das ja auch kein Problem sein...

Allerdings scheitere ich an der Umsetzung und die Delphi IDE stürzt mehr oder weniger ständig ab wenn ich versuche meine Komponente zu testen.

Hier die essentiellen Code-Teile:

Klassendeklaration
Delphi-Quellcode:
  TVBBrushedLine = class(TCustomControl)
    private
      fBrushStyle: TBrushStyle;
      fLineStyle: TPenStyle;
      fBrushColor, fLineColor: TColor;
      fBrushBitmap: TPicture;
      procedure SetBrushStyle(const ABrushStyle: TBrushStyle);
      procedure SetBrushColor(const AColor: TColor);
      procedure SetLineStyle(const APenStyle: TPenStyle);
      procedure SetLineColor(const AColor: TColor);
      procedure SetBrushBitmap(const ABitmap: TPicture);
      procedure DrawBrushedLine;
    protected
      procedure Paint; override;
    public
      constructor Create(AOwner: TComponent); override;
    published
      property BrushStyle: TBrushStyle read fBrushStyle write SetBrushStyle;
      property BrushColor: TColor read fBrushColor write SetBrushColor;
      property LineStyle: TPenStyle read fLineStyle write SetLineStyle;
      property LineColor: TColor read fLineColor write SetLineColor;
      property BrushBitmap: TPicture read fBrushBitmap write SetBrushBitmap;
  end;
Konstruktor
Delphi-Quellcode:
constructor TVBBrushedLine.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fBrushBitmap := TPicture.Create;
end;
Setter
Delphi-Quellcode:
procedure TVBBrushedLine.SetBrushBitmap(const ABitmap: TPicture);
begin
  fBrushBitmap.Assign(ABitmap.Bitmap);
  Paint;
end;
Zeichen-Methode
Delphi-Quellcode:
procedure TVBBrushedLine.DrawBrushedLine;
begin
  if Parent = nil then
    Exit;

  Canvas.Brush.Style := BrushStyle;
  Canvas.Brush.Color := BrushColor;
  Canvas.Pen.Style := LineStyle;
  //if fBrushBitmap.Bitmap.Empty = false then Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap);
  Canvas.Rectangle(0, 0, Width, Height);
  Canvas.Brush.Bitmap.Free;
end;
Ohne die kommentierte Zeile funktioniert alles wie es soll, nur eben ohne den individuellen BrushStyle. Kommentiere ich die Zeile aus, hagelt es bei der Verwendung Fehler ala "Lesen von Adresse 000000" oder auch "Listenindex überschreitet das Maximum" (WTF???). Manchmal schmiert dann auch noch die DelphiSpeeUpErweiterung ab und ich muss Delphi via TaskManager killen :(

So macht Komponentenentwicklugn keinen Spaß :twisted:

Was habe ich übersehen, vergessen, oder was mache ich falsch?


mischerr 3. Jun 2007 14:03

Re: Verwendung von TBrush.Bitmap
 
> fBrushBitmap: TPicture;
Müsste das nicht ein TBitmap sein?

..denn..
> fBrushBitmap.Assign(ABitmap.Bitmap);
Hier wird dem TPicture das TPicture.Bitmap zugewiesen

Meflin 3. Jun 2007 14:08

Re: Verwendung von TBrush.Bitmap
 
Zitat:

Zitat von mischerr
Müsste das nicht ein TBitmap sein?

Jein. TPicture hat ja eine Bitmap Eigenschaft, und ich verwende auch nur 8x8 Pixel bmps, das sollte keine Probleme machen. Und TBitmapt ist irgendwie nicht über den ObjectInspector änderbar, weswegen meine Wahl auf TPicture viel (da fehtl wohl der property Editor oder so...).

Das allein kann jedenfalls nicht verantwortlich sein.


Meflin 3. Jun 2007 14:22

Re: Verwendung von TBrush.Bitmap
 
Zitat:

Zitat von mischerr
fBrushBitmap.Assign(ABitmap.Bitmap);
Hier wird dem TPicture das TPicture.Bitmap zugewiesen

Wenn ich daraus
Delphi-Quellcode:
fBrushBitmap.Assign(ABitmap);
mache, ändert das rein garnichts am Verhalten :(


mischerr 3. Jun 2007 14:25

Re: Verwendung von TBrush.Bitmap
 
Prüf doch mal bei fBrushBitmap.Bitmap.Empty ob das BMP überhaupt assigned ist.

if (fBrushBitmap.Bitmap<>nil) and (not fBrushBitmap.Bitmap.Empty) then
...

Meflin 3. Jun 2007 14:29

Re: Verwendung von TBrush.Bitmap
 
Zitat:

Zitat von mischerr
if (fBrushBitmap.Bitmap<>nil) and (not fBrushBitmap.Bitmap.Empty) then

Auch keine Veränderung :(

Es sei noch dazu gesagt: solange ich meine BrushBitmap property nicht verwende geht alles wunderbar. Beim zuweisen eines Bitmaps hagelt es dann Fehler. Der Fehler im Code sollte also folglich auch nur in diesem Bereich liegen :stupid:


mischerr 3. Jun 2007 14:45

Re: Verwendung von TBrush.Bitmap
 
Irgendwie habe ich da ein Verständnissproblem...

Delphi-Quellcode:
if fBrushBitmap.Bitmap.Empty = false then
   Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap);
Canvas.Rectangle(0, 0, Width, Height);
Canvas.Brush.Bitmap.Free;
Oben: BMP.Assign...
Unten: BMP.Free...

Ich kenne nun deinen kompletten Code nicht, aber nach dem unteren Free zeigt der Pointer des BMP doch irgendwo in de Wald. Das nächste Assign wird dann auf Basis dieses Pointers ausgeführt. Ausserdem erfolgt der Free auch dann, wenn oben nichts zugewiesen wurde.

Meflin 3. Jun 2007 15:05

Re: Verwendung von TBrush.Bitmap
 
Zitat:

Zitat von mischerr
Delphi-Quellcode:
Canvas.Brush.Bitmap.Free;

Auch diese Zeile kann ich komplett auskommentieren, ohne dass sich irgendetwas ändern würde.


Meflin 3. Jun 2007 19:46

Re: Verwendung von TBrush.Bitmap
 
Ich glaube ich habe den Fehler gefunden.
Wenn ich statt
Delphi-Quellcode:
Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap);
Das hier verwende:
Delphi-Quellcode:
Canvas.Brush.Bitmap := fBrushBitmap.Bitmap;
Scheint es wunderbar zu funktionieren!


Hawkeye219 3. Jun 2007 20:02

Re: Verwendung von TBrush.Bitmap
 
Hallo Meflin,

in der Online-"Hilfe" zu Delphi 2006 fehlen leider die Beispiele, deshalb hier ein Auszug aus der Delphi6-Hilfe:

Zitat:

Zitat von Delphi6-Hilfedatei
Im folgenden Code wird ein Bitmap aus einer Datei geladen und der Eigenschaft Brush der Zeichenfläche von Form1 zugewiesen.

Delphi-Quellcode:
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('MyBitmap.bmp');
    Form1.Canvas.Brush.Bitmap := Bitmap;
    Form1.Canvas.FillRect(Rect(0,0,100,100));
  finally
    Form1.Canvas.Brush.Bitmap := nil;
    Bitmap.Free;
  end;
end;

Du solltest also nicht vergessen, die Eigenschaft Bitmap wieder mit dem Wert NIL zu besetzen und anschließend die zuvor benutzte Bitmap freizugeben.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz