Obiettivo
Creeremo un componente invisibile con tre propietà ed un solo metodo.
Le propietà saranno Num1,Num2,Risultato;
Il metodo sarà Execute.
Come Funziona
Chiamando il metodo Execute, viene aggiornato il valore della proprietà Risultato dato dalla somma di Num1 e Num2.
Unit Heading
Specifica il nome della unit sia come file fisico su disco che come riferimento per il comando 'Uses'. Tale nome deve essere unico: nello stesso progetto non possono essere richiamate due Unit con lo stesso nome.
unit MiaUnit1;
Inseriamo quindi il nome della unit, preceduta dalla parola riservata 'Unit'. In questo esempio il nome è 'MiaUnit1'.
Interface Part - Definizione
interface
Iniziamo a scrivere l'Interface part della unit. Come già sappiamo, questa sezione specifica le parti visibili e quindi utilizzabili all'esterno della unit.
Interface Part - Uses Clause
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
Per il momento nell'uses clause inseriremo solo le unit standard necessarie per la creazione del nostro componente.
Interface Part - Inizio blocco Type
Type
Ora è necessario definire il tipo di componente che intendiamo creare. Questa parte inizia con la parola chiave 'Type' e termina con la parola chiave 'End;'
Interface Part - Nome Componente
TMioVCL1 = class(TComponent)
Definiamo il nome ed il tipo di oggetto che intendiamo creare. Il nome può essere qualsiasi, in questo caso è 'TMioVCL1'. Se si intende seguire la logica Borland, il nome del componente deve iniziare con la lettera 'T'.
Interface Part - Tipo Componente
Definiamo poi il tipo di oggetto che intendiamo creare in questo modo :
NomeComponente = Class(TAntenato)
TAntenato in questo caso corrisponde a TComponent.
Interface Part - Livelli di accesso
private
    { Private declarations }
Definiamo il livello di accesso ai dati più restrittivo. Tutto ciò che verrà dichiarato nella sezione 'Private', sarà accessibile solo all'interno della Unit.
protected
    { Protected declarations }
Tutto ciò che verrà dichiarato nella sezione 'Protected', sarà accessibile solo all'interno della Unit e potrà essere 'ereditato' dai discendenti di questo componente.
public
    { Public declarations }
Come ricorderete il terzo livello di accesso ai dati è il tipo 'Public'. Quello che viene definito in questa sezione è accessibile a tutti. Qui verranno definiti ad esempio i metodi del componente.
published
    { Published declarations }
Infine apriamo la sezione 'Published' del componente. Qui verranno definite le nuove proprietà e gli eventi del componente.
Interface Part - Fine blocco Type
end;
Come avevemo detto, concludiamo il blocco Type con la parola chiave 'End;'
Interface Part - Prototipo
procedure Register;
Definiamo poi il prototipo della procedura che ci permetterà di registrare il nostro nuovo componente nella ComponentPalette di Delphi. Il nome della procedura non può essere diverso da 'Register'.
Interface Part - Completa
A questo punto la stuttura dell'Inerface part della unit è stata definita. Continueremo con la definizione della sezione 'Implementation'.
Implementation Part - Definizione
implementation
L'Implementation part della unit ha inizio con la parola riservata 'Implementation'. Termina con la parola riservata 'End.', che indica la fine della unit, oppure 'Initialization' che specifica la lista di comandi da eseguire per inizializzare la Unit.
Implementation Part - Procedure Register
procedure Register;
begin
  RegisterComponents('Samples', [TMioVCL1]);
end;
Definiamo la procedura 'Register'. Questa procedura verrà automaticamente eseguita al momento dell'installazione del componente. Come qualsiasi altra procedura ha inizio con la parola chiave 'Begin' e termina con la parola chiave 'End;'.
Procedure Register - Comando
RegisterComponents('Samples', [TMioVCL1]);
La procedura 'Register' prevede almeno 1 chiamata alla procedura 'RegisterComponents'. Come parametri imposteremo la sezione della ComponentPalette in cui andrà inserito il componente ed il set dei nomi dei componenti da installare.
Fine Unit
end.
Come al solito terminiamo la unit con la parola riservata 'End.'
Riassunto
Abbiamo creato la struttura generale della unit componente. Da notare che fino ad ora abbiamo specificato il nome dalla Unit, nome del nuovo componente, tipo di componente e la pagina della ComponentPalette in cui visualizzare il nuovo componente.
Nota
Avremmo ottenuto lo stesso risultato utilizzando il Component Expert di Delphi ed impostando le seguenti proprietà:
Class Name= TMioVCL1
Ancestor Class= TComponent
Palette Page= Samples
Il nome della unit verrebbe inpostato automaticamente da Delphi.
Definizione variabili private.
N1,N2,R:Integer;
Ora iniziamo con la definizione vera e propria delle nuove caratteristiche del componente. Per questo esempio avremo bisogno di tre variabili (N1,N2 ed R) di tipo intero che corrispondono rispettivamente alle proprietà Num1,Num2 e Risultato.
Definizione dei metodi
Procedure Execute;
Come avevamo detto in precedenza, definiamo il prototipo del metodo 'Execute' nella sezione 'Public' del componente.
Definizione delle nuove proprietà
Property Num1:Integer Read N1 Write N1;
    Property Num2:Integer Read N2 Write N2;
    Property Risultato:Integer Read R Write R;
Infine definiamo le nuove proprietà del componente. Queste verranno visualizzate automaticamente nell'Object Inspector di Delphi in ordine alfabetico. Sintassi:
 Property NomeVariabile:TipoVariabile Read VariabileInterna Write VariabileInterna;
Nota - Definizione delle nuove proprietà
La sintassi utilizzata in questo caso è corretta ma non completa, vedremo in seguito le altre opzioni.
Facoltativo - Definizione delle vecchie proprietà
Property Name;
E' possibile ridichiarare le proprietà ereditate dal componente Antenato. Queste propietà verrebbero comunque visualizzate nell'Object Inspector. In questo caso non è necessario ridichiarare il tipo di variabile nè le variabili interne corrispondenti.
Scrittura Metodo
Procedure TMioVCL1.Execute;
 Begin
  R:=N1+N2;
 End;
Scriviamo in fine la procedura Execute, come se fosse una qualsiasi procedura. A questo punto il nostro primo componente è completo.
Conclusioni
Abbiamo creato un VCL perfettamente funzionante, ma forse un pò 'scomodo' da utilizzare. Vediamo nella Lezione1b alcune semplici modifiche da apportare per renderlo migliore.