Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TBitmap Property in eigener Komponente (https://www.delphipraxis.net/147906-tbitmap-property-eigener-komponente.html)

Culxxaw 18. Feb 2010 19:05


TBitmap Property in eigener Komponente
 
Hallo Leute,

ich wollte nur mal schnell fragen, ob es möglich ist eine Bitmap als Property zu erklären, sodass man später über den Objektinspektor eine Bitmap wählen kann. (Mit dem typischen Bild-Wählen-Dialog etc.) Aus irgendwelchen Gründen erhalte ich jedes Mal eine Fülle an Fehlermeldungen.

Gibt bestimmt schon zig Threads, die dieses Thema mal hatten, habe jedoch leider keinen gefunden.

Danke im Voraus!

Teekeks 18. Feb 2010 19:16

Re: TBitmap Property in eigener Komponente
 
Was machst du denn genau?
Und was bekommst du für Fehlermeldung?

Gruß Teekeks

Culxxaw 18. Feb 2010 19:23

Re: TBitmap Property in eigener Komponente
 
Unter Private hab ich:
Delphi-Quellcode:
FGlyph : TBitMap;
und dann unter Published das hier:
Delphi-Quellcode:
property Glyph : TBitMap read FGlyph write FGlyph;
Wie bei allen anderen Eigenschaften auch (was wahrscheinlich der Fehler ist)...

Dann im OnCreate ein
Delphi-Quellcode:
FGlyph := TBitMap.Create;
und das dazugehörige Free im OnDestroy

Als Fehlermeldung bekomme ich sowas wie z.B.: "Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.", wenn ich eine Bitmap laden möchte...

mleyen 18. Feb 2010 19:45

Re: TBitmap Property in eigener Komponente
 
Objekte kann man soweit ich weiß nicht direkt in den OI packen.
Beim Erzeugen im Konstruktor sollte man auf csDesigning in Delphi-Referenz durchsuchenComponentState prüfen.

Was dich aber bestimmt zum Ziel führt ist der Delphi-Referenz durchsuchenTPropertyEditor.
Ein gutes Video dazu ist bestimmt dieses hier.

SirThornberry 18. Feb 2010 19:46

Re: TBitmap Property in eigener Komponente
 
So kann das nicht gehen. In deinem Create reservierst du Speicher für ein Bitmap (mit TBitmap.Create). Wenn aber ein neues Bitmap gesetzt wird, so wird dein FGlyph einfach nur auf den Speicher des zugewiesenen Bitmaps zeigen und der Speicher den du im Create angefordert hast ist nicht mehr referenziert. Du solltest eine Set-Methode verwenden und das übergebene Bitmap darin auf das andere Assignen.

himitsu 18. Feb 2010 20:34

Re: TBitmap Property in eigener Komponente
 
Zitat:

Zitat von SirThornberry
So kann das nicht gehen. ...

Also schau dir einfach mal .Picture bei TImage, bzw. Bitmap bei TPicture an.

Fazit: Wenn das Objekt in der Klasse erstellt wird, dann sollte dessen Instanz auch nur innerhalb dieser Elternklasse verändert/verwaltet werden.
Und ein direkter Schreibzugriff ala WRITE ist damnach inakzeptabel.


Delphi-Quellcode:
property Glyph : TBitMap read FGlyph write Assign;

procedure Assign(AGlyph : TBitMap);
begin
  FGlyph.Assign(AGlyph);
  // oder die einzelnen Werte manuell setzen
end;


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