padvak Posted May 1, 2012 at 11:03 PM Report #452565 Posted May 1, 2012 at 11:03 PM Olá mi amigos, estou com una problema em dll, eu fiz una função para verificar o caption de uma label isso em uma DLL... Segue el codigo: function CheckTitleLabel (Title: LPCSTR) : bool; var p:pointer; begin with TForm1(p) do begin if ( Title = lbc.Caption ) then begin ShowMessage('Label Correta'); end; Result := True; end; end; procedure TitleCheck; begin CheckTitleLabel('labelcorreta'); end; e no button... procedure TForm1.Button1Click(Sender: TObject); begin TitleCheck; end; tudo bem, quando vou verificar o titulo me deparo com o seguinte error Access violation at address 003878ED in a module 'MyDllCheck.dll'. Read of address 5B202DBF Agradeço meus amigos!
bsccara Posted May 2, 2012 at 12:28 AM Report #452579 Posted May 2, 2012 at 12:28 AM Não estás a inicializar a variável 'p'. Quando tentas aceder a uma propriedade da classe TForm1 (referenciada por 'p') lá vai disto... P.S. Um concelho: indenta o código um bocadinho melhor, vais ver que simplifica grandemente a resolução de muitos problemas.
padvak Posted May 2, 2012 at 12:40 AM Author Report #452581 Posted May 2, 2012 at 12:40 AM mesmo sem a variável p o erro continua....!
bsccara Posted May 2, 2012 at 12:43 AM Report #452582 Posted May 2, 2012 at 12:43 AM No segundo bloco de código estás a chamar uma função 'CheckTitleLabel' e no primeiro a função chama-se 'CheckTitle'. São a mesma função ?
padvak Posted May 2, 2012 at 01:09 AM Author Report #452584 Posted May 2, 2012 at 01:09 AM amigo arrumei la, o certo é CheckTitleLabel olha novamente o post
nunopicado Posted May 2, 2012 at 08:20 AM Report #452612 Posted May 2, 2012 at 08:20 AM Só para ver se estou a perceber o conceito, porque não usas, em vez de um pointer, uma variável TForm1, ou melhor ainda, transformas a função CheckTitleLabel num método da propria TForm1? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
bsccara Posted May 2, 2012 at 11:26 AM Report #452655 Posted May 2, 2012 at 11:26 AM Só para confirmar: apenas a função 'CheckTitleLabel' está na DLL, correcto ? O código do evento e a outra função estão no executável ? Ou isto está tudo na DLL ?
nunopicado Posted May 3, 2012 at 10:29 AM Report #452878 Posted May 3, 2012 at 10:29 AM Só para ver se estou a perceber o conceito, porque não usas, em vez de um pointer, uma variável TForm1, ou melhor ainda, transformas a função CheckTitleLabel num método da propria TForm1? Já agora, deixo aqui uma possível implementação: 1º Criar um Class Interceptor para a Form. Deverá ser colocado antes da declaração do tipo TForm1: type TForm = Class (Forms.TForm) Public function CheckTitleLabel (Title: LPCSTR) : bool; End; 2º Criar a implementação da função CheckTitleLabel function TForm.CheckTitleLabel (Title: LPCSTR) : bool; begin Result:= Title=(FindComponent('LBC') as TLabel).Caption; // LBC é uma TLabel, certo? // Como tinhas a tua, devolvia sempre True, mesmo em comparações negativas, já que o result:=true estava fora do IF // e só dava mensagem em caso positivo! end; 3º Usar a informação devolvida pelo CheckTitleLabel procedure TitleCheck; begin if Form1.CheckTitleLabel('labelcorreta') then ShowMessage('Label Correcta') else ShowMessage('Label Errada'); end; "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now