Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/it: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Esistono molte guide eccellenti su Pascal, ma questa guida tenta di coinvolgere ulteriormente il principiante , nella programmazione orientata agli oggetti o [[Glossary|Object-Oriented Programming]], che è un'estensione dello standard pascal, offerta da Turbo pascal, Delphi e FreePascal/Lazarus.
22
33Un [[Glossary|Object]] è un'estensione della struttura standard pascal detta [record](http://wiki.lazarus.freepascal.org/Record)
44
55La programmazione Pascal in testo standard è adatta alla creazione di applicazioni che, come le applicazioni Unix tradizionali,sono adatte per fare una cosa e per farla molto bene.
66
77Ciò che un programma fa può essere un'azione veramente complicata ,e può offrire all'utente molte opzioni di menu, ma è essenzialmente ristretta ad obbedire a comandi che l'utente digita da tastiera e a listare le sue risposte sul terminale o sulla stampante.
88
99Per poter produrre una [[Glossary|Graphical User Interface (GUI)]] usualmente si utilizza una sorta di Metodo di programmazione orientata agli oggetti (spesso facendo uso di [[Glossary|C]] o di una delle sue varianti, o Visual Basic, o una delle [[Glossary|OO]] varianti di Pascal quali [[Glossary|FreePascal]] con o senza [[Glossary|Lazarus]]).
1010
1111In una GUI all'utente vengono presentate schermate con un gran numero di immagini organizzate in modo strutturato, consistenti in un'insieme di strumenti o [[Glossary|Widgets]] che sono associati con varie azioni quali
1212
1313- selezioni da menu,
1414- aperture o salvataggio files ,
1515- connessioni ad Internet,
1616- esecuzioni di calcoli numerici, etc.
1717
1818L'utente dovrà muovere il mouse o qualche altro puntatore o strumento sullo schermo, per selezionare le azioni che saranno eseguite in risposta al click del mouse o ai tasti premuti.
1919
2020I sistemi per offrire una complessa interfaccia grafica possono essere scritti in Pascal standard o quasi qualsiasi altro linguaggio di programmazione, ma è molto più facile l'utilizzo di un sistema orientato agli oggetti, in cui ogni oggetto grafico sullo schermo può avere tutte le sue proprietà e le sue procedure e funzioni connesse con il suo uso conglobate in una struttura comune.
2121
2222## Oggetti - una analogia con il mondo reale
2323
2424Consideriamo le analogie di un campione di sangue prelevato in un ospedale o in uno studio medico.
2525
2626### Campione di sangue
2727
2828Il campione fisico è certamente un oggetto o **object**; ed ha , associato con esso una quantità di informazioni,documenti ed altri oggetti fisici.
2929
3030- **Provetta**, del tipo determinato dal test che si dovrà eseguire.
3131
3232- **Metodica** (o *metodo*, *procedura operativa standard*) utilizzata dall'infermiera o dal tecnico di laboratorio che prelevano e processano il campione
3333 - che tipo di provetta si dovrà usare,
3434 - come processare il campione
3535 - come conservarlo prima di consegnarlo al laboratorio.
3636
3737- **Etichetta** sulla provetta con i dettagli per
3838 - identificare il campione
3939 - Nome e cognome e data di nascita del paziente
4040 - data e ora del prelievo
4141 - analisi richieste.
4242
4343- **Modulo di richiesta** che accompagna il campione per il laboratorio cui il campione è diretto
4444 - ID Campione
4545 - ID del medico richiedente
4646 - quali analisi il medico richiede e
4747 - anamnesi e dettagli completi del paziente
4848 - La possibile diagnosi di cui si richiede conferma.
4949
5050Una copia delle richiesta viene conservata nella cartella clinica per ricordare al medico di attendersi risultati entro un periodo di tempo adeguato.
5151
5252- In laboratorio - **metodi locali** per determinare
5353 - come il campione deve essere analizzato,
5454 - Quale strumento usare,
5555 - come lo strumento dovrà operare e come dovrà essere calibrato,
5656 - come il risultato dovrà essere memorizzato formattato e
5757 - presentato al medico.
5858
5959L'effettivo*'risultato*' è un dato che il medico usa per formulare la diagnosi, e una copia dei risultati è archiviata nella cartella clinica del paziente.
6060
6161Il campione fisico può essere conservato per riferimento,per test di conferma o ulteriori test, o potrà essere smaltito in ottemperanza alle norme per lo smaltimento dei campioni biologici o mediante incenerimento, ci sarà un metodo per descrivere questo procedimento.
6262
6363Non è necessario che il medico dica tutti i dettagli operativi e le istruzioni di lavoro ogni qualvolta che un campione viene prelevato; anzi,egli può avere ben poche conoscenze di come il campione verrà processato dal laboratorio.
6464
6565I dettagli dei vari processi sono***ereditati** dai precedenti processi dei campione in analisi ,ossia a priori si è stabilito il metodo di processo del campione - ci sarà un piano generico per l'intera sequenza, e insieme abbiamo potuto pensare al campione di sangue,a tutti i suoi documenti e dati, e la metodica di base, come a un complesso* 'oggetto'''.
6666
6767Nella mente del medico, il campione di sangue è visto come un'unica entità, come i suoi risultati, e per gli infermieri e tecnici il campione, la provetta, l'etichetta e le condizioni di conservazione anch'esse sono identificate come se fossero una sola entità.
6868
6969Traduzione da completare.....
7070
7171### Un'altro esempio- Automobile
7272
7373Se non vi piace l'esempio del campione di sangue,lo stesso tipo di ragionamento può essere applicato all'automobile consegnata al garage per una riparazione. Ciò potrebbe consistere in
7474
7575- Il veicolo fisico
7676- i documenti in possesso del proprietario: Libretto di circolazione (comprese targhe), le assicurazioni, le ricevute per l'acquisto, i pezzi di ricambio, le riparazioni, ecc
7777- il consumo di carburante
7878- i conducenti autorizzati ad utilizzare il veicolo, con le loro patenti di guida
7979- gli interventi di manutenzione registrati presso il garage
8080- metodi o procedure da seguire per la verifica e la manutenzione di routine
8181- metodi da seguire per le riparazioni non di routine, ecc
8282- informazioni di fatturazione per il cliente
8383
8484## Esempi di programmazione
8585
8686Basta con questa introduzione, fatta di esempi del mondo reale! Dobbiamo procedere con l'obiettivo principale: la programmazione FreePascal
8787
8888Dobbiamo considerare la creazione di un semplice modulo con pochi controlli per una applicazione in FreePascal / Lazzaro.
8989
90-<div class="floatleft">
91-
92-<figure>
93-<img src="ObjectInspector-TForm.png" title="ObjectInspector-TForm.png" />
94-<figcaption>ObjectInspector-TForm.png</figcaption>
95-</figure>
96-
97-</div>
98-
99-<div class="floatright">
100-
101-<figure>
102-<img src="BlankForm.png" title="BlankForm.png" />
103-<figcaption>BlankForm.png</figcaption>
104-</figure>
90+![](/wiki-images/2/25/ObjectInspector-TForm.png)
10591
106-</div>
92+![](/wiki-images/e/e2/BlankForm.png)
10793
10894Richiamando la IDE di Lazarus, al programmatore viene presentato un modello vuoto "Form" in progettazione, in cui egli dovrà porre oggetti e vari controlli.
10995
11096Si noti che il Form vuoto precostituito è già un oggetto, con le proprie caratteristiche, come la posizione (in alto e sinistra), le dimensioni (altezza e larghezza), il colore, il font di default per l'aggiunta di testo ecc
11197
11298------------------------------------------------------------------------
11399
114100Se un controllo Button, un tasto, viene immesso sul Form (tipo TButton), questi avrà una serie di proprietà, che possono essere esaminate nella finestra Object Inspector .
115101
116102Molte delle proprietà hanno nomi simili a quelle del Modulo 'Form', questo è dovuto al fatto che molte proprietà sono*'ereditate*' da parte di alcuni comuni antenati di classe, che definiscono le proprietà come sono definite e gestite dalle classi discendenti.
117103
118104Così come per le proprietà, l'Object Inspector offre una scheda denominata*'Eventi*', che dà accesso ai gestori di eventi 'Event Handlers' che sono metodi per gestire tali eventi, come un clic del mouse su un pulsante (OnClick) o alcuni cambiamento di posizione, le dimensioni o altre proprietà (OnChange).
119105
120106L'immagine fisica del pulsante nel Modulo o Form, insieme con tutte le sue proprietà e metodi di gestione, dovrebbe essere considerato come una singola entità o*'oggetto*' in Pascal.
121107
122-<div class="floatleft">
123-
124-<figure>
125-<img src="ObjectInspector-TButton.png" title="ObjectInspector-TButton.png" />
126-<figcaption>ObjectInspector-TButton.png</figcaption>
127-</figure>
128-
129-</div>
130-
131-<div class="floatright">
132-
133-<figure>
134-<img src="FormWithButton.png" title="FormWithButton.png" />
135-<figcaption>FormWithButton.png</figcaption>
136-</figure>
137-
138-</div>
139-
140-<div class="floatright">
108+![](/wiki-images/f/f5/ObjectInspector-TButton.png)
141109
142-<figure>
143-<img src="Source_FormWithButton1.png‎" title="Source_FormWithButton1.png‎" />
144-<figcaption>Source_FormWithButton1.png‎</figcaption>
145-</figure>
110+![](/wiki-images/e/e8/FormWithButton.png)
146111
147-</div>
112+![](/wiki-images/4/4d/Source_FormWithButton1.png%E2%80%8E)
148113
149114## Object-Oriented Extensions to standard Pascal
150115
151116La struttura Pascal di tipo record viene estesa per definire un
152117
153118### Object
154119
155120Un oggetto è uno speciale tipo di record. Il record contiene tutti i campi che sono dichiarati nella definizione dell'oggetto (proprio come un convenzionale record), ma ora le procedure e le funzioni possono essere dichiarate come se fossero parte del record e si richiamano come puntatori ai metodi associati con il tipo di oggetto.
156121
157122Ad esempio, un oggetto può contenere una serie di valori reali, una matrice,unitamente con un metodo di calcolo della media.
158123
159124`Type`\
160125`  Average = Object`\
161126`    NumVal: Integer;`\
162127`    Values: Array [1..200] of Real;`\
163128`    Function Mean: Real; { calculates the average value of the array }`\
164129`  End;`
165130
166131Gli oggetti possono "ereditare" campi e metodi da oggetti "madre". Ciò significa che questi campi e metodi possono essere usati come se fossero incluse negli oggetti dichiarati come un oggetto figlio.
167132
168133Inoltre, viene introdotto un concetto di visibilità : i campi, le procedure e le funzioni possono essere dichiarati come pubblici, protetti o privati. Per impostazione predefinita, i campi e metodi sono pubblici, e possono essere esportati al di fuori delle attuali unit. Campi o metodi protetti sono disponibili solo per gli oggetti discendenti dal corrente oggetto antenato. Campi e metodi dichiarati privati sono unicamente accessibili nella unit corrente: il loro scopo è limitato all'implementazione della corrente unit.
169134
170135### Class
171136
172137Gli oggetti molto spesso non sono usati da se stessi in FreePascal and Lazarus; invece le classi sono largamente usate. La Classe è definita quasi alla stessa stregua di un oggetto, ma è un puntatore ad un oggetto piuttosto che l'oggetto stesso.
173138
174139Tecnicamente, questo significa che la classe è assegnata "on the Heap of a program", mentre l'oggetto viene assegnato in Stack. Ecco un semplice esempio di dichiarazione di una classe:
175140
176141`{-----------------------------------------}`\
177142`{example of Class declaration from the LCL}`\
178143`{-----------------------------------------}`\
179144` TPen = class(TFPCustomPen)`\
180145` private`\
181146`   FColor: TColor;`\
182147`   FPenHandleCached: boolean;`\
183148`   FReference: TWSPenReference;`\
184149`   procedure FreeReference;`\
185150`   function GetHandle: HPEN;`\
186151`   function GetReference: TWSPenReference;`\
187152`   procedure ReferenceNeeded;`\
188153`   procedure SetHandle(const Value: HPEN);`\
189154` protected`\
190155`   procedure DoAllocateResources; override;`\
191156`   procedure DoDeAllocateResources; override;`\
192157`   procedure DoCopyProps(From: TFPCanvasHelper); override;`\
193158`   procedure SetColor`\
194159`        (const NewColor: TColor; const NewFPColor: TFPColor); virtual;`\
195160`   procedure SetFPColor(const AValue: TFPColor); override;`\
196161`   procedure SetColor(Value: TColor);`\
197162`   procedure SetMode(Value: TPenMode); override;`\
198163`   procedure SetStyle(Value: TPenStyle); override;`\
199164`   procedure SetWidth(value: Integer); override;`\
200165` public`\
201166`   constructor Create; override;`\
202167`   destructor Destroy; override;`\
203168`   procedure Assign(Source: TPersistent); override;`\
204169`   property Handle: HPEN read GetHandle write SetHandle; deprecated;`\
205170`   property Reference: TWSPenReference read GetReference;`\
206171` published`\
207172`   property Color: TColor read FColor write SetColor default clBlack;`\
208173`   property Mode default pmCopy;`\
209174`   property Style default psSolid;`\
210175`   property Width default 1;`\
211176` end;`
212177
213178Si noti che questa classe è definita come un istanza di un altra classe **madre** o **antenato** (**'TFPCustomPen) da cui**eredita''' tutte le sue proprietà e metodi.Ha alcuni campi propri, raggruppati sotto
214179
215180- **private** - questo significa che gli elementi qui definiti, sono disponibili o visibili da altre classi procedure o funzioni definite all'interno della stessa unit di programma (questo esempio è da*Graphics*, così che una qualsiasi delle altre classi, come *TBitMap*,*TPicture* etc nella stessa unità è in grado di farne uso.Esse sono generalmente variabili locali (eg *FColor*, *FPenHandleCached*) o metodi usati localmente(*GetHandle*, *SetHandle*) ma possono essere usate o possono riferirvi voci dichiarate in sezioni **protected** or **public**.
216181- **protected** - questo significa che le voci definite qui sono solo disponibili o visibili da classi che discendono da quella classe **antenata**,ed eredita le sue proprietà o metodi
217182- **public** - questo significa che le voci definite qui sono solo disponibili per qualunque unit che includa la unit corrente in essa con la clausula [[Glossary|Uses]]
218183- **published** - è simile alla sezione **public**, ma il compilatore genera anche il tipo di informazioni che è necessario per lo streaming automatico di queste classi. Spesso la lista delle voci appare nel Object Inspector di Lazarus; se non compare una lista **published**,tutti i campi **public** appaiono normalmente in the Object Inspector.
219184
220185### Methods
221186
222187Un metodo è esattamente come una procedura standard o una funzione, ma può avere qualche **directives**.
223188
224189Alcuni dei metodi di definizione di cui sopra sono etichettati con la direttiva **virtual**; altri sono etichettati con la direttiva **override**.
225190
226191- **virtual** significa che il tipo o il grado effettivo di un metodo non è noto al momento della compilazione,ma è stato selezionato in run-time a seconda di ciò che effettivamente richiama il sotto-programma sul momento. It could be considered a place-holder in the definition of the class.
227192- **override** means that at run-time the locally given definition can take the place of a definition inherited from an ancestor class, particularly if it was **virtual**. If you particularly want to use the method defined in the ancestor class, it is sometimes necessary to call it specifically with the **inherited** clause.
228193
229194Methods with no virtual or override directive are **static** methods (the usual kind in Pascal). Those with a virtual or override directive are **dynamic**.
230195
231196Special instances of methods are:
232197
233198- **create** - a **constructor** for a class, which takes care of allocating memory, collecting together all the information needed and configuring/initializing the various properties.
234199- **destroy** - a **destructor** for a class, which removes all the parts of the class from the system in an orderly and logical way, and returns all its resources for the system to re-use.
235200
236201### Properties
237202
238203Properties are just like ordinary fields in a conventional Pascal record, but they can have **read** and/or **write** specifiers.
239204
240205- **read** specifier is a field, or a function that returns a result of the correct type for the property. In the example above, the property *Color* has a read specifier *FColor*, which is a local variable containing the value to be used. If a property has a **read** but no **write** specifier, it is read-only.
241206- **write** specifier is a field, or a procedure that will store the value of the property in a specific location. In the example above, *Color* has a write specifier *SetColor* that is a procedure (defined in the **protected** section) for writing the color value to some specified location. If a property has a **write** but no **read** specifier, it is write-only.
242207- **default** - note that it is possible to set a **default** value for a property. For example, *Color* here is given the default value *clBlack*, or black, at the time of creation. It could subsequently be given a different value, by a programming assignment statement, or in the Object Inspector.
243208
244209## Further information
245210
246211This has only scratched the surface of the topic. For more details, readers are strongly recommended to read the [FreePascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html) manuals, especially Chapters 5 (**Objects**) and 6 (**Classes**)
247212
248213--Kirkpatc 11:04, 20 July 2008 (CEST)
249214
250215------------------------------------------------------------------------
251216
252217[[Console Mode Pascal]]
253218
254219---
255220*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/it", as it stood on 2015-06-19 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history