Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Zugriffsverletzungsfehler! & Override OnClick?
Masterhawk - Mo 11.09.06 18:10
Titel: Zugriffsverletzungsfehler! & Override OnClick?
Servus erstmal....
Zu meiner Komponente:
CustomButton sollen eine Komponente werden, die Buttons produziert, welche nicht einem Rechteck ähneln. Es soll möglich sein ein Bitmap zu laden und die OnCLick Prozedur soll nur ausgelöst werden, wenn ein nicht transparenter Pixel getroffen wurde.
zu meinen Problemen:
#1: Immer wenn ich versuche meine Prozedur "SetBitmap" aufrufe kommt ein Zugriffsverletzung-Fehler...kann mir jemand sagen warum?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99:
| unit CButtons;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls;
type TCButton = class(TGraphicControl) private FTransColor : TColor; FBitmap : TBitmap; procedure SetTransColor(const Value: TColor); procedure SetBitmap(const Value: TBitmap); protected procedure Paint; override; public constructor Create(Owner: TComponent); override; destructor Destroy; override; published property TransColor: TColor read FTransColor write SetTransColor; property Bitmap : TBitmap read FBitmap write SetBitmap default nil; property Constraints; property ParentShowHint; property PopupMenu; property ShowHint; property Visible; property Align; property Anchors; property OnClick; property OnMouseDown; property OnMouseMove; property OnMouseUp; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Masterhawk', [TCButton]); end;
constructor TCButton.Create(Owner: TComponent); begin inherited Create(Owner); Width := 50; Height := 30; FTransColor := clwhite; end;
destructor TCButton.Destroy; begin inherited Destroy; end;
procedure TCButton.Paint; var Bar: TBitmap; I: Integer; begin Bar := TBitmap.Create; Bar.Width := Width; Bar.Height := Height; Bar.TransparentColor:=FTransColor; Bar.Canvas.Brush.Color:=clblack; Bar.Canvas.FillRect(Rect(0, 0, Width, Height)); Canvas.CopyRect(Rect(0,0,Width,Height),Bar.Canvas,Rect(0,0,Width,Height));
Bar.Free; end;
procedure TCButton.SetTransColor(const Value: TColor); begin FTransColor := Value; Paint end;
procedure TCButton.SetBitmap(const Value:TBitmap); begin FBitmap.Assign(Value); Paint end; end. |
Hat jmd. ne Lösung parat? Wenn noch Infos erwünscht, dann stelle ich diese gerne bereit...
Problem #2:
Ist es möglich die OnClick Prozedur so zu überschreiben, dass sie nur auf nicht transparente Pixel anspricht?
Wie funktioniert die OnClick Prozedur überhaupt?
Thx for help
Masterhawk
Carl Johnson - Mo 11.09.06 21:21
Zu #1:
Versuch es mal mit:
FBitmap := TBitmap.Create;
FBitmap.Assign(XYZ....); !
Zu #2:
Du musst das OnClick-Event einfach zuweisen:
Du musst eine eigene procedure mit sämtlichen variablen eines OnClick-Events:
procedure XYZ(XYZ : XYZ........)
schau am besten das OnClick-Event einer fertigen Komponente an und kopier dir das in deine eigene!
danach definierst du das Vorgehen im OnClick-Event:
If (bspw. Mauszeiger auf transparentem Pixel) then
begin
.
.
.
end;
Danach überschreibst du im Constructor das OnClick-Event des Button, etwa so:
...inherited(Owner)
.
.
.
OnClick := XYZ(siehe Name der procedure)
Dass sollte es eigentlich gewesen sein.Hab allerdings keine Zeit,dass jetzt zu testen!
Probier es mal, sonst muss ich selbst mal schauen..
Masterhawk - Di 12.09.06 11:31
#1: Wie gesagt, ich hatte zwar schon fast alle Möglichkeiten ausprobiert und diese auch, aber ich habe danach nie die Komponente neu eingebunden.... :autsch:
Nun habe ich aber ein anderes Problem....wenn ich den Code auskommentiere, dann wird das Bild net auf der Form angezeigt, warum?
Delphi-Quelltext
1: 2: 3: 4:
| if FBitmap<>nil then Bar.Canvas.CopyRect(Rect(0,0,Width,Height),FBitmap.Canvas,Rect(0,0,Width,Height)) else Bar.Canvas.Brush.Color:=clblack; |
#2: Ok, du hast recht. Da hätt ich ja auch selber drauf kommen können...
Special Thx für deine Mühen
MfG Masterhawk
Carl Johnson - Di 12.09.06 18:13
Du hast vielleicht CopyMode nicht gesetzt (in dem Fall sollte es etwa so aussehen:
Bar.Canvas.CopyMode := cmSrcCopy;)
Das ist vor CopyRect nötig. Kann aber auch noch an anderen Dingen liegen.
Du könntest mal die gesamt procedure posten, damit ich mal gucken kann,falls dass nicht funzt.
Masterhawk - Di 12.09.06 20:09
ok, an Bar.Canvas.CopyMode := cmSrcCopy; bzw. Canvas.CopyMode := cmSrcCopy; lag es nicht....
Hier die Paint Prozedur.....alles komplett findest du im ersten Post
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TCButton.Paint; var Bar: TBitmap; I: Integer; begin Bar := TBitmap.Create; Bar.Width := Width; Bar.Height := Height; Bar.TransparentColor:=FTransColor; if FBitmap<>nil then Bar.Assign(FBitmap) else Bar.Canvas.Brush.Color:=clblack; Bar.Canvas.CopyMode := cmSrcCopy; Bar.Canvas.FillRect(Rect(0, 0, Width, Height)); Canvas.CopyMode := cmSrcCopy; Canvas.CopyRect(Rect(0,0,Width,Height),Bar.Canvas,Rect(0,0,Width,Height));
Bar.Free; end; |
Ich bekomme immer wenn ich mein Projekt öffne folgende Fehlermeldung:
Zitat: |
Fehler beim Lesen von CButton1.Bitmap.Data: Ungültiger Pfad für Eigenschaft. Ignore the error and continue? NOTE: Ignoring the error may cause components to be deleted or property values to be lost. |
Wo ist der Denkfehler....übergebe ich die Bitmap doch falsch?
MfG Masterhawk
Masterhawk - Mi 13.09.06 19:24
PUSH: HEEEEEELP......wo bist du CARL??? ;)
Carl Johnson - Mi 13.09.06 23:49
Hab den Fehler wahrscheinlich gefunden:
Falls du die auf dem Button darstellen willst, wenn dieses eine Grafik enthält, und der Button schwarz erscheinen soll, wenn dies nicht der Fall ist, dann ist dass die Lösung.
Sonst musst du noch mit dem else hantieren.
Das eigentliche Problem ist FBitmap <> nil, da FBitmap immer <> nil ist. Was du brauchst, ist FBitmap.Empty!
Teste mal :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TCButton.Paint; var Bar: TBitmap; I: Integer; begin Bar := TBitmap.Create; Bar.Width := Width; Bar.Height := Height; Bar.TransparentColor:=FTransColor; if FBitmap.Empty = False then Bar.Assign(FBitmap) else begin Bar.Canvas.Brush.Color:=clblack; Bar.Canvas.FillRect(Rect(0, 0, Width, Height)); end; Canvas.CopyMode := cmSrcCopy; Canvas.CopyRect(Rect(0,0,Width,Height),Bar.Canvas,Rect(0,0,Width,Height)); Canvas.Brush.Bitmap; Bar.Free; end; |
Du könntest evtl. noch ne AccessViolation bekommen. Dass liegt dann aber an "Canvas.bla".
Probiers dann mal mit "TCButton.Canvas.bla" oder so.
Ansonsten viel Spaß!
Masterhawk - Do 14.09.06 12:11
Servus.....Problem #1 ist gelöst:
Ich musste anstatt
Delphi-Quelltext
1: 2: 3:
| FBitmap:TBitmap;
procedure SetBitmap(Value:TBitmap); |
es so verwenden
Delphi-Quelltext
1: 2: 3:
| FBitmap:Graphics.TBitmap;
procedure SetBitmap(Value:Graphics.TBitmap); |
Aber hier mal die zwei wichtigsten Procezeduren für das Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TCButton.Paint; var Bar: TBitmap; begin Bar := TBitmap.Create; Bar.Width := Width; Bar.Height := Height; Bar.TransparentColor:=FTransColor;
if FBitmap.Empty = False then Bar.Assign(FBitmap) else begin Canvas.Brush.Color:=clblack; Canvas.FillRect(Rect(0, 0, Width, Height)); end; Canvas.CopyMode := cmSrcCopy; Canvas.CopyRect(Rect(0,0,Width,Height),Bar.Canvas,Rect(0,0,Width,Height)); Canvas.Brush.Bitmap;
Bar.Free; end;
procedure TCButton.SetBitmap(const Value:Graphics.TBitmap); begin FBitmap.Assign(Value); Paint end; |
Jetzt werd ich mich dann wohl mal bald an Problem #2 machen.....ihr werdet mich dann wieder hier finden....:P
EDIT: PROBLEM #2 GELÖST!!!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!