con questo problema del nome delle variabili e dei parametri mi ci sono imbattuto anche io all'inizio e non capivo il motivo
poi l'illuminazione: il compilatore fpc ha diversi modi di compilare il pascal
il "delphi mode" attiva la compilazione, appunto, in modalità Delphi
se leggi in questo link, al punto 8
https://www.freepascal.org/docs-html/prog/progse74.html
vedrai che dovrebbe risolvere il tuo problema in quanto dovrebbe accettare che i parametri dei metodi di una classe, abbiano lo stesso nome delle proprietà
comunque bisogna ammettere che leggere il seguente codice:
procedure TClasseAAA.ImpostaTemp(Temperatura: double);
begin
...
Temperatura := Temperatura;
...
end;
è ambiguo e la domanda potrebbe sorgere spontanea: assegno la proprietà dell'istanza o assegno il parametro? :o
mentre il seguente non lascia spazio a fraintendimenti di lettura:
procedure TClasseAAA.ImpostaTemp(ATemperatura: double);
begin
...
Temperatura := ATemperatura;
...
end;
Diciamo che la "A" come prefisso del nome del parametro del metodo, la puoi intendere come l'articolo indeterminativo "un" - :) -, per cui il tutto è molto più chiaro.
visto che ci siamo
a proposito delle dichiarazioni di metodi, funzioni e procedure:
a meno che non sia espressamente richiesto dal contesto, tutti i parametri dovrebbero essere const
(sopra non l'ho messo perché sennò non ci sarebbe stata l'ambiguità ;D )
No, no, non ci sono problemi, anzi ho rivisto la classe TComPort e l'ho rimessa parzialmente a posto.
Non esiste proprio utilizzare nomi uguali per tutto.
MA IL DUBBIO NON E' STATO DIRIMATO ... SI POTREBBE FARE ? O è una libertà di Delphi ?
Dei vari modificatori mi sono documentato (aprendo un codice Lazarus è il primo define nuovo che leggi :D ), però il fatto di usarlo come Delphi non se ne parla sarebbe un pò riduttivo, se Delphi permette questo.
L'unica cosa che secondo me si dovrebbe mettere a posto (a meno che non si possa già fare e sbagli io) è l'assegnazione degli eventi:
- creo un evento OnClick, e assegno questo evento a runtime a tutta una serie di componenti. Adesso come adesso con modalità "{$Mode objFPC}" devo assegnare all'evento il puntatore alla procedura. Questo però induce una possibile problematica (a parte l'odio di lavorare con i puntatori), ossia la procedura potrebbe non essere compatibile con quanto richiesto dall'evento e non viene controllato in fase di compilazione dando adito a possibili problematiche difficili poi da diagnosticare a runtime.
esempio:
//Procedura generica
procedure TForm1.JvLED1Click(Sender: TObject);
begin
if Sender is TJvLed then
(Sender as TJvLed).Status := not (Sender as TJvLed).Status;
end;
//Assegnazione attuale (senza controllo)
Led2.OnClick := @JvLED1Click;
//Assegnazione preferibile (con controllo, ma genera l'errore (Error: Wrong number of parameters specified for call to "JvLED1Click")
Led2.OnClick := JvLED1Click;
Saluti
Ciao.
Delphi nasconde la natura della callback.
Ma di fatto è un puntatore a metodo o procedura/funzione. Dipende da come è dichiarato il prototipo di chiamata.
Sul fatto che possa dare errore, mi sembra di ricordare, che controlla. Essendo un puntatore tipizzato ti castiga se passi un OnKeyUp al posto di un OnChange. Ma vado a memoria, potrei ricordarmi male.
Se poi fai un cast passando per puntatore generico, saresti solo masochista nel farlo :)
Che poi stia sulle scatole è una questione di gusti e quelli non si discutono.
{*
Led2.OnClick := JvLED1Click;
*}
[/size]Qui stai tentando di invocare il metodo e assegnare ad OnClick il risultato della chiamata. Il compilatore ti sta gentilmente chiedendo di passare un parametro in chiamata. Se mettessi un nil come parametro, mi aspetto che ti dica che la procedura non restituisce nulla nello stack.
Stilgar
Mentre stavo scrivendo ha risposto Stilgar, ma la risposta la metto comunque (oramai l'ho scritta :D )
MA IL DUBBIO NON E' STATO DIRIMATO ... SI POTREBBE FARE ? O è una libertà di Delphi ?
forse non ho capito la domanda
il fatto è che il compilatore Delphi accetta quella sintassi (e di conseguenza la sua semantica)
fpc invece no, non ha quella sintassi (e secondo me è più corretto l'approccio di fpc)
però, vista la mole di codice Delphi a disposizione, hanno inventato la modalità Delphi di modo da poter compilare quel codice anche in progetti fpc
la modalità delphi, per concludere, la vedo utile solamente per fare il porting senza voler riscrivere con la sintassi di fpc
si tratta alla fine di una scelta del programmatore
L'unica cosa che secondo me si dovrebbe mettere a posto (a meno che non si possa già fare e sbagli io) è l'assegnazione degli eventi:
- creo un evento OnClick, e assegno questo evento a runtime a tutta una serie di componenti. Adesso come adesso con modalità "{$Mode objFPC}" devo assegnare all'evento il puntatore alla procedura. Questo però induce una possibile problematica (a parte l'odio di lavorare con i puntatori), ossia la procedura potrebbe non essere compatibile con quanto richiesto dall'evento e non viene controllato in fase di compilazione dando adito a possibili problematiche difficili poi da diagnosticare a runtime.
Beh, essendo l'evento un puntatore ad una procedura ho paura che non ci siano alternative.
Proprio per evitare i problemi di compilazione, molti metodi destinati ad essere assegnati come risposta ad un evento si aspettano un unico parametro Sender (vedi dichiarazione di TNotifyEvent).
Quindi l'assegnazione seguente
Led2.OnClick := @JvLED1Click;
E' corretta perché assegna all'evento OnClick l'indirizzo del metodo "JvLED1Click".
L'assegnazione sotto è errata per diversi motivi:
Led2.OnClick := JvLED1Click;
- si sta assegnando al puntatore OnClick un valore che non arriverà mai perché una procedura non restituisce un valore
- la procedura si aspetta un parametro ma nell'assegnazione il parametro non è stato passato
nomorelogic