Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Probleme mit TBitmap und Größenänderung (https://www.delphipraxis.net/2900-probleme-mit-tbitmap-und-groessenaenderung.html)

janjan 12. Feb 2003 14:51


Probleme mit TBitmap und Größenänderung
 
Delphi-Quellcode:
unit TestBox;

interface

uses
   Classes,
   ExtCtrls,
   Graphics;

type
  TTestBox = class(TPaintBox)
  private
    { Private-Deklarationen }
  protected
    Background: TBitMap;
    first: boolean;
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure  paint; override;
    procedure  Resize; override;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure TTestBox.Resize;
begin
  Background.Width:=Width;
  Background.Height:=Height;
  background.Canvas.Ellipse(0,0,Width,Height);
  inherited Resize;
end;

constructor TTestBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Background:= tbitmap.Create;
  Background.Width:=Width;
  Background.Height:=Height;
  background.Canvas.Ellipse(0,0,Width,112);
end;

procedure TTestBox.Paint;
begin
  inherited paint;
  canvas.Draw(0,0,background);
end;

destructor TTestBox.Destroy;
begin
  background.Free;
  inherited Destroy;
end;

procedure Register;
begin
  RegisterComponents('Beispiele', [TTestBox]);
end;

end.
Warum kann ich das Bitmap beim Create verändern, im Resize-Ereigniss nicht? Da stegt er jedesmal mit einer "Zugriffsverletzung bei Adresse..." aus. :(

sakura 12. Feb 2003 15:11

Mal ehrlich, dass es überhaupt jemals gut geht ist schon verwunderlich, sorry. :) Folgender Abschnitt:
Delphi-Quellcode:
constructor TTestBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Background:= tbitmap.Create;
  Background.Width:=Width;
  Background.Height:=Height;
  background.Canvas.Ellipse(0,0,Width,112);
end;
Als erstes rufst Du bereits inherited... auf, was eigentlich okay ist, aber intern wird auch sofort Resize aufgerufen. Dein Resize nutzt dann background, was noch nicht initialisiert ist (also nil) -> Zugriffsverletzung,
Delphi-Quellcode:
procedure TTestBox.Resize;
begin
  Background.Width:=Width;
  Background.Height:=Height;
  background.Canvas.Ellipse(0,0,Width,Height);
  inherited Resize;
end;
Ändere Dein Create wie folgt, und alles sollte laufen
Delphi-Quellcode:
constructor TTestBox.Create(AOwner: TComponent);
begin
  Background:= tbitmap.Create;
  inherited Create(AOwner);
end;
...:cat:...

janjan 12. Feb 2003 15:17

thx, es klappt :) und dabei wollt ich mich doch nur an die hilfe halten:

Delphi-Quellcode:
constructor TWrapMemo.Create(AOwner: TComponent);*****{ Dies kommt nach der Implementierung }
begin
  **inherited Create(AOwner);***************************{ Diesen Schritt IMMER zuerst! } 
  **WordWrap := False;**********************************{ Neuen Wert setzen }

*end;

sakura 12. Feb 2003 15:21

Einige Sachen muss man halt etwas salzen, bevor diese genießbar sind :D

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz