Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema de objeto que hereda de Timage (https://www.clubdelphi.com/foros/showthread.php?t=63661)

astwin 25-02-2009 13:02:49

Problema de objeto que hereda de Timage
 
Hola, estoy creando un programa que se encarga de interconexionar bloques. Estoy intentando que en un Tpanel pueda tener los bloques que serviran para su interconexion (en el se podran mover libremente los bloques). Cada bloque tiene una imagen.

Tengo dos codigos hechos, el primero que funciona bien (con la imagen como objeto dentro de una clase) y otro que no funciona (no aparece la imagen en el Tpanel; esta hecha heredando de timage)

Funciona: la imagen se ve sobre el Tpanel
Código Delphi [-]
type TgraphBlock=class
  public
    image: Timage;
    pIn,pOut: array of Tpoint;
    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
    function isIn(p:Tpoint):integer;
    function isOut(p:Tpoint):integer;
    procedure imageDragOver(Sender, Source: TObject; X, Y: Integer;
                            State: TDragState; var Accept: Boolean);
    procedure imageDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure imageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

end;

Type BlockA=class(TgraphBlock)
  public
    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
end;

Type BlockB=class(TgraphBlock)
  public
    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
end;
////////////////////////////////////////////////////////////////////////////
Constructor TgraphBlock.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  // Creamos el objeto imagen
  image:=TImage.Create(parent);

  Form1.ImageList1.GetBitmap(img,image.Picture.bitmap);
  image.Left:=pos.X;
  image.Top:=pos.Y;
  image.AutoSize:=true;
  image.Visible:=true;
  image.BringToFront;
  image.Parent:=parent;
  image.OnDragOver:=ImageDragOver;
  image.OnDragDrop:=ImageDragDrop;
  image.onMouseDown:=ImageMouseDown ;
end;

Constructor BlockA.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  Inherited Create(img,parent,pos);
  setlength(pIn,2);
  setlength(pOut,1);
  pIn[0].X:=1 ;
  pIn[0].Y:=14 ;
  pIn[1].X:=1 ;
  pIn[1].Y:=32 ;
  pOut[0].X:=72 ;
  pOut[0].Y:=22 ;
end;

Constructor BlockB.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  Inherited Create(img,parent,pos);
  setlength(pIn,1);
  setlength(pOut,1);
  pIn[0].X:=1 ;
  pIn[0].Y:=22 ;
  pOut[0].X:=72 ;
  pOut[0].Y:=22 ;
end;

No funciona: la imagen no se ve sobre el Tpanel
Código Delphi [-]
type TgraphBlock=class(Timage)
  public
    pIn,pOut: array of Tpoint;
    lineaIn: array of Tlinea;
    lineaOut: array of array of Tlinea;

    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
    function isIn(p:Tpoint):integer;
    function isOut(p:Tpoint):integer;
    procedure imageDragOver(Sender, Source: TObject; X, Y: Integer;
                            State: TDragState; var Accept: Boolean);
    procedure imageDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure imageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

end;

Type BlockA=class(TgraphBlock)
  public
    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
end;

Type BlockB=class(TgraphBlock)
  public
    Constructor Create(img:integer;parent:TWinControl;pos:Tpoint);
end;
///////////////////////////////////////////////////////////////////
Constructor TgraphBlock.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  inherited create(parent);
  Parent:=parent;
  Form1.ImageList1.GetBitmap(img,Picture.bitmap);
  Left:=pos.X;
  Top:=pos.Y;
  AutoSize:=true;
  Visible:=true;
  BringToFront;

  OnDragOver:=ImageDragOver;
  OnDragDrop:=ImageDragDrop;
  onMouseDown:=ImageMouseDown ;
end;

Constructor BlockA.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  Inherited Create(img,parent,pos);
  setlength(pIn,2);
  setlength(pOut,1);
  pIn[0].X:=1 ;
  pIn[0].Y:=14 ;
  pIn[1].X:=1 ;
  pIn[1].Y:=32 ;
  pOut[0].X:=72 ;
  pOut[0].Y:=22 ;
  // Inicializamos lineas entrada y salida
  setlength(lineaIn,2); // Tantas lineas de entrada como entradas
  setlength(lineaOut,1,0); // Una dimension la salida
end;

Constructor BlockB.Create(img:integer;parent:TWinControl;pos:Tpoint);
begin
  Inherited Create(img,parent,pos);
  setlength(pIn,1);
  setlength(pOut,1);
  pIn[0].X:=1 ;
  pIn[0].Y:=22 ;
  pOut[0].X:=72 ;
  pOut[0].Y:=22 ;
  // Inicializamos lineas entrada y salida
  setlength(lineaIn,1); // Tantas lineas de entrada como entradas
  setlength(lineaOut,1,0); // Una dimension la salida
end;


Si pudierais ayudarme os estaria muy agradecido.

Neftali [Germán.Estévez] 25-02-2009 16:02:52

Mi recomendación en este caso y en otros similares, donde las porciones de código son grandes, es que subas un proyecto de ejemplo.
Seguro que en ese caso hay quien se anime a probarlo y te pueda ayudar de forma más eficaz.
De esta forma, vuiendo el código, es difícil averiguar o intuir dónde puede estar el problema.

astwin 27-02-2009 08:47:09

Gracias por el consejo, haber si puedo subir el proyecto ahora despues.
Un saludo.

iktwo 29-08-2010 19:21:22

Que tal hermano, pues tuve el mismo problema, intenté heradar de TImage y no funcionó, así que tuve que hacer una clase que tiene dentro una imagen que después pintaré en pantalla, algo como lo que tienes al principio, te pongo el codigo y revisa si te sirve:

Clase:
Código:

type
  TCelda2 = class(TObject)
  imagen:TImage;
  x,y,contenido:integer;
  conquistado:boolean;
  frescoComoLechuga:boolean;
  private
  public
  constructor Create();
  end;

Constructor:
Código:

constructor TCelda2.Create;
begin
        imagen:=TImage.Create(Form1);
        imagen.Parent:=Form1;
end;

Inicialización:
Código:

var
    aux:TCelda2
begin
        a:=TCelda2.Create;
        a.imagen.Top:=0;
        a.imagen.Left:=0;
        a.imagen.Width:=120;
        a.imagen.Height:=120;
        a.imagen.Picture.Bitmap.LoadFromResourceName(HInstance,'Bitmap_1');

Espero que esto te sirva, no digo que sea la mejor forma de hacer las cosas y no se si para lo que quieres aplica, pero si ya lo pudiste resolver a ver si comentas como por favor.


La franja horaria es GMT +2. Ahora son las 08:15:01.

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