Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: AndreaM - Dicembre 12, 2016, 02:01:18 pm

Titolo: Problemi con indirizzo di una procedura.
Inserito da: AndreaM - Dicembre 12, 2016, 02:01:18 pm
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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?
Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: nomorelogic - Dicembre 13, 2016, 12:31:09 am
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
Codice: [Seleziona]
editNumero.OnKeyPress:=@KeyPressNumero;

il tutto funziona perché l'operatore @ restituisce l'indirizzo del *metodo* (= procedure of object) KeyPressNumero
Codice: [Seleziona]
procedure TForm1.KeyPressNumero(Sender: TObject; var Key: char);

probabilmente quando sposti KeyPressNumero in una unit diversa, dichiari qualcosa tipo:
Codice: [Seleziona]
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
editNumero.OnKeyPress:=@Appoggio.KeyPressNumero;

non l'ho provato ma credo che dovrebbe andare

Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: Legolas - Dicembre 18, 2016, 08:11:27 pm
Domanda: non è che il progetto dove funziona e quello dove non funziona utilizzano due modalità differenti, tipo una {$mode delphi} e l'altra {$mode objfpc}?
Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: AndreaM - Dicembre 22, 2016, 02:29:14 pm
No, no ovviamente le due modalità sono identiche!
Ora provo a verificare se la soluzione proposta è funzionante!
Grazie
Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: AndreaM - Dicembre 22, 2016, 03:43:06 pm
La soluzione proposta da  nomorelogic sembra funzionare!
Grazie
Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: SB - Dicembre 25, 2016, 08:31:13 am
In Pascal il nome di una procedura dovrebbe essere già l'indirizzo della procedura. L'operatore @ non ci dovrebbe essere. (o almeno in Delphi funziona così)

Come fai a "spostare" la procedura in un'altra unit quando è dichiarata come membro di TForm1?

Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: Avogadro - Dicembre 30, 2016, 03:53:36 am
Perdonate l' intrusione, ma non si puo' piu' semplicemente  usare il maskedit per questa tipologia di problemi (il controllo stretto del data entry . digitare solo numeri, digitare secondo un protocollo preciso etc - ) ?

E' li' nell'ide li lazarus, se ci sono già le comodità collaudate perché impelagarsi con altri approcci  ?  Cosa mi sfugge ?

"Argumentum ad google ":

http://lazarustutorials.blogspot.it/2014/03/mask-edit-tutorial.html

http://www.lazaruspascal.it/index.php?topic=278.0

http://forum.lazarus.freepascal.org/index.php?topic=15445.0

etc, etc


Saluti



Titolo: Re:Problemi con indirizzo di una procedura.
Inserito da: SB - Dicembre 30, 2016, 07:53:38 am
E' utile saper lavorare con i tasti premuti perchè ci sono casi non gestibili da una maskedit (per quel che ne so)
Ad esempio potresti gestire tasti che non corrispondono a caratteri stampabili per ottenere funzionalità particolari (tasti funzione, ecc.)

Poi personalmente trovo scomoda una maskedit perchè gli utenti sono troppo "umani" e mal si adattano ad un input preformattato  ;D
Perfino per una data/ora avrebbero problemi a scrivere 01/01/2017 00:01