AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Verwendung von TBrush.Bitmap
Thema durchsuchen
Ansicht
Themen-Optionen

Verwendung von TBrush.Bitmap

Ein Thema von Meflin · begonnen am 3. Jun 2007 · letzter Beitrag vom 4. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:00
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ß

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

  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:03
> fBrushBitmap: TPicture;
Müsste das nicht ein TBitmap sein?

..denn..
> fBrushBitmap.Assign(ABitmap.Bitmap);
Hier wird dem TPicture das TPicture.Bitmap zugewiesen
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:08
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.

  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#4

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:22
Zitat von mischerr:
fBrushBitmap.Assign(ABitmap.Bitmap);
Hier wird dem TPicture das TPicture.Bitmap zugewiesen
Wenn ich daraus
fBrushBitmap.Assign(ABitmap); mache, ändert das rein garnichts am Verhalten

  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:25
Prüf doch mal bei fBrushBitmap.Bitmap.Empty ob das BMP überhaupt assigned ist.

if (fBrushBitmap.Bitmap<>nil) and (not fBrushBitmap.Bitmap.Empty) then
...
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#6

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:29
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

  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 14:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#8

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 15:05
Zitat von mischerr:
Canvas.Brush.Bitmap.Free;
Auch diese Zeile kann ich komplett auskommentieren, ohne dass sich irgendetwas ändern würde.

  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#9

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 19:46
Ich glaube ich habe den Fehler gefunden.
Wenn ich statt
Canvas.Brush.Bitmap.Assign(fBrushBitmap.Bitmap); Das hier verwende:
Canvas.Brush.Bitmap := fBrushBitmap.Bitmap; Scheint es wunderbar zu funktionieren!

  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Verwendung von TBrush.Bitmap

  Alt 3. Jun 2007, 20:02
Hallo Meflin,

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

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.
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