Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehler beim Laden einer TBitmap-Property (https://www.delphipraxis.net/50226-fehler-beim-laden-einer-tbitmap-property.html)

hanselmansel 22. Jul 2005 10:02


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:
[...]

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

jfheins 22. Jul 2005 10:13

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

BlackJack 22. Jul 2005 10:21

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:

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?

hanselmansel 22. Jul 2005 10:25

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

BlackJack 22. Jul 2005 10:30

Re: Fehler beim Laden einer TBitmap-Property
 
Zitat:

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?

Muetze1 22. Jul 2005 10:46

Re: Fehler beim Laden einer TBitmap-Property
 
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

hanselmansel 22. Jul 2005 10:59

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.

BlackJack 22. Jul 2005 11:03

Re: Fehler beim Laden einer TBitmap-Property
 
Zitat:

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.

hanselmansel 22. Jul 2005 11:20

Re: Fehler beim Laden einer TBitmap-Property
 
Zitat:

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.

BlackJack 22. Jul 2005 11:36

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.
Seite 1 von 2  1 2      

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