FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Access Violation al cargar un Tbitmap en mi componente
Ya estoy 3 horas intentando solucionar este problema que deberia ser simple, pero a mi no me funciona.
Al colocar siguiente componente en un formulario e intentar cargar una imagen en el sale un error de "access violation". Les agradezco mucho su ayuda. Código:
unit prueba; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, db; type Tprueba = class(Tcomponent) private { Private declarations } Fglyph: Tbitmap; procedure SetBitmap(const Value: TBitmap); protected { Protected declarations } public { Public declarations } constructor create(AOwner: Tcomponent); override; published { Published declarations } property Glyph: TBitmap read FGlyph write SetBitmap; end; procedure Register; implementation uses pmemose1; constructor Tprueba.create(AOwner: Tcomponent); begin inherited create(AOwner); end; procedure Tprueba.SetBitmap(const Value: TBitmap); begin FGlyph.Assign(Value); end; procedure Register; begin RegisterComponents('Samples', [Tprueba]); end; end. |
#2
|
|||
|
|||
Falta la creacion del componente FGlyph en el metodo create de tu componente,
luego del inherited create(AOwner); FGlyph := TBitmap.create; Saludos. |
#3
|
||||
|
||||
Según tengo entendido, el bitmap debes crearlo y eliminarlo con el componente
Saludos, salvica |
#4
|
||||
|
||||
Antes de nada respondo a tu pregunta. El access violation te aparece porque delphi inicializa Fglyph a nil, y al intentar accecera a Fglyph.Assign estas traspasando un puntero nulo.
Cita:
A mi entender, solo deberías crear el Tbitmat cuando lo asignas, no desde la creación del componente.
Aqui hay varias cosillas a tener en cuenta: Fglyph delphi lo inicializa a nil, por tanto, la primera vez que asignes un Bitmap, el FreeAndnil no hace nada. La segunda vez que asignes una imagen, primero se libera la imagen anterior con FreeAndNil, despues se crea de nuevo la imagen. El parámetro que usa en Tbitmap.create(nil) es porque nadie se va a encargar de destruir el Bitmap, pero está controlado en el destroy del componenente, que tambien hacemos un Freeandnil Saludos |
|
|
|