AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim Laden einer TBitmap-Property

Ein Thema von hanselmansel · begonnen am 22. Jul 2005 · letzter Beitrag vom 22. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#1

Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:02
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:
[...]

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;
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?

Schon mal vielen Dank, für's Lesen!

hanselmansel
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:13
Nehm' mal statt Img_normal := Img oder so Img_normal.Assign (Img); sonst kopierst du nur den zeiger
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:21
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:
Nehm' mal statt Img_normal := Img oder so Img_normal.Assign (Img); sonst kopierst du nur den zeiger Wink
dann sollte man sich wahrscheinlich auch den vergleich sparen. die pointer werden ja wahrscheinlich nicht gleich sein, oder?
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#4

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:25
@ 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
Miniaturansicht angehängter Grafiken
zugriffsverletzung_-_2_401.jpg  
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:30
Zitat von hanselmansel:
@ Blackjack: Hatte mir davon erhofft, den Fehler eindämmen zu können. Werde es ändern. Ist es denn sinnvoll die Excepion ganz rauszustreichen?
auf jeden fall solltest du das freigeben im exception-block sein lassen. am übergeben bitmap hast du ja gar nicght rumzufummeln, und dein eigenes bitmap solltest du ja auch nicht einfach so freigeben, das brauchst du ja noch. von daher könnte man sich den gesamten try-block meiner meinung nach sparen und nur die assign-methode stehen lassen. naja vielleicht solltest du vorher noch überprüfen ob auch beide bitmaps assigned (d.h. <> nil) sind.

zu dem imemr noch bestehenden fehler: bist du sicher dass du dir deine eigenen bitmaps created hast?
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:46
Moin!

Delphi-Quellcode:
var
  b_Enabled :Boolean;
  b_MouseDown :Boolean;
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...

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#7

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 11:59
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

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.
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 12:03
Zitat von hanselmansel:
@ BlackJack: Ich habe die Exceptions weggestrichen und die TBitmaps im Constructor "created". Wahrscheinlich war genau das der Fehler!
dann gib sie aber auch bitte im Destructor wieder frei

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.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#9

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 12:20
Zitat von BlackJack:
ach ja vielleicht solltest 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.
Ich hatte vor, die Größe der Komponente immer genau dem geladenen Bitmap anzupassen, damit 1. auf jeden fall das gesamte Bitmap angezeigt wird, und 2. Die Komponente nicht riesig groß ist, obwohl das geladenen Bitmap nur 24x24 Pixel hat.

Ich habe jetzt keine Möglichkeit gesehen, die Größenänderung für jedes Bitmap spezifisch UND außerhalb der Paint Prozedur zu machen.
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Fehler beim Laden einer TBitmap-Property

  Alt 22. Jul 2005, 12:36
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.
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  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 07:00 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