Buogiorno,
Se ho un campo edit in una form e voglio controllare che vengano digitati solo numeri, posso fare il controllo nell'evento OnKeyPress e posso scrivere:
procedure TForm1.KeyPressNumero(Sender: TObject; var Key: char);
begin // Controllo caratteri digitati su edit
if not (Key in ['0'..'9',#8,#9]) then key:=#0;
end;
Questa procedura nell'evento OnCreate della form la associo al campo edit con:
editNumero.OnKeyPress:=@KeyPressNumero;
Il problema è: se la procedura è dentro la stessa unit, il tutto funziona regolarmente, mentre se la sposto in un'altra unit (magari una unit comune a tante altre, per il riutilizzo del codice), la stessa assegnazione nell'evento OnCreate mi dà il seguente errore:
Error: Incompatible types: got "<address of procedure(TObject;var Char);Register>" expected "<procedure variable type of procedure(TObject;var Char) of object;Register>"
Perche? C'è una possibile soluzione?
l'errore dice che mentre si aspettava un puntatore ad un metodo (= "doppio" puntatore di una procedura "of object") si è ritrovato un puntatore ad una procedura (= puntatore "tradizionale").
Tradotto per il caso specifico, quando scrivi
editNumero.OnKeyPress:=@KeyPressNumero;
il tutto funziona perché l'operatore @ restituisce l'indirizzo del *metodo* (= procedure of object) KeyPressNumero
procedure TForm1.KeyPressNumero(Sender: TObject; var Key: char);
probabilmente quando sposti KeyPressNumero in una unit diversa, dichiari qualcosa tipo:
procedure KeyPressNumero(Sender: TObject; var Key: char);
e cioè una semplice procedura (che non è un puntatore "of object").
Soluzioni?
Potresti dichiarare in questa unit con le tue utilità una semplice classe tipo:
type
TClasseAppoggio = class
public
procedure KeyPressNumero(Sender: TObject; var Key: char);
end
var
Appoggio: TClasseAppoggio;
poi:
1) nella sezione implementation metterai il codice che ritieni opportuno
2) nella sezione initialization istanzi l'oggetto di appoggio (Appoggio:=TClasseAppoggio.Create)
3) nella finalization liberi l'oggetto di appoggio (Appoggio.Free)
a questo punto potrebbe funzionare qualcosa tipo:
editNumero.OnKeyPress:=@Appoggio.KeyPressNumero;
non l'ho provato ma credo che dovrebbe andare