Jump to content

Recommended Posts

Posted

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!

Posted

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.

Posted

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.

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.