Pyetro 0 Denunciar post Postado Novembro 16, 2011 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: Link da imagem: http://imageshack.us/photo/my-images/21/delphiajudaimasters.jpg Compartilhar este post Link para o post Compartilhar em outros sites
Pyetro 0 Denunciar post Postado Novembro 29, 2011 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