GARANTIR DESCONTO

Fórum Incompatible type: ´method pointer and regular procedure´ #375514

02/10/2009

0

Bom dia colegas

Tomando como exemplo a unit abaixo:

unit faUtil;

interface

uses Windows, SysUtils, DBCtrls, Messages, Controls;

Type
   procedure ProximoControle(Sender: TObject; var Key: Char);
   procedure ContextoPopUp(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
  
implementation

procedure ProximoControle(Sender: TObject; var Key: Char);
begin {PRÓXIMO CONTROLE COM ENTER}
   if Sender is TDBLookUpCombobox then
      if key = #10 then //CTRL+ENTER
         TDBLookupComboBox(Sender).PopupMenu.Items[0].Click;
   if key = 13 then
      PostMessage(TWinControl(Sender).Handle, WM_NEXTDLGCTL, 0, 0); //no 1º parametro, zero é para frente e um é para cima
end;

procedure ContextoPopUp(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin {SETA O FOCO NO COMPONENTE AO CLICAR COM DIREITO PARA ACIONAR OS POP-UPs}
   TDBLookUpComboBox(Sender).SetFocus;
end;



Em outra unit ao atribuir os procedimentos ao evento OnKeyPress
   DBEditContato.OnKeyPress := ProximoControle;

resulta no seguinte erro: Incompatible type: ´method pointer and regular procedure´

Já se colocar os métodos em uma classe e declarar uma var aí funciona:

   TUtil = Class
   public
      procedure ProximoControle(Sender: TObject; var Key: Char);
      procedure ContextoPopUp(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
   end;
var
   util: Tutil;


ou

   TUtil = Class
   public
      class procedure ProximoControle(Sender: TObject; var Key: Char);
      class procedure ContextoPopUp(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
   end;
var
   util: Tutil;


Tem alguma alternativa de contornar o problema sem necessariamente jogar os métodos em uma classe?

Se alguém tiver um material bom sobre method pointer x procedures regulares enviar para delmar.delmar@gmail.com ou se conhecer um link que aborde ´legal´ o assunto, poste aí


Delmar

Delmar

Responder

Posts

02/10/2009

Afarias

Opa Delmar,

Como vc já viu Procedimentos/Funções e Métodos são incompatíveis. Enquanto o primeiro é um endereço para o seu código o segundo é uma dupla de ponteiros, sendo 1 para o código e outro para o objeto/classe que o detém.

É possível q com algum código mirabolante envolvendo ponteiros/RTTI/´sei lá o q´ vc consiga usar um procedimento como método -- mas, tenho certeza q não valeria a pena.

A solução de criar uma classe responsável por conter esses métodos (relacionados) juntos -- como vc mostrou -- é simples, intuitiva e dentro dos padrões.



T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar