Italian community of Lazarus and Free Pascal

Programmazione => LCL => Topic aperto da: DragoRosso - Giugno 16, 2025, 03:42:38 pm

Titolo: Lazarus IDE e eventi - Errata "signature"
Inserito da: DragoRosso - Giugno 16, 2025, 03:42:38 pm
Dal forum internazionale: https://forum.lazarus.freepascal.org/index.php/topic,71477.msg557873.html#msg557873 (https://forum.lazarus.freepascal.org/index.php/topic,71477.msg557873.html#msg557873)

Sunto:

impostando nell'IDE un evento di un componente LCL, l'eventuale cambio degli argomenti della procedura (l'evento viene poi gestito a codice come procedura) non genera errori in compilazione, ma bensì a runtime e difficili da dignosticare pure.

Questo potrebbe accadere sopratutto quando si usa il copia / incolla da un codice vecchio a un nuovo progetto dove la "signature" (in Italiano "firma") del metodo potrebbe essere cambiato.
A me è capitato più di qualche volta in Delphi, ma Delphi te lo segnala e ti chiede di rimuoverlo o non compila.

EDIT: un utente ha tolto nel suo sorgente il supporto alle stringhe lunghe.

Sul forum è stato segnalato in quanto è stato tolto il supporto in compilazione alle stringhe lunghe per default (cioè con {$H+} ) è ciò ha cambiato la tipologia di compilazione (da stringhe "lunghe" a stringhe "corte") senza che il compilatore segnalasse la cosa.
La LCL vuole avere le stringhe lunghe ed è per quello che viene insierito in testa a tutte le unità il ( {$H+} ) quando si usa
la modalità {$mode objfpc}. Nella modalità {$mode Delphi} è già definito l'uso di stinghe lunghe e quindi il problema non si pone.

In pratica la chiamata all'evento è avvenuta con parametri diversi da quelli che si aspettava e quindi a runtime venicano generati errori a casaccio.

Se cambiate anche a mano il tipo di uno degli argomenti di un evento settato dall'IDE, vedrete che non ci sono segnalazioni.

Esempio: mettete in una Form vuota una TEdit e impostate l'evento KeyPress, poi andate a codice e cambiate il tipo del parametro "Key" come indicato di seguito, sia nella interface che nella implementation ovviamente, di base dovrebbe essere CHAR:

Codice: [Seleziona]
procedure Edit1KeyPress(Sender: TObject; var Key: String);

... io non ho provato ma dicono che crasha il programma.

Ripeto, nessuno farebbe volontariamente qualcosa di simile, ma il cambiamento della tipologia di parametri tra una versione e l'altra potrebbe portare a situazioni simili (come segnalato nel forum basta togliere la {$H+}.

Ciò è stato riportato come bug ma sembra che poi sia stato derubricato in "limitazione dell'IDE" in quanto per adesso non c'è una soluzione.

Nell'ultima stabile 4.0 questa cosa è ancora presente.