{"text_format":"dbase-jsonl-2026-09-30","columns":[{"name":"DIDASCALIA","type":"character","width":254},{"name":"CODICE","type":"character","width":254},{"name":"NUMERORIGA","type":"number","width":11,"decimals":0},{"name":"LUNGHEZZA","type":"number","width":11,"decimals":0},{"name":"DESCRIZION","type":"character","width":254}],"n_rows":27,"rows_kept":27,"cut":false,"deleted_skipped":0,"read_ended":"whole","bounds":"16MiB/16384/4096/first_that_fit","version":"dbase_level_three","encoding_class":"enc_single_byte","reader":"statdb_count/9"}
["Miglioramenti",null,-1,0,"Come si era detto, apporteremo alcune semplicissime modifiche al componente creato nella Lezione1a. Elimineremo il metodo Execute e faremo in modo che la proprietà Risultato venga automaticamente aggiornata modificando le proprietà Num1 e Num2."]
["Scelta",null,-1,0,"Per fare ciò è possibile procedere in due modi che portano ovviamente allo stesso risultato, ma che sono strutturalmente molto diversi. La unit che stiamo per creare installerà automaticamente le due versioni del componente."]
["Inizio","unit T_MioVCL1;\r\n\r\n interface\r\n\r\n uses\r\n  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;",0,7,"Manteniamo identica l'Uniti Heading e l'Uses Clause del componente, ricordando che comunque potranno essere modificati in qualsiasi momento a seconda delle caratteristiche del componente e delle necessità di programmazione."]
["Definizione delle Classi","type\r\n  TMioVCL1a = class(TComponent)",7,2,"Definiamo, come nella lezione precedente, il tipo di componente che creeremo. Il nome è stato modificato per maggiore comodità."]
["Interface Part - Livelli di accesso","private\r\n    { Private declarations }\r\n    N1,N2,R:Integer;",9,3,"Ridefiniamo le variabili interne come per il componente precedentemente creato."]
["Definizione delle proprietà","Property Num1:Integer Read N1 Write SetNum1;\r\n    Property Num2:Integer Read N2 Write SetNum2;",20,2,"Ridefiniamo le proprietà. La sintassi è stata modificata, in particolare allo specificatore Write non è stata assegnata una variabile, ma il nome della procedura che andrà ad assegnare il nuovo valore alla proprietà."]
["Definizione prototipi","Procedure SetNum1(Value:Integer);\r\n    Procedure SetNum2(Value:Integer);",12,2,"Definiamo come procedure Private i prototipi delle due procedure che vengono automaticamente chiamate da Delphi al momento dell'assegnazione del valore della proprietà."]
["Dettagli","Procedure SetNum1(Value:Integer);",-1,0,"Il parametro Value della procedura può avere un qualsiasi nome valido di variabile, ma deve assere dello stesso tipo della proprietà corrispondente.\r\nDelhi assegnerà automaticamente il valore del parametro anche a DesignTime."]
["Nota","//Procedure interne del componente TMioVCL1a",46,1,"Spostiamoci quindi nella sezione Implementation della unit per scrivere le due procedure che abbiamo appena dichiarato."]
["Procedura Interna","Procedure TMioVCL1a.SetNum1(Value:Integer);\r\n Begin\r\n  N1:=Value;\r\n  R:=N1+N2;\r\n End;",48,5,"Scriviamo la procedura. Questa assegna il nuovo valore della variabile alla proprietà del componente ed aggiorna il valore della proprietà Risultato anche a DesignTime."]
["Procedura Interna","Procedure TMioVCL1a.SetNum2(Value:Integer);\r\n Begin\r\n  N2:=Value;\r\n  R:=N1+N2;\r\n End;",54,5,"Identica alla procedura precedente, l'unica differenza sta nel fatto che aggiorna la proprità Num2 invece di Num1."]
["Dettagli","N1:=Value;",-1,0,"Mi sembra inutile far notare che questa riga assegna il valore della variabile Value alla variabile interna N1 (Proprietà Num1)."]
["Dettagli","R:=N1+N2;",-1,0,"Questa è la riga che aggiorna automaticamente la variabile R (Proprietà Risultato).\r\nSemplice vero?"]
["L'altro modo",null,-1,0,"Vediamo adesso l'altro metodo per conseguire l'obbiettivo che ci siamo proposti."]
["Definizione Oggetto","type\r\n  TMioVCL1b = class(TComponent)\r\n  private\r\n    { Private declarations }\r\n    N1,N2,R:Integer;",25,5,"Ridefiniamo il nome dell'oggetto, il tipo e le tre solite variabili interne."]
["Definizione delle proprietà","Property Num1:Integer Read N1 Write N1;\r\n    Property Num2:Integer Read N2 Write N2;",37,2,"La definizione delle proprietà Num1 e Num2 resta identica a quella della Lezione1a."]
["Definizione delle propietà","Property Risultato:Integer Read GetRisultato Write R;",39,1,"La sintassi è stata modificata, in particolare allo specificatore Read non è stata assegnata una variabile, ma il nome della funzione che restituirà il valore della proprietà."]
["Dettagli","Property Risultato:Integer Read GetRisultato Write R;",-1,0,"Come per le Procedure in scrittura, questa Funzione viene automaticamente chiamata da Delphi ogni qual volta sia richiesto il valore della proprietà risultato. La funzione deve essere dello stesso tipo della propietà corrispondente."]
["Prototipo","Function GetRisultato:Integer;",30,1,"Come per il componente precedente, definiamo il prototipo della funzione nella sezione Private del componente."]
["Implementation Part","//Funzione interna del componente TMioVCL1b",60,1,"Ed ora scriviamo la funzione appena dichiarata."]
["Funzione","Function TMioVCL1b.GetRisultato:Integer;\r\n Begin\r\n  Result:=N1+N2;\r\n End;",62,4,"La funzione ovviamente restituisce la somma delle propietà Num1 e Num2."]
["Nota","Result:=N1+N2;",64,1,"E' stato utilizzato Result, ma può essere tranquillamente sostituito dal nome della Funzione, in questo caso 'GetRisultato'."]
["Procedure Register","procedure Register;",42,1,"I due Componenti sono pronti. Non scordiamoci Mai la procedura Register!"]
["Modifica Procedura Register","procedure Register;\r\n begin\r\n  RegisterComponents('Samples', [TMioVCL1a,TMioVCL1B]);\r\n end;",67,4,"I parametri della procedura RegisterComponents sono stati modificati in modo da installare tutti e due i componenti."]
["Nota","RegisterComponents('Samples', [TMioVCL1a,TMioVCL1B]);\r\n\r\nè uguale a\r\n \r\n  RegisterComponents('Samples', [TMioVCL1a]);\r\n  RegisterComponents('Samples1', [TMioVCL1B]);",-1,0,"Se i due componenti dovranno essere installati nella stessa sezione della ComponentPalette, è consigliabile utilizzare una sola chiamata. Altrimenti è possibile effettuare due chiamate modificando il nome della Sezione ed il nome del componente."]
["Conclusione",null,-1,0,"Possiamo finalmente provare i due componenti. Non vi diremo noi le differenze, provate voi a scoprirle:\r\nAggiungete una ShowMessage alle due Procedure e alla funzione per vedere quando e quante volte viene eseguito il calcolo (R:=N1+N2)."]
["Nel Prossimo Numero",null,-1,0,"Non pensiate che sia finita qui...\r\nVedremo come creare componenti visibili, come creare nuovi eventi, come ereditare metodi e tanto altro ancora!"]