Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pyetro

[Resolvido] Abstract Error - Ao fechar TImage criado em Runtime c

Recommended Posts

Bom galera, talvez haja alguém aqui para sanar minhas dúvidas...

 

Vou explicar. Tenho um TImage de fundo no meu form. Ao clicar nele, dependendo da posição, cria um TImage específico naquela mesma posição. A imagem criada fica a frente desta de fundo. O Problema surge porque na imagem de fundo tem o Evento Click, que chama a procedure que cria a nova imagem, então quando uma imagem fica a frente da imagem de fundo perco o evento naquela posição que usaria para apagar a imagem criada.

 

Para resolver isso ao criar a imagem, adiciono no Evento Click dela a procedure de Click da imagem de fundo. O problema é que algumas vezes aparece o erro "Abstract Error" e as vezes erro de "Violação de acesso no endereço 00402FFCC no módulo 'Project1.exe'. Leitura do endereço 016E3C62"...

 

Por favor alguém que saiba como arrumar, tenta me ajudar aí! Obrigado!

 

Olhem uma simulução do código original:

 

unit UPrincipal;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 jpeg, ExtCtrls, ComCtrls, StdCtrls, Buttons, RxGIF, DBTables, Db, Mask;

type
 TFrmPrincipal = class(TForm)
   ImgFundo: TImage;
   ImgDinamica: TImage;

 function FnPosicaoMouse():Integer;
 procedure FnDesenha();
 procedure ImgFundoClick(Sender: TObject);
 procedure FormCreate(Sender: TObject);

 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 FrmPrincipal: TFrmPrincipal;
 gName: String;
 gLeft,gTop: Integer;

implementation

{$R *.DFM}

function TFrmPrincipal.FnPosicaoMouse():Integer;
var
 pt: TPoint;
 mX, mY: Integer;
begin
 pt.x := 0;
 pt.y := 0;
 pt := ImgFundo.ClientToScreen(pt);
 mX := pt.x; mY := pt.y;
 GetCursorPos(pt);
 mX := pt.x - mX; mY := pt.y - mY;

 if (mX < ImgFundo.width/2) then
 begin
   if(mY < ImgFundo.Height/2) then
     gName := 'Parte1'
   else
     gName := 'Parte3';
 end else
 begin
   if(mY < ImgFundo.Height/2) then
     gName := 'Parte2'
   else
     gName := 'Parte4';
 end;
 gLeft := mX;
 gTop := mY;
 if (gLeft > 0) and (gTop > 0) then
   result := 1
 else
   result := 0;
end;

procedure TFrmPrincipal.FnDesenha();
var
 TIMG: TImage;
begin
TIMG := TImage(FindComponent('ImgDinamica'));

 if FrmPrincipal.FindComponent(gName) = Nil then
 begin
   // Criando Imagem
   with TImage.Create(SELF) do
     try begin
       Parent  := FrmPrincipal;
       Name  := gName;
       Left  := gLeft;
       Top   := gTop;
       Height  := TIMG.HEIGHT;
       Width   := TIMG.WIDTH;
       Picture := TIMG.Picture;
       Visible := True;
       Transparent := False;
       OnClick := ImgFundoClick;
       BringToFront;
     end;
     Except
       Free;
   end;
 end
 else begin
   TImage(FrmPrincipal.FindComponent(gName)).Free;
 end; // Fim IF Find Component
end;


// Procedure Pinta face com Azul (Previsão)
procedure TFrmPrincipal.ImgFundoClick(Sender: TObject);
begin
 if(FnPosicaoMouse = 1) then
   FnDesenha();
end; // Fim Function

procedure TFrmPrincipal.FormCreate(Sender: TObject);
begin
 DoubleBuffered := True;
end;

end.

 

Agora uma imagem do que seria um form simples simulando meu form com a imagem de fundo e as dinamicas:

delphiajudaimasters.jpg

Link da imagem: http://imageshack.us/photo/my-images/21/delphiajudaimasters.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi o problema jogando uma TImage, chamado ImageRecebeEvento, do mesmo tamanho da que eu usava como fundo, a frente de todas as outras, porém sem adicionar picture, deixando esse componente como invisivel/transparente, e movi os eventos de click pra esse TImage... assim acabou meus problemas, o único probleminha foi ter que adicionar o comando "ImageRecebeEvento.BringToFront;" sempre logo depois de criar uma nova imagem dinamicamente para esta ficar sempre a frente!

 

Podem fechar o tópico!

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.