Delphi-PRAXiS

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 AV bei Verwendung eines TPictures in meiner Komponente (https://www.delphipraxis.net/97228-av-bei-verwendung-eines-tpictures-meiner-komponente.html)

Andreas L. 7. Aug 2007 11:07


AV bei Verwendung eines TPictures in meiner Komponente
 
Hi,
ich habe mir eine neue Komponente erstellt. Diese enthält im Objektinspektor wiederum eine Klasse die ein TPicture als property enthält. Noch läuft alles ohne Probleme, lade ich aber ein Bild in diese Eigenschaft und klicke auf eine andere Eigenschaften oder irgendwo anders aus die Form, bekomme ich folgende AV:

Zitat:

---------------------------
Fehler
---------------------------
Zugriffsverletzung bei Adresse 6946540C. Lesen von Adresse 6946540C.
---------------------------
OK Details >>
---------------------------
Danach die hier:
Zitat:

---------------------------
Fehler
---------------------------
Zugriffsverletzung bei Adresse 20F29C20 in Modul 'designide100.bpl'. Lesen von Adresse 4F444E49.
---------------------------
OK Details >>
---------------------------
Und die wiederholen sich solange bis ich die IDE abschieße...

Hier mein Code:

HTMLUtils.pas (enthält Klasse und Definitionen die auch in anderen Komponenten verwendet werden sollen):
Delphi-Quellcode:
...
type
  THTMLBackground = class(TComponent)
  private
   fBackgroundImage: TPicture; //Variable für das Bild
   fBackgroundColor: TColor;
   fBackgroundPosition: THTMLBackgroundPosition;
   fBackgroundPositionInPixels: Integer;
   fBackgroundRepeat: THTMLBackgroundRepeat;
  published
   property BackgroundImage: TPicture read fBackgroundImage write fBackgroundImage; //und die Eigenschaft für den OI
   property BackgroundColor: TColor read fBackgroundColor write fBackgroundColor;
   property BackgroundPosition: THTMLBackgroundPosition read fBackgroundPosition write fBackgroundPosition;
   property BackgroundPositionInPixels: Integer read fBackgroundPositionInPixels write fBackgroundPositionInPixels;
   property BackgroundRepeat: THTMLBackgroundRepeat read fBackgroundRepeat write fBackgroundRepeat;
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
  end;
...
...
{ THTMLBackground implementation }

constructor THTMLBackground.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);

 fBackgroundImage := TPicture.Create; //Bild wird erstellt
 fBackgroundColor := clNone;
 fBackgroundPosition := [hbpLeft];
 fBackgroundPositionInPixels := 0;
 fBackgroundRepeat := hbrRepeat;

end;

destructor THTMLBackground.Destroy;
begin

 fBackgroundImage.Free; //Bild wird freigegeben

 inherited Destroy;

end;
DivLayer.pas (Die eigentliche Komponente):
Delphi-Quellcode:
type
  TDivLayer = class(TCustomPanel)
  private
    fBorders: THTMLBorder;
    fBackground: THTMLBackground;
    procedure SetBorders(Value: THTMLBorder);
    procedure SetBackground(Value: THTMLBackground);
  published
    property Borders: THTMLBorder read fBorders write SetBorders;
    property Background: THTMLBackground read fBackground write SetBackground; //Klasse wird als Eigenschaft deklariert
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

...
{ TDivLayer implementation }

constructor TDivLayer.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);

 fBorders := THTMLBorder.Create(Self);
 fBackground := THTMLBackground.Create(Self); //Klasse wird erstellt

end;

destructor TDivLayer.Destroy;
begin

 fBorders.Free;
 fbackground.Free; // und freigegeben...

 inherited Destroy;

end;
Hat jemand eine Idee?

Apollonius 7. Aug 2007 11:11

Re: AV bei Verwendung eines TPictures in meiner Komponente
 
Zitat:

Delphi-Quellcode:
property BackgroundImage: TPicture read fBackgroundImage write fBackgroundImage;

Der Zugriff auf Pbjekteigenschaften sollte nicht per Überschreiben, sondern per assign erfolgen. Deklariere also eine Settermethode (Getter ist nicht notwendig). Sonst gibt es auch Speicherlecks.

Andreas L. 7. Aug 2007 11:42

Re: AV bei Verwendung eines TPictures in meiner Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da hätte ich selbst draufkommen müssen :wall:

Danke :thumb:

Warum sieht eigentlich die Eigenschaft der Klasse im Objektinspektor so komisch aus (siehe Anhang)?

jim_raynor 7. Aug 2007 13:13

Re: AV bei Verwendung eines TPictures in meiner Komponente
 
Die Eigenschaft Background von TDivLayer sollte nicht schreibbar sein. Dann sollte es richtig aussehen. Und ich glaube es sollte reichen THTMLBackground von TPersistent abzuleiten und nicht von TComponent.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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