![]() |
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:
Konstruktor
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;
Delphi-Quellcode:
Setter
constructor TVBBrushedLine.Create(AOwner: TComponent);
begin inherited Create(AOwner); fBrushBitmap := TPicture.Create; end;
Delphi-Quellcode:
Zeichen-Methode
procedure TVBBrushedLine.SetBrushBitmap(const ABitmap: TPicture);
begin fBrushBitmap.Assign(ABitmap.Bitmap); Paint; end;
Delphi-Quellcode:
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 :(
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; So macht Komponentenentwicklugn keinen Spaß :twisted: Was habe ich übersehen, vergessen, oder was mache ich falsch? |
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 |
Re: Verwendung von TBrush.Bitmap
Zitat:
Das allein kann jedenfalls nicht verantwortlich sein. |
Re: Verwendung von TBrush.Bitmap
Zitat:
Delphi-Quellcode:
mache, ändert das rein garnichts am Verhalten :(
fBrushBitmap.Assign(ABitmap);
|
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 ... |
Re: Verwendung von TBrush.Bitmap
Zitat:
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: |
Re: Verwendung von TBrush.Bitmap
Irgendwie habe ich da ein Verständnissproblem...
Delphi-Quellcode:
Oben: BMP.Assign...
if fBrushBitmap.Bitmap.Empty = false then
Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap); Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Bitmap.Free; 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. |
Re: Verwendung von TBrush.Bitmap
Zitat:
|
Re: Verwendung von TBrush.Bitmap
Ich glaube ich habe den Fehler gefunden.
Wenn ich statt
Delphi-Quellcode:
Das hier verwende:
Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap);
Delphi-Quellcode:
Scheint es wunderbar zu funktionieren!
Canvas.Brush.Bitmap := fBrushBitmap.Bitmap;
|
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:
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz