Fehler beim Laden einer TBitmap-Property
HiHo,
Ich habe in einer Komponente (von TCustomControl abgeleitet) eine Property definiert, über die ich zur Entwurfszeit via Objektinspektor ein *.bmp laden möchte. Die Syntaxprüfung zeigt mir keine Fehler an, wenn ich jedoch versuche zur Entwurfszeit ein Bitmap zu laden, bekomme ich eine Fehlermeldung: Untenstehend poste ich mal den Quellcode, in dem ich den Fehler vermute:
Delphi-Quellcode:
Ich denke, ich habe mir die Property, und dort ganz speziell die Methode write, falsch aus der OH zusammengeschustert. Kann mir jemand bei der Fehlersuche helfen?
[...]
type Wechselbutton = class(TCustomControl) private { Private-Deklarationen } FOnMouseDown :TMouseEvent; Img_normal :TBitmap; [...] protected { Protected-Deklarationen } Procedure Paint; override; Procedure SetNormImg(Img :TBitmap); [...] public { Public-Deklarationen } published { Published-Deklarationen } Property Surface_Normal :TBitmap read Img_normal write SetNormImg; [...] end; procedure Register; var b_Enabled :Boolean; b_MouseDown :Boolean; implementation [...] procedure Wechselbutton.Paint; begin If b_Enabled then Begin If b_MouseDown then Begin {Width := Img_MouseDown.Width; Height := Img_MouseDown.Height; } Canvas.Draw(0,0,Img_MouseDown); End Else Begin {Width := Img_normal.Width; Height := Img_normal.Height;} Canvas.Draw(0,0,Img_normal); End; End Else Begin Width := Img_disabled.Width; Height := Img_disabled.Height; Canvas.Draw(0,0,Img_disabled); End; end; Procedure Wechselbutton.SetNormImg(Img :TBitmap); begin try if Img <> Img_normal then begin Img_normal := Img; Update; end; except begin Img.Free; Img_normal.Free; end; end; end; Schon mal vielen Dank, für's Lesen! :) hanselmansel |
Re: Fehler beim Laden einer TBitmap-Property
Nehm' mal statt Img_normal := Img oder so Img_normal.Assign (Img); sonst kopierst du nur den zeiger ;)
|
Re: Fehler beim Laden einer TBitmap-Property
wieso gibst du denn im except-block die bitmaps wieder frei? zumindest bei dem bitmap, dass du als parameter an diese procedur übergeben bekommst, würde ich mir das doch mal stark überlegen. der nutzer wird sich freuen, wenn er sein bitmap zuweisen will, dabei geht was schief, und -schwups- ist sein bitmap wech. ;)
ach ja und deiner paint-methode wird es auch gar nicht gefallen, wenn nach einer missglückten zuweisung auf propertys vom freigegebenen img_normal zugegriffen werden. edit: Zitat:
|
Re: Fehler beim Laden einer TBitmap-Property
Liste der Anhänge anzeigen (Anzahl: 1)
@ jfheins: Okey, ich habe den Code geändert. Freundlicherweise hat sich im Gegenzug auch die Fehlermeldung an gleicher Stelle verändert. (Screenshot im Anhang!)
@ Blackjack: Hatte mir davon erhofft, den Fehler eindämmen zu können. Werde es ändern. Ist es denn sinnvoll die Excepion ganz rauszustreichen? Danke für die super-schnellen Antworten! hanselmansel |
Re: Fehler beim Laden einer TBitmap-Property
Zitat:
zu dem imemr noch bestehenden fehler: bist du sicher dass du dir deine eigenen bitmaps created hast? |
Re: Fehler beim Laden einer TBitmap-Property
Moin!
Delphi-Quellcode:
Dir ist bewusst das diese Variablen von allen Instanzen deiner Komponente gleichzeitig benutzt werden? Also wenn du dir mehr als eine deiner Komponente auf die Form ziehst, benutzten alle diese Variablen. Eine setzt es false - die nächst auf true ... usw. Nur mal so als Hinweis, aber im Code ist ja nicht ersichtlich ob es gewollt ist - präventative Informationen halt...
var
b_Enabled :Boolean; b_MouseDown :Boolean; MfG Muetze1 |
Re: Fehler beim Laden einer TBitmap-Property
DANKE!!!
@ BlackJack: Ich habe die Exceptions weggestrichen und die TBitmaps im Constructor "created". Wahrscheinlich war genau das der Fehler! @ Muetze1: Danke für den Hinweis! War mir nicht darüber im Klaren, hab die Variablen jetzt aber in "private" deklariert. Nochmals vielen Dank! hanselmansel :dp: P.S.: Falls es irgendjemanden interessiert/ Sollte irgendjemand eine ähnliche Fragestellung gehabt haben:
Delphi-Quellcode:
unit MyButtons; interface uses SysUtils, Classes, Controls, Graphics; type Wechselbutton = class(TCustomControl) private { Private-Deklarationen } FOnMouseDown :TMouseEvent; Img_normal :TBitmap; Img_MouseDown :TBitmap; Img_disabled :TBitmap; b_Enabled :Boolean; b_MouseDown :Boolean; protected { Protected-Deklarationen } Procedure Paint; override; Procedure SetNormImg(Img :TBitmap); Procedure SetMoDoImg(Img :TBitmap); Procedure SetDisaImg(Img :TBitmap); public { Public-Deklarationen } constructor Create(Owner: TComponent); override; published { Published-Deklarationen } Property OnMouseDown:TMouseEvent read FOnMouseDown write FOnMouseDown; Property Surface_Normal :TBitmap read Img_normal write SetNormImg; Property Surface_MouseDown :TBitmap read Img_MouseDown write SetMoDoImg; Property Surface_Disabled :TBitmap read Img_disabled write SetDisaImg; end; procedure Register; implementation constructor Wechselbutton.Create(Owner: TComponent); begin inherited Create(Owner); b_Enabled := True; b_MouseDown := False; Img_normal := TBitmap.Create; Img_MouseDown := TBitmap.Create; Img_disabled := TBitmap.Create; end; procedure Wechselbutton.Paint; begin If b_Enabled then Begin If b_MouseDown then Begin {Width := Img_MouseDown.Width; Height := Img_MouseDown.Height; } Canvas.Draw(0,0,Img_MouseDown); End Else Begin {Width := Img_normal.Width; Height := Img_normal.Height;} Canvas.Draw(0,0,Img_normal); End; End Else Begin Width := Img_disabled.Width; Height := Img_disabled.Height; Canvas.Draw(0,0,Img_disabled); End; end; Procedure Wechselbutton.SetNormImg(Img :TBitmap); begin if Img <> Img_normal then begin Img_normal.Assign(Img); Update; end; end; Procedure Wechselbutton.SetMoDoImg(Img :TBitmap); begin if Img <> Img_MouseDown then begin Img_MouseDown.Assign(Img); Update; end; end; Procedure Wechselbutton.SetDisaImg(Img :TBitmap); begin if Img <> Img_disabled then begin Img_disabled.Assign(Img); Update; end; end; //***************** //***************** //***************** procedure Register; begin RegisterComponents('Beispiele', [MyButtons.Wechselbutton]); end; end. |
Re: Fehler beim Laden einer TBitmap-Property
Zitat:
da solltest du dir immer gedanken machen, sobald du ein .Create aufrufst - muss ich das selber wieder freigeben? wenn ja, wo muss ich das freigeben? etc. edit: ach ja vielleicht soltlest du die größen der bilder schon direkt anpassen, wenn du sie zuweist, und nicht erst in der Paint-methode - das resizen dürfte ziemlich langwierig sein, da ja noch neuer speicher angefordert werden muss, eventuell muss was im speicher umgeschaufelt werden etc. |
Re: Fehler beim Laden einer TBitmap-Property
Zitat:
Ich habe jetzt keine Möglichkeit gesehen, die Größenänderung für jedes Bitmap spezifisch UND außerhalb der Paint Prozedur zu machen. |
Re: Fehler beim Laden einer TBitmap-Property
oh, sorry, vergiss was ich geschrieben habe, ich dachte du würdest die größen von zwei bitmaps abgleichen, aber du passt ja die größe des controls an. dann ist das natürlich was anderes.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 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