Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-01-2005
pepe2000 pepe2000 is offline
Miembro
 
Registrado: dic 2003
Ubicación: Cajamarca
Posts: 93
Poder: 21
pepe2000 Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 13-01-2005
Coco Coco is offline
Miembro
 
Registrado: jul 2004
Ubicación: Argentina
Posts: 83
Poder: 20
Coco Va por buen camino
Falta la creacion del componente FGlyph en el metodo create de tu componente,

luego del

inherited create(AOwner);

FGlyph := TBitmap.create;



Saludos.
Responder Con Cita
  #3  
Antiguo 22-01-2005
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Según tengo entendido, el bitmap debes crearlo y eliminarlo con el componente
Código Delphi [-]
 constructor Tprueba.create(AOwner: Tcomponent);
begin
 Fglyph : Tbitmap.Create;
 Fglyph := nil;
 inherited create(AOwner);
end;

destructor Tprueba.destroy; override;
begin
  Fgluph.Free;
  inherited destroy;
end;
Saludos, salvica
Responder Con Cita
  #4  
Antiguo 22-01-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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:
Empezado por salvica
constructor Tprueba.create(AOwner: Tcomponent);
begin
Fglyph : Tbitmap.Create;
Fglyph := nil;
En cuanto a la respuesta de salvica, hay un error, supongo que por las prisas, despues de hacer el Tbitmap.create no puedes asignarle nil, estarás dejando en el limbo el bitmap recien creado.

A mi entender, solo deberías crear el Tbitmat cuando lo asignas, no desde la creación del componente.

Código Delphi [-]
en el SetBitmap :

Freeandnil(Fglyph);
Fglyph := Tbitmat.Create(nil);
Fglyph.Assign(Value);
...
en el destroy:

Freeandnil(Fglyph);

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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:32:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi