Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
INPRISE CONFIDENTIAL
April 15, 2002 6:49 pm (D:\Lavori\bcb6\DG\BCBonly\title.fm5)
Guida alla
programmazione
Borland Software Corporation, 100 Enterprise Way
Scotts Valley, CA 95066-3249
Borland
C
++
Builder
6
per Windows
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 15, 2002 6:49 pm (D:\Lavori\bcb6\DG\BCBonly\title.fm5)
Per una lista completa dei file che possibile distribuire in conformit allAccordo di Licenza e Garanzia Limitata di
C++Builder, fare riferimento al file DEPLOY.TXT situato nella directory principale di C++Builder 6.
Borland potrebbe avere brevetti e/o applicazioni in corso di brevetto relativamente ad argomenti trattati in questo
documento. La fornitura di questo documento non conferisce alcuna licenza relativamente a questi brevetti. Per un
elenco dei brevetti in vigore, fare riferimento al CD del prodotto oppure alla finestra di dialogo About.
COPYRIGHT 19832002 Borland Software Corporation. Tutti i diritti riservati. Tutti i marchi e i nomi dei prodotti
Borland sono marchi o marchi registrati di Borland Software Corporation negli Stati Uniti e negli altri paesi. Tutti gli
altri marchi citati sono di propriet dei rispettivi detentori.
Stampato in Irlanda
CPE1340WW21001 4E0R1001
0102030405-9 8 7 6 5 4 3 2 1
D3
i
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 1
Introduzione 1-1
Contenuto del manuale . . . . . . . . . . . . . . 1-1
Convenzioni tipografiche . . . . . . . . . . . . . 1-3
Servizi di assistenza agli sviluppatori . . . . 1-3
Come ordinare la documentazione cartacea. 1-3
Parte I
Programmazione con C++Builder
Capitolo 2
Sviluppo di applicazioni
con C++Builder 2-1
Ambiente di sviluppo integrato . . . . . . . . . 2-1
Progettazione di applicazioni. . . . . . . . . . . 2-2
Creazione di progetti . . . . . . . . . . . . . . . 2-3
Editing del codice . . . . . . . . . . . . . . . . . 2-4
Compilazione di applicazioni . . . . . . . . . . 2-4
Debug di applicazioni . . . . . . . . . . . . . . . 2-5
Distribuzione di applicazioni . . . . . . . . . . . 2-5
Capitolo 3
Uso delle librerie di classi 3-1
Le librerie di classi . . . . . . . . . . . . . . . . . 3-1
Propriet, metodi ed eventi . . . . . . . . . . 3-2
Propriet . . . . . . . . . . . . . . . . . . . 3-2
Metodi . . . . . . . . . . . . . . . . . . . . 3-3
Eventi . . . . . . . . . . . . . . . . . . . . 3-3
Eventi utente . . . . . . . . . . . . . . . . 3-3
Eventi di sistema . . . . . . . . . . . . . . 3-3
Oggetti, componenti e controlli . . . . . . . . . 3-4
Il ramo TObject . . . . . . . . . . . . . . . . . 3-6
Il ramo TPersistent . . . . . . . . . . . . . . . 3-6
Il ramo TComponent. . . . . . . . . . . . . . 3-7
Il ramo TControl . . . . . . . . . . . . . . . . 3-8
Il ramo TWinControl/TWidgetControl . . . 3-9
Capitolo 4
Utilizzo di BaseCLX 4-1
Uso di stream. . . . . . . . . . . . . . . . . . . . 4-2
Uso di stream per leggere o scrivere dati . . 4-2
Metodi di stream per lettura e scrittura . 4-2
Lettura e scrittura di componenti . . . . . 4-3
Copia di dati da uno stream a un altro. . . . 4-3
Specifica della posizione e
della dimensione dello stream . . . . . . . . 4-3
Ricerca di una posizione specifica . . . . . 4-4
Utilizzo delle propriet Position e Size . . 4-4
Operazioni con i file . . . . . . . . . . . . . . . . 4-4
Approccio alle operazioni di I/O su file . . . 4-5
Uso degli stream di file . . . . . . . . . . . . . 4-5
Creazione e apertura di file
con stream di file . . . . . . . . . . . . . . 4-6
Uso dellhandle di file . . . . . . . . . . . . 4-7
Manipolazione dei file . . . . . . . . . . . . . 4-7
Cancellazione di un file . . . . . . . . . . . 4-7
Ricerca di un file . . . . . . . . . . . . . . . 4-8
Cambiamento del nome di un file . . . . . 4-9
Routine per data-ora. . . . . . . . . . . . . 4-9
Copia di un file. . . . . . . . . . . . . . . 4-10
Operazioni con file ini
e con il Registro di sistema . . . . . . . . . . . 4-10
Utilizzo di TIniFile e di TMemIniFile . . 4-11
Utilizzo di TRegistryIniFile. . . . . . . . 4-12
Uso di TRegistry . . . . . . . . . . . . . . 4-12
Operazioni con le liste . . . . . . . . . . . . . . 4-13
Operazioni comuni su elenchi . . . . . . . . 4-14
Aggiunta di elementi di un elenco. . . . 4-14
Cancellazione degli elementi
di un elenco. . . . . . . . . . . . . . . . 4-14
Accesso agli elementi di un elenco. . . . 4-15
Riordinamento degli elementi
di un elenco. . . . . . . . . . . . . . . . 4-15
Elenchi persistenti . . . . . . . . . . . . . . . 4-15
Operazioni con elenchi di stringhe . . . . . . . 4-16
Caricamento e salvataggio
di elenchi di stringhe . . . . . . . . . . . . 4-16
Creazione di un nuovo elenco di stringhe . 4-17
Elenchi di stringhe a breve termine . . . 4-17
Elenchi di stringhe a lungo termine . . . 4-18
Gestione di stringhe in un elenco . . . . . . 4-18
Conteggio di stringhe in un elenco . . . 4-19
Accesso ad una particolare stringa. . . . 4-19
Individuazione di elementi
in un elenco di stringhe . . . . . . . . . 4-19
Analisi sequenziale di stringhe
in un elenco. . . . . . . . . . . . . . . . 4-19
Aggiunta di una stringa a un elenco. . . 4-19
Spostamento di una stringa
allinterno di un elenco . . . . . . . . . 4-20
Indice generale
ii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Cancellazione di una stringa
da un elenco . . . . . . . . . . . . . . . . 4-20
Associazione di oggetti
ad un elenco di stringhe . . . . . . . . . 4-20
Operazioni con stringhe. . . . . . . . . . . . . . 4-21
Routine per wide character . . . . . . . . . . 4-21
Routine comunemente utilizzate
per AnsiStrings . . . . . . . . . . . . . . . . 4-22
Routine comunemente utilizzate
per stringhe terminate con null . . . . . . . 4-25
Stampa . . . . . . . . . . . . . . . . . . . . . . . 4-26
Conversione di misure . . . . . . . . . . . . . . 4-27
Esecuzione di conversioni . . . . . . . . . . . 4-27
Esecuzione di conversioni semplici . . . . 4-28
Esecuzione di conversioni complesse . . 4-28
Aggiunta di nuovi tipi di misura . . . . . . . 4-28
Creazione di una semplice famiglia di
conversione e aggiunta delle unit . . . . . 4-29
Dichiarazione delle variabili. . . . . . . . 4-29
Registrazione della famiglia
di conversione . . . . . . . . . . . . . . . 4-29
Registrazione delle unit di misura. . . . 4-29
Utilizzo delle nuove unit di misura . . . 4-30
Utilizzo di una funzione di conversione . . . 4-30
Dichiarazione delle variabili. . . . . . . . 4-30
Registrazione della famiglia
di conversione . . . . . . . . . . . . . . . 4-30
Registrazione dellunit di misura
di base . . . . . . . . . . . . . . . . . . . 4-31
Scrittura dei metodi per la conversione
in base allunit di misura di base. . . . 4-31
Registrazione delle altre unit di misura. 4-31
Utilizzo delle nuove unit di misura . . . 4-31
Utilizzo di una classe per gestire
le conversioni . . . . . . . . . . . . . . . . . 4-32
Creazione della classe di conversione . . 4-32
Dichiarazione delle variabili. . . . . . . . 4-33
Registrazione della famiglia
di conversione e delle altre unit . . . . 4-33
Utilizzo delle nuove unit di misura . . . 4-35
Creazione di spazi di disegno . . . . . . . . . . 4-35
Capitolo 5
Operazioni con componenti 5-1
Impostazione delle propriet dei componenti . 5-2
Impostazione delle propriet
in progettazione. . . . . . . . . . . . . . . . 5-2
Utilizzo di editor di propriet . . . . . . . 5-3
Impostazione di propriet in esecuzione . . 5-3
Chiamate a metodi . . . . . . . . . . . . . . . . . 5-3
Operazioni con eventi e gestori di evento . . . . 5-3
Generazione di nuovo gestore di evento . . . 5-4
Generazione di un gestore per levento
predefinito di un componente . . . . . . . . 5-4
Individuazione dei gestori di evento . . . . . 5-4
Associazione di un evento ad un gestore
di evento esistente . . . . . . . . . . . . . . . 5-5
Utilizzo del parametro Sender . . . . . . . 5-5
Visualizzazione e codifica di eventi
condivisi . . . . . . . . . . . . . . . . . . 5-5
Associazione di eventi di menu
a gestori di evento . . . . . . . . . . . . . . . 5-6
Cancellazione di gestori di evento. . . . . . . 5-6
Componenti multipiattaforma
e non multipiattaforma . . . . . . . . . . . . . . 5-7
Aggiunta di componenti custom alla
Component palette . . . . . . . . . . . . . . 5-9
Capitolo 6
Uso dei controlli 6-1
Implementazione del drag and drop
nei controlli . . . . . . . . . . . . . . . . . . . . 6-1
Inizio di unoperazione di trascinamento. . . 6-1
Accettazione degli elementi rilasciati . . . . . 6-2
Rilascio di elementi . . . . . . . . . . . . . . . 6-3
Fine di unoperazione di trascinamento . . . 6-3
Personalizzazione delle operazioni
di drag-and-drop con un oggetto drag . . . 6-4
Modifica del puntatore di trascinamento
del mouse. . . . . . . . . . . . . . . . . . . . 6-4
Implementazione del drag-and-dock
nei controlli . . . . . . . . . . . . . . . . . . . . 6-4
Trasformazione di un controllo con finestra
in una posizione di aggancio . . . . . . . . . 6-5
Trasformazione di un controllo
in un figlio agganciabile . . . . . . . . . . . 6-5
Controllo della modalit di aggancio dei
controlli figlio . . . . . . . . . . . . . . . . . 6-6
Controllo della modalit di sgancio
dei controlli figlio . . . . . . . . . . . . . . . 6-6
Controllo della modalit di risposta
dei controlli figlio alle operazioni
drag-and-dock . . . . . . . . . . . . . . . . . 6-7
Operazioni con testo nei controlli . . . . . . . . . 6-7
Impostazione dellallineamento del testo. . . 6-7
Aggiunta di barre di scorrimento
in fase di esecuzione. . . . . . . . . . . . . . 6-8
Aggiunta delloggetto clipboard. . . . . . . . 6-8
iii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Selezione del testo . . . . . . . . . . . . . . . 6-9
Selezione di tutto il testo. . . . . . . . . . . . 6-9
Operazione taglia, copia e incolla del testo . 6-9
Cancellazione del testo selezionato. . . . . . 6-10
Disattivazione delle voci di menu . . . . . . 6-10
Preparazione di un menu a comparsa . . . . 6-11
Gestione dellevento OnPopup . . . . . . . . 6-11
Aggiunta di grafici ai controlli . . . . . . . . . . 6-12
Come indicare che un controllo
owner-drawn . . . . . . . . . . . . . . . . 6-13
Aggiunta di oggetti grafici
ad un elenco di stringhe . . . . . . . . . . . 6-13
Aggiunta di immagini
ad unapplicazione . . . . . . . . . . . . 6-13
Aggiunta di immagini
a un elenco di stringhe . . . . . . . . . . 6-14
Disegno di elementi owner-draw. . . . . 6-15
Dimensionamento degli elementi
owner-draw. . . . . . . . . . . . . . . . . . 6-15
Disegno di elementi owner-draw. . . . . . . 6-16
Capitolo 7
Creazione di applicazioni,
componenti e librerie 7-1
Creazione di applicazioni . . . . . . . . . . . . . 7-1
Applicazioni GUI. . . . . . . . . . . . . . . . 7-1
Modelli di interfaccia utente. . . . . . . . 7-2
Applicazioni SDI . . . . . . . . . . . . . . 7-2
Applicazioni MDI. . . . . . . . . . . . . . 7-2
Impostazioni delle opzioni per lIDE, il
progetto e la compilazione . . . . . . . . 7-3
Modelli di programmazione . . . . . . . . . 7-3
Applicazioni per console . . . . . . . . . . . 7-4
Utilizzo di VCL e CLX in applicazioni
per console. . . . . . . . . . . . . . . . . 7-4
Applicazioni di servizio . . . . . . . . . . . . 7-4
Thread dei servizi. . . . . . . . . . . . . . 7-7
Propriet del nome del servizio . . . . . . 7-9
Debug delle applicazioni di servizio . . . 7-9
Creazione di package e di DLL. . . . . . . . . . 7-10
Quando usare i package e le DLL . . . . . . 7-11
Uso delle DLL in C++Builder. . . . . . . . . . . 7-11
Creazione di DLL in C++Builder. . . . . . . . . 7-12
Creazione di DLL contenenti
componenti VCL e CLX . . . . . . . . . . . . . 7-13
Collegamento delle DLL . . . . . . . . . . . . . 7-15
Scrittura di applicazioni database . . . . . . . . 7-16
Distribuzione di applicazioni database . . . 7-17
Creazione di applicazioni per Web server. . . . 7-17
Utilizzo di Web Broker . . . . . . . . . . . . 7-17
Creazione di applicazioni WebSnap. . . . . 7-18
Utilizzo di InternetExpress . . . . . . . . . . 7-19
Creazione di applicazioni Web Services . . 7-19
Scrittura di applicazioni con COM . . . . . . . 7-20
Utilizzo di COM e DCOM . . . . . . . . . . 7-20
Utilizzo di MTS e COM+ . . . . . . . . . . . 7-20
Utilizzo dei moduli dati . . . . . . . . . . . . . 7-21
Creazione e modifica
di moduli dati standard. . . . . . . . . . . 7-22
Attribuzione del nome a un modulo
dati e al relativo file unit . . . . . . . . 7-22
Posizionamento e assegnazione
del nome ai componenti . . . . . . . . . 7-23
Utilizzo delle propriet e degli eventi
dei componenti di un modulo dati. . . 7-24
Creazione di regole di gestione
in un modulo dati . . . . . . . . . . . . 7-24
Accesso a un modulo dati da una scheda. . 7-24
Aggiunta di un modulo dati remoto a un
progetto di application server . . . . . . . 7-25
Utilizzo dellObject Repository . . . . . . . . . 7-25
Condivisione di elementi
allinterno di un progetto . . . . . . . . . . 7-25
Aggiunta di elementi allObject Repository 7-26
Condivisione di oggetti
in un team di lavoro. . . . . . . . . . . . . 7-26
Utilizzo di un elemento
dellObject Repository in un progetto . . . 7-26
Copia di un elemento . . . . . . . . . . . 7-27
Ereditare un elemento. . . . . . . . . . . 7-27
Utilizzo di un elemento . . . . . . . . . . 7-27
Utilizzo di modelli di progetto. . . . . . . . 7-27
Modifica di elementi condivisi. . . . . . . . 7-28
Specifica di un progetto predefinito, di una
nuova scheda e della scheda principale. . 7-28
Attivazione dellHelp nelle applicazioni . . . . 7-28
Interfacce per il sistema di Help . . . . . . . 7-29
Implementazione di ICustomHelpViewer . 7-30
Comunicazione con Help Manager . . . . . 7-30
Richiesta di informazioni allHelp Manager 7-31
Visualizzazione di Help
in base a parole chiave . . . . . . . . . . . 7-31
Visualizzazione degli indici . . . . . . . . . 7-32
Implementazione IExtendedHelpViewer . . 7-33
Implementazione IHelpSelector . . . . . . . 7-34
Registrazione di oggetti di sistema di Help 7-34
Registrazione dei visualizzatori di Help 7-34
Registrazione dei selettori di Help. . . . 7-35
iv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Utilizzo dellHelp in unapplicazione VCL . . . 7-35
In che modo TApplication
elabora lHelp VCL. . . . . . . . . . . . . . 7-35
In che modo i controlli VCL
elaborano lHelp . . . . . . . . . . . . . . . 7-36
Utilizzo dellHelp in unapplicazione CLX . . . 7-36
In che modo TApplication
elabora lHelp CLX . . . . . . . . . . . . . . 7-36
In che modo i controlli CLX
elaborano lHelp . . . . . . . . . . . . . . . 7-37
Chiamata diretta a un sistema di Help . . . . . 7-37
Utilizzo di IHelpSystem. . . . . . . . . . . . . . 7-37
Personalizzazione del sistema di Help dellIDE7-38
Capitolo 8
Sviluppo dellinterfaccia utente
dellapplicazione 8-1
Controllo del comportamento dellapplicazione 8-1
Il lavoro a livello di applicazione . . . . . . . 8-2
Gestione dello schermo . . . . . . . . . . . . 8-2
Impostazione delle schede . . . . . . . . . . . . 8-2
Uso della scheda principale . . . . . . . . . . 8-3
Occultamento della scheda principale . . . . 8-3
Aggiunta di schede. . . . . . . . . . . . . . . 8-3
Collegamento delle schede . . . . . . . . 8-3
Gestione del layout. . . . . . . . . . . . . . . 8-4
Uso delle schede . . . . . . . . . . . . . . . . . . 8-5
Controllo delle schede in memoria . . . . . . 8-5
Visualizzazione di una scheda
creata automaticamente . . . . . . . . . 8-6
Creazione dinamica delle schede . . . . . 8-6
Creazione di schede non modali
come finestre. . . . . . . . . . . . . . . . 8-7
Creazione di unistanza di scheda
mediante una variabile locale . . . . . . 8-7
Passaggio di altri argomenti alle schede . . . 8-8
Recupero dei dati dalle schede . . . . . . . . 8-9
Recupero dei dati da schede non modali. 8-9
Recupero dei dati da schede modali . . . 8-10
Riutilizzo di componenti
e gruppi di componenti . . . . . . . . . . . . . 8-12
Creazione e utilizzo di modelli di componenti . 8-13
Operazioni con i frame . . . . . . . . . . . . . . 8-14
Creazione di frame . . . . . . . . . . . . . . . 8-14
Aggiunta di frame alla Component palette . 8-15
Uso e modifica di frame . . . . . . . . . . . . 8-15
Condivisione di frame . . . . . . . . . . . . . 8-16
Sviluppo di finestre di dialogo . . . . . . . . . . 8-16
Utilizzo delle finestre di dialogo
di tipo Open . . . . . . . . . . . . . . . . . 8-17
Organizzazione delle azioni per barre e menu 8-17
Che cosa un azione . . . . . . . . . . . . . 8-19
Configurazione delle bande di azione . . . 8-20
Creazione di barre di strumenti e menu . . 8-20
Aggiunta di colori, motivi o immagini a
menu, pulsanti e barre di strumenti . . 8-22
Aggiunta di icone a menu e
barre di strumenti . . . . . . . . . . . . 8-23
Creazione di barre di strumenti e menu
personalizzabili dagli utenti . . . . . . 8-23
Occultamento di elementi e categorie
inutilizzate nelle bande di azioni . . . . 8-24
Uso delle liste di azioni. . . . . . . . . . . . . . 8-25
Configurazione delle liste di azioni . . . . . 8-25
Cosa accade quando si scatena unazione . 8-27
Risposta con eventi . . . . . . . . . . . . 8-27
Come le azioni trovano
le proprie destinazioni. . . . . . . . . . 8-28
Aggiornamento delle azioni . . . . . . . . . 8-29
Classi di azione predefinite. . . . . . . . . . 8-29
Scrittura di componenti azione . . . . . . . 8-30
Registrazione delle azioni . . . . . . . . . . 8-31
Creazione e gestione dei menu . . . . . . . . . 8-32
Apertura del Menu Designer . . . . . . . . 8-32
Costruzione di menu . . . . . . . . . . . . . 8-33
Assegnazione dei nomi dei menu . . . . 8-33
Assegnazione dei nomi
delle voci di menu . . . . . . . . . . . . 8-34
Aggiunta, inserimento e cancellazione
delle voci di menu . . . . . . . . . . . . 8-34
Aggiunta di barre separatrici . . . . . . . 8-36
Specifica dei tasti di scelta rapida e delle
scorciatoie di tastiera . . . . . . . . . . 8-36
Creazione di sottomenu . . . . . . . . . . . 8-37
Creazione di sottomenu
per retrocessione dei menu esistenti . . 8-38
Spostamento delle voci di menu . . . . . 8-38
Aggiunta di immagini alle voci di menu 8-38
Visualizzazione del menu. . . . . . . . . 8-39
Editing delle voci di menu
nellObject Inspector . . . . . . . . . . . . 8-39
Uso del menu contestuale Menu Designer . 8-40
I comandi del menu contestuale . . . . . 8-40
Passaggio da un menu allaltro
in fase di progettazione . . . . . . . . . 8-40
Uso dei modelli di menu . . . . . . . . . . . 8-41
Salvataggio di un menu come modello . . . 8-42
v
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Convenzioni per lassegnazione
dei nomi delle voci di menu
e dei gestori di evento di un modello . . 8-43
Manipolazione delle voci di menu
in fase di esecuzione . . . . . . . . . . . . . 8-44
Fusione dei menu . . . . . . . . . . . . . . . 8-44
Specifica del menu attivo:
propriet Menu . . . . . . . . . . . . . . 8-44
Determinazione dellordine delle voci
di menu fuse: propriet GroupIndex . . 8-44
Importazione dei file risorsa . . . . . . . . . 8-45
Progettazione di barre strumenti e di coolbar . 8-45
Aggiunta di una barra strumenti usando un
componente panel . . . . . . . . . . . . . . 8-47
Aggiunta di un pulsante di scelta
rapida a un pannello . . . . . . . . . . . 8-47
Assegnazione del glifo a un pulsante
di scelta rapida . . . . . . . . . . . . . . 8-47
Impostazione della condizione iniziale
di un pulsante di scelta rapida . . . . . 8-48
Creazione di un gruppo di pulsanti
di scelta rapida . . . . . . . . . . . . . . 8-48
Come consentire la commutazione
dei pulsanti . . . . . . . . . . . . . . . . 8-48
Aggiunta di una barra strumenti usando il
relativo componente . . . . . . . . . . . . . 8-49
Aggiunta di un pulsante strumento . . . 8-49
Assegnazione di immagini
ai pulsanti strumento . . . . . . . . . . . 8-50
Impostazione dellaspetto di un pulsante
strumento e delle condizioni iniziali . . 8-50
Creazione di gruppi
di pulsanti strumento. . . . . . . . . . . 8-50
Come consentire pulsanti
strumento commutati. . . . . . . . . . . 8-51
Aggiunta di un componente coolbar . . . . . 8-51
Impostazione dellaspetto della coolbar . 8-52
Risposta ai clic . . . . . . . . . . . . . . . . . 8-52
Assegnazione di un menu
a un pulsante strumento . . . . . . . . . 8-52
Aggiunta di barre strumenti nascoste . . . . 8-53
Come nascondere e mostrare
le barre strumenti . . . . . . . . . . . . . . . 8-53
Capitolo 9
Tipi di controlli 9-1
Controlli di testo . . . . . . . . . . . . . . . . . . 9-1
Controlli di editing. . . . . . . . . . . . . . . 9-2
Propriet dei controlli di editing . . . . . . . 9-3
Controlli memo e rich edit . . . . . . . . . 9-3
Controlli per la visualizzazione
del testo (solo per la CLX) . . . . . . . . . . 9-4
Etichette . . . . . . . . . . . . . . . . . . . . . 9-4
Controlli specializzati per linput . . . . . . . . . 9-5
Barre di scorrimento . . . . . . . . . . . . . . 9-5
Barre di regolazione. . . . . . . . . . . . . . . 9-5
Controlli up-down (solo VCL) . . . . . . . . . 9-6
Controlli spin edit (solo CLX) . . . . . . . . . 9-6
Controlli Hot key (solo VCL). . . . . . . . . . 9-6
Controlli splitter . . . . . . . . . . . . . . . . . 9-7
Pulsanti e controlli simili . . . . . . . . . . . . . . 9-7
Controlli pulsante . . . . . . . . . . . . . . . . 9-8
Pulsanti bitmap . . . . . . . . . . . . . . . . . 9-8
Pulsanti di scelta rapida . . . . . . . . . . . . 9-8
Caselle di controllo . . . . . . . . . . . . . . . 9-9
Pulsanti di opzione . . . . . . . . . . . . . . . 9-9
Barre strumenti . . . . . . . . . . . . . . . . . 9-9
Cool bar (solo VCL) . . . . . . . . . . . . . . 9-10
Controlli elenco . . . . . . . . . . . . . . . . . . 9-10
Caselle di riepilogo e
caselle di riepilogo con spunta . . . . . . . 9-11
Caselle combinate . . . . . . . . . . . . . . . 9-12
Viste ad albero . . . . . . . . . . . . . . . . . 9-12
Viste ad elenco . . . . . . . . . . . . . . . . . 9-13
Selettore data-ora e
calendari mensili (solo VCL) . . . . . . . . 9-13
Controlli di raggruppamento . . . . . . . . . . 9-14
Caselle di gruppo e
gruppi di pulsanti di opzione . . . . . . . 9-14
Pannelli . . . . . . . . . . . . . . . . . . . . . 9-14
Caselle a scorrimento . . . . . . . . . . . . . 9-15
Controlli separatore . . . . . . . . . . . . . . 9-15
Controlli pagina . . . . . . . . . . . . . . . . 9-16
Controlli intestazione . . . . . . . . . . . . . 9-16
Controlli di visualizzazione . . . . . . . . . . . 9-16
Barre di stato. . . . . . . . . . . . . . . . . . 9-16
Barre di avanzamento. . . . . . . . . . . . . 9-17
Propriet Help e Hint . . . . . . . . . . . . . 9-17
Griglie . . . . . . . . . . . . . . . . . . . . . . . 9-17
Griglie grafiche . . . . . . . . . . . . . . . . 9-18
Griglie per stringhe . . . . . . . . . . . . . . 9-18
Editor di liste di valori (solo VCL) . . . . . . . 9-18
Controlli grafici . . . . . . . . . . . . . . . . . . 9-19
Immagini . . . . . . . . . . . . . . . . . . . . 9-20
Forme . . . . . . . . . . . . . . . . . . . . . . 9-20
Linee smussate. . . . . . . . . . . . . . . . . 9-20
Caselle di disegno . . . . . . . . . . . . . . . 9-20
Controlli Animation (solo VCL) . . . . . . . 9-20
vi
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 10
Operazioni con elementi
grafici e multimediali 10-1
Panoramica sulla programmazione dei grafici . 10-1
Aggiornamento dello schermo . . . . . . . . 10-2
Tipi di oggetti grafici . . . . . . . . . . . . . . 10-3
Propriet e metodi comuni
delloggetto Canvas . . . . . . . . . . . . . 10-4
Uso delle propriet delloggetto Canvas . . 10-5
Uso delle penne . . . . . . . . . . . . . . . 10-6
Uso dei pennelli . . . . . . . . . . . . . . . 10-8
Lettura e impostazione dei pixel . . . . 10-10
Uso dei metodi Canvas
per disegnare oggetti grafici. . . . . . . . 10-10
Disegno di linee e spezzate . . . . . . . 10-10
Disegno di figure . . . . . . . . . . . . . 10-11
Gestione di pi oggetti di disegno
in unapplicazione . . . . . . . . . . . . . 10-13
Come tenere la traccia dello strumento
di disegno da usare . . . . . . . . . . . 10-13
Modifica degli strumenti
con i pulsanti di scelta rapida . . . . . 10-14
Uso degli strumenti di disegno . . . . . 10-14
Disegno su un grafico . . . . . . . . . . . . 10-17
Come far scorrere i grafici . . . . . . . . 10-18
Aggiunta di un controllo immagine . . 10-18
Caricamento e salvataggio dei file grafici . 10-20
Caricamento di unimmagine da un file 10-20
Salvataggio di unimmagine in un file . 10-21
Sostituzione dellimmagine . . . . . . . 10-21
Uso della clipboard con i grafici . . . . . . 10-22
Operazioni di copia di grafici
nella clipboard. . . . . . . . . . . . . . 10-23
Operazioni di taglio di grafici
nella clipboard. . . . . . . . . . . . . . 10-23
Operazioni di incollaggio di grafici
dalla clipboard . . . . . . . . . . . . . 10-24
Esempio di effetto elastico. . . . . . . . . . 10-24
Risposta al mouse. . . . . . . . . . . . . 10-25
Risposta ad unazione mouse-down . . 10-26
Aggiunta di un campo
ad un oggetto scheda per tenere
traccia delle azioni del mouse . . . . . 10-27
Affinamento del disegno delle linee . . 10-29
Uso di componenti multimediali. . . . . . . . 10-30
Aggiunta di clip video senza suono
ad unapplicazione . . . . . . . . . . . . . 10-31
Esempio di aggiunta di clip video
senza suono . . . . . . . . . . . . . . . 10-32
Aggiunta di clip audio e/o video
a unapplicazione . . . . . . . . . . . . . 10-33
Esempio di aggiunta di clip audio
e/o video (solo VCL) . . . . . . . . . 10-34
Capitolo 11
Scrittura di applicazioni multi-thread 11-1
Definizione di oggetti thread . . . . . . . . . . 11-1
Inizializzazione del thread . . . . . . . . . . 11-3
Assegnazione di una priorit predefinita 11-3
Come indicare quando i thread
vengono rilasciati . . . . . . . . . . . . 11-4
Scrittura della funzione thread. . . . . . . . 11-4
Utilizzo del thread VCL/CLX principale 11-4
Uso di variabili locali al thread. . . . . . 11-5
Controllo del termine
da parte di altri thread. . . . . . . . . . 11-6
Gestione delle eccezioni
nella funzione di thread . . . . . . . . . 11-7
Scrittura del codice di pulizia . . . . . . . . 11-7
Coordinamento dei thread. . . . . . . . . . . . 11-7
Come evitare laccesso simultaneo . . . . . 11-8
Blocco di oggetti . . . . . . . . . . . . . . 11-8
Uso di sezioni critiche . . . . . . . . . . . 11-8
Uso del sincronizzatore multilettura a
scrittura esclusiva . . . . . . . . . . . . 11-9
Altre tecniche per la condivisione
della memoria . . . . . . . . . . . . . . 11-9
Attesa di altri thread . . . . . . . . . . . . .11-10
Attesa che un thread
termini lesecuzione . . . . . . . . . . .11-10
Attesa che venga completata
unoperazione . . . . . . . . . . . . . .11-10
Esecuzione di oggetti thread. . . . . . . . . . .11-12
Ridefinizione della priorit predefinita . . .11-12
Avvio e interruzione dei thread . . . . . . .11-12
Debug di applicazioni multi-thread . . . . . .11-13
Assegnazione di un nome al thread. . . . .11-13
Conversione di un thread senza nome
in uno con nome . . . . . . . . . . . . .11-13
Assegnazione di nomi differenti
a thread simili . . . . . . . . . . . . . .11-14
Capitolo 12
Gestione delle eccezioni 12-1
Gestione delle eccezioni C++ . . . . . . . . . . 12-1
Sintassi della gestione delle eccezioni . . . . 12-2
Il blocco try . . . . . . . . . . . . . . . . . 12-2
Listruzione throw . . . . . . . . . . . . . 12-2
vii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Listruzione catch . . . . . . . . . . . . . . 12-3
Risollevamento delle eccezioni . . . . . . . . 12-4
Specifica delle eccezioni . . . . . . . . . . . . 12-4
Rilascio delle eccezioni . . . . . . . . . . . . 12-5
Puntatori sicuri . . . . . . . . . . . . . . . 12-5
I costruttori nella gestione delle eccezioni . . 12-6
Gestione di eccezioni non intercettate
e inattese. . . . . . . . . . . . . . . . . . . . 12-6
Eccezioni strutturate in ambiente Win32 . . . . 12-7
Sintassi delle eccezioni strutturate . . . . . . 12-7
Gestione delle eccezioni strutturate . . . . . 12-8
Filtri delle eccezioni . . . . . . . . . . . . . . 12-9
Abbinamento di eccezioni
strutturate con C++. . . . . . . . . . . . . 12-10
Eccezioni basate su C
in un programma di esempio C++ . . 12-11
Definizione delle eccezioni . . . . . . . . . 12-12
Sollevamento delle eccezioni . . . . . . . . 12-13
Blocchi di terminazione . . . . . . . . . . . 12-13
Opzioni di C++Builder
per la gestione delle eccezioni. . . . . . . 12-15
Gestione delle eccezioni VCL/CLX . . . . . . 12-15
Differenze tra C++ e VCL/CLX
nella gestione delle eccezioni . . . . . . . 12-16
Gestione delle eccezioni
del sistema operativo. . . . . . . . . . . . 12-16
Gestione delle eccezioni
della VCL e della CLX . . . . . . . . . . . 12-17
Classi di eccezioni VCL e CLX . . . . . . . 12-17
Considerazioni sulla portabilit . . . . . . 12-19
Capitolo 13
Supporto del linguaggio C++
per la VCL e la CLX 13-1
Modelli di oggetti C++ e Object Pascal . . . . . 13-1
Eredit e interfacce . . . . . . . . . . . . . . . 13-2
Utilizzo delle interfacce invece
delleredit multipla . . . . . . . . . . . 13-2
Dichiarazione delle classi interfaccia . . . 13-2
IUnknown e IInterface . . . . . . . . . . . 13-3
Creazione di classi
che supportano IUnknown . . . . . . . 13-4
Classi interfacciate e gestione
del periodo di esistenza . . . . . . . . . 13-5
Identit e istanziazione di un oggetto . . . . 13-5
Distinzione tra i riferimenti in C++ e in
Object Pascal. . . . . . . . . . . . . . . . 13-6
Copia di oggetti . . . . . . . . . . . . . . . 13-6
Oggetti come argomenti di funzione . . . 13-8
Costruzione di oggetti per le classi
VCL\CLX di C++Builder . . . . . . . . . . 13-8
Costruzione di oggetti in C++ . . . . . . 13-8
Costruzione di oggetti in Object Pascal . 13-8
Costruzione di oggetti in C++Builder . . 13-8
Chiamata dei metodi virtuali
nei costruttori della classe base . . . . . 13-10
Modello Object Pascal . . . . . . . . . . .13-11
Modello C++ . . . . . . . . . . . . . . . .13-11
Modello C++Builder. . . . . . . . . . . .13-11
Esempio: chiamata dei metodi virtuali .13-11
Inizializzazione del costruttore dei
membri dati per le funzioni virtuali . 13-12
Distruzione di oggetti . . . . . . . . . . . . 13-13
Eccezioni sollevate dai costruttori . . . 13-14
Metodi virtuali chiamati dai distruttori 13-15
AfterConstruction e BeforeDestruction . . 13-15
Funzioni virtuali di classe . . . . . . . . . 13-15
Supporto per i tipi di dati Object Pascal e per le
strutture del linguaggio . . . . . . . . . . . 13-15
Typedef . . . . . . . . . . . . . . . . . . . . 13-16
Classi che supportano
il linguaggio Object Pascal . . . . . . . . 13-16
Equivalenti del linguaggio C++
presenti nel linguaggio Object Pascal . . 13-17
Parametri var . . . . . . . . . . . . . . . 13-17
Parametri senza tipo. . . . . . . . . . . 13-17
Open array . . . . . . . . . . . . . . . . . . 13-17
Calcolo del numero di elementi . . . . 13-18
Array temporanei . . . . . . . . . . . . 13-18
Array of const . . . . . . . . . . . . . . 13-19
Macro OPENARRAY . . . . . . . . . . 13-19
Macro EXISTINGARRAY . . . . . . . . 13-20
Funzioni C++ che accettano
argomenti di tipo open array . . . . . 13-20
Tipi definiti in altro modo . . . . . . . . . 13-20
Tipi di dati booleani . . . . . . . . . . . 13-20
Tipi di dati char . . . . . . . . . . . . . 13-21
Interfacce Delphi . . . . . . . . . . . . . . 13-21
Stringhe di risorse . . . . . . . . . . . . . . 13-21
Parametri predefiniti . . . . . . . . . . . . 13-22
Informazioni di tipo runtime. . . . . . . . 13-23
Tipi non mappati . . . . . . . . . . . . . . 13-24
Tipi real a 6 byte . . . . . . . . . . . . . 13-24
Arrays come tipi restituiti da funzioni 13-24
Estensioni di parole chiave . . . . . . . . . 13-24
__classid . . . . . . . . . . . . . . . . . 13-24
__closure . . . . . . . . . . . . . . . . . 13-25
__property . . . . . . . . . . . . . . . . 13-27
viii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
__published . . . . . . . . . . . . . . . . 13-28
Estensione della parola chiave __declspec. 13-29
__declspec(delphiclass) . . . . . . . . . 13-29
__declspec(delphireturn). . . . . . . . . 13-29
__declspec(delphirtti) . . . . . . . . . . 13-30
__declspec(dynamic) . . . . . . . . . . . 13-30
__declspec(hidesbase) . . . . . . . . . . 13-30
__declspec(package) . . . . . . . . . . . 13-30
__declspec(pascalimplementation) . . . 13-31
__declspec(uuid) . . . . . . . . . . . . . 13-31
Capitolo 14
Sviluppo di applicazioni
multipiattaforma 14-1
Creazione di applicazioni multipiattaforma . . 14-1
Porting di applicazioni Windows in Linux . . . 14-2
Tecniche di porting. . . . . . . . . . . . . . . 14-2
Porting specifico per una piattaforma . . 14-3
Porting per pi piattaforme . . . . . . . . 14-3
Porting in emulazione Windows . . . . . 14-3
Porting dellapplicazione . . . . . . . . . . . 14-3
CLX e VCL . . . . . . . . . . . . . . . . . . . 14-5
Differenze nella CLX. . . . . . . . . . . . . . 14-6
Aspetto. . . . . . . . . . . . . . . . . . . . 14-6
Stili . . . . . . . . . . . . . . . . . . . . . . 14-6
Variant . . . . . . . . . . . . . . . . . . . . 14-6
File di registro . . . . . . . . . . . . . . . . 14-7
Altre differenze . . . . . . . . . . . . . . . 14-7
Cosa manca nella CLX. . . . . . . . . . . . . 14-8
Funzioni di cui non possibile
fare il porting . . . . . . . . . . . . . . . . . 14-9
Confronto fra le unit CLX e VCL . . . . . . . 14-9
Differenze nei costruttori di oggetti CLX . 14-13
Gestione degli eventi di sistema
e di widget. . . . . . . . . . . . . . . . . . 14-13
Condivisione di file sorgente
tra Windows e Linux . . . . . . . . . . . . 14-14
Differenze di ambiente
fra Windows e Linux . . . . . . . . . . . . 14-14
Struttura delle directory su Linux . . . . . 14-16
Scrittura di codice portabile . . . . . . . . . 14-17
Utilizzo delle direttive condizionali . . 14-18
Emissione di messaggi . . . . . . . . . . 14-20
Inclusione di codice assembler in linea. 14-20
Differenze di programmazione in Linux. . 14-21
Applicazioni database multipiattaforma . . . 14-21
Differenze in dbExpress . . . . . . . . . . . 14-22
Differenze a livello di componenti . . . . . 14-23
Differenze a livello di interfaccia utente . . 14-24
Porting di applicazioni database in Linux 14-25
Aggiornamento dei dati
in applicazioni dbExpress . . . . . . . . 14-28
Applicazioni Internet multipiattaforma . . . 14-30
Porting di applicazioni Internet in Linux . 14-30
Capitolo 15
Uso di package e di componenti 15-1
Perch usare i package . . . . . . . . . . . . . . 15-2
Package e DLL standard . . . . . . . . . . . 15-2
Package di esecuzione . . . . . . . . . . . . . . 15-3
Uso dei package in unapplicazione. . . . . 15-3
Caricamento dinamico dei package . . . . . 15-4
Scelta di quali package di esecuzione usare 15-4
Package custom . . . . . . . . . . . . . . . . 15-5
Package di progettazione . . . . . . . . . . . . 15-5
Installazione di package di componenti . . 15-6
Creazione ed editing dei package . . . . . . . . 15-7
Creazione di un package . . . . . . . . . . . 15-7
Editing di un package esistente . . . . . . . 15-8
File sorgenti di package
e file di opzione di progetto . . . . . . . . 15-8
Packaging di componenti . . . . . . . . . 15-9
Struttura di un package. . . . . . . . . . . . 15-9
Assegnazione del nome ai package . . 15-10
Elenco Requires . . . . . . . . . . . . . 15-10
Elenco Contains . . . . . . . . . . . . . .15-11
Generazione di package . . . . . . . . . . .15-11
Direttive al compilatore
specifiche per il packaging . . . . . . 15-12
Uso del compilatore e del linker
dalla riga comandi . . . . . . . . . . . 15-13
File package creati
mediante generazione . . . . . . . . . 15-13
Distribuzione dei package . . . . . . . . . . . 15-14
Distribuzione di applicazioni
che usano package. . . . . . . . . . . . . 15-14
Distribuzione di package
ad altri sviluppatori . . . . . . . . . . . . 15-14
File di raccolta di package . . . . . . . . . 15-15
Capitolo 16
Creazione di applicazioni
internazionali 16-1
Internazionalizzazione e localizzazione . . . . 16-1
Internazionalizzazione . . . . . . . . . . . . 16-1
Localizzazione . . . . . . . . . . . . . . . . . 16-2
Internazionalizzazione delle applicazioni . . . 16-2
Abilitazione del codice dellapplicazione. . 16-2
ix
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Set di caratteri . . . . . . . . . . . . . . . . 16-2
Set di caratteri OEM e ANSI . . . . . . . . 16-3
Set di caratteri multibyte. . . . . . . . . . 16-3
Caratteri estesi . . . . . . . . . . . . . . . 16-3
Inclusione di funzionalit bidirezionali
nelle applicazioni . . . . . . . . . . . . . 16-4
Propriet BiDiMode . . . . . . . . . . . . 16-6
Funzioni specifiche della localit . . . . . 16-8
Progettazione di uninterfaccia utente . . . . 16-9
Testo . . . . . . . . . . . . . . . . . . . . . 16-9
Immagini. . . . . . . . . . . . . . . . . . 16-10
Formati e ordinamento. . . . . . . . . . 16-10
Configurazione della tastiera . . . . . . 16-10
Isolamento delle risorse . . . . . . . . . . . 16-10
Creazione di DLL di risorse . . . . . . . . . 16-11
Uso delle DLL di risorse . . . . . . . . . . . 16-11
Sostituzione dinamica delle DLL di risorse 16-12
Localizzazione delle applicazioni . . . . . . . 16-13
Localizzazione delle risorse . . . . . . . . . 16-13
Capitolo 17
Distribuzione di applicazioni 17-1
Distribuzione di applicazioni generiche. . . . . 17-1
Uso di programmi di installazione . . . . . . 17-2
Identificazione dei file dellapplicazione. 17-2
File di applicazione . . . . . . . . . . . . . 17-3
File package . . . . . . . . . . . . . . . . . 17-3
Moduli di fusione. . . . . . . . . . . . . . 17-3
Controlli ActiveX . . . . . . . . . . . . . . 17-5
Applicazioni di ausilio . . . . . . . . . . . 17-5
Ubicazione delle DLL . . . . . . . . . . . 17-6
Distribuzione di applicazioni CLX. . . . . . . . 17-6
Distribuzione di applicazioni database . . . . . 17-6
Distribuzione di applicazioni
database dbExpress. . . . . . . . . . . . . . 17-7
Distribuzione di applicazioni BDE . . . . . . 17-8
Borland Database Engine . . . . . . . . . 17-9
SQL Links . . . . . . . . . . . . . . . . . . 17-9
Distribuzione di applicazioni
database multi-tier (DataSnap) . . . . . . 17-10
Distribuzione di applicazioni Web. . . . . . . 17-10
Distribuzione su server Apache . . . . . . 17-11
Abilitazione dei moduli . . . . . . . . . 17-11
Applicazioni CGI . . . . . . . . . . . . . 17-12
Programmazione per ambienti
di destinazione diversi. . . . . . . . . . . . . 17-12
Risoluzione dello schermo
e numero di colori . . . . . . . . . . . . . 17-13
Considerazioni sul ridimensionamento
non dinamico . . . . . . . . . . . . . . 17-13
Considerazioni sul ridimensionamento
dinamico di schede e controlli . . . . 17-13
Regolazione in funzione
del numero di colori disponibili . . . 17-15
Font . . . . . . . . . . . . . . . . . . . . . . 17-15
Versioni del sistema operativo . . . . . . . 17-16
Requisiti per la licenza duso del software . . 17-16
DEPLOY . . . . . . . . . . . . . . . . . . . 17-16
README. . . . . . . . . . . . . . . . . . . 17-17
Accordo di licenza. . . . . . . . . . . . . . 17-17
Documentazione sui prodotti di terze parti 17-17
Parte II
Sviluppo di applicazioni database
Capitolo 18
Progettazione di applicazioni
database 18-1
Uso dei databases . . . . . . . . . . . . . . . . . 18-1
Tipi di database . . . . . . . . . . . . . . . . 18-3
Sicurezza del database . . . . . . . . . . . . 18-4
Transazioni . . . . . . . . . . . . . . . . . . . 18-5
Integrit referenziale, procedure registrate
e trigger . . . . . . . . . . . . . . . . . . . . 18-5
Architettura di un database . . . . . . . . . . . 18-6
Struttura generale . . . . . . . . . . . . . . . 18-6
La scheda dellinterfaccia utente . . . . . 18-6
Il modulo dati . . . . . . . . . . . . . . . 18-7
Connessione diretta a un server di database 18-8
Utilizzo di un file dedicato su disco. . . . . 18-9
Collegamento a un altro dataset . . . . . . 18-10
Connessione di un dataset client
a un altro dataset
nella stessa applicazione . . . . . . . 18-12
Utilizzo di unarchitettura multi-tier . 18-13
Combinazione dei vari approcci . . . . . . 18-15
Progettazione dellinterfaccia utente . . . . . 18-16
Analisi dei dati. . . . . . . . . . . . . . . . 18-16
Scrittura di report . . . . . . . . . . . . . . 18-17
Capitolo 19
Uso dei controlli dati 19-1
Uso delle funzioni comuni ai controlli dati . . 19-2
Associazione di un controllo
dati a un dataset . . . . . . . . . . . . . . . 19-3
x
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Modifica del dataset
associato in esecuzione . . . . . . . . . . 19-4
Attivazione e disattivazione
del datasource . . . . . . . . . . . . . . . 19-4
Risposta alle modifiche
mediate dal datasource. . . . . . . . . . 19-4
Modifica e aggiornamento dei dati . . . . . . 19-5
Abilitazione dellediting
nei controlli allatto
dellimmissione dati . . . . . . . . . . . 19-5
Modifica dei dati in un controllol . . . . . 19-5
Disabilitazione e abilitazione della
visualizzazione dei dati . . . . . . . . . . . 19-6
Aggiornamento della visualizzazione
dei dati . . . . . . . . . . . . . . . . . . . . . 19-7
Abilitazione degli eventi mouse,
tastiera e timer . . . . . . . . . . . . . . . . 19-7
Scelta del modo in cui organizzare i dati . . . . 19-8
Visualizzazione di un singolo record. . . . . 19-8
Visualizzazione dei dati come etichette . 19-8
Visualizzazione e modifica
di campi in una casella di testo . . . . . 19-9
Visualizzazione e modifica
del testo in un controllo memo l . . . . . 19-9
Visualizzazione e modifica
del testo in un controllo rich edit . . . 19-10
Visualizzazione e modifica
di campi grafici
in un controllo immagine . . . . . . . 19-10
Visualizzazione e modifica
di dati in caselle combinate
e di riepilogo. . . . . . . . . . . . . . . 19-11
Gestione dei valori di campo booleani
con le caselle di controllo. . . . . . . . 19-14
Restrizione dei valori del campo
con controlli di opzione . . . . . . . . 19-15
Visualizzazione di pi record . . . . . . . . 19-16
Visualizzazione e modifica dei dati
con TDBGrid . . . . . . . . . . . . . . . . . . 19-16
Uso di un controllo griglia
nel suo stato predefinito . . . . . . . . . . 19-17
Creazione di una griglia personalizzata . . 19-18
Caratteristiche delle colonne persistenti 19-19
Creazione di colonne persistenti . . . . 19-19
Cancellazione di colonne persistenti . . 19-21
Sistemazione dellordine
delle colonne persistenti . . . . . . . . 19-21
Impostazione delle propriet
di una colonna in progettazione. . . . 19-22
Definizione di una colonna
elenco di consultazione . . . . . . . . 19-23
Inserimento di un pulsante
in una colonna . . . . . . . . . . . . . 19-23
Ripristino dei valori predefiniti
in una colonna . . . . . . . . . . . . . 19-24
Visualizzazione dei campi ADT e array . 19-24
Impostazione delle opzioni per la griglia. 19-26
Editing nella griglia . . . . . . . . . . . . . 19-28
Controllo del disegno della griglia . . . . 19-28
Risposta alle azioni dellutente
in fase di esecuzione. . . . . . . . . . . . 19-29
Creazione di una griglia contenente
altri controlli associati ai dati . . . . . . . . 19-30
Spostamento e gestione dei record . . . . . . 19-31
Scelta dei pulsanti del navigatore
da visualizzare . . . . . . . . . . . . . . . 19-32
Visualizzazione e occultamento
dei pulsanti del navigatore
in fase di progettazione . . . . . . . . 19-33
Visualizzazione e occultamento
dei pulsanti del navigatore
in fase di esecuzione . . . . . . . . . . 19-33
Visualizzazione del fumetto guida . . . . 19-34
Uso di un singolo navigatore
per pi dataset . . . . . . . . . . . . . . . 19-34
Capitolo 20
Uso dei componenti
di supporto decisionale 20-1
Panoramica . . . . . . . . . . . . . . . . . . . . 20-1
I crosstab . . . . . . . . . . . . . . . . . . . . . . 20-2
Crosstab monodimensionali . . . . . . . . . 20-3
Crosstab multidimensionali . . . . . . . . . 20-3
Regole generali per luso dei componenti di
supporto decisionale . . . . . . . . . . . . . . 20-3
Uso dei dataset con i componenti
di supporto decisionale. . . . . . . . . . . . . 20-5
Creazione di dataset decisionali
con TQuery o TTable . . . . . . . . . . . . 20-5
Creazione di dataset decisionali
con leditor Decision Query . . . . . . . . 20-6
Uso dei cubi decisionali . . . . . . . . . . . . . 20-7
Propriet del cubo decisionale e eventi . . . 20-7
Uso di Decision Cube editor . . . . . . . . . 20-7
Visualizzazione e modifica delle
impostazioni delle dimensioni . . . . . 20-8
Impostazione del numero massimo di
dimensioni e di riepiloghi disponibili . 20-8
xi
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Visualizzazione e modifica
delle opzioni di progetto . . . . . . . . . 20-9
Uso delle sorgenti decisionali. . . . . . . . . . . 20-9
Propriet ed eventi . . . . . . . . . . . . . . . 20-9
Uso dei pivot decisionali . . . . . . . . . . . . 20-10
Propriet dei pivot decisionali . . . . . . . 20-10
Creazione e uso delle griglie decisionali . . . 20-11
Creazione di griglie decisionali . . . . . . . 20-11
Uso delle griglie decisionali . . . . . . . . . 20-11
Apertura e chiusura dei campi
della griglia decisionale . . . . . . . . 20-11
Riorganizzazione di righe
e colonne in griglie decisionali . . . . 20-12
Espansione dei dettagli
nelle griglie decisionali . . . . . . . . . 20-12
Limitazione della selezione
delle dimensioni
in griglie decisionali . . . . . . . . . . 20-12
Propriet della griglia decisionale . . . . . 20-12
Creazione e uso dei grafici decisionali. . . . . 20-13
Creazione di grafici decisionali . . . . . . . 20-14
Uso dei grafici decisionali . . . . . . . . . . 20-14
Visualizzazione del grafico decisionale . . 20-15
Personalizzazione dei grafici decisionali . 20-16
Impostazioni predefinite dei modelli
di grafico decisionale . . . . . . . . . . 20-17
Personalizzazione delle serie
del grafico decisionale . . . . . . . . . 20-18
Componenti di supporto decisionale
in esecuzione . . . . . . . . . . . . . . . . . . 20-19
Pivot decisionali in esecuzione . . . . . . . 20-19
Griglie decisionali in esecuzione . . . . . . 20-19
Grafici decisionali in esecuzione . . . . . . 20-20
Componenti di supporto decisionale
e controllo della memoria . . . . . . . . . . . 20-20
Impostazione dei valori massimi per
dimensioni, riepiloghi e celle . . . . . . . 20-20
Impostazione dello stato della dimensione 20-21
Utilizzo delle dimensioni paginate . . . . . 20-21
Capitolo 21
Connessione ai database 21-1
Uso di connessioni implicite . . . . . . . . . . . 21-2
Controllo delle connessioni . . . . . . . . . . . . 21-3
Connessione a un server di database. . . . . 21-3
Disconnessione da un server di database . . 21-4
Controllo del login al server . . . . . . . . . . . 21-4
Gestione delle transazioni. . . . . . . . . . . . . 21-6
Avvio di una transazione . . . . . . . . . . . 21-7
Chiusura di una transazione . . . . . . . . . 21-8
Chiusura di una transazione
andata a buon fine . . . . . . . . . . . . 21-8
Chiusura di una transazione
non andata a buon fine . . . . . . . . . 21-9
Specifica del livello di isolamento
delle transazioni . . . . . . . . . . . . . . 21-10
Invio di comandi al server . . . . . . . . . . . .21-11
Operazioni con i dataset associati . . . . . . . 21-13
Chiusura dei dataset
senza scollegarsi dal server. . . . . . . . 21-13
Scansione di tutti i dataset associati . . . . 21-13
Ottenimento di metadati . . . . . . . . . . . . 21-14
Elenco delle tabelle disponibili . . . . . . 21-14
Elenco dei campi in una tabella . . . . . . 21-14
Elenco delle procedure registrate
disponibili . . . . . . . . . . . . . . . . . 21-15
Elenco degli indici disponibili . . . . . . . 21-15
Elenco dei parametri
delle procedure registrate. . . . . . . . . 21-15
Capitolo 22
I dataset 22-1
Utilizzo dei discendenti di TDataSet . . . . . . 22-2
Determinazione degli stati del dataset . . . . . 22-3
Apertura e chiusura di dataset . . . . . . . . . 22-4
Spostamenti nei dataset . . . . . . . . . . . . . 22-5
Utilizzo dei metodi First e Last . . . . . . . 22-6
Utilizzo dei metodi Next e Prior . . . . . . . 22-7
Utilizzo del metodo MoveBy. . . . . . . . . 22-7
Utilizzo delle propriet Eof e Bof . . . . . . 22-8
Eof . . . . . . . . . . . . . . . . . . . . . . 22-8
Bof . . . . . . . . . . . . . . . . . . . . . . 22-9
Contrassegno e ritorno ai record. . . . . . . 22-9
La propriet Bookmark . . . . . . . . . 22-10
Il metodo GetBookmark. . . . . . . . . 22-10
I metodi GotoBookmark
e BookmarkValid. . . . . . . . . . . . 22-10
Il metodo CompareBookmarks. . . . . 22-10
Il metodo FreeBookmark . . . . . . . . 22-10
Un esempio di utilizzo dei segnalibri . 22-10
Ricerche nei dataset. . . . . . . . . . . . . . . .22-11
Uso di Locate . . . . . . . . . . . . . . . . .22-11
Uso di Lookup. . . . . . . . . . . . . . . . 22-12
Visualizzazione e modifica
di un sottoinsieme di dati usando i filtri . . 22-13
Attivazione e disattivazione dei filtri . . . 22-13
Creazione di filtri . . . . . . . . . . . . . . 22-14
Impostazione della propriet Filter . . 22-14
xii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Scrittura di un gestore
di eventi OnFilterRecord . . . . . . . . 22-16
Commutazione dei gestori evento
di filtro in esecuzione . . . . . . . . . . 22-16
Impostazione delle opzioni del filtro. . . . 22-16
Spostamento tra i record
in un dataset filtrato . . . . . . . . . . . . 22-17
Modifica dei dati . . . . . . . . . . . . . . . . . 22-17
Modifica dei record . . . . . . . . . . . . . 22-18
Aggiunta di nuovi record . . . . . . . . . . 22-19
Inserimento di record. . . . . . . . . . . 22-20
Aggiunta di record . . . . . . . . . . . . 22-20
Cancellazione dei record . . . . . . . . . . 22-20
Registrazione dei dati . . . . . . . . . . . . 22-21
Annullamento delle modifiche . . . . . . . 22-22
Modifica di interi record. . . . . . . . . . . 22-22
Calcolo dei campi . . . . . . . . . . . . . . . . 22-24
Tipi di dataset . . . . . . . . . . . . . . . . . . 22-24
Utilizzo dei dataset di tipo tabella . . . . . . . 22-26
Vantaggi dellutilizzo dei dataset
di tipo tabella . . . . . . . . . . . . . . . . 22-27
Ordinamento dei record con indici . . . . . 22-27
Ottenimento di informazioni
sugli indici . . . . . . . . . . . . . . . . 22-28
Specifica di un indice con IndexName . 22-28
Creazione di un indice
con IndexFieldNames . . . . . . . . . 22-28
Utilizzo di indici per la ricerca di record. . 22-29
Esecuzione di una ricerca
con metodi Goto. . . . . . . . . . . . . 22-30
Esecuzione di una ricerca
con metodi Find. . . . . . . . . . . . . 22-30
Specifica del record corrente
dopo una ricerca andata a buon fine . 22-31
Ricerca in base a chiavi parziali . . . . . 22-31
Ripetizione o ampliamento
di una ricerca . . . . . . . . . . . . . . 22-31
Limitazione dei record con gli intervalli . . 22-32
Differenze fra intervalli e filtri. . . . . . 22-32
Specifica degli intervalli . . . . . . . . . 22-32
Modifica di un intervallo. . . . . . . . . 22-35
Applicazione o annullamento
di un intervallo . . . . . . . . . . . . . 22-36
Creazione di relazioni master/detail. . . . 22-36
Trasformazione della tabella nella
tabella dettaglio di un altro dataset . . 22-37
Utilizzo di tabelle dettaglio annidate . . 22-38
Controllo dellaccesso alle tabelle
in lettura/scrittura . . . . . . . . . . . . . 22-39
Creazione e cancellazione di tabelle. . . . 22-40
Creazione di tabelle . . . . . . . . . . . 22-40
Cancellazione di tabelle . . . . . . . . . 22-42
Svuotamento di tabelle . . . . . . . . . . . 22-42
Sincronizzazione di tabelle . . . . . . . . . 22-43
Utilizzo di dataset di tipo query. . . . . . . . 22-43
Specifica della query . . . . . . . . . . . . 22-44
Specifica di una query utilizzando la
propriet SQL. . . . . . . . . . . . . . 22-45
Specifica di una query utilizzando la
propriet CommandText . . . . . . . 22-46
Utilizzo dei parametri nelle query. . . . . 22-46
Fornitura dei parametri
in progettazione . . . . . . . . . . . . 22-47
Fornitura dei parametri in esecuzione. 22-48
Impostazione di relazioni master/detail
mediante parametri . . . . . . . . . . . . 22-49
Preparazione di query . . . . . . . . . . . 22-50
Esecuzione di query che
non restituiscono un set risultato . . . . 22-50
Utilizzo di set risultato unidirezionali . . 22-51
Utilizzo di dataset di tipo
procedura registrata . . . . . . . . . . . . . 22-52
Operazioni con i parametri
delle procedure registrate. . . . . . . . . 22-53
Impostazione dei parametri
in progettazione . . . . . . . . . . . . 22-54
Utilizzo di parametri in esecuzione . . 22-55
Preparazione delle procedure registrate . 22-56
Esecuzione di procedure registrate che non
restituiscono un set risultato . . . . . . . 22-56
Prelievo di pi set risultato. . . . . . . . . 22-57
Capitolo 23
Operazioni
con i componenti campo 23-1
Componenti campo dinamici . . . . . . . . . . 23-2
Componenti campo persistenti . . . . . . . . . 23-3
Creazione di campi persistenti . . . . . . . . 23-4
Disposizione dei campi persistenti . . . . . 23-5
Definizione di nuovi campi persistenti . . . 23-5
Definizione di un campo dati. . . . . . . 23-7
Definizione di un campo calcolato. . . . 23-7
Programmazione di un campo calcolato 23-8
Definizione di un campo
di consultazione . . . . . . . . . . . . . 23-9
Definizione di un campo
di aggregazione . . . . . . . . . . . . 23-10
xiii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Cancellazione di componenti
campo persistenti . . . . . . . . . . . . . . 23-11
Impostazione di propriet ed eventi
dei campi persistenti . . . . . . . . . . . . 23-11
Impostazione delle propriet di
visualizzazione e di modifica
in progettazione . . . . . . . . . . . . . 23-12
Impostazione delle propriet del
componente campo in esecuzione. . . 23-13
Creazione di set di attributi
per i componenti campo . . . . . . . . 23-14
Associazione di set di attributi
ai componenti campo. . . . . . . . . . 23-14
Rimozione delle associazioni
degli attributi . . . . . . . . . . . . . . 23-15
Controllo e mascheratura dellinput . . 23-15
Uso dei formati predefiniti per i campi
numerici, data e ora. . . . . . . . . . . 23-16
Gestione degli eventi . . . . . . . . . . . 23-16
Operazioni con i metodi
del componente campo in esecuzione . . . . 23-17
Visualizzazione, conversione e accesso
ai valori di campo . . . . . . . . . . . . . . . 23-18
Visualizzazione dei valori dei componenti
campo nei controlli standard . . . . . . . 23-19
Conversione dei valori di campo . . . . . . 23-19
Accesso ai valori dei campi con la propriet
predefinita del dataset . . . . . . . . . . . 23-21
Accesso ai valori dei campi con la propriet
Fields di un dataset. . . . . . . . . . . . . 23-21
Accesso ai valori dei campi con il metodo
FieldByName di un dataset . . . . . . . . 23-21
Impostazione del valore predefinito
di un campo. . . . . . . . . . . . . . . . . . . 23-22
Utilizzo dei vincoli. . . . . . . . . . . . . . . . 23-22
Creazione di un vincolo custom . . . . . . 23-22
Uso dei vincoli del server . . . . . . . . . . 23-23
Uso dei campi oggetto. . . . . . . . . . . . . . 23-24
Visualizzazione di campi ADT e array. . . 23-24
Uso dei campi ADT . . . . . . . . . . . . . 23-25
Utilizzo di componenti campo
persistenti . . . . . . . . . . . . . . . . 23-25
Utilizzo del metodo FieldByName
del dataset . . . . . . . . . . . . . . . . 23-26
Utilizzo della propriet FieldValues
del dataset . . . . . . . . . . . . . . . . 23-26
Utilizzo della propriet FieldValues del
campo ADT . . . . . . . . . . . . . . . 23-26
Utilizzo della propriet Fields
del campo ADT. . . . . . . . . . . . . 23-26
Uso dei campi array. . . . . . . . . . . . . 23-26
Utilizzo di campi persistenti . . . . . . 23-27
Uso della propriet FieldValues
del campo array . . . . . . . . . . . . 23-27
Uso della propriet Fields
del campo array . . . . . . . . . . . . 23-27
Uso dei campi dataset. . . . . . . . . . . . 23-27
Visualizzazione dei campi dataset . . . 23-27
Accesso ai dati in un dataset annidato 23-28
Uso dei campi riferimento . . . . . . . . . 23-28
Visualizzazione
dei campi riferimento . . . . . . . . . 23-28
Accesso ai dati
di un campo riferimento . . . . . . . 23-29
Capitolo 24
Uso di Borland Database Engine 24-1
Larchitettura BDE . . . . . . . . . . . . . . . . 24-1
Impiego di dataset per BDE . . . . . . . . . 24-2
Associazione di un dataset
a connessioni di database e di sessione 24-3
Cache dei BLOB . . . . . . . . . . . . . . 24-4
Ottenimento degli handle BDE. . . . . . 24-4
Utilizzo di TTable . . . . . . . . . . . . . . . 24-5
Specifica del tipo di tabella
per tabelle locali . . . . . . . . . . . . . 24-5
Controllo dellaccesso a tabelle locali in
lettura/scrittura . . . . . . . . . . . . . 24-6
Specifica di file indice dBASE . . . . . . 24-6
Come rinominare tabelle locali . . . . . . 24-8
Importazione di dati da altre tabelle. . . 24-8
Utilizzo di TQuery . . . . . . . . . . . . . . 24-9
Creazione di query eterogenee . . . . . . 24-9
Ottenimento di un set risultato
modificabile. . . . . . . . . . . . . . . 24-10
Aggiornamento di set risultato
a sola lettura . . . . . . . . . . . . . . .24-11
Utilizzo di TStoredProc . . . . . . . . . . . 24-12
Inglobamento dei parametri . . . . . . 24-12
Operazioni con procedure registrate
ridefinite di Oracle . . . . . . . . . . . 24-13
Collegamento ai database
tramite TDatabase . . . . . . . . . . . . . 24-13
Associazione di un componente
database a una sessione . . . . . . . . 24-13
Interazioni tra il componente
Session e i database . . . . . . . . . . 24-14
xiv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Identificazione del database . . . . . . . 24-14
Apertura di una connessione
utilizzando TDatabase . . . . . . . . . 24-16
Impiego di componenti
database nei moduli dati . . . . . . . . 24-17
Gestione delle sessioni di database. . . . . 24-17
Attivazione di una sessione . . . . . . . 24-18
Specifica del comportamento predefinito
della connessione al database . . . . . 24-19
Gestione delle connessioni
con il database. . . . . . . . . . . . . . 24-20
Operazioni con tabelle Paradox e dBASE
protette da password . . . . . . . . . . 24-22
Specifica delle ubicazioni
delle directory di Paradox . . . . . . . 24-25
Operazioni con gli alias BDE . . . . . . 24-25
Reperimento di informazioni
su una sessione . . . . . . . . . . . . . 24-27
Creazione di sessioni supplementari . . 24-28
Attribuzione del nome a una sessione . 24-29
Gestione di sessioni multiple . . . . . . 24-29
Utilizzo delle transazioni con BDE. . . . . . . 24-31
Utilizzo di passthrough SQL . . . . . . . . 24-32
Utilizzo delle transazioni locali . . . . . . . 24-33
Utilizzo di BDE per gli aggiornamenti
in cache . . . . . . . . . . . . . . . . . . . . . 24-33
Attivazione degli aggiornamenti
in cache con BDE . . . . . . . . . . . . . . 24-35
Applicazione degli aggiornamenti in cache
basati su BDE . . . . . . . . . . . . . . . . 24-35
Applicazione degli aggiornamenti nella
cache mediante un database . . . . . . 24-36
Applicazione degli aggiornamenti
in cache con i metodi
dei componenti dataset. . . . . . . . . 24-37
Creazione di un gestore di evento
OnUpdateRecord . . . . . . . . . . . . 24-38
Gestione degli errori di aggiornamento 24-39
Aggiornamento di dataset
mediante oggetti update. . . . . . . . . . 24-41
Creazione di istruzioni SQL
per componenti update. . . . . . . . . 24-42
Utilizzo di pi oggetti update . . . . . . 24-46
Esecuzione delle istruzioni SQL. . . . . 24-47
Utilizzo di TBatchMove . . . . . . . . . . . . . 24-50
Creazione di un componente batch move . 24-50
Specifica della modalit
di un componente batch move . . . . . . 24-51
Aggiunta di record . . . . . . . . . . . . 24-52
Aggiornamento di record . . . . . . . . 24-52
Aggiunta e aggiornamento di record . 24-52
Copia di dataset . . . . . . . . . . . . . 24-52
Cancellazione di record . . . . . . . . . 24-53
Mappatura dei tipi di dati . . . . . . . . . 24-53
Esecuzione di unoperazione batch move 24-54
Gestione degli errori
delle operazioni batch move . . . . . . . 24-54
Il Data Dictionary . . . . . . . . . . . . . . . . 24-55
Strumenti per operare con BDE . . . . . . . . 24-56
Capitolo 25
Operazioni con componenti ADO 25-1
Panoramica dei componenti ADO . . . . . . . 25-1
Connessione a datastore ADO. . . . . . . . . . 25-2
Connessione a un datastore
mediante TADOConnection . . . . . . . . 25-3
Accesso alloggetto connessione . . . . . 25-4
Messa a punto di una connessione . . . . . 25-5
Come forzare connessioni asincrone. . . 25-5
Controllo dei timeout . . . . . . . . . . . 25-5
Indicazione dei tipi di operazione che la
connessione supporta . . . . . . . . . . 25-6
Come specificare se la connessione
avvia in automatico le transazioni . . . 25-6
Accesso ai comandi della connessione . . . 25-7
Eventi di connessione ADO . . . . . . . . . 25-7
Eventi allo stabilirsi di una connessione 25-8
Eventi alla chiusura del collegamento. . 25-8
Eventi durante la gestione
delle transazioni . . . . . . . . . . . . . 25-8
Altri eventi . . . . . . . . . . . . . . . . . 25-8
Uso di dataset ADO . . . . . . . . . . . . . . . 25-9
Connessione di un dataset
ADO a un datastore . . . . . . . . . . 25-10
Operazioni con set di record . . . . . . 25-10
Filtraggio di record mediante segnalibri 25-11
Prelievo di record in modalit asincrona25-11
Uso di aggiornamenti batch . . . . . . 25-12
Caricamento e salvataggio
di dati su file . . . . . . . . . . . . . . 25-15
Utilizzo di TADODataSet. . . . . . . . . . 25-16
Utilizzo di oggetti Command . . . . . . . . . 25-17
Specifica del comando . . . . . . . . . . . 25-18
Utilizzo del metodo Execute . . . . . . . . 25-18
Annullamento di comandi . . . . . . . . . 25-19
Reperimento di set risultato con comandi 25-19
Gestione dei parametri di comando. . . . 25-20
xv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 26
Uso di dataset unidirezionali 26-1
Tipi di dataset unidirezionali . . . . . . . . . . . 26-2
Connessione al server di database . . . . . . . . 26-2
Impostazione di TSQLConnection . . . . . . 26-3
Identificazione del driver . . . . . . . . . 26-3
Specifica dei parametri di connessione. . 26-4
Assegnazione di un nome
a una descrizione della connessione . . 26-4
Utilizzo di Connection Editor . . . . . . . 26-5
Specifica dei dati da visualizzare. . . . . . . . . 26-6
Rappresentazione dei risultati di una query 26-6
Rappresentazione dei record in una tabella . 26-7
Rappresentazione di una tabella
mediante TSQLDataSet. . . . . . . . . . 26-7
Rappresentazione di una tabella
mediante TSQLTable . . . . . . . . . . . 26-7
Rappresentazione dei risultati
di una procedura registrata . . . . . . . . . 26-8
Reperimento dei dati . . . . . . . . . . . . . . . 26-8
Preparazione del dataset. . . . . . . . . . . . 26-9
Reperimento di pi dataset . . . . . . . . . . 26-9
Esecuzione di comandi
che non restituiscono record . . . . . . . . . . 26-9
Specifica del comando da eseguire . . . . . 26-10
Esecuzione del comando . . . . . . . . . . 26-10
Creazione e modifica
dei metadati del server. . . . . . . . . . . 26-11
Configurazione di cursor
master/detail collegati . . . . . . . . . . . . 26-12
Accesso a informazioni di schema . . . . . . . 26-12
Prelievo di metadati
in un dataset unidirezionale. . . . . . . . 26-13
Ottenimento dei dati
dopo aver utilizzato il dataset
per i metadati . . . . . . . . . . . . . . 26-14
La struttura dei dataset di metadati . . 26-14
Debug di applicazioni dbExpress . . . . . . . 26-18
Utilizzo di TSQLMonitor per controllare i
comandi SQL . . . . . . . . . . . . . . . . 26-18
Utilizzo di una callback per controllare i
comandi SQL . . . . . . . . . . . . . . . . 26-19
Capitolo 27
Utilizzo dei dataset client 27-1
Utilizzo dei dati tramite un dataset client . . . . 27-2
Come spostarsi tra i dati nei dataset client . 27-2
Come limitare i record da visualizzare. . . . 27-2
Editing di dati. . . . . . . . . . . . . . . . . . 27-5
Annullamento delle modifiche . . . . . . 27-6
Salvataggio delle modifiche . . . . . . . 27-7
Definizione dei vincoli dei valori dati. . . . 27-7
Specifica di vincoli custom . . . . . . . . 27-8
Ordinamento e indicizzazione . . . . . . . . 27-8
Aggiunta di un nuovo indice. . . . . . . 27-9
Cancellazione e cambio degli indici . . 27-10
Uso degli indici
per il raggruppamento dei dati . . . . 27-10
Rappresentazione dei valori calcolati . . . .27-11
Uso di campi calcolati internamente
nei dataset client . . . . . . . . . . . . .27-11
Uso delle aggregazioni di manutenzione . 27-12
Specifica delle aggregazioni . . . . . . 27-12
Aggregazione di gruppi di record . . . 27-13
Ottenimento dei valori di aggregazione 27-14
Copia di dati da un altro dataset. . . . . . 27-15
Assegnazione diretta dei dati. . . . . . 27-15
Clonazione di un cursor
di un dataset client . . . . . . . . . . . 27-16
Aggiunta di informazioni specifiche per
lapplicazione ai dati . . . . . . . . . . . 27-16
Utilizzo di un dataset client
per registrare in cache gli aggiornamenti . . 27-17
Panoramica sullutilizzo
degli aggiornamenti in cache. . . . . . . 27-18
Scelta del tipo di dataset
per gli aggiornamenti in cache . . . . . . 27-19
Indicazione dei record modificati . . . . . 27-20
Aggiornamento dei record . . . . . . . . . 27-21
Applicazione degli aggiornamenti. . . 27-22
Interventi durante lapplicazione
degli aggiornamenti . . . . . . . . . . 27-23
Riconciliazione degli errori
di aggiornamento . . . . . . . . . . . 27-25
Uso di un dataset client
con un provider di dati . . . . . . . . . . . . 27-26
Specifica di un provider . . . . . . . . . . 27-27
Richiesta di dati da un dataset sorgente
o da un documento . . . . . . . . . . . . 27-28
Recupero incrementale . . . . . . . . . 27-28
Recupero in automatico . . . . . . . . . 27-29
Ottenimento dei parametri
dal dataset sorgente . . . . . . . . . . . . 27-29
Passaggio di parametri al dataset sorgente 27-30
Invio dei parametri di una query
o di una procedura registrata . . . . . 27-31
Limitazione dei record mediante
parametri . . . . . . . . . . . . . . . . 27-31
xvi
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Gestione dei vincoli dal server . . . . . . . 27-32
Rinnovo dei record. . . . . . . . . . . . . . 27-33
Comunicazione con i provider
tramite eventi custom . . . . . . . . . . . 27-33
Ridefinizione del dataset sorgente . . . . . 27-34
Uso di un dataset client con dati basati su file 27-35
Creazione di un nuovo dataset . . . . . . . 27-35
Caricamento dei dati da un file
o da uno stream. . . . . . . . . . . . . . . 27-36
Fusione delle modifiche nei dati . . . . . . 27-36
Salvataggio dei dati in un file
o in uno stream . . . . . . . . . . . . . . . 27-37
Capitolo 28
Uso di componenti provider 28-1
Individuazione della sorgente dati. . . . . . . . 28-2
Uso di un dataset come sorgente dati . . . . 28-2
Uso di un documento XML
come sorgente dati . . . . . . . . . . . . . . 28-2
Comunicazione con il dataset clientt . . . . . . 28-3
Come applicare gli aggiornamenti
usando un provider di dataset . . . . . . . . . 28-4
Controllo delle informazioni
incluse nei pacchetti dati . . . . . . . . . . . . 28-4
Specifica dei campi inclusi
in un pacchetto dati . . . . . . . . . . . . . 28-5
Impostazione di opzioni che influenzano i
pacchetti dati . . . . . . . . . . . . . . . . . 28-5
Aggiunta di informazioni personali
ai pacchetti dati . . . . . . . . . . . . . . . . 28-7
Risposta alle richieste di dati del client . . . . . 28-8
Risposta alle richieste di aggiornamento
del client. . . . . . . . . . . . . . . . . . . . . . 28-8
Modifica dei pacchetti delta prima
dellaggiornamento del database . . . . . . 28-9
Come influenzare la modalit
di applicazione degli aggiornamenti . . . 28-10
Vaglio dei singoli aggiornamenti . . . . . . 28-11
Risoluzione degli errori di aggiornamento
sul provider . . . . . . . . . . . . . . . . . 28-12
Applicazione di aggiornamenti
a dataset che non rappresentano
una singola tabella . . . . . . . . . . . . . 28-12
Risposta agli eventi generati dal client . . . . 28-13
Gestione dei vincoli del server . . . . . . . . . 28-13
Capitolo 29
Creazione di applicazioni multi-tier 29-1
Vantaggi di un modello database multi-tier . . 29-2
Applicazioni multi-tier basate su provider. . . 29-2
Panoramica di unapplicazione three-tier . 29-3
Struttura dellapplicazione client . . . . . . 29-4
La struttura dellapplication server . . . . . 29-5
Contenuti del modulo dati remoto. . . . 29-6
Uso di moduli dati transazionali . . . . . 29-7
Centralizzazione di moduli dati remoti . 29-8
Scelta di un protocollo di connessione . . . 29-9
Uso di connessioni DCOM . . . . . . . 29-10
Uso delle connessioni socket . . . . . . 29-10
Uso di connessioni . . . . . . . . . . . . .29-11
Utilizzo di connessioni SOAP . . . . . .29-11
Creazione di unapplicazione multi-tier . . . 29-12
Creazione dellapplication server . . . . . . . 29-12
Impostazione del modulo dati remoto . . 29-14
Configurazione del modulo dati
remoto nel caso non sia transazionale 29-14
Configurazione di un modulo
dati remoto transazionale . . . . . . . 29-15
Configurazione di TSoapDataModule. 29-16
Estensione dellinterfaccia
dellapplication server . . . . . . . . . . 29-17
Aggiunta di callback allinterfaccia
dellapplication server . . . . . . . . . 29-18
Estensione dellinterfaccia
transazionale di un application server 29-18
Gestione delle transazioni
nelle applicazioni multi-tiered . . . . . . 29-18
Supporto delle relazioni master/detail . . 29-19
Supporto delle informazioni di stato
nei moduli dati remoti . . . . . . . . . . 29-20
Uso di pi moduli dati remoti . . . . . . . 29-21
Registrazione dellapplication server . . . . . 29-22
Creazione dellapplicazione client . . . . . . 29-23
Connessione allapplication server . . . . 29-24
Specifica di una connessione
con DCOM . . . . . . . . . . . . . . . 29-24
Specifica di una connessione
con i socket . . . . . . . . . . . . . . . 29-25
Specifica di una connessione con HTTP 29-26
Specifica di una connessione con SOAP 29-26
Brokering delle connessioni . . . . . . 29-27
Gestione delle connessioni al server. . . . 29-27
Connessione al server . . . . . . . . . . 29-28
Abbandono o modifica
di una connessione a un server . . . . 29-28
Chiamata delle interfacce del server . . . 29-29
Connessione a un application server
che utilizza pi moduli dati . . . . . . . 29-30
xvii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Scrittura di applicazioni client basate su Web 29-31
Distribuzione di unapplicazione
client come controllo ActiveX . . . . . . . 29-32
Creazione di una Active Form per
lapplicazione client. . . . . . . . . . . 29-32
Creazione di applicazioni
Web con InternetExpress. . . . . . . . . . 29-33
Creazione di unapplicazione
InternetExpress . . . . . . . . . . . . . . . 29-34
Uso delle librerie javascript . . . . . . . 29-35
Concessione dei permessi per laccesso e
lavvio dellapplication server . . . . . 29-35
Uso di un broker XML . . . . . . . . . . . . 29-36
Recupero di pacchetti dati XML. . . . . 29-36
Applicazione degli aggiornamenti da
pacchetti delta XML . . . . . . . . . . 29-37
Creazione di pagine web con produttori di
pagine InternetExpress. . . . . . . . . . . 29-39
Utilizzo di Web page editor . . . . . . . 29-39
Impostazione delle propriet
degli elementi Web . . . . . . . . . . . 29-40
Personalizzazione del modello del
produttore di pagine InternetExpress. 29-41
Capitolo 30
Uso di XML
nelle applicazioni database 30-1
Definizione della trasformazione . . . . . . . . 30-1
Mappatura tra nodi XML e campi di un
pacchetto dati . . . . . . . . . . . . . . . . . 30-2
Utilizzo di XMLMapper . . . . . . . . . . . . 30-4
Caricamento di uno schema XML
o di un pacchetto dati. . . . . . . . . . . 30-4
Definizione delle mappature . . . . . . . 30-5
Generazione dei file di trasformazione. . 30-6
Conversione di documenti XML
in pacchetti dati . . . . . . . . . . . . . . . . . 30-6
Specifica del documento XML di origine . . 30-6
Specifica della trasformazione . . . . . . . . 30-7
Ottenimento del pacchetto dati risultante . . 30-7
Conversione dei nodi definiti dallutente . . 30-7
Impiego di un documento XML
come origine di un provider . . . . . . . . . . 30-8
Utilizzo di documenti XML
come client di un provider . . . . . . . . . . . 30-9
Prelievo di un documento XML
da un provider . . . . . . . . . . . . . . . . 30-9
Applicazione degli aggiornamenti da un
documento XML a un provider . . . . . . 30-10
Parte III
Creazione di applicazioni Internet
Capitolo 31
Scrittura di applicazioni CORBA 31-1
Panoramica di unapplicazione CORBA . . . . 31-1
Gli stub e gli skeleton . . . . . . . . . . . . . 31-2
Utilizzo di Smart Agent. . . . . . . . . . . . 31-3
Attivazione delle applicazioni server . . . . 31-4
Binding dinamico
delle chiamate alle interfacce. . . . . . . . 31-4
Scrittura di server CORBA. . . . . . . . . . . . 31-4
Definizione delle interfacce delloggetto . . 31-5
Utilizzo del CORBA Server Wizard . . . . . 31-5
Generazione di stub e skeleton
da un file IDL . . . . . . . . . . . . . . . . 31-6
Uso del Wizard
CORBA Object Implementation . . . . . . 31-7
Istanze di oggetti CORBA. . . . . . . . . 31-8
Uso del modello di delega . . . . . . . . 31-8
Visualizzazione e modifica
dei cambiamenti . . . . . . . . . . . . . 31-9
Implementazione degli oggetti CORBA . 31-10
Protezione da conflitti di thread . . . . 31-12
Modifica delle interfacce CORBA . . . . . 31-13
Registrazione delle interfacce del server . 31-13
Scrittura di client CORBA . . . . . . . . . . . 31-14
Uso di stub . . . . . . . . . . . . . . . . . . 31-15
Utilizzo dellinterfaccia
di chiamata dinamica . . . . . . . . . . . 31-16
Collaudo di server CORBA . . . . . . . . . . 31-17
Configurazione dello strumento
di collaudo . . . . . . . . . . . . . . . . . 31-18
Registrazione ed esecuzione
di script di collaudo . . . . . . . . . . . . 31-18
Capitolo 32
Creazione di applicazioni server
per Internet 32-1
Web Broker e WebSnap. . . . . . . . . . . . . . 32-1
Terminologia e standard . . . . . . . . . . . . . 32-3
Parti di uno Uniform Resource Locator. . . 32-4
URI e. URL . . . . . . . . . . . . . . . . . 32-4
Informazioni dellheader
della richiesta HTTP. . . . . . . . . . . . . 32-4
Attivit di un server HTTP . . . . . . . . . . . 32-5
Composizione delle richieste del client . . . 32-5
Soddisfacimento delle richieste del client . 32-6
xviii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Risposta alle richieste del client. . . . . . . . 32-6
Tipi di applicazioni per server Web . . . . . . . 32-7
ISAPI e NSAPI . . . . . . . . . . . . . . . 32-7
CGI indipendente. . . . . . . . . . . . . . 32-7
Win-CGI indipendente . . . . . . . . . . . 32-7
Apache . . . . . . . . . . . . . . . . . . . . 32-7
Web App Debugger. . . . . . . . . . . . . 32-8
Conversione del tipo di destinazione per
applicazioni Web server . . . . . . . . . . . 32-9
Debug di applicazioni server . . . . . . . . . . . 32-9
Utilizzo di Web Application Debugger . . 32-10
Avvio dellapplicazione
con Web Application Debugger . . . . 32-10
Conversione dellapplicazione
in un altro tipo di applicazione
per Web server. . . . . . . . . . . . . . 32-11
Debug di applicazioni Web
sotto forma di DLL . . . . . . . . . . . . . 32-11
Diritti utente necessari
per il debug di DLL. . . . . . . . . . . 32-12
Capitolo 33
Utilizzo di Web Broker 33-1
Creazione di applicazioni per Web server
con Web Broker. . . . . . . . . . . . . . . . . . 33-1
Il modulo Web . . . . . . . . . . . . . . . . . 33-2
Loggetto Application Web . . . . . . . . . . 33-3
Struttura delle applicazioni Web Broker. . . . . 33-3
Il dispatcher Web. . . . . . . . . . . . . . . . . . 33-4
Aggiunta di azioni al dispatcher . . . . . . . 33-5
Dispatch dei messaggi di richiesta . . . . . . 33-5
Elementi di azione . . . . . . . . . . . . . . . . . 33-6
Determinazione dellattivazione
degli elementi di azione . . . . . . . . . . . 33-6
LURL di destinazione . . . . . . . . . . . 33-6
La propriet Method Type . . . . . . . . . 33-7
Attivazione e disattivazione
di elementi di azione . . . . . . . . . . . 33-7
Scelta di un elemento
di azione predefinito . . . . . . . . . . . 33-7
Risposta a messaggi di richiesta
mediante elementi di azione . . . . . . . . 33-8
Invio della risposta . . . . . . . . . . . . . 33-8
Utilizzo di pi elementi di azione. . . . . 33-9
Accesso alle informazioni
della richiesta client . . . . . . . . . . . . . . . 33-9
Propriet contenenti informazioni
dello header della richiesta . . . . . . . . . 33-9
Propriet che identificano
la destinazione . . . . . . . . . . . . . . 33-9
Propriet che descrivono il client Web. 33-10
Propriet che identificano
lo scopo della richiesta . . . . . . . . 33-10
Propriet che descrivono
la risposta prevista . . . . . . . . . . . 33-10
Propriet che descrivono il contenuto . .33-11
Il contenuto dei messaggi
di richiesta HTTP . . . . . . . . . . . . . .33-11
Creazione di messaggi di risposta HTTP. . . .33-11
Compilazione dellintestazione
della risposta . . . . . . . . . . . . . . . . .33-11
Indicazione dello stato della risposta . 33-12
Indicazione della necessit
di azione da parte del client. . . . . . 33-12
Descrizione dellapplicazione server . 33-12
Descrizione del contenuto . . . . . . . 33-13
Impostazione del contenuto della risposta 33-13
Invio della risposta . . . . . . . . . . . . . 33-13
Generazione del contenuto
dei messaggi di risposta . . . . . . . . . . . 33-14
Utilizzo di componenti
produttori di pagine. . . . . . . . . . . . 33-14
Modelli HTML . . . . . . . . . . . . . . 33-14
Specifica del modello HTML . . . . . . 33-15
Conversione dei tag HTML trasparenti 33-16
Utilizzo dei produttori di pagine da un
elemento di azione . . . . . . . . . . . 33-16
Concatenamento di
produttori di pagine . . . . . . . . . . 33-17
Utilizzo nelle risposte
di informazioni di database . . . . . . . . . 33-18
Aggiunta di una sessione
a un modulo Web . . . . . . . . . . . . . 33-18
Rappresentazione di informazioni
di database in HTML . . . . . . . . . . . 33-19
Utilizzo dei produttori
di pagine di dataset . . . . . . . . . . 33-19
Utilizzo di produttori di tabelle . . . . 33-19
Specifica degli attributi di tabella . . . 33-20
Specifica degli attributi di riga . . . . . 33-20
Specifica delle colonne . . . . . . . . . 33-20
Inserimento di tabelle
nei documenti HTML . . . . . . . . . 33-21
Impostazione di un produttore
di tabelle di dataset . . . . . . . . . . 33-21
Impostazione di un produttore
di tabelle di query . . . . . . . . . . . 33-21
xix
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 34
Creazione di applicazioni
Web Server con WebSnap 34-1
Componenti fondamentali di WebSnap . . . . . 34-2
Moduli Web . . . . . . . . . . . . . . . . . . . 34-2
Tipi di modulo Web application. . . . . . 34-3
Moduli pagina Web. . . . . . . . . . . . . 34-4
Moduli dati Web . . . . . . . . . . . . . . 34-5
Adattatori . . . . . . . . . . . . . . . . . . . . 34-5
Campi . . . . . . . . . . . . . . . . . . . . 34-6
Azioni . . . . . . . . . . . . . . . . . . . . 34-6
Errori . . . . . . . . . . . . . . . . . . . . . 34-6
Record . . . . . . . . . . . . . . . . . . . . 34-6
Produttori di pagina . . . . . . . . . . . . . . 34-7
Creazione di applicazioni per Web server
con WebSnap . . . . . . . . . . . . . . . . . . . 34-8
Selezione di un tipo server . . . . . . . . . . 34-9
Specifica dei componenti
del modulo applicazione. . . . . . . . . . . 34-9
Selezione delle opzioni
del modulo Web application . . . . . . . 34-11
Esercitazione WebSnap . . . . . . . . . . . . . 34-12
Creazione della nuova applicazione . . . . 34-12
Fase 1. Avvio di WebSnap
application wizard . . . . . . . . . . . 34-12
Fase 2. Salvataggio dei file generati
e del progetto . . . . . . . . . . . . . . 34-12
Fase 3. Specifica del titolo
dellapplicazione . . . . . . . . . . . . 34-13
Creazione di una pagina CountryTable . . 34-13
Fase 1. Aggiunta di un nuovo
modulo pagina Web . . . . . . . . . . 34-13
Fase 2. Salvataggio del nuovo
modulo pagina Web . . . . . . . . . . 34-14
Aggiunta dei componenti dati
al modulo CountryTable . . . . . . . . . . 34-14
Fase 1. Aggiunta di componenti
data-aware . . . . . . . . . . . . . . . . 34-15
Fase 2. Specifica di un campo chiave . . 34-15
Fase 3. Aggiunta di un
componente adapter . . . . . . . . . . 34-16
Creazione di una griglia
per visualizzare i dati . . . . . . . . . . . 34-16
Fase 1. Aggiunta di una griglia . . . . . 34-16
Fase 2. Aggiunta alla griglia
di comandi per lediting . . . . . . . . 34-18
Aggiunta di una scheda per lediting . . . 34-19
Fase 1. Aggiunta di un nuovo
modulo pagina Web . . . . . . . . . . 34-19
Fase 2. Salvataggio del nuovo modulo 34-20
Fase 3. Come rendere CountryTableU
accessibile al nuovo modulo . . . . . 34-20
Fase 4. Aggiunta dei campi
di immissione. . . . . . . . . . . . . . 34-20
Fase 5. Aggiunta di pulsanti . . . . . . 34-21
Fase 6. Collegamento di azioni
della scheda con la pagina
della griglia . . . . . . . . . . . . . . . 34-22
Fase 7. Collegamento delle azioni
della griglia con la pagina
della scheda. . . . . . . . . . . . . . . 34-22
Esecuzione dellapplicazione ultimata . . 34-23
Aggiunta della notifica degli errori . . . . 34-23
Fase 1. Aggiunta alla griglia
del supporto per gli errori. . . . . . . 34-23
Fase 2. Aggiunta alla scheda
del supporto per gli errori. . . . . . . 34-24
Fase 3. Verifica del meccanismo di
segnalazione errori. . . . . . . . . . . 34-24
Progettazione HTML evoluta . . . . . . . . . 34-25
Trattamento dello script lato server
nei file HTML . . . . . . . . . . . . . . . 34-26
Supporto per il login . . . . . . . . . . . . . . 34-26
Aggiunta del supporto per il login . . . . 34-27
Utilizzo del servizio per le sessioni . . . . 34-28
Pagine di login. . . . . . . . . . . . . . . . 34-28
Impostazione delle pagine in modo che
richiedano il login . . . . . . . . . . . . . 34-30
Diritti di accesso degli utenti . . . . . . . . 34-31
Visualizzazione dinamica di campi
come caselle di testo o di modifica . . 34-31
Occultamento dei campi
e del loro contenuto . . . . . . . . . . 34-32
Come evitare laccesso alla pagina. . . 34-32
Scripting lato server in WebSnap . . . . . . . 34-33
Active scripting . . . . . . . . . . . . . . . 34-34
Motore di script . . . . . . . . . . . . . . . 34-34
Blocchi di script . . . . . . . . . . . . . . . 34-34
Creazione di script . . . . . . . . . . . . . 34-35
Modelli di wizard . . . . . . . . . . . . 34-35
TAdapterPageProducer . . . . . . . . . 34-35
Modifica e visualizzazione di script . . . . 34-35
Inclusione di script in una pagina . . . . . 34-35
Oggetti script . . . . . . . . . . . . . . . . 34-35
Indirizzamento di richieste e risposte . . . . 34-36
Componenti dispatcher. . . . . . . . . . . 34-37
Operazioni delladapter dispatcher . . . . 34-37
xx
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Utilizzo di componenti adapter
per generare contenuti . . . . . . . . . 34-37
Ricezione di richieste delladapter e
generazione delle risposte . . . . . . . 34-38
Richiesta di immagine . . . . . . . . . . 34-40
Risposta di immagine . . . . . . . . . . 34-40
Indirizzamento degli elementi di azione . 34-41
Operazione del dispatcher di pagine. . . . 34-42
Capitolo 35
Operazioni con documenti XML 35-1
Utilizzo del Document Object Model . . . . . . 35-2
Operazioni con i componenti XML . . . . . . . 35-3
Utilizzo di TXMLDocument. . . . . . . . . . 35-3
Operazioni con i nodi XML . . . . . . . . . . 35-4
Operazioni con il valore di un nodo . . . 35-5
Operazioni con gli attributi di un nodo . 35-5
Aggiunta e cancellazione di nodi figlio . 35-5
Astrazione di documenti XML
con Data Binding wizard . . . . . . . . . . . . 35-6
Utilizzo di XML Data Binding wizard . . . . 35-7
Utilizzo del codice generato da XML Data
Binding wizard . . . . . . . . . . . . . . . . 35-9
Capitolo 36
Utilizzo dei Web Services 36-1
Le interfacce richiamabili . . . . . . . . . . . . . 36-2
Utilizzo di tipi non scalari
nelle interfacce richiamabili . . . . . . . . . 36-4
Registrazione di tipi non scalari. . . . . . 36-5
Registrazione di tipi dichiarati
con typedef e di tipi enumerati . . . . . 36-6
Utilizzo di oggetti remotable . . . . . . . 36-7
Esempio di oggetto Remotable . . . . . . 36-9
Scrittura di server che supportano
i Web Services . . . . . . . . . . . . . . . . . 36-10
Creazione di un server Web Service . . . . 36-10
Utilizzo di SOAP application wizard . . . 36-11
Aggiunta di nuovi Web Services . . . . . . 36-12
Editing del codice generato . . . . . . . 36-13
Utilizzo di una classe di base differente 36-13
Utilizzo di Web Services Importer . . . . . 36-14
Creazione di classi di eccezione custom
per Web Services . . . . . . . . . . . . . . 36-15
Generazione di documenti WSDL per
unapplicazione Web Service . . . . . . . 36-16
Scrittura di client per Web Services . . . . . . 36-17
Importazione di documenti WSDL. . . . . 36-17
Chiamata a interfacce richiamabili . . . . . 36-17
Capitolo 37
Operazioni con i socket 37-1
Implementazione dei servizi. . . . . . . . . . . 37-1
I protocolli di servizio. . . . . . . . . . . . . 37-2
Comunicare con le applicazioni . . . . . 37-2
Servizi e porte . . . . . . . . . . . . . . . . . 37-2
Tipi di connessioni socket . . . . . . . . . . . . 37-2
Connessioni client . . . . . . . . . . . . . . . 37-3
Connessioni di ascolto . . . . . . . . . . . . 37-3
Connessioni server . . . . . . . . . . . . . . 37-3
Descrizione dei socket . . . . . . . . . . . . . . 37-3
Descrizione dellhost . . . . . . . . . . . . . 37-4
Scelta tra un nome di host
e un indirizzo IP . . . . . . . . . . . . . 37-5
Uso delle porte. . . . . . . . . . . . . . . . . 37-5
Utilizzo dei componenti socket . . . . . . . . . 37-5
Ottenimento di informazioni
sulla connessione . . . . . . . . . . . . . . 37-6
Utilizzo di socket client . . . . . . . . . . . . 37-6
Specifica del server desiderato . . . . . . 37-6
Formazione della connessione . . . . . . 37-7
Ottenimento di informazioni
sulla connessione. . . . . . . . . . . . . 37-7
Chiusura della connessione. . . . . . . . 37-7
Uso dei socket server . . . . . . . . . . . . . 37-7
Specifica della porta . . . . . . . . . . . . 37-7
Ascolto delle richieste
provenienti da client . . . . . . . . . . . 37-8
Connessione con i client. . . . . . . . . . 37-8
Chiusura delle connessioni server . . . . 37-8
Risposta agli eventi socket . . . . . . . . . . . . 37-8
Eventi di errore . . . . . . . . . . . . . . . . 37-8
Eventi del client . . . . . . . . . . . . . . . . 37-9
Eventi del server. . . . . . . . . . . . . . . . 37-9
Eventi durante lascolto . . . . . . . . . . 37-9
Eventi con connessioni client . . . . . . . 37-9
Lettura e scrittura sulle connessioni socket . 37-10
Connessioni non bloccanti . . . . . . . . . 37-10
Eventi di lettura e scrittura . . . . . . . 37-10
Connessioni bloccanti . . . . . . . . . . . . .37-11
Parte IV
Sviluppo di applicazioni COM
Capitolo 38
Panoramica sulle tecnologie COM 38-1
COM come specifica
e implementazione. . . . . . . . . . . . 38-1
xxi
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Estensioni COM. . . . . . . . . . . . . . . 38-2
Parti di unapplicazione COM . . . . . . . . . . 38-3
Interfacce COM. . . . . . . . . . . . . . . . . 38-3
Linterfaccia COM fondamentale,
IUnknown . . . . . . . . . . . . . . . . . 38-4
Puntatori di interfaccia COM . . . . . . . 38-5
Server COM. . . . . . . . . . . . . . . . . . . 38-5
CoClass e class factory . . . . . . . . . . . 38-6
Server in-process, out-of-process
e remoti. . . . . . . . . . . . . . . . . . . 38-6
Il meccanismo di smistamento . . . . . . 38-8
Aggregazione . . . . . . . . . . . . . . . . 38-9
Client COM . . . . . . . . . . . . . . . . . . 38-10
Estensioni COM . . . . . . . . . . . . . . . . . 38-10
Server Automation . . . . . . . . . . . . . . 38-13
Active Server Pages . . . . . . . . . . . . . 38-14
Controlli ActiveX. . . . . . . . . . . . . . . 38-14
Active Documents . . . . . . . . . . . . . . 38-15
Oggetti transazionali . . . . . . . . . . . . . 38-15
Oggetti evento COM+
e subscriber di eventi. . . . . . . . . . . . 38-16
Librerie di tipi. . . . . . . . . . . . . . . . . 38-17
Contenuto delle librerie di tipi . . . . . 38-17
Creazione di librerie di tipi . . . . . . . 38-18
Quando usare le librerie di tipi . . . . . 38-18
Accesso alle librerie di tipi . . . . . . . . 38-19
Vantaggi delluso delle librerie di tipi . 38-19
Uso degli strumenti della libreria di tipi 38-20
Implementazione di oggetti COM
con i wizard. . . . . . . . . . . . . . . . . . . 38-20
Codice generato dai wizard . . . . . . . . . 38-23
Capitolo 39
Funzionamento delle librerie di tipi 39-1
Type Library editor . . . . . . . . . . . . . . . . 39-2
Elementi del Type Library editor . . . . . . . 39-3
Barra strumenti . . . . . . . . . . . . . . . 39-3
Pannello Object list . . . . . . . . . . . . . 39-5
Barra di stato . . . . . . . . . . . . . . . . 39-5
Pagine di informazioni di tipo. . . . . . . 39-6
Elementi del Type Library editor . . . . . . . 39-8
Interfacce. . . . . . . . . . . . . . . . . . . 39-9
Dispinterface . . . . . . . . . . . . . . . 39-10
CoClass . . . . . . . . . . . . . . . . . . 39-10
Definizioni di tipo . . . . . . . . . . . . 39-10
Moduli . . . . . . . . . . . . . . . . . . . 39-11
Uso del Type Library editor . . . . . . . . . 39-11
Tipi consentiti . . . . . . . . . . . . . . . 39-12
Creazione di una nuova libreria di tipi . 39-13
Apertura di una libreria di tipi esistente39-14
Aggiunta di uninterfaccia
alla libreria di tipi . . . . . . . . . . . 39-14
Modifica di uninterfaccia
con il Type Library editor . . . . . . . 39-15
Aggiunta di propriet e metodi ad una
interface o dispinterface . . . . . . . . 39-15
Aggiunta di CoClass alla libreria di tipi 39-16
Aggiunta di uninterfaccia
a una CoClass. . . . . . . . . . . . . . 39-17
Aggiunta di una Enumeration
alla libreria di tipi . . . . . . . . . . . 39-17
Aggiunta di un alias alla libreria di tipi 39-18
Aggiunta di un record o di una union
alla libreria di tipi . . . . . . . . . . . 39-18
Aggiunta di un modulo
alla libreria di tipi . . . . . . . . . . . 39-18
Salvataggio e registrazione delle
informazioni della libreria di tipi. . . 39-19
Salvataggio di una libreria di tipi . . . 39-19
Aggiornamento della libreria di tipi . . 39-19
Registrazione della libreria di tipi . . . 39-20
Esportazione di un file IDL . . . . . . . 39-20
Distribuzione delle librerie di tipi . . . . . . . 39-20
Capitolo 40
Creazione di client COM 40-1
Importazione di informazioni
della libreria di tipi . . . . . . . . . . . . . . . 40-2
Uso della finestra di dialogo
Import Type Library. . . . . . . . . . . . . 40-3
Uso della finestra di dialogo
Import ActiveX . . . . . . . . . . . . . . . 40-4
Codice generato durante limportazione
delle informazioni di una libreria di tipi . 40-5
Controllo di un oggetto importato . . . . . . . 40-7
Uso di wrapper di componenti . . . . . . . 40-7
Wrapper ActiveX. . . . . . . . . . . . . . 40-7
Wrapper di oggetti Automation . . . . . 40-8
Uso di controlli ActiveX associati ai dati . . 40-9
Esempio: stampa di un documento con
Microsoft Word . . . . . . . . . . . . . . .40-11
Fase 1: preparazione di C++Builder
per lesempio . . . . . . . . . . . . . . .40-11
Fase 2: importazione della libreria
di tipi di Word . . . . . . . . . . . . . .40-11
Fase 3: uso di un oggetto interfaccia
VTable o dispatch per il controllo di
Microsoft Word. . . . . . . . . . . . . 40-12
xxii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Fase 4: ripristino dello stato originario . 40-13
Scrittura del codice del client in base alle
definizioni della libreria di tipi . . . . . . 40-13
Connessione a un server . . . . . . . . . 40-13
Controllo di un server Automation
usando uninterfaccia duale . . . . . . 40-14
Controllo di un server Automation
usando uninterfaccia dispatch . . . . 40-14
Gestione degli eventi
in un controller Automation . . . . . . 40-15
Creazione di client per server
che non hanno una libreria di tipi . . . . . . 40-17
Capitolo 41
Creazione di semplici server COM 41-1
Panoramica sulla creazione
di un oggetto COM . . . . . . . . . . . . . . . 41-2
Progettazione di un oggetto COM . . . . . . . . 41-2
Utilizzo di COM object wizard. . . . . . . . . . 41-3
Uso di Automation object wizard . . . . . . . . 41-4
Scelta di una modello di threadingl . . . . . 41-5
Scrittura di un oggetto che supporta il
modello free threading . . . . . . . . . . 41-7
Scrittura di un oggetto che supporta il
modello apartment threading . . . . . . 41-8
Scrittura di un oggetto che supporta il
modello di threading neutral . . . . . . 41-8
Specifica di opzioni ATL . . . . . . . . . . . . . 41-9
Definizione dellinterfaccia di un oggetto COM41-9
Aggiunta di una propriet
allinterfaccia delloggetto . . . . . . . . . 41-10
Aggiunta di un metodo
allinterfaccia delloggetto . . . . . . . . . 41-10
Esposizione di eventi ai client. . . . . . . . 41-11
Gestione degli eventi
nelloggetto Automation . . . . . . . . 41-12
Interfacce di Automation . . . . . . . . . . . . 41-13
Interfacce duali . . . . . . . . . . . . . . . . 41-13
Interfacce di dispatch . . . . . . . . . . . . 41-14
Interfacce custom. . . . . . . . . . . . . . . 41-15
Marshaling dei dati . . . . . . . . . . . . . . . 41-15
Tipi compatibili con Automation . . . . . 41-16
Restrizioni di tipo
per il marshaling automatico . . . . . . . 41-16
Marshaling personalizzato . . . . . . . . . 41-17
Registrazione di un oggetto COM . . . . . . . 41-17
Registrazione di un server in-process . . . 41-17
Registrazione di un server out-of-process . 41-17
Verifica e debug dellapplicazione . . . . . . . 41-18
Capitolo 42
Creazione di Active Server Page 42-1
Creazione di Active Server Object . . . . . . . 42-2
Utilizzo degli intrinsics di ASP . . . . . . . 42-3
Application . . . . . . . . . . . . . . . . . 42-4
Request . . . . . . . . . . . . . . . . . . . 42-4
Response . . . . . . . . . . . . . . . . . . 42-5
Session . . . . . . . . . . . . . . . . . . . 42-6
Server . . . . . . . . . . . . . . . . . . . . 42-7
Creazione di ASP per server in-process
o out-of-process . . . . . . . . . . . . . . . 42-7
Registrazione di Active Server Object . . . . . 42-8
Registrazione di un server in-process . . . . 42-8
Registrazione di un server out-of-process . 42-8
Collaudo e debug
dellapplicazione Active Server Page . . . . . 42-8
Capitolo 43
Creazione di un controllo ActiveX 43-1
Panoramica sulla creazione
di controlli ActiveX . . . . . . . . . . . . . . . 43-2
Elementi di un controllo ActiveX . . . . . . 43-2
Il controllo VCL . . . . . . . . . . . . . . 43-3
Wrapper ActiveX. . . . . . . . . . . . . . 43-3
La libreria di tipi . . . . . . . . . . . . . . 43-3
Pagina di propriet . . . . . . . . . . . . 43-3
Progettazione di un controllo ActiveX . . . . . 43-4
Generazione di un controllo ActiveX da un
controllo VCL . . . . . . . . . . . . . . . . . . 43-4
Generazione di un controllo ActiveX
basato su una scheda VCL . . . . . . . . . . . 43-6
Concessione in licenza di controlli ActiveX . . 43-7
Personalizzazione dellinterfaccia
del controllo ActiveX . . . . . . . . . . . . . . 43-8
Aggiunta di ulteriori propriet,
metodi ed eventi . . . . . . . . . . . . . . . 43-9
Aggiunta di propriet e metodi . . . . . 43-9
Aggiunta di eventi . . . . . . . . . . . . .43-11
Attivazione dellassociazione
di dati semplici con la libreria di tipi . . 43-12
Creazione di una pagina di propriet per un
controllo ActiveX . . . . . . . . . . . . . . . 43-14
Creazione di una nuova pagina
di propriet. . . . . . . . . . . . . . . . . 43-14
Aggiunta di controlli
ad una pagina di propriet . . . . . . . . 43-15
Associazione dei controlli di una pagina di
propriet alle propriet del
controllo ActiveX . . . . . . . . . . . . . 43-15
xxiii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Aggiornamento
della pagina di propriet . . . . . . . . 43-15
Aggiornamento delloggetto. . . . . . . 43-16
Collegamento di una pagina
di propriet ad un controllo ActiveX. . . 43-16
Registrazione di un controllo ActiveX. . . . . 43-16
Collaudo di un controllo ActiveX . . . . . . . 43-17
Distribuzione di un controllo ActiveX su Web 43-17
Impostazione delle opzioni . . . . . . . . . 43-18
Capitolo 44
Creazione di oggetti MTS o COM+ 44-1
Gli oggetti transazionali . . . . . . . . . . . . . . 44-2
Requisiti di un oggetto transazionale . . . . 44-3
Gestione delle risorse . . . . . . . . . . . . . . . 44-3
Accesso al contesto delloggetto . . . . . . . 44-4
Attivazione just-in-time . . . . . . . . . . . . 44-5
Condivisione delle risorse. . . . . . . . . . . 44-6
Distributori di risorse di database . . . . 44-6
Shared property manager . . . . . . . . . 44-7
Rilascio delle risorse . . . . . . . . . . . . 44-9
Condivisione degli oggetti . . . . . . . . . 44-10
Supporto delle transazioni MTS e COM+. . . 44-10
Attributi di transazione . . . . . . . . . . . 44-12
Impostazione dellattributo
di transazione . . . . . . . . . . . . . . 44-12
Oggetti con e senza stato . . . . . . . . . . 44-13
Come influenzare la modalit
di completamento delle transazioni . . . 44-13
Inizio di transazioni . . . . . . . . . . . . . 44-14
Impostazione di un oggetto
transazionale sul lato client . . . . . . 44-15
Impostazione di un oggetto
transazionale sul lato server . . . . . . 44-16
Durata della transazione. . . . . . . . . . . 44-17
Sicurezza basata sul ruolo. . . . . . . . . . . . 44-17
Panoramica sulla creazione
di oggetti transazionali . . . . . . . . . . . . 44-18
Uso di Transactional Object wizard . . . . . . 44-18
Scelta di un modello di threading
per un oggetto transazionale . . . . . . . 44-19
Attivit . . . . . . . . . . . . . . . . . . . 44-20
Generazione di eventi in ambiente COM+ . . 44-22
Uso di Event Object wizard . . . . . . . . . 44-24
Uso di COM+ Event Subscription
object wizard . . . . . . . . . . . . . . . . 44-25
Attivazione di eventi utilizzando
un oggetto evento di COM+. . . . . . . . 44-26
Passaggio di riferimenti a oggetti . . . . . . . 44-27
Uso del metodo SafeRef . . . . . . . . . 44-27
Callback. . . . . . . . . . . . . . . . . . 44-28
Debug e collaudo di oggetti transazionali . . 44-28
Installazione di oggetti transazionali . . . . . 44-29
Amministrazione di oggetti transazionali . . 44-30
Parte V
Creazione di componenti custom
Capitolo 45
Introduzione alla creazione
di componenti 45-1
Librerie di classi . . . . . . . . . . . . . . . . . . 45-1
Componenti e classi . . . . . . . . . . . . . . . 45-2
Creazione di componenti . . . . . . . . . . . . 45-2
Modifica di controlli esistenti . . . . . . . . 45-3
Creazione di controlli con finestra. . . . . . 45-4
Creazione di controlli grafici . . . . . . . . . 45-4
Derivazioni di sottoclassi
da controlli Windows . . . . . . . . . . . . 45-4
Creazione di componenti non visuali . . . . 45-5
Cosa mettere in un componente. . . . . . . . . 45-5
Rimozione delle dipendenze. . . . . . . . . 45-5
Impostazione di propriet, metodi ed eventi45-6
Propriet . . . . . . . . . . . . . . . . . . 45-6
Eventi . . . . . . . . . . . . . . . . . . . . 45-7
Metodi. . . . . . . . . . . . . . . . . . . . 45-7
Incapsulamento della grafica. . . . . . . . . 45-7
Registrazione di componenti. . . . . . . . . 45-8
Creazione di un nuovo componente . . . . . . 45-8
Creazione di un componente
con Component wizard . . . . . . . . . . . 45-9
Creazione manuale di un componente . . 45-12
Creazione di un unit file . . . . . . . . 45-12
Derivazione del componente . . . . . . 45-13
Dichiarazione di un nuovo costruttore 45-13
Registrazione del componente . . . . . 45-14
Creazione di una bitmap
per un componente . . . . . . . . . . . . 45-15
Verifica di componenti non installati . . . . . 45-17
Collaudo di componenti installati. . . . . . . 45-19
Installazione di un componente
sulla Component palette . . . . . . . . . . . 45-20
Rendere disponibili i file sorgente. . . . . 45-20
Aggiunta del componente . . . . . . . . . 45-20
xxiv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 46
Programmazione object-oriented
per gli scrittori di componenti 46-1
Definizione di nuove classi . . . . . . . . . . . . 46-1
Derivazione di nuove classi . . . . . . . . . . 46-2
Modificare le impostazioni predefinite
della classe per evitare ripetizioni . . . . 46-2
Aggiungere nuove capacit a una classe . 46-2
Dichiarazione di una nuova classe
di componente . . . . . . . . . . . . . . . . 46-3
Antenati, discendenti e gerarchie della classe . 46-3
Controllo dellaccesso . . . . . . . . . . . . . . . 46-4
Occultamento dei dettagli implementativi . 46-5
Definizione dellinterfaccia
per lo scrittore di componenti . . . . . . . . 46-7
Definizione dellinterfaccia di esecuzione . . 46-7
Definizione dellinterfaccia di progettazione46-8
Dispatch dei metodi . . . . . . . . . . . . . . . . 46-8
Metodi regolari . . . . . . . . . . . . . . . . . 46-9
Metodi virtuali . . . . . . . . . . . . . . . . . 46-9
Ridefinizione dei metodi . . . . . . . . . 46-10
Membri astratti di classi. . . . . . . . . . . . . 46-10
Classi e puntatori . . . . . . . . . . . . . . . . 46-11
Capitolo 47
Creazione di propriet 47-1
Perch creare le propriet . . . . . . . . . . . . . 47-1
Tipi di propriet . . . . . . . . . . . . . . . . . . 47-2
Pubblicazione di propriet ereditate. . . . . . . 47-3
Definizione delle propriet . . . . . . . . . . . . 47-3
Dichiarazione della propriet . . . . . . . . . 47-4
Memorizzazione interna dei dati . . . . . . . 47-4
Accesso diretto . . . . . . . . . . . . . . . . . 47-5
Access methods. . . . . . . . . . . . . . . . . 47-5
Il metodo read. . . . . . . . . . . . . . . . 47-7
Il metodo write . . . . . . . . . . . . . . . 47-7
Valori predefiniti delle propriet . . . . . . . 47-7
Specifica di una propriet
senza valore predefinito . . . . . . . . . 47-8
Creazione di propriet array . . . . . . . . . . . 47-8
Creazione di propriet per i sottocomponenti 47-10
Registrazione e caricamento delle propriet . 47-11
Uso del meccanismo di registrazione
e di caricamento . . . . . . . . . . . . . . 47-12
Specifica di valori predefiniti . . . . . . . . 47-12
Determinazione di che cosa registrare . . . 47-13
Inizializzazione dopo il caricamento. . . . 47-14
Registrazione e caricamento
di propriet non pubbliche . . . . . . . . 47-14
Creazione di metodi per memorizzare e
caricare i valori delle propriet . . . . 47-14
Ridefinizione del metodo
DefineProperties . . . . . . . . . . . . 47-15
Capitolo 48
Creazione di eventi 48-1
Cos un evento . . . . . . . . . . . . . . . . . . 48-1
Gli eventi sono closure . . . . . . . . . . . . 48-2
Gli eventi sono propriet . . . . . . . . . . . 48-2
I tipi degli eventi sono tipi closure . . . . . 48-3
Il tipo restituito
dai gestori di evento void . . . . . . . 48-3
I gestori di evento sono facoltativi. . . . . . 48-4
Implementazione degli eventi standard . . . . 48-4
Identificazione degli eventi standard . . . . 48-4
Eventi standard di tutti i controlli . . . . 48-5
Gli eventi standard
dei controlli standard . . . . . . . . . . 48-5
Visibilit degli eventi . . . . . . . . . . . . . 48-5
Modifica della gestione
standard degli eventi . . . . . . . . . . . . 48-6
Definizione di eventi personalizzati . . . . . . 48-6
Attivazione dellevento . . . . . . . . . . . . 48-7
Due tipi di eventi . . . . . . . . . . . . . 48-7
Definizione del tipo di gestore . . . . . . . . 48-7
Notifica semplice. . . . . . . . . . . . . . 48-7
Gestori che dipendono dallevento . . . 48-8
Restituzione di informazioni
da parte del gestore . . . . . . . . . . . 48-8
Dichiarazione dellevento . . . . . . . . . . 48-8
I nomi degli eventi cominciano con On48-8
Chiamata dellevento . . . . . . . . . . . . . 48-9
Capitolo 49
Creazione di metodi 49-1
Eliminazione delle dipendenze . . . . . . . . . 49-1
Assegnazione del nome ai metodi . . . . . . . 49-2
Protezione dei metodi . . . . . . . . . . . . . . 49-3
Metodi che devono essere pubblici . . . . . 49-3
Metodi che devono essere protetti. . . . . . 49-3
Utilizzo dei metodi virtual . . . . . . . . . . . . 49-4
Dichiarazione dei metodi . . . . . . . . . . . . 49-4
Capitolo 50
Uso della grafica nei componenti 50-1
Introduzione alla grafica . . . . . . . . . . . . . 50-1
xxv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Utilizzo del canvas. . . . . . . . . . . . . . . . . 50-3
Operazioni con le immagini . . . . . . . . . . . 50-3
Uso di classi picture, graphic o canvas. . . . 50-4
Caricamento e memorizzazione di grafici . . 50-4
Gestione delle tavolozze. . . . . . . . . . . . 50-5
Specifica di una tavolozza
per un controllo . . . . . . . . . . . . . . 50-5
Le bitmap fuori schermo . . . . . . . . . . . . . 50-6
Creazione e gestione di bitmap
fuori schermo . . . . . . . . . . . . . . . . . 50-6
Copia di immagini bitmap . . . . . . . . . . 50-7
Risposta alle modifiche . . . . . . . . . . . . . . 50-7
Capitolo 51
Gestione dei messaggi
e delle notifiche di sistema 51-1
Il sistema di gestione dei messaggi . . . . . . . 51-1
Cosa contiene un messaggio di Windows? . 51-2
Smistamento dei messaggi . . . . . . . . . . 51-3
Il flusso dei messaggi. . . . . . . . . . . . 51-3
Modifica della gestione dei messaggi . . . . . . 51-4
Ridefinizione del metodo di gestione . . . . 51-4
Uso dei parametri del messagio . . . . . . . 51-5
Intercettazione dei messaggi . . . . . . . . . 51-5
Creazione di nuovi gestori di messaggio . . . . 51-6
Definizione di un proprio messaggio . . . . 51-6
Dichiarazione di un identificatore
di messaggio. . . . . . . . . . . . . . . . 51-7
Dichiarazione di un tipo di struttura
di messaggio. . . . . . . . . . . . . . . . 51-7
Dichiarazione di un nuovo metodo
di gestione messaggi . . . . . . . . . . . . . 51-8
Invio di messaggi. . . . . . . . . . . . . . . . 51-8
Trasmissione di un messaggio a tutti i
controlli in una scheda . . . . . . . . . . 51-9
Chiamata diretta del gestore
del messaggio di un controllo . . . . . . 51-9
Invio di un messaggio utilizzando
la coda dei messaggi Windows . . . . 51-10
Invio di un messaggio che non
viene eseguito immediatamente. . . . 51-10
Risposta alle notifiche di sistema
utilizzando la CLX . . . . . . . . . . . . . . . 51-11
Risposta ai segnali . . . . . . . . . . . . . . 51-11
Assegnazione dei gestori
di segnale custom. . . . . . . . . . . . 51-12
Risposta a eventi di sistema . . . . . . . . . 51-13
Eventi comunemente utilizzati . . . . . 51-13
Ridefinizione del metodo EventFilter . 51-15
Generazione di eventi Qt . . . . . . . . 51-15
Capitolo 52
Come rendere disponibili
i componenti in fase di progetto 52-1
Registrazione di componenti . . . . . . . . . . 52-1
Dichiarazione della funzione Register . . . 52-2
Scrittura della funzione Register. . . . . . . 52-2
Specifica dei componenti . . . . . . . . . 52-2
Specifica della pagina della tavolozza. . 52-3
Uso della funzione
RegisterComponents . . . . . . . . . . 52-3
Aggiunta di bitmap alla tavolozza . . . . . . . 52-4
Preparazione di un file di Guida
per il componente . . . . . . . . . . . . . . . . 52-4
Creazione del file di Guida. . . . . . . . . . 52-5
Creazione delle voci . . . . . . . . . . . . 52-5
Come rendere sensibile al contesto
la guida del componente . . . . . . . . 52-6
Aggiunta di file di Guida al componente 52-7
Aggiunta di editor di propriet . . . . . . . . . 52-7
Derivazione di una classe
editor di propriet . . . . . . . . . . . . . . 52-8
Modifica della propriet come testo. . . . . 52-9
Visualizzazione del valore
della propriet . . . . . . . . . . . . . . 52-9
Impostazione del valore della propriet 52-10
Modifica globale della propriet. . . . . . 52-10
Specifica degli attributi delleditor . . . . .52-11
Registrazione delleditor di propriet. . . 52-12
Categorie di propriet . . . . . . . . . . . . . 52-13
Registrazione di una propriet alla volta . 52-13
Registrazione contemporanea
di pi propriet . . . . . . . . . . . . . . 52-14
Specifica delle categorie di propriet . . . 52-15
Utilizzo della funzione
IsPropertyInCategory . . . . . . . . . . . 52-15
Aggiunta di editor di componenti . . . . . . 52-16
Aggiunta di voci al menu contestuale. . . 52-17
Specifica delle voci di menu . . . . . . 52-17
Implementazione dei comandi . . . . . 52-17
Modifica del comportamento
del doppio clic . . . . . . . . . . . . . . . 52-18
Aggiunta di formati nella clipboard. . . . 52-19
Registrazione delleditor di componente . 52-19
Compilazione dei componenti in package . . 52-20
Risoluzione dei problemi
con componenti custom . . . . . . . . . . . 52-20
xxvi
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Capitolo 53
Modifica di un componente
esistente 53-1
Creazione e registrazione del componente . . . 53-1
Modifica della classe del componente . . . . . . 53-3
Ridefinizione del costruttore . . . . . . . . . 53-3
Specifica del nuovo valore
predefinito di una propriet. . . . . . . . . 53-4
Capitolo 54
Creazione di un controllo grafico 54-1
Creazione e registrazione del componente . . . 54-1
Pubblicazione delle propriet ereditate . . . . . 54-3
Aggiunta di funzionalit grafiche . . . . . . . . 54-3
Determinazione di cosa disegnare . . . . . . 54-4
Dichiarzione del tipo della propriet . . . 54-4
Dichiarazione della propriet . . . . . . . 54-4
Scrittura del metodo di implementazione54-5
Ridefinizione del costruttore
e del distruttore . . . . . . . . . . . . . . . . 54-5
Cambiamento dei valori predefiniti
delle propriet. . . . . . . . . . . . . . . 54-5
Pubblicazione di penna e pennello . . . . . . 54-6
Dichiarazione dei membri dati
della classe . . . . . . . . . . . . . . . . . 54-6
Dichiarazione delle propriet di accesso . 54-7
Inizializzazione delle classi possedute . . 54-7
Impostazione delle propriet
delle classi possedute. . . . . . . . . . . 54-8
Disegno dellimmagine del componente . . 54-9
Perfezionamento del disegno della figura . 54-10
Capitolo 55
Personalizzazione di una griglia 55-1
Creazione e registrazione del componente . . . 55-1
Come rendere pubbliche le propriet ereditate. 55-3
Cambiamento dei valori iniziali . . . . . . . . . 55-3
Ridimensionamento delle celle. . . . . . . . . . 55-4
Riempimento delle celle. . . . . . . . . . . . . . 55-6
Registrazione della data . . . . . . . . . . . . 55-6
Registrazione della data interna. . . . . . 55-7
Accesso a giorno, mese e anno . . . . . . 55-8
Generazione dei numeri dei giorni . . . . 55-9
Selezione del giorno corrente . . . . . . 55-11
Scorrimento di mesi e anni . . . . . . . . . . . 55-11
Scorrimento dei giorni. . . . . . . . . . . . . . 55-12
Spostamento della selezione . . . . . . . . 55-13
Preparazione di un evento OnChange . . . 55-13
Esclusione delle celle vuote . . . . . . . . 55-14
Capitolo 56
Creazione di un controllo
di accesso ai dati 56-1
Creazione di un controllo per lesame dei dati 56-1
Creazione e registrazione del componente . 56-2
Costruzione del controllo a sola lettura. . . 56-3
Aggiunta della propriet ReadOnly . . . 56-3
Permettere gli aggiornamenti necessari . 56-4
Aggiunta di un datalink . . . . . . . . . . . 56-5
Dichiarazione del membro dati . . . . . 56-5
Dichiarzione delle propriet di accesso . 56-6
Un esempio di dichiarazione
delle propriet di accesso . . . . . . . . 56-6
Inizializzazione del datalink . . . . . . . 56-7
Risposta alle modifiche dei dati . . . . . . . 56-7
Creazione di un controllo per lediting dei dati 56-8
Modifica del valore predefinito
di FReadOnly . . . . . . . . . . . . . . . . 56-9
Gestione dei messaggi
mouse-down e key-down. . . . . . . . . . 56-9
Risposta ai messaggi mouse-down . . . 56-9
Risposta a messaggi key-down. . . . . 56-10
Modifica della classe datalink del campo. .56-11
Modifica del metodo Change . . . . . . . 56-12
Aggiornamento del dataset . . . . . . . . 56-13
Capitolo 57
Trasformazione di una finestra
di dialogo in un componente 57-1
Definizione dellinterfaccia del componente. . 57-2
Creazione e registrazione del componente. . . 57-2
Creazione dellinterfaccia del componente. . . 57-3
Inclusione dei file unit della scheda . . . . . 57-4
Aggiunta delle propriet di interfaccia . . . 57-4
Aggiunta del metodo Execute . . . . . . . . 57-5
Verifica del componente . . . . . . . . . . . . . 57-7
Capitolo 58
Estensione dellIDE 58-1
Panoramica sugli strumenti API . . . . . . . . 58-2
Scrittura di una classe wizard . . . . . . . . . . 58-3
Implementazione delle interfacce wizard . 58-4
Semplificazione dellimplementazione
delle interfacce . . . . . . . . . . . . . . . . 58-6
Installazione del package del wizard . . . . 58-7
Ottenimento dei servizi delle API Tools . . . . 58-8
xxvii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
Utilizzo di oggetti nativi dellIDE . . . . . . 58-9
Utilizzo dellinterfaccia INTAServices . . 58-9
Aggiunta di unimmagine
alla lista delle immagini . . . . . . . . . 58-9
Aggiunta di unazione
allelenco di azioni . . . . . . . . . . . 58-10
Cancellazione di pulsanti
dalla barra strumenti . . . . . . . . . . 58-10
Debug di un wizard . . . . . . . . . . . . . 58-11
Numeri di versione dellinterfaccia . . . . 58-12
Operazioni con file ed editor . . . . . . . . . . 58-13
Utilizzo delle interfacce di modulo. . . . . 58-13
Utilizzo delle interfacce degli editor . . . . 58-14
Creazione di schede e di progetti . . . . . . . 58-14
Creazione dei moduli . . . . . . . . . . . . 58-15
Notifica a un wizard di eventi dellIDE . . . . 58-19
Installazione della DLL di un wizard . . . . . 58-23
Utilizzo di una DLL
senza package di esecuzione . . . . . . . 58-24
Appendice A
Normativa ANSI per le
implementazioni specifiche A-1
Appendice B
Guida di riferimento
agli script lato server di WebSnap B-1
Tipi di oggetto . . . . . . . . . . . . . . . . . . . B-2
Tipo Adapter . . . . . . . . . . . . . . . . . . B-2
Propriet . . . . . . . . . . . . . . . . . . . B-3
Tipo AdapterAction . . . . . . . . . . . . . . B-4
Propriet . . . . . . . . . . . . . . . . . . . B-4
Metodi . . . . . . . . . . . . . . . . . . . . B-6
Tipo AdapterErrors . . . . . . . . . . . . . . B-6
Propriet . . . . . . . . . . . . . . . . . . . B-6
Tipo AdapterField type . . . . . . . . . . . . B-7
Propriet . . . . . . . . . . . . . . . . . . . B-7
Metodo. . . . . . . . . . . . . . . . . . . .B-10
Tipo AdapterFieldValues . . . . . . . . . . .B-10
Propriet . . . . . . . . . . . . . . . . . . .B-10
Metodi . . . . . . . . . . . . . . . . . . . .B-10
Tipo AdapterFieldValuesList . . . . . . . . .B-11
Propriet . . . . . . . . . . . . . . . . . . .B-11
Metodi . . . . . . . . . . . . . . . . . . . .B-11
Tipo AdapterHiddenFields . . . . . . . . . .B-12
Propriet . . . . . . . . . . . . . . . . . . .B-12
Metodi . . . . . . . . . . . . . . . . . . . .B-12
Tipo AdapterImage . . . . . . . . . . . . . .B-12
Propriet . . . . . . . . . . . . . . . . . . B-12
Tipo di modulo . . . . . . . . . . . . . . . . B-12
Propriet . . . . . . . . . . . . . . . . . . B-12
Tipo Page . . . . . . . . . . . . . . . . . . . . B-13
Propriet . . . . . . . . . . . . . . . . . . B-13
Oggetti globali. . . . . . . . . . . . . . . . . . . B-14
Oggetto Application . . . . . . . . . . . . . B-15
Propriet . . . . . . . . . . . . . . . . . . B-15
Metodi. . . . . . . . . . . . . . . . . . . . B-16
Oggetto EndUser . . . . . . . . . . . . . . . B-16
Propriet . . . . . . . . . . . . . . . . . . B-16
Oggetto Modules . . . . . . . . . . . . . . . B-16
Oggetto Page. . . . . . . . . . . . . . . . . . B-17
Oggetto Pages . . . . . . . . . . . . . . . . . B-17
Oggetto Producer . . . . . . . . . . . . . . . B-17
Propriet . . . . . . . . . . . . . . . . . . B-17
Metodi. . . . . . . . . . . . . . . . . . . . B-17
Oggetto Request . . . . . . . . . . . . . . . . B-18
Propriet . . . . . . . . . . . . . . . . . . B-18
Oggetto Response . . . . . . . . . . . . . . . B-18
Propriet . . . . . . . . . . . . . . . . . . B-18
Metodi. . . . . . . . . . . . . . . . . . . . B-18
Oggetto Session . . . . . . . . . . . . . . . . B-19
Propriet . . . . . . . . . . . . . . . . . . B-19
Esempi JScript . . . . . . . . . . . . . . . . . . . B-19
Esempio 1 . . . . . . . . . . . . . . . . . . . B-20
Esempio 2 . . . . . . . . . . . . . . . . . . . B-21
Esempio 3 . . . . . . . . . . . . . . . . . . . B-21
Esempio 4 . . . . . . . . . . . . . . . . . . . B-21
Esempio 5 . . . . . . . . . . . . . . . . . . . B-22
Esempio 6 . . . . . . . . . . . . . . . . . . . B-22
Esempio 7 . . . . . . . . . . . . . . . . . . . B-23
Esempio 8 . . . . . . . . . . . . . . . . . . . B-23
Esempio 9 . . . . . . . . . . . . . . . . . . . B-24
Esempio 10 . . . . . . . . . . . . . . . . . . . B-25
Esempio 11 . . . . . . . . . . . . . . . . . . . B-26
Esempio 12 . . . . . . . . . . . . . . . . . . . B-28
Esempio 13 . . . . . . . . . . . . . . . . . . . B-28
Esempio 14 . . . . . . . . . . . . . . . . . . . B-29
Esempio 15 . . . . . . . . . . . . . . . . . . . B-31
Esempio 16 . . . . . . . . . . . . . . . . . . . B-32
Esempio 17 . . . . . . . . . . . . . . . . . . . B-34
Esempio 18 . . . . . . . . . . . . . . . . . . . B-35
Esempio 19 . . . . . . . . . . . . . . . . . . . B-35
Esempio 20 . . . . . . . . . . . . . . . . . . . B-36
Esempio 21 . . . . . . . . . . . . . . . . . . . B-36
Esempio 22 . . . . . . . . . . . . . . . . . . . B-37
Indice I-1
xxviii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:21 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.toc)
xxix
1.1 Caratteri tipografici e simboli . . . . . . . 1-3
3.1 Classi di base importanti . . . . . . . . . . 3-5
4.1 Modalit Open . . . . . . . . . . . . . . . . 4-6
4.2 Modalit Share . . . . . . . . . . . . . . . . 4-6
4.3 Modalit shared disponibili
per ogni modalit open . . . . . . . . . . . 4-7
4.4 Costanti di attributo e valori . . . . . . . . 4-8
4.5 Classi per la gestione di elenchi . . . . . . 4-13
4.6 Routine per il confronto delle stringhe . . 4-23
4.7 Routine di conversione
maiuscole/minuscole . . . . . . . . . . . . 4-24
4.8 Routine per la modifica di stringhe . . . . 4-24
4.9 Routine per le sottostringhe . . . . . . . . 4-24
4.10 Routine di confronto
per stringhe terminate con null . . . . . . 4-25
4.11 Routine di conversione
maiuscole/minuscole
per stringhe terminate con null . . . . . . 4-25
4.12 Routine per la modifica di stringhe . . . . 4-26
4.13 Routine per le sottostringhe . . . . . . . . 4-26
4.14 Routine per la copia di stringhe . . . . . . 4-26
5.1 Pagine della Component palette . . . . . 5-7
6.1 Propriet del testo selezionato . . . . . . . 6-9
6.2 Confronto dello stile owner-draw
fixed con quello variable . . . . . . . . . . 6-13
7.1 Direttive al compilatore per le librerie. . . 7-11
7.2 Pagine di database
sulla Component palette . . . . . . . . . . 7-16
7.3 Applicazioni per Web server . . . . . . . . 7-18
7.4 Opzioni del menu contestuale
dei moduli dati . . . . . . . . . . . . . . . 7-22
7.5 Metodi Help in TApplication . . . . . . . 7-35
8.1 Terminologia per la configurazione
delle azioni . . . . . . . . . . . . . . . . . . 8-18
8.2 Valori predefiniti della propriet
PrioritySchedule del gestore di azioni. . . 8-25
8.3 Classi di azioni . . . . . . . . . . . . . . . . 8-29
8.4 Esempi di caption e loro nomi derivati . . 8-34
8.5 Comandi del menu contestuale
Menu Designer. . . . . . . . . . . . . . . . 8-40
8.6 Impostazione dellaspetto
di pulsanti scelta rapid a . . . . . . . . . . 8-48
8.7 Impostazione dellaspetto
di pulsanti strumento . . . . . . . . . . . . 8-50
8.8 Impostazione dellaspetto
di un pulsante cool . . . . . . . . . . . . . 8-52
9.1 Propriet dei controlli di testo . . . . . . . 9-3
10.1 Tipi di oggetti grafici . . . . . . . . . . . . 10-3
10.2 Propriet comuni delloggetto Canvas . . 10-4
10.3 Metodi comuni delloggetto Canvas . . . 10-4
10.4 Tipi MIME e costanti della CLX . . . . 10-23
10.5 Parametri degli eventi mouse . . . . . 10-25
10.6 Tipi di dispositivi multimediali
e loro funzioni . . . . . . . . . . . . . . 10-34
11.1 Priorit del thread . . . . . . . . . . . . . 11-3
11.2 Valori di ritorno di Waifor . . . . . . . . . 11-11
12.1 Opzioni del compilatore
per la gestione delle eccezioni . . . . . . 12-15
12.2 Classi di eccezione selezionate . . . . . 12-18
13.1 Confronto dei modelli degli oggetti . . 13-10
13.2 Confronto delluguaglianza !A == !B di
variabili BOOL . . . . . . . . . . . . . . 13-21
13.3 Esempi di correlazioni RTTI
da Object Pascal a C++. . . . . . . . . . 13-23
14.1 Tecniche di porting . . . . . . . . . . . . . 14-2
14.2 Sezioni della CLX. . . . . . . . . . . . . . 14-5
14.3 Funzionalit modificate o differenti . . . 14-9
14.4 Unit nella VCL
ed equivalenti nella CLX. . . . . . . . . 14-10
14.5 Unit solo nella CLX. . . . . . . . . . . . 14-10
14.6 Unit solo nella VCL. . . . . . . . . . . . .14-11
14.7 Differenze fra gli ambienti operativi
Linux e Windows . . . . . . . . . . . . . 14-14
14.8 Directory Linux comuni . . . . . . . . 14-16
14.9 Componenti paragonabili
per laccesso ai dati . . . . . . . . . . . . 14-23
14.10Propriet , metodi ed eventi degli
aggiornamenti in cache . . . . . . . . . 14-29
15.1 File package . . . . . . . . . . . . . . . . . 15-2
15.2 Direttive al compilatore
specifiche per il packaging. . . . . . . . 15-12
15.3 Opzioni del linker della riga comandi
specifiche per i package . . . . . . . . . 15-13
15.4 File distribuiti con un package . . . . . 15-14
16.1 Oggetti VCL che supportano BiDi . . . . 16-4
16.2 Metodi della VCL che supportano BiDi . 16-8
16.3 Lunghezza stimata delle stringhe. . . . . 16-9
17.1 File di applicazione . . . . . . . . . . . . 17-3
17.2 Moduli di fusione
e rispettive dipendenze . . . . . . . . . . 17-4
17.3 Distribuzione di dbExpress
come eseguibile indipendente . . . . . . 17-7
17.4 Distribuzione dbExpress
con DLL di driver . . . . . . . . . . . . . 17-8
Tabelle
xxx
17.5 File software del client di database . . . . 17-9
19.1 Controllo dati . . . . . . . . . . . . . . . . 19-2
19.2 Propriet di Columns . . . . . . . . . . . 19-22
19.3 Propriet Title del TColumn espanso . . 19-23
19.4 Propriet che influiscono
sulla modalit di visualizazione dei campi compositi
19-26
19.5 Propriet Options espansa
di TBDGrid . . . . . . . . . . . . . . . . 19-27
19.6 Eventi di controllo della griglia . . . . . 19-29
19.7 Propriet del controllo griglia
per database selezionato . . . . . . . . . 19-31
19.8 Pulsanti di TDBNavigator . . . . . . . . 19-32
21.1 Componenti di connessione
del database . . . . . . . . . . . . . . . . . 21-1
22.1 Valori della propriet State
di un dataset . . . . . . . . . . . . . . . . . 22-3
22.2 Metodi di navigazione dei dataset . . . . . 22-5
22.3 Propriet di navigazione dei dataset . . . 22-6
22.4 Operatori logici e di confronto
che possono apparire in un filtro . . . . 22-15
22.5 Valori di FilterOptions . . . . . . . . . . 22-16
22.6 Metodi di navigazione
nei dataset filtrati . . . . . . . . . . . . . 22-17
22.7 Metodi dei dataset per inserire,
aggiornare e cancellare dati. . . . . . . . 22-18
22.8 Metodi che funzionano
con interi record . . . . . . . . . . . . . . 22-22
22.9 Metodi di ricerca basati sugli indici . . . 22-29
23.1 Propriet di TFloatField
che influenzano la visualizzazione
dei dati . . . . . . . . . . . . . . . . . . . . 23-1
23.2 Tipi di campi persistenti particolari . . . . 23-6
23.3 Propriet dei componenti campo . . . . 23-12
23.4 Routine di formattazione
dei componenti campo . . . . . . . . . . 23-16
23.5 Eventi dei componenti campo . . . . . 23-17
23.6 Altri metodi dei componenti campo. . . 23-18
23.7 Risultati speciali di conversioni . . . . . 23-20
23.8 Tipi di componenti campo oggetto . . . 23-24
23.9 Propriet comuni dei discendenti
dei campi oggetto . . . . . . . . . . . . . 23-24
24.1 Tipi di tabella riconosciuti da BDE
in base allestensione del file . . . . . . . . 24-5
24.2 Valori di TableType . . . . . . . . . . . . . 24-6
24.3 Modalit di importazione
di BatchMove . . . . . . . . . . . . . . . . 24-8
24.4 Metodi informativi correlati
al database dei componenti session . . . 24-27
24.5 Propriet e metodi di TSessionList . . 24-30
24.6 Propriet , metodi ed eventi degli
aggiornamenti in cache . . . . . . . . . 24-34
24.7 Valori di UpdateKind . . . . . . . . . . 24-40
24.8 Modalit di un componente
batch move . . . . . . . . . . . . . . . . 24-51
24.9 Interfaccia del Data Dictionary . . . . 24-56
25.1 Componenti ADO . . . . . . . . . . . . . 25-2
25.2 Modalit di connessione ADO . . . . . . 25-6
25.3 Opzioni di esecuzione dei dataset ADO 25-12
25.4 Confronto tra gli aggiornamenti
in cache di ADO e gli aggiornamenti
in cache nel dataset client . . . . . . . . 25-12
26.1 Colonne nelle tabelle di metadati
che elencano tabelle . . . . . . . . . . . 26-14
26.2 Colonne nelle tabelle di metadati
che elencano procedure registrate . . . 26-15
26.3 Colonne nelle tabelle di metadati
che elencano campi . . . . . . . . . . . . 26-16
26.4 Colonne nelle tabelle di metadati
che elencano indici . . . . . . . . . . . . 26-17
26.5 Colonne nelle tabelle di metadati
che elencano parametri. . . . . . . . . . 26-17
27.1 Supporto per i filtri nei dataset client . . 27-3
27.2 Operatori di riepilogo per le
aggregazioni di manutenzione . . . . . 27-13
27.3 Dataset client specializzati per gli
aggiornamenti in cache . . . . . . . . . 27-19
28.1 Membri dellinterfaccia AppServer . . . . 28-3
28.2 Opzione del provider. . . . . . . . . . . . 28-5
28.3 Valori di UpdateStatus . . . . . . . . . . 28-9
28.4 Valori di UpdateMode . . . . . . . . . . 28-10
28.5 Valori di ProviderFlags . . . . . . . . . .28-11
29.1 Componenti usati nelle
applicazioni multi-tier . . . . . . . . . . . 29-3
29.2 Componenti connection . . . . . . . . . . 29-5
29.3 Librerie javascript. . . . . . . . . . . . . 29-35
32.1 Web Broker e WebSnap. . . . . . . . . . . 32-2
33.1 Valori di MethodType . . . . . . . . . . . 33-7
34.1 Tipi di modulo Web application. . . . . . 34-3
34.2 Tipi di applicazione per Web server . . . 34-9
34.3 Componenti Web application . . . . . . 34-10
34.4 Oggetti script . . . . . . . . . . . . . . . 34-36
34.5 Informazioni di richiesta presenti nelle
richieste di azioni . . . . . . . . . . . . 34-39
36.1 Classi Remotable . . . . . . . . . . . . . . 36-8
38.1 Requisiti degli oggetti COM. . . . . . . 38-12
xxxi
38.2 Wizard di C++Builder per
limplementazione di oggetti COM,
Automation e ActiveX . . . . . . . . . . 38-22
39.1 File di Type Library editor . . . . . . . . . 39-2
39.2 Parti di Type Library editor. . . . . . . . . 39-3
39.3 Pagine del Type Library editor . . . . . . . 39-6
41.1 Modelli di threading
per gli oggetti COM. . . . . . . . . . . . . 41-6
42.1 Membri dellinterfaccia
IApplicationObject . . . . . . . . . . . . . 42-4
42.2 Membri dellinterfaccia IRequest . . . . . 42-4
42.3 Membri dellinterfaccia IResponse . . . . 42-5
42.4 Membri dellinterfaccia ISessionObject . . 42-6
42.5 Membri dellinterfaccia IServer . . . . . . 42-7
44.1 Metodi IObjectContext
per il supporto delle transazioni . . . . . 44-14
44.2 Modelli di threading
per oggetti transazionali . . . . . . . . . 44-20
44.3 Opzioni di sincronizzazione
della chiamata . . . . . . . . . . . . . . . 44-21
44.4 Codici di ritorno dei publisher
di evento . . . . . . . . . . . . . . . . . . 44-26
45.1 Punti di partenza per la creazione
di componenti . . . . . . . . . . . . . . . . 45-3
46.1 Livelli di visibilit allinterno
di un oggetto . . . . . . . . . . . . . . . . 46-4
47.1 Come appaiono le propriet nellObject
Inspector . . . . . . . . . . . . . . . . . . 47-2
50.1 Riepilogo delle capacit del canvas. . . . 50-3
50.2 Metodi per la copia di immagini . . . . . 50-7
51.1 Metodi protetti di TWidgetControl
per la risposta ad eventi di sistema . . 51-14
51.2 Metodi protetti di TWidgetControl per la
risposta ad eventi dai controlli . . . . . 51-14
52.1 Tipi di editor di propriet predefiniti. . . 52-8
52.2 Metodi per leggere e scrivere
i valori delle propriet . . . . . . . . . . . 52-9
52.3 Flag attributi di un editor di propriet . .52-11
52.4 Categorie di propriet . . . . . . . . . . 52-15
58.1 I quattro tipi di wizard . . . . . . . . . . 58-3
58.2 Interfacce di servizi Tools API. . . . . . . 58-8
58.3 Le interfacce notifier . . . . . . . . . . . 58-19
A.1 Opzioni necessarie per assicurare
il rispetto delle norme ANSI. . . . . . . . A-1
A.2 Identificazione dei diagnostici in C++ . . A-3
B.1 Tipi di oggetto di WebSnap . . . . . . . . . B-2
B.2 Oggetti globali WebSnap. . . . . . . . . . B-14
B.3 Esempi JScript di scripting lato server . . B-19
xxxii
xxxiii
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:34 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.lof)
3.1 Oggetti, componenti e controlli . . . . . . 3-4
3.2 Un diagramma semplificato
della gerarchia . . . . . . . . . . . . . . . . 3-5
8.1 Un frame con controlli data-aware e un
componente datasource. . . . . . . . . . . 8-16
8.3 Terminologia dei menu . . . . . . . . . . . 8-32
8.4 Componenti MainMenu e PopupMenu. . 8-32
8.6 Aggiunta di voci di menu
a un menu principale . . . . . . . . . . . . 8-36
8.7 Strutture di menu annidate. . . . . . . . . 8-37
9.2 Una barra di avanzamento . . . . . . . . . 9-17
10.1 Finestra di dialogo
Bitmap Dimension dalla unit BMPDlg . 10-22
13.1 Sequenza di costruzione
degli oggetti in stile VCL . . . . . . . . . . 13-9
16.1 TListBox impostato a bdLeftToRight . . . 16-6
16.2 TListBox impostato a bdRightToLeft . . . 16-7
16.3 TListBox impostato a
bdRightToLeftNoAlign . . . . . . . . . . . 16-7
16.4 TListBox impostato a
bdRightToLeftReadingOnly . . . . . . . . 16-7
18.1 Architettura generale di un database . . . 18-6
18.2 Connessione diretta
a un server di database . . . . . . . . . . . 18-8
18.3 Unapplicazione database basata su file. 18-10
18.4 Architettura che combina
un dataset client e un altro dataset. . . . 18-12
18.5 Architettura multi-tier di un database. . 18-14
19.1 Controllo TDBGrid . . . . . . . . . . . . 19-17
19.2 Controllo TDBGrid
con ObjectView impostato a false . . . . 19-25
19.3 Controllo TDBGrid
con Expanded impostato a false . . . . . 19-26
19.4 Controllo TDBGrid
con Expanded impostato a true . . . . . 19-26
19.5 TDBCtrlGrid in fase di progettazione . . 19-31
19.6 Pulsanti del controllo TDBNavigator . . 19-32
20.1 Componenti di supporto decisionale
in progettazione . . . . . . . . . . . . . . . 20-2
20.2 Un crosstab mono-dimensionale. . . . . . 20-3
20.3 Crosstab tridimensionale . . . . . . . . . . 20-3
20.4 Grafici decisionali collegati a sorgenti
decisionali diverse . . . . . . . . . . . . . 20-15
24.1 Componenti in unapplicazione BDE. . . 24-2
29.1 Applicazione database multi-tier
basata su Web . . . . . . . . . . . . . . . 29-31
31.1 Struttura di unapplicazione CORBA. . . 31-2
32.1 Parti di uno Uniform Resource Locator . 32-4
33.1 Struttura di unapplicazione server. . . . 33-4
34.5 Pagina CountryTable Preview. . . . . . 34-17
34.6 Pagina CountryTable HTML Script . . . 34-18
34.7 CountryTable Preview
dopo avere aggiunto
i comandi di editing . . . . . . . . . . . 34-19
34.10Finestra di dialogo
Web App Components
con le opzioni per supporto
del login selezionate . . . . . . . . . . . 34-27
34.11 Un esempio di pagina di login visto
nelleditor della pagina web. . . . . . . 34-30
34.12 Generazione
del flusso dei contenuti . . . . . . . . . 34-38
34.13Action request e response . . . . . . . . 34-40
34.14 Risposta di immagine a una richiesta . 34-41
34.15 Indirizzamento di una pagina . . . . . 34-42
38.1 Uninterfaccia COM . . . . . . . . . . . . 38-3
38.2 Vtable dellinterfaccia . . . . . . . . . . . 38-5
38.3 Server in-process . . . . . . . . . . . . . . 38-7
38.4 Server out-of-process e remoti. . . . . . . 38-8
38.5 Tecnologie basate su COM. . . . . . . . 38-12
38.6 Una semplice interfacia
per un oggetto COM . . . . . . . . . . . 38-21
38.7 Interfaccia di un oggetto Automation . 38-21
38.8 Interfaccia di un oggetto ActiveX. . . . 38-21
39.1 Type Library editor . . . . . . . . . . . . . 39-3
39.2 Pannello Object list . . . . . . . . . . . . . 39-5
41.1 VTable di uninterfaccia duale. . . . . . 41-14
43.1 La pagina di propriet Mask Edit
in modalit progetto . . . . . . . . . . . 43-15
44.1 Il sistema a eventi di COM+. . . . . . . 44-24
45.1 La gerarchia di classi
della Visual Component Library . . . . . 45-2
45.2 Component wizard. . . . . . . . . . . . 45-10
51.1 Instradamento del segnale. . . . . . . . .51-11
51.2 Instradamento dellevento di sistema . 51-13
Figure
xxxiv
Copyright 1998, Inprise Corporation. All rights reserved. INPRISE CONFIDENTIAL
April 16, 2002 7:34 am (D:\Lavori\bcb6\DG\BCBonly\bcbdg.lof)
I n t r o d u z i o n e 1-1
C a p i t o l o
1
Capitolo1Introduzione
Il manuale Guida alla programmazione descrive gli argomenti, intermedi e evoluti,
quali la costruzione di database client/server, la scrittura di componenti custom, la
creazione di applicazioni per Web server Internet e linclusione del supporto per
specifiche standard come SOAP, TCP/IP, COM e ActiveX. La maggior parte delle
funzioni evolute che supportano lo sviluppo per Web, le tecnologie evolute XML e lo
sviluppo di database richiedono componenti o wizard che non sono disponibili in
tutte le versioni di C++Builder
Il manuale Guida alla programmazione presuppone una certa familiarit con luso di
C++Builder e la conoscenza delle tecniche fondamentali di programmazione in
C++Builder. Per una introduzione alla programmazione in C++Builder e
allambiente di sviluppo integrato (IDE), consultare il manuale Per iniziare e la Guida
in linea.
Contenuto del manuale
Questo manuale costituito da cinque parti:
La Parte I, Programmazione con C++Builder, descrive come costruire
applicazioni C++Builder per scopi generici. Vi vengono fornite informazioni
dettagliate sulle tecniche di programmazione, utilizzabili in qualsiasi applicazione
C++Builder. Per esempio, vi viene descritto l+uso di oggetti della Visual
Component Library (VCL) comuni o della Component Library for Cross-platform
(CLX), che semplificano la programmazione dellinterfaccia utente, per aspetti
quali la gestione delle stringhe, la manipolazione del testo, limplementazione
delle finestre di dialogo comuni di Windows, le operazioni con elementi grafici, la
gestione degli errori e delle eccezioni, luso di DLL, di Ole Automation e la
scrittura di applicazioni internazionali.
Capita di rado che una libreria VCL di C++Builder sia scritta in Object Pascal.
Tuttavia, ci sono casi in cui ci vale anche per programmi C++Builder. Un capitolo
sul supporto del linguaggio C++ e sulle librerie VCL descrive alcuni argomenti
1-2 G u i d a a l l a p r o g r a mma z i o n e
C o n t e n u t o d e l m a n u a l e
relativi al linguaggio quali le diverse modalit con cui si istanzia una classe C++
quando si utilizzano le classi VCL o le estensioni del linguaggio C++ aggiunte per
supportare il modello di programmazione componente-propriet-evento di
C++Builder.
Un capitolo descrive come utilizzare gli oggetti inclusi nella Borland Component
Library for Cross-Platform (CLX) per lo sviluppo di applicazioni che possono
essere compilate ed eseguite su piattaforme Windows o Linux.
Il capitolo sulla distribuzione illustra dettagliatamente le operazioni connesse alla
distribuzione delle applicazioni agli utenti. Per esempio, include informazioni
sulle opzioni del compilatore, sulluso di InstallShield Express, sulla concessione
delle licenze e su come determinare quali package, DLL e altre librerie utilizzare
per generare una versione della propria applicazione da immettere sul mercato.
La Parte II, Sviluppo di applicazioni database, descrive come costruire
applicazioni database utilizzando strumenti e componenti database. C++Builder
permette di accedere a molti tipi di database, inclusi i database locali come
Paradox e dBASE e database SQL server per rete come InterBase, Oracle e Sybase.
possibile scegliere fra vari meccanismi per laccesso di dati, fra cui dbExpress,
Borland Database Engine, InterBaseExpress e ActiveX Data Objects (ADO). Per
implementare applicazioni database client/server pi evolute, sono necessarie
funzionalit di C++Builder che non sono disponibili in tutte le edizioni.
La Parte III, Creazione di applicazioni Internet, descrive come creare
applicazioni da distribuire in Internet. C++Builder include una vasta gamma di
strumenti per la scrittura di applicazioni per Web server, fra cui Web Broker,
unarchitettura che permette di creare applicazioni server per pi piattaforme,
WebSnap, che permette di progettare pagine web in un ambiente GUI, il supporto
per operazioni con documenti XML, e BizSnap, unarchitettura per lutilizzo di
Servizi Web basati su SOAP.
Questa parte contiene anche un capitolo sui componenti socket di C++Builder che
permettono di creare applicazioni in grado di comunicare con altri sistemi tramite
TCP/IP e i protocolli correlati. I socket forniscono connessioni basate sul
protocollo TCP/IP, ma sufficientemente generiche da consentire di lavorare con
protocolli correlati come Xerox Network System (XNS), DECnet di Digital o la
famiglia IPX/SPX di Novell.
La Parte IV, Sviluppo di applicazioni COM, descrive come costruire
applicazioni in grado di interagire con altri oggetti API basati su COM.
C++Builder supporta le applicazioni COM basate sui wizard ATL (Active
Template Library) e un Type Library editor per semplificare lo sviluppo di server
COM, oltre a uno strumento di importazione che consente di creare rapidamente
applicazioni client. Il supporto per i client COM previsto in tutte le versioni di
C++Builder. Il supporto per i server COM non disponibile in tutte le versioni di
C++Builder.
La Parte V, Creazione di componenti custom, descrive come progettare e
implementare componenti personali e come renderli disponibili nella Component
palette dellIDE. Un componente pu essere un qualsiasi elemento di programma
che si desidera gestire in fase di progettazione. Limplementazione di componenti
I n t r o d u z i o n e 1-3
C o n v e n z i o n i t i p o g r a f i c h e
personalizzati implica la derivazione di una nuova classe a partire da uno dei tipi
di classe presenti nelle librerie di classi VCL o CLX.
Convenzioni tipografiche
Il presente manuale utilizza i caratteri e i simboli descritti nella Tabella 1.1 per
indicare un testo speciale.
Servizi di assistenza agli sviluppatori
Borland offre diverse opzioni di supporto. Tra queste vi sono servizi gratuiti su
Internet, dove si possono fare ricerche in unampia base di informazioni o collegarsi
con altri utenti dei prodotti Borland. Inoltre, possibile scegliere tra varie categorie di
supporto, che vanno dal supporto allinstallazione del prodotto Borland al supporto
a livello di consulenza e allassistenza estesa non gratuiti.
Per ottenere informazioni sui costi dei servizi Borland di assistenza agli sviluppatori,
visitare il sito Web di Borland, allindirizzo http://www.borland.com/devsupport/
bcppbuilder, oppure allindirizzo htpp://www.borland.it (seguire i collegamenti a
Borland Assist), oppure contattare telefonicamente Borland Assist al numero
0542.34058. I clienti non residenti negli Stati Uniti dAmerica possono anche
consultare il sito web di Borland allindirizzo http://www.borland.com/bww/
intlcust.html.
Quando si contatta il supporto tecnico, bene avere sotto mano tutte le informazioni
relative allambiente, alla versione del prodotto utilizzato e una descrizione
dettagliata del problema.
Come ordinare la documentazione cartacea
Per ordinare la documentazione aggiuntiva, visitare il sito http://shop.borland.com.
Tabella 1.1 Caratteri tipografici e simboli
Carattere o simbolo Significato
.s,i.i Il carattere monospaziato viene utilizzato per rappresentare un testo cos
come appare sullo schermo o nel codice C++. Rappresenta, inoltre, tutto ci
che deve essere immesso da tastiera.
[ ] Le parentesi quadre nel testo o nei listati sintattici racchiudono elementi
facolativi. Un testo di questo tipo non deve essere scritto letteralmente.
Grassetto Le parole in grassetto nel testo o nei listati di codice rappresentano parole
riservate di C++ oppure opzioni del compilatore.
Corsivo Le parole in corsivo nel testo rappresentano identificatori di C++, come i
nomi di variabili o di tipi. Il corsivo viene anche utilizzato per mettere in
evidenza determinate parole, come i nuovi termini.
Keycaps Questo carattere indica un tasto sulla tastiera. Ad esempio, Premere Esc
per uscire dal menu.
1-4 G u i d a a l l a p r o g r a mma z i o n e
C o n v e n z i o n i t i p o g r a f i c h e
P r o g r a mma z i o n e c o n C + + B u i l d e r
P a r t e
I
ParteIProgrammazione con C++Builder
I capitoli inclusi nella sezione Programmazione con C++Builder illustrano i
concetti di base e le nozioni necessarie per creare applicazioni C++Builder con
qualunque edizione del prodotto.
S v i l u p p o d i a p p l i c a z i o n i c o n C + + B u i l d e r 2-1
C a p i t o l o
2
Capitolo2Sviluppo di applicazioni con
C++Builder
Borland C++Builder un ambiente di programmazione visuale orientato agli oggetti
per lo sviluppo di applicazioni a 32-bit da distribuire in ambiente Windows e Linux.
Con C++Builder possibile creare applicazioni ad elevata efficienza scrivendo
pochissime righe di codice.
C++Builder mette a disposizione una suite di strumenti di progettazione RAD
(Rapid Application Development) che include wizard per la programmazione oltre a
modelli di applicazioni e schede, e supporta la programmazione orientata agli
oggetti grazie a una completa libreria di classi:
la Visual Component Library (VCL), che include oggetti che, oltre alle API di
Windows, incapsulano molte altre utili tecniche di programmazione (Windows).
la Borland Component Library for Cross-Platform (CLX), che include oggetti che
incapsulano la libreria Qt (Windows o Linux).
Questo capitolo descrive in breve lambiente di sviluppo di C++Builder e come esso
si adatta perfettamente al ciclo di sviluppo di un progetto. Nella parte rimanente di
questo manuale vengono forniti dettagli tecnici sullo sviluppo di applicazioni
generiche, di applicazioni database, di applicazioni Internet e Intranet, oltre che sulla
scrittura di controlli ActiveX e COM e di componenti personali.
Ambiente di sviluppo integrato
Quando si avvia C++Builder, ci si trova immediatamente allinterno dellambiente di
sviluppo integrato, detto anche IDE. Questo ambiente fornisce tutti gli strumenti
necessari per progettare, sviluppare, collaudare, correggere e distribuire le
applicazioni, consentendo cos la creazione rapida di prototipi e labbreviazione dei
tempi del ciclo di sviluppo.
2-2 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i a p p l i c a z i o n i
LIDE include tutti gli strumenti necessari per iniziare la progettazione di
applicazioni, quali:
Form Designer, una finestra vuota, detta anche scheda, in cui progettare
linterfaccia utente (UI) dellapplicazione.
Component palette per la visualizzazione di componenti visuali e non, che
possibile utilizzare per progettare linterfaccia utente.
Object Inspector per esaminare e modificare le propriet e gli eventi degli oggetti.
Object TreeView per visualizzare e modificare le relazioni di un componente.
Code editor per la stesura e la modifca della logica sottostante di un programma.
Project Manager per gestire i file che costituiscono uno o pi progetti.
Debugger integrato per ricercare e corregere gli errori nel codice.
Molti altri strumenti, come gli editor di propriet per modificare i valori delle
properiet di un oggetto.
Strumenti per la riga comandi che comprendono compilatori, linker e altri
programmi di utilit.
Complete librerie di classi con moltissimi oggetti riutilizzabili. La maggior parte
degli oggetti forniti nella libreria di classi sono accessibili nellIDE dalla
Component palette. Per convenzione, i nomi degli oggetti nella libreria di classi
iniziano con una T, come TStatusBar.
Alcuni strumenti potrebbero non essere inclusi in tutte le edizioni del prodotto.
Nel manuale Per iniziare, incluso nel prodotto, viene presentata una panoramica pi
completa sullambiente di sviluppo. Inoltre, il sistema di Guida in linea contiene la
descrizione completa dei menu, delle finestre di dialogo e delle finestre
dellapplicazione.
Progettazione di applicazioni
C++Builder pu essere usato per progettare qualsiasi tipo di applicazione a 32 bit
dai programmi di utilit per scopi generici ai sofisticati programmi di accesso ai dati
o applicazioni distribuite.
Quando si progetta in modo visuale linterfaccia utente per lapplicazione,
C++Builder genera il codice C++ sottostante. Quando si selezionano e si modificano
le propriet di componenti e schede, i risultati di queste modifiche vengono
visualizzati automaticamente nel codice sorgente e viceversa. possibile modificare i
file sorgente direttamente con qualsiasi editor di testo, compreso il Code editor
integrato. Le modifiche apportate vengono immediatamente riportate nellambiente
visuale.
In C++Builder possibile creare dei propri componenti. La maggior parte dei
componenti forniti scritta in Object Pascal. possibile aggiungere alla Component
palette i propri componenti oppure personalizzarla in base alle proprie preferenze
inserendo, ad esempio, nuove pagine.
Utilizzando la libreria CLX possibile anche utilizzare C++Builder per lo sviluppo di
applicazioni eseguibili su entrambe le piattaforme Linux e Windows. CLX contiene
un insieme di classi che, se utilizzate al posto di quelle incluse nella VCL, permettono
di eseguire il porting del programma tra Windows e Linux. Per i dettagli sulla
S v i l u p p o d i a p p l i c a z i o n i c o n C + + B u i l d e r 2-3
C r e a z i o n e d i p r o g e t t i
programmazione per pi piattaforme e per le differenze fra gli ambienti Windows e
Linux, fare riferimento al Capitolo 14, Sviluppo di applicazioni multipiattaforma.
Il Capitolo 7, Creazione di applicazioni, componenti e librerie, presenta i supporti
forniti da C++Builder per i diversi tipi di applicazioni.
Creazione di progetti
In C++Builder, tutte le attivit relative allo sviluppo di applicazioni ruotano intorno
ai progetti. Quando si crea unapplicazione in C++Builder si crea un progetto. Un
progetto una raccolta di file che compongono unapplicazione. Alcuni di questi file
sono creati in fase di progettazione. Gli altri vengono generati automaticamente
quando si compila il codice sorgente del progetto.
possibile visualizzare il contenuto di un progetto in uno strumento per la gestione
dei progetti di nome Project Manager. Il Project Manager elenca, in una vista
gerarchica, i nomi delle unit, le schede contenute nella unit (nel caso ve ne siano) e
mostra i percorsi dei file nel progetto. Bench sia possibile modificare direttamente la
maggior parte di questi file, spesso pi semplice e affidabile utilizzare gli strumenti
visuali di C++Builder.
In cima alla gerarchia del progetto, vi un file di gruppo. possibile combinare pi
progetti in un gruppo di progetti.Ci permette di aprire nel Project Manager pi di
un progetto per volta. I gruppi di progetti permettono organizzare e operare su
progetti correlati, come le applicazioni che funzione in combinazione fra di loro o che
fanno parte di unapplicazione multi-tier. Se si lavora su un solo progetto, per creare
unapplicazione non necessario un file di gruppo di progetti.
I file di progetto, che descrivono i singoli progetti, i file e le opzioni associate, hanno
lestensione .bpr. I file di progetto contengono indicazioni per la generazione di
unapplicazione o di un oggetto condiviso. Quando si aggiungono e rimuovono file
utilizzando il Project Manager, il file di progetto viene aggiornato. Le opzioni di
progetto vengono specificate utilizzando una finestra di dialogo, Project Options,
contenente varie pagine per i diversi aspetti del progetto come le schede,
lapplicazione o il compilatore. Queste opzioni di progetto vengono memorizzate nel
file di progetto assieme al progetto.
Le unit e le schede sono i componenti di base di unapplicazione in C++Builder. Un
progetto pu condividere tutti i file form e unit esistenti, inclusi quelli che risiedono
esternamente allalbero delle directory di progetto. Questo include le procedure e le
funzioni custom che sono state scritte come routine indipendenti.
Se si aggiunge a un progetto un file condiviso, bene rendersi conto che il file non
viene copiato nella directory del progetto corrente; rimane nella sua ubicazione
attuale. Laggiunta al progetto corrente di un file condiviso registra il nome del file e
il percorso nel file di progetto. C++Builder gestisce automaticamente questa
operazione non appena si aggiungono delle unit a un progetto.
Quando si compila un progetto, non importate la posizione in cui risiedono i file
che compongono il progetto. Il compilatore tratta i file condivisi esattamente come
quelli creati dal progetto stesso.
2-4 G u i d a a l l a p r o g r a mma z i o n e
E d i t i n g d e l c o d i c e
Editing del codice
Il Code editor di C++Builder un editor ASCII completo di ogni funzione. Se si
utilizza lambiente di programmazione visuale, viene visualizzata automaticamente
una scheda come parte di un nuovo progetto. possibile cominciare a progettare
linterfaccia dellapplicazione collocando oggetti sulla scheda e modificandone il
funzionamento con lObject Inspector. Altre attivit di programmazione, invece,
come la scrittura dei gestori di evento degli oggetti, devono essere fatte immettendo
il codice.
I contenuti della scheda, tutte le sue propriet, i suoi componenti e le rispettive
propriet possono essere visualizzati e modificati sotto forma di testo nel Code
Editor. Nel Code Editor possibile adattare il codice generato e aggiungervi altri
componenti dallinterno delleditor scrivendo il codice opportuno. Man mano che si
scrive il codice nelleditor, il compilatore scandisce costantemente ogni modifica e
aggiorna la scheda con il nuovo layout. possibile quindi ritornare alla scheda,
visualizzarla e verificare le modifiche apportate nelleditor, e quindi continuarne la
messa a punto.
I sistemi di generazione del codice e di esposizione delle propriet di C++Builder
possono essere ispezionati completamente. Il codice sorgente per tutto ci che
incluso nel file eseguibile finalevale a dire tutti gli oggetti VCL, tutti gli oggetti
CLX, i sorgenti RTL e tutti i file di progetto-possono essere visualizzati e modificati
nel Code editor.
Compilazione di applicazioni
Una volta terminata la progettazione sulla scheda dellinterfaccia dellapplicazione e
la scrittura di tutto il codice aggiuntivo, in modo che lapplicazione faccia ci che ci si
era prefissi, possibile compilare il progetto dallIDE o dalla riga comandi.
Tutti i progetti hanno come destinazione un singolo file eseguibile distribuibile.
possibile visualizzare o provare lapplicazione a diversi stadi dello sviluppo
compilandola, rigenerandola o mandandola in esecuzione:
Quando si compila, vengono ricompilate solo le unit che sono state modificate
rispetto allultima compilazione.
Quando si rigenera lapplicazione, vengono ricompilate tutte le unit nel progetto,
indipendentemente dal fatto che siano state modificate o meno rispetto allultima
compilazione. importante utilizzare il comando Build anche quando si sono
modificate le direttive globali del compilatore, in modo da accertarsi che tutto il
codice venga compilato in base alle impostazioni appropriate. importante anche
eseguire la rigenerazione del progetto una volta modificate tutte le direttive
globali del compilatore per accertarsi che tutto il codice venga compilato nello
stato opportuno. anche possibile verificare la validit del codice sorgente senza
tentare di compilare il progetto.
S v i l u p p o d i a p p l i c a z i o n i c o n C + + B u i l d e r 2-5
D e b u g d i a p p l i c a z i o n i
Quando si esegue lapplicazione, lapplicazione viene compilata e quindi eseguita.
Se si modificato il codice sorgente rispetto allultima compilazione, il
compilatore ricompila i moduli modificati e ne riesegue il link allapplicazione.
Nel caso si siano raggruppati pi progetti, possibile compilare o rigenerare in una
sola volta tutti i progetti in un singolo gruppo di progetti. Dopo aver selezionato nel
Project Manager il gruppo di progetti, scegliere il comando Project|Compile All
Projects o Project|Build All Projects.
Non ancora disponibile unapplicazione C++ per Linux per compilare
unapplicazione CLX in Linux, ma possibile cominciare a sviluppare da ora le
proprie applicazioni con C++Builder.
Debug di applicazioni
C++Builder fornisce un debugger integrato che consente di trovare e di correggere
gli errori presenti nelle applicazioni. Il debugger integrato permette di controllare
lesecuzione del programma, di tenere sotto controllo i valori delle variabili e gli
elementi delle strutture di dati, oltre che di modificare i valori dei dati durante la fase
di debug.
Il debugger integrato pu tracciare sia gli errori di esecuzione sia gli errori di logica.
Eseguendo il programma fino a determinati punti ed esaminando i valori delle
variabili, le funzioni nello stack delle chiamate e loutput del programma, possibile
controllare il comportamento del programma e trovare le aree in cui il
comportamento non quello progettato. Il debugger descritto nella Guida in linea.
anche possibile usare la gestione delle eccezioni per riconoscere, individuare e
trattare gli errori. In C++Builder le eccezioni sono classi, identiche alle altre classi di
C++Builder, tranne per il fatto che, per convenzione, il loro nome inizia con una E
invece che con una T. Per maggiori informazioni sulla gestione delle eccezioni,
consultare il Capitolo 12, Gestione delle eccezioni.
Distribuzione di applicazioni
C++Builder include strumenti aggiuntivi che consentono la distribuzione delle
applicazioni. Ad esempio, InstallShield Express (non disponibile in tutte le edizioni)
aiuta a creare un package per linstallazione dellapplicazione, che include tutti i file
necessari per lesecuzione di unapplicazione distribuita. disponibile anche il
software TeamSource (non disponibile in tutte le edizioni) per tenere traccia degli
aggiornamenti apportati alle applicazioni.
_
Non tutte le edizioni di C++Builder consentono la distribuzione di applicazioni.
Non ancora disponibile unapplicazione C++ per Linux per distribuire
unapplicazione CLX in Linux, ma possibile cominciare a sviluppare da ora le
proprie applicazioni con C++Builder.
2-6 G u i d a a l l a p r o g r a mma z i o n e
D i s t r i b u z i o n e d i a p p l i c a z i o n i
Per informazioni specifiche sulla distribuzione, consultare il Capitolo 17,
Distribuzione di applicazioni,.
U s o d e l l e l i b r e r i e d i c l a s s i 3-1
C a p i t o l o
3
Capitolo3Uso delle librerie di classi
Questo capitolo presenta una panoramica delle librerie di componenti e presenta
alcuni oggetti che possibile utilizzare durante lo sviluppo di applicazioni.
C++Builder include sia la Visual Component Library (VCL) che la Borland
Component Library for Cross-Platform (CLX). La VCL per lo sviluppo in Windows
e la CLX per lo sviluppo multipiattaforma in Windows e in Linux. Sono due librerie
di classi diverse ma hanno molte somiglianze.
Le librerie di classi
VCL e CLX sono librerie di classi composte da oggetti che si utilizzano durante lo
sviluppo di applicazioni. Le librerie sono fra loro simili e contengono entrambe quasi
tutti gli stessi oggetti. Alcuni oggetti nella VCL implementano funzioni che sono
disponibili solo in Windows, come gli oggetti che vengono visualizzati sulle pagine
ADO, BDE, QReport, COM+ e Server della Component palette. Potenzialmente tutti
gli oggetti CLX sono disponibili sia in Windows che in Linux.
Tutti gli oggetti della VCL e della CLX discendono da TObject, una classe astratta i cui
metodi ne definiscono il comportamento di base come la costruzione, la distruzione e
la gestione dei messaggi. Quando si scrivono personalmente delle classi, dovrebbero
discendere da TObject incluso nella libreria di classi che si intende utilizzare.
I componenti sono un sottoinsieme della VCL o della CLX e discendono dalla classe
astratta TComponent. I componenti sono oggetti che possono essere collocati su una
scheda o in un modulo dati e trattare in fase di progettazione. La maggior parte dei
componenti sono visuali o non visuali, a seconda del fatto che siano visibili o meno in
esecuzione. Alcuni componenti vengono visualizzati nella Component palette.
I componenti visuali, come TForm e TSpeedButton, sono detti controlli e discendono
da TControl. TControl fornisce le propriet che specificano gli attributi visuali dei
controlli, come la loro altezza e ampiezza.
3-2 G u i d a a l l a p r o g r a mma z i o n e
L e l i b r e r i e d i c l a s s i
I componenti non visuali vengono usati per una vasta gamma di compiti. Ad
esempio, se si sta scrivendo unapplicazione che si connete a un database, possibile
collocare sulla scheda un componente TDataSource per collegarsi a un controllo e un
componente dataset usato dal controllo. Questa connessione non visibile allutente,
pertanto TDataSource non visuale. In progettazione, i componenti non visuali
vengono rappresentati da unicona. Ci consente di manipolarne le propriet e gli
eventi esattamente come se si trattasse di un controllo visuale.
Durante la programmazione, possibile accedere alla Guida in linea che contiene la
documentazione di riferimento molto dettagliata su tutti gli oggetti della VCL e della
CLX. Dallinterno del Code editor, collocare il cursore sulloggetto e premere F1 per
visualizzare la Guida sui componenti della topic . Gli oggetti, le propriet, i metodi e
gli eventi che sono inclusi nella VCL sono contrassegnati come VCL Reference,
mentre quelli inclusi nella CLX come CLX Reference.
Propriet, metodi ed eventi
Sia la VCL che la CLX sono gerarchie di oggetti legate allIDE di Delphi, in cui
possibile sviluppare rapidamente applicazioni. Gli ogggetti in entrambe le librerie di
componenti si basano su propriet, metodi ed eventi. Ogni oggetto include i membri
dati (le propriet), le funzioni che operano sui dati (i metodi) e un modo per
interagire con gli utenti della classe (gli eventi). La VCL e la CLX sono scritte in
Object Pascal, anche se la VCL si basa sulle API di Windows API e la CLX si basa
sulla libreria di widget Qt.
Propriet
Le propriet sono le caratteristiche di un oggetto che influiscono o sul comportamento
visibile o sulle operazioni delloggetto. Ad esempio, la propriet Visible determina se
un oggetto pu essere visualizzato o meno nellinterfaccia dellapplicazione.
Propriet ben progettate consentono di semplificare lutilizzo del componente da
parte di altri programmatori e la manutenzione da parte di chi lha progettato.
Di seguito sono riportare alcune utili caratteristiche delle propriet:
A differenza dei metodi, che sono disponibili solo in esecuzione, possibile vedere
e modificare le propriet nellIDE in fase di progettazione e ottenere un immediato
riscontro visivo dei cambiamenti apportati.
possibile accedere alle propriet tramite lObject Inspector, che consente di
modificare visivamente i valori delloggetto. Limpostazione delle propriet in
fase di progettazione pi semplice della scrittura del codice e rende il codice pi
semplice da gestire.
Poich i dati sono incapsulati, risultano protetti e privati allinterno delloggetto.
Le chiamate volte a ottenere e a impostare i valori sono metodi, rendendo pertanto
invisibili allutente delloggetto particolari elaborazioni. Ad esempio, i dati
potrebbero risiedere in una tabella, ma potrebbero apparire al programmatore
come normali membri dati.
U s o d e l l e l i b r e r i e d i c l a s s i 3-3
L e l i b r e r i e d i c l a s s i
possibile implementare la logica che innesca eventi o modifica altri dati durante
laccesso alla propriet. Ad esempio, la modifica del valore di una propriet
potrebbe richiedere la modifica di unaltra. possibile modificare i metodi creati
per la propriet.
Le propriet possono essere virtuali.
Una propriet non limitata a un singolo oggetto. La modifica di una propriet di
un oggetto potrebbe ripercuotersi su numerosi oggetti. Ad esempio,
limpostazione della propriet Checked su un pulsante di opzione influenza tutti i
pulsanti di opzione nel gruppo.
Metodi
Un metodo una funzione che memebro di una classe. I metodi definiscono il
comportamento di un oggetto. I metodi di classe possono accedere a tutte le
propriet pubbliche, protette e private e ai membri dati della classe e sono
comunemente menzionati come funzioni membro. Consulatre Controllo
dellaccesso a pagina 46-4.
Eventi
Un evento unazione o un accadimento rilevato da un programma. Molte
applicazioni moderne vengono definite event-driven, perch sono progettate per
rispondere agli eventi. In un programma, il programmatore non ha alcun modo di
prevedere la sequenza esatta di azioni che sar eseguita dallutente. Lutente ad
esempio potr scegliere una voce di menu, fare clic su un pulsante o selezionare del
testo. Il programmatore potr scrivere il codice per gestire gli eventi che ritiene
importanti, invece di scrivere del codice che sar eseguito sempre secondo lo stesso
ordine limitato.
Indipendentemente da come stato chiamato levento, C++Builder cerca di
individuare se stato predisposto un qualsiasi codice per gestire quel determinato
evento. Nel caso sia stato predisposto, quel codice viene eseguito; altrimenti, ha
luogo il comportamento predefinito di gestione dellevento.
I tipi di eventi che possono verificarsi possono essere suddivisi in due categorie
principali:
Eventi utente
Eventi di sistema
Eventi utente
Gli eventi utente sono azioni che vengono iniziate dallutente. Esempi di eventi
utente sono OnClick (lutente ha fatto clic col mouse), OnKeyPress (lutente ha
premuto un tasto sulla tastiera), e OnDblClick (lutente ha fatto doppio clic su un
pulsante del mouse).
Eventi di sistema
Gli eventi di sistema sono eventi generati automaticamente dal sistema operativo. Ad
esempio, levento OnTimer (il componente TTimer genera uno di questi eventi ogni
3-4 G u i d a a l l a p r o g r a mma z i o n e
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
volta che trascorso un intervallo temporale predefinito), levento OnCreate (il
componente sta per essere creato), levento OnPaint (un componente o una window
devono essere ridisegnati), e cos via. Di solito, gli eventi di sistema non vengono
avviati direttamente da unazione dellutente.
Oggetti, componenti e controlli
La Figura 3.1 mostra in modo molto semplificato la gerarchia dellereditariet che
illustra le relazioni esistenti tra oggetti, componenti e controlli.
Figura 3.1 Oggetti, componenti e controlli
Ogni oggetto eredita da TObject, e molti oggetti ereditano da TComponent. I controlli,
che ereditano da TControl, hanno la capacit di visualizzare s stessi in fase di
esecuzione. Un controllo come TCheckBox eredita tutta le funzionalit di TObject, di
TComponent e di TControl e aggiunge proprie capacit specializzate.
La Figura 3.2 una panoramica della Visual Component Library (VCL) che mostra i
rami principali dellalbero dellereditariet. A questo livello, la Borland Component
Library for Cross-Platform (CLX) molto simile, ma TWinControl sostituito da
TWidgetControl.
TForm TButton TCheckBox TListBox
TObject
TComponent
TControl
U s o d e l l e l i b r e r i e d i c l a s s i 3-5
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
Figura 3.2 Un diagramma semplificato della gerarchia
Nella figura vengono visualizzate diverse importanti classi base che sono descritte
nella tabella seguente:
Le prossime sezioni presentano una descrizione generale dei tipi di classi conytenuti
in ogni ramo. Per una panoramica completa della gerarchia degli oggetti della VCL e
della CLX, fare riferimento ai diagramma VCL Object Hierarchy e CLX Object
Hierarchy inclusi nel prodotto.
Tabella 3.1 Classi di base importanti
Classe Descrizione
TObject Indica la classe di base e lantenato pi remoto di tutto ci che incluso nella
VCL o nella CLX. TObject incapsula il comportamento fondamentale comune
a tutti gli oggetti della VCL/CLX introducendo i metodi che eseguono le
funzioni di base come la creazione, la gestione e la distruzione di unistanza
di un oggetto.
Exception Specifica la classe di base di tutte le classi correlate alle eccezioni. La classe
Exception fornisce uninterfaccia coerente per le condizioni di errore e
permette alle applicazioni di gestire le condizioni di errore in modo elegante.
TPersistent Specifica la classe di base per tutti gli oggetti che implementano propriet. Le
classi sotto TPersistent si occupano dellinvio di dati agli stream e permettono
lassegnazione di classi.
TComponent Specifica la classe di base per tutti i componenti non visuali come
TApplication. TComponent lantenato comune di tutti i componenti. Questa
classe permette a un componente di essere visualizzato sulla Component
palette, consente a un componente di possedere altri componenti, e consente
di trattare il componente direttamente su una scheda.
TControl Rappresenta la classe di base per tutti i controlli visibili in fase di esecuzione.
TControl lantenato comune di tutti i componenti visuali e fornisce ai
controlli propriet standard come posizione e cursore. Questa classe fornisce
anche gli eventi che rispondono alle azioni del mouse.
TWinControl Specifica la classe di base di tutti gli oggetti dellinterfaccia utente. I controlli
sotto TWinControl sono controlli basati su finestre in grado di catturare
linput da tastiera. In CLX, questi vengono chiamati widget, e TWidgetControl
sostituisce TWinControl.
TObject
TGraphicControl
Exception
TComponent TControl TWinControl TPersistent
[Objects]
[Objects]
[Objects]
[Objects] [Objects] [Objects]
3-6 G u i d a a l l a p r o g r a mma z i o n e
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
Il ramo TObject
Il ramo TObject include tutti gli oggetti VCL e CLX che discendono da TObject ma
non da TPersistent. Molte potenti capacit degli oggetti della VCL e della CLX
derivano dai metodi introdotti da TObject. TObject incapsula il comportamento di
base comune a tutti gli oggetti della VCL e della CLX, introducendo metodi che
forniscono:
La capacit di rispondere quando gli oggetti vengono creati o distrutti.
Tipo della classe e informazioni sullistanza relativamente a un oggetto, e
informazioni di tipo in esecuzione (RTTI) relativamente alle propriet rese
pubbliche.
Supporto per la gestione di messaggi (VCL) oppure per gli eventi di sistema
(CLX).
TObject lantenato diretto di molte classi semplici. Le classi allinterno del ramo
TObject hanno unimportante caratteristica comune: sono transitorie. Ci significa
che queste classi non hanno un metodo per salvare lo stato in cui sono prima di
essere distrutte, vale a dire che non sono persistenti.
Uno dei gruppi principali delle classi in questo ramo la classe Exception. Questa
classe fornisce una vasta serie di classi di eccezioni predefinite per gestire
automaticamente errori di divisione per zero, errori di I/O su file, conversioni di tipo
non valide e molte altre condizioni di eccezione.
Un altro tipo di classe nel ramo TObject sono le classi che incapsulano strutture dati,
come:
TBits, una classe che memorizza un array di valori booleani.
TList, una classe di lista collegata.
TStack, una classe che mantiene un array di puntatori di tipo last-in-first-out.
TQueue, una classe che mantiene un array di puntatori di tipo first-in first-out.
Nella VCL possibile anche trovare dei wrapper per oggetti esterni come TPrinter,
che incapsula linterfaccia per la stampante Windows e TRegistry, un wrapper a basso
livello per il file di registro di sistema e per le funzioni che operano sul file di registro.
Queste sono specifiche per lambiente Windows.
TStream un buon esempio di un altro tipo di classi in questo ramo. TStream il tipo
di classe base per oggetti stream che sono in grado di leggere o scrivere su vari tipi di
supporto, come file su disco, memoria dinamica, e cos via.
Pertanto, questo ramo include molti tipi di classi differenti che risultano molto utili
agli sviluppatori.
Il ramo TPersistent
Il ramo TPersistent include tutti gli oggetti VCL e CLX che discendono da TPersistent
ma non da TComponent. La persistenza determina che cosa viene salvato con un file
form o con un modulo dati e che cosa viene caricato nella scheda o nel modulo dati
quando li si ricupera dalla memoria.
U s o d e l l e l i b r e r i e d i c l a s s i 3-7
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
Gli oggetti in questo ramo implementano le propriet per i componenti. Le propriet
vengono caricate e salvate con una scheda solo se hanno un possessore. Il possessore
deve essere qualche componente. Questo ramo introduce la funzione GetOwner che
permette di determinare il possessore della propriet.
Gli oggetti in questo ramo sono anche i primi a includere una sezione published in
cui possibile caricare e salvare automaticamente le propriet. Il metodo
DefineProperties permette anche di indicare come caricare e salvare le propriet.
Di seguito sono elencate alcune altre classi incluse nel ramo TPersistent della
gerarchia:
TGraphicsObject, una classe base astratta per oggetti grafici, come TBrush, TFont, e
TPen.
TGraphic, una classe base astratta per oggetti come TBitmap e TIcon ,in grado di
memorizzare e visualizzare immagini.
TStrings, una classe base per oggetti che rappresentano un elenco di stringhe.
TClipboard, una classe in grado di contenere testo o immagini grafiche tagliate o
copiate da unapplicazione.
TCollection, TOwnedCollection, e TCollectionItem, classi che contengono raccolte
indicizzate di elementi definiti in modo particolare.
Il ramo TComponent
Il ramo TComponent contiene oggetti che scendono da TComponent ma non da
TControl. Gli oggetti in questo ramo sono componenti che possibile manipolare
sulle schede in fase di progettazione. Essi sono oggetti persistenti che possono fare
quanto segue:
Essere visualizzati sulla Component palette e modificati nel Form designer.
Possedere e gestire altri componenti.
Caricare e salvare se stessi.
Diversi metodi in TComponent regolano il comportamento dei componenti in fase di
progettazione e quali informazioni vengono salvate con il componente. In questo
ramo della CLX viene introdotto il concetto di stream. C gestisce automaticamente la
maggior parte delle operazioni che coinvolgono gli stream. Le propriet sono
persistenti se sono state rese pubbliche e le propriet rese pubbliche sono
automaticamente soggette allo stream.
La classe TComponent introduce anche il concetto di possesso che propagato in tutta
la VCL e la CLX. Due propriet supportano il possesso: Owner e Components. Ogni
componente ha una propriet Owner che fa riferimento a un altro componente come
possessore. Un componente pu possedere altri componenti. In questo caso, tutti i
componenti posseduti sono referenziati nella propriet Array del componente.
Il costruttore di un componente richiede un singolo parametro che utilizzato per
specificare il possessore del nuovo componente. Se il possessore che viene passato
esiste, il nuovo componente viene aggiunto alla lista Components del possessore. Oltre
allutilizzo della lista Components per referenziare i componenti posseduti, questa
propriet consente anche la distruzione automatica dei componenti posseduti. Finch
3-8 G u i d a a l l a p r o g r a mma z i o n e
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
il componente ha un possessore, sar distrutto al momento della distruzione del
possessore. Ad esempio, poich TForm un discendente di TComponent, quando si
distrugger la scheda saranno distrutti tutti i componenti posseduti dalla scheda e la
memoria allocata sar liberata. In questo caso si parte dallassunto che tutti i
componenti sulla scheda siano in grado di far pulizia di s stessi correttamente nel
momento in cui vengono chiamati i rispettivi distruttori.
Se un tipo di propriet un TComponent o un discendente, il sistema di streaming
crea unistanza di quel tipo al momento della sua lettura. Se un tipo di propriet
TPersistent ma non TComponent, il sistema di streaming utilizza listanza esistente
disponibile attraverso la propriet e legge i valori delle propriet di quellistanza.
Quando si crea un file form (un file utilizzato per memorizzare le informazioni
relative ai componenti sulla scheda), il Form designer analizza ciclicamente la sua
matrice di componenti e salva tutti i componenti sulla scheda. Ogni componente sa
come scrivere nello stream (in questo caso, un file di testo) le propriet che sono state
modificate. Al contrario, quando si caricano le propriet dei componenti nel file di
scheda, il Form designer analizza ciclicamente la sua matrice di componenti e carica
ogni componente.
I tipi di classi che troverai in questo ramo includono:
TActionList, una classe che conserva un elenco di azioni utilizzate con componenti
e controlli, come elementi di menu e pulsanti.
TMainMenu, una classe che fornisce alle schede una barra di menu e i relativi
menu a discesa.
TOpenDialog, TSaveDialog, TFontDialog, TFindDialog, TColorDialog e cos via, sono
classi che rendono disponibili le finestre di dialogo utilizzate pi di frequente.
TScreen, una classe che tiene traccia di quali schede e moduli dati sono stati
istanziati dallapplicazione, qual scheda attiva, qual il controllo attivo
allinterno di quella scheda, le dimensioni e la risoluzione dello schermo, e i
cursori e i font disponibile utilizzabili dallapplicazione.
Componenti che non hanno bisogno di uninterfaccia visuale possono essere derivati
direttamente da TComponent. Per creare uno strumento come un dispositivo TTimer,
possibile derivarlo da TComponent. Questo tipo di componente risiede nella
Component palette, ma esegue funzioni interne a cui si accede mediante codice e non
viene visualizzato nellinterfaccia utente in fase di esecuzione.
Nella CLX, il ramo TComponent include anche THandleComponent. Questa la classe
di base per i componenti non visuali che richiedono un handle per un oggetto Qt
sottostante, come le finestre di dialogo e i menu.
Per i dettagli sullimpostazione delle propriet, sulla chiamata ai metodi e sulle
operazioni con gli eventi dei componenti, consultare il Capitolo 5, Operazioni con
componenti.
Il ramo TControl
Il ramo TControl formato da componenti che discendono da TControl ma non da
TWinControl (TWidgetControl nella CLX). Gli oggetti in questo ramo sono controlli
che sono oggetti visuali che lutente dllapplicazione pu vedere e manipolare in
U s o d e l l e l i b r e r i e d i c l a s s i 3-9
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
esecuzione. Tutti i controlli hanno propriet, metodi ed eventi in comune che sono
correlati allaspetto del controllo, come la posizione, il cursore associato alla finestra
del controllo (al widget nella CLX), i metodi per colorare o spostare il controllo e gli
eventi per rispondere alle azioni del mouse. I controlli non possono mai ricevere
linput da tastiera.
Mentre TComponent definisce il comportamento di tutti i componenti, TControl
definisce il comportamento per tutti i controlli visuali. Ci comprende le routine di
disegno, gli eventi standard e le relazioni contenuto-contenitore.
Tutti i controlli visuali condividono alcune propriet. Bench queste propriet siano
ereditate da TControl, esse vengo rese pubbliche, e appaiono pertanto nellObject
Inspector, solo per quei componenti per cui sono applicabili. Ad esempio, il
componente TImage non pubblica la propriet Color, poich il suo colore
determinato dallimmagine grafica visualizzata.
Ci sono due tipi di controlli:
Quelli che hanno una propria finestra (o un widget.
Quelli che utilizzano la finestra (o il widget) del proprio genitore.
I controlli che hanno una propria finestra sono detti controlli con finestra (VCL) o
controlli basati su widget (CLX) e discendono da TWinControl (TWidgetControl in
CLX). I pulsanti e le caselle di controllo rientrano in questa categoria.
I controlli che utilizzano la finestra (o il widget) del genitore sono definiti controlli
grafici e discendono da TGraphicControl. I controlli immagine ed etichetta rientrano
in questa categoria. I controlli grafici non posseggono un handle e non possono
ricevere il fuoco. Poich un controllo grafico non necessita di un handle, utilizza
meno risorse di sistema. I controlli grafici devono tracciare s stessi e non possono
essere genitori di altri controlli.
Per informazioni sugli altri controlli grafici, vedere Controlli grafici a pagina 9-19,
e per i dettagli sui diversi tipi di controlli consultare il Capitolo 9, Tipi di controlli.
Per informazioni su come interagire con i controlli in esecuzione, consultare il
Capitolo 6, Uso dei controlli.
Il ramo TWinControl/TWidgetControl
Nella VCL, il ramo TWinControl include tutti i controlli che discendono da
TWinControl. TWinControl la classe di base per tutti i controlli con finestra, che
sono elementi che si utilizzeranno nellinterfaccia utente di unapplicazione. I
controlli con finestra sono wrapper di controlli Windows.
In CLX, TWidgetControl, che sostituisce TWinControl, la classe base per tutti i
controlli widget, che sono wrappers di widget.
I controlli con finestra e i widget:
Possono ricevere il fuoco durante la fase di esecuzione di unapplicazione, il che
significa che possono ricevere linput da tastiera da parte dellutente
dellapplicazione. A confronto, altri controlli possono solo visualizzare dati.
Possono essere genitori di uno o pi controlli figlio.
3-10 G u i d a a l l a p r o g r a mma z i o n e
O g g e t t i , c o m p o n e n t i e c o n t r o l l i
Hanno un handle, o un identificatore univoco.
Il ramo TWinControl/TwidgetControl include sia i controlli che vengono tracciati
automaticamente (inclusi TEdit, TListBox, TComboBox, TPageControl, e cos via) sia i
controlli custom che devono essere tracciati da C++Builder come TDBNavigator,
TMediaPlayer (solo nella VCL), TGauge (solo nella VCL). Di solito i discendenti diretti
di TWinControl/TWidgetControl implementano controlli standard, come i campi di
editing, le caselle combinate, le caselle di riepilogo o i controlli pagina e, pertanto,
sanno gi come tracciarsi.
La classe TCustomControl viene fornita per quei componenti che richiedono un
handle di finestra ma non incapsulano un controllo standard che include la capacit
di tracciarsi. Non necessario preoccuparsi di come i controlli vengono tracciati o di
come rispondono agli eventi. C++Buider incapsula completamente e
automaticamnete questo comportamento.
4-1 G u i d a a l l a p r o g r a mma z i o n e
C a p i t o l o
4
Capitolo4Utilizzo di BaseCLX
Vi sono molte unit comuni sia alla VCL che alla CLX che forniscono il supporto
sottostante per entrambe le librerie di componenti. Collettivamente, queste unit
vengono chiamate BaseCLX. BaseCLX non include nessuno dei componenti
visualizzati sulla Component palette. Include invece moltissime classi e routine
globali che vengono usate dai componenti che vengono visualizzati sulla Component
palette. Queste classi e queste routine sono utilizzabili anche nel codice delle proprie
applicazioni o durante la scrittura delle proprie classi.
_
Le routine globali che compongono la BaseCLX sono anche dette libreria di
esecuzione. Non confondere queste routine con la libreria di esecuzione del C++.
Molte di queste eseguono funzioni simili a quelle nella libreria di esecuzione del
C++, ma possono essere distinte in quanto i nomi delle funzioni iniziano con una
lettera maiuscola e vengono dichiarate nello header di una unit.
Le sezioni seguenti trattano molte classi e routine che compongono BaseCLX e ne
illustrano i possibili utilizzi. Fra questi vi sono:
Uso di stream
Operazioni con i file
Operazioni con i file .ini
Operazioni con le liste
Operazioni con elenchi di stringhe
Operazioni con stringhe
Conversione di misure
Creazione di spazi di disegno
_
Questo elenco di attivit non esaustivo. La libreria di esecuzione in BaseCLX
contiene molte routine in grado di eseguire compiti non citati in questa trattazione.
Fra qyesti vi sono una serie di funzioni matematiche (definite nella unit Math), varie
routine per operare con valori di data/ora (definiti nelle unit SysUtils e DateUtils) e
routine per operare con i Variant di Object Pascal (definite nella unit Variants).
4-2 G u i d a a l l a p r o g r a mma z i o n e
U s o d i s t r e a m
Uso di stream
Gli stream sono classi che permettono di leggere e scrivere dati. Essi forniscono
uninterfaccia comune per la lettura e la scrittura su svariati supporti come memoria,
stringhe, socket e campi BLOB nei database. Esistono numerose classi stream, che
discendono tutte da TStream. Ogni classe stream specifica per un tipo di supporto.
Ad esempio, TMemoryStream legge o scrive su unimmagine in memoria, TFileStream
legge o scrive su un file.
Uso di stream per leggere o scrivere dati
Le classi stream condividono tutte svariati metodi per la lettura e la scrittura di dati.
Questi metodi sono distinguibili per il fatto che compiono quanto segue:
Restituiscono il numero di byte letti o scritti.
Richiedono che sia noto il numero di byte.
Generano uneccezione sullerrore.
Metodi di stream per lettura e scrittura
Il metodo Read legge dallo stream un numero specificato di byte, iniziando dalla sua
posizione corrente (Position), caricandoli in un buffer. La lettura quindi sposta la
posizione corrente del numero di byte effettivamente trasferiti. Il prototipo per Read
vIttaaI Iat __?aatcaII ci.veIi ..c, Iat ,
Read utile quando il numero di byte del file non noto. Read restituisce il numero di
byte effettivamente trasferiti, che pu essere minore di Count se lo stream non
conteneva Count byte di dati precedenti alla posizione corrente.
Write una funzione che scrive Count byte dal buffer nel file associato allo stream,
partendo dalla Position corrente. Il prototipo per Write :
vIttaaI Iat __?aatcaII cceaat veIi ..c, Iat ,
Dopo la scrittura nel file, Write sposta la posizione corrente del numero di byte scritti,
e restituisce il numero di byte effettivamente scritti, che pu essere minore di Count
se incontra la fine del buffer oppure se lo stream non pu accettare pi byte.
Le procedure complementari sono ReadBuffer e WriteBuffer che, a differenza di Read e
Write, non restituiscono il numero di byte letti o scritti. Queste procedure sono utili
nei casi in cui il numero di byte noto e sono necessarie, per esempio, per la lettura
delle strutture. ReadBuffer e WriteBuffer generano uneccezione (EReadError e
EWriteError) se il Count byte non corrisponde esattamente. Ci in contrasto con i
metodi Read e Write, che possono restituire un numero di byte diverso dal valore
chiesto. I prototipi per ReadBuffer e WriteBuffer sono:
vIttaaI Iat __?aatcaII ci...cveIi ..c, Iat ,
vIttaaI Iat __?aatcaII c..cceaat veIi ..c, Iat ,
Questi metodi chiamano i metodi Read e Write, per eseguire una lettura e una
scrittura effettive.
4-3 G u i d a a l l a p r o g r a mma z i o n e
U s o d i s t r e a m
Lettura e scrittura di componenti
TStream definisce metodi specializzati, ReadComponent e WriteComponent, per la
lettura e la scrittura di componenti. possibile utilizzarli nelle applicazioni come un
modo per salvare i componenti e le rispettive propriet quando li si crea o li si
modifica in fase di esecuzione.
ReadComponent e WriteComponent sono i metodi che lIDE utilizza per leggere o
scrivere i componenti nei file scheda. Durante la lettura o la scrittura da o in un file
scheda, le classi stream operano con le classi TFiler, TReader e TWriter, per leggere
oggetti dal file scheda o per scriverli su disco. Per ulteriori informazioni sulluso del
sistema di streaming dei componenti, consultare nella guida di riferimento in linea le
classi TStream, TFiler, TReader, TWriter, e TComponent.
Copia di dati da uno stream a un altro
Quando si copiano dati da uno stream a un altro, non necessario leggere
esplicitamente e poi scrivere i dati. possibile invece utilizzare il metodo CopyFrom,
come illustrato nellesempio seguente.
Lapplicazione include due controlli di testo (From e To) e un pulsante Copy File.
veIi __?aatcaII .,cc.ccc .c.c
__?IaaII,
ieIete sci..,
__?IaaII,
ieIete sci.,
I? ..cx.ciccc
icc>i, .ciccc>.i.c - ' s ' - L..ciccc..c - ' ccs
s.c',
eIae
.sc.ciccc,
_
Nelle applicazioni multipiattaforma, tutti i nomi di percorso scritti direttamente nel
codice vanno sostituiti con il percorso corretto per il sistema, oppure si devono
utilizzare variabili di ambiente per rappresentare tali percorsi (sulla pagina
Environment Variables selezionare il comando Tools| Environment Options.
Cambiamento del nome di un file
Per modificare un nome file, utilizzare la funzione RenameFile:
exteta .~~ beeI __?aatcaII ci.ccceaat ~s. ..i.c, ceaat ~s.
.c..i.c,
RenameFile cambia il nome, identificato da OldFileName, con il nome specificato da
NewFileName. Se loperazione ha successo, RenameFile restituisce true. Se non
possibile rinominare il file, (ad esempio, se un file chiamato NewFileName esiste gi),
RenameFile restituisce false. Ad esempio:
I? ci.cc'.~..','..~..'
.s' ci. .c',
impossibile rinominare (spostare) un file nelle unit usando RenameFile. Prima
bisogna copiare il file e poi cancellare il vecchio.
_
RenameFile nella libreria runtime BaseCLX un wrapper per la funzione MoveFile
delle API di Windows, e pertanto nemmeno MoveFile funzioner sulle varie unit.
Routine per data-ora
Le routine FileAge, FileGetDate e FileSetDate operano sui valori data-ora del sistema
operativo. FileAge restituisce la data e lora di registrazione di un file, o -1 se il file non
esiste. FileSetDate imposta la data e lora di registrazione per un determinato file, e
restituisce zero se lesito positivo, o un codice di errore se lesito negativo.
4-10 G u i d a a l l a p r o g r a mma z i o n e
O p e r a z i o n i c o n f i l e i n i e c o n i l R e g i s t r o d i s i s t e m a
FileGetDate restituisce la data e lora di registrazione per il file specificato o -1 se
lhandle non corretto.
Analogamente a molte altre routine per il trattamento dei file, FileAge utilizza un
nome di file di tipo string. FileGetDate e FileSetDate, tuttavia, utilizzano un parametro
integer che accetta un handle di file. Per ottenere lhandle di file possibile
Utilizzare la funzione FileOpen o FileCreate per creare un nuovo file o aprire un file
esistente. Sia FileOpen che FileCreate restituiscono un handle di file.
Istanziare TFileStream per creare o aprire un file. Quindi utilizzarne la propriet
Handle. Per ulteriori informazioni, vedere Uso degli stream di file a pagina 4-5.
Copia di un file
La libreria runtime non fornisce tutte le routine per copiare un file. Comunque, se si
stanno scrivendo applicazioni per lambiente Windows, per chiamare un file,
possibile chiamare direttamente la funzione API CopyFile di Windows. Come la
maggior parte delle routine della libreria runtime , CopyFile accetta un nome di file
come parametro, e non un handle di file. Quando si copia un file, occorre fare
attenzione che nel nuovo file vengano copiati gli attributi del file esistente, ma non
quelli relativi alla sicurezza. CopyFile utile anche nello spostamento dei file nelle
unit, perch n la funzione RenameFile n la funzione API MoveFile possono
rinominare oppure spostare i file nelle unit. Per ulteriori informazioni, consultare la
Guida in linea di Microsoft Windows.
Operazioni con file ini e con il Registro di sistema
Molte applicazioni utilizzano i file ini per memorizzare le informazioni di
configurazione. BaseCLX include due classi per le operazioni con i file ini: TIniFile e
TMemIniFile. Lutilizzo dei file ini ha il vantaggio che possono essere utilizzati in
applicazioni multipiattaforma e sono semplici da leggere e da modificare. Per
informazioni su queste classi, vedere Utilizzo di TIniFile e di TMemIniFile a
pagina 4-11 per ulteriori informazioni.
Molte applicazioni Windows sostituiscono lutilizzo di file ini con il Registro di
sistema. Il file di registro di sistema di Windows un database gerarchico che agisce
come uno spazio di memoria centralizzato per informazioni di configurazione . La
VCL include classi per operare con il Registro di sistema. Bench dal punto di vista
tecnico non facciano parte di BaseCLX (poich essi sono disponibili solo in
Windows), due di queste classi, TRegistryIniFile e TRegistry, sono trattati in questa
sezione grazie alla loro somiglianza con le classi usate per operare con i file ini.
TRegistryIniFile utile per applicazioni multipiattaforma, poich condivide un
antenato comune (TCustomIniFile) con le classi che operano con file ini. Se ci si limita
ad utilizzare i metodi dellantenato comune (TCustomIniFile) lapplicazione pu
funzionare su entrambe le applicazioni con pochissimo codice condizionale.
TRegistryIniFile trattato in Utilizzo di TRegistryIniFile a pagina 4-12.
Nel caso di applicazioni che non sono multipiattaforma, possibile utilizzare la
classe TRegistry. Le propriet e i metodi di TRegistry hanno nomi che corrispondono
4-11 G u i d a a l l a p r o g r a mma z i o n e
O p e r a z i o n i c o n f i l e i n i e c o n i l R e g i s t r o d i s i s t e m a
pi direttamente al modo in cui organizzato il Registro di sistema, in quanto non
necessario che siano compatibili con le classi per i file ini. TRegistry trattato in Uso
di TRegistry a pagina 4-12.
Utilizzo di TIniFile e di TMemIniFile
Il formato dei file ini ancora molto diffuso, e molti file di configurazione (come il
file DSK delle impostazioni del Desktop) sono in questo formato. Questo formato
particolarmente utile in applicazioni multipiattaforma, in cui impossibile fare
affidamento su un Registro di sistema per la memorizzazione delle informazioni di
configurazione. BaseCLX fornisce due classi, TIniFile e TMemIniFile, per semplificare
le operazioni di lettura e di scrittura con i file ini.
In Linux, TMemIniFile e TIniFile sono identiche. Su Windows, TIniFile opera
direttamente sul file ini su disco mentre TMemIniFile registra tutte le modifiche in
memoria e non le scrive sul disco finch non si chiama il metodo UpdateFile.
Quando si crea unistanza delloggetto TIniFile oppure TMemIniFile , si passa al
costruttore il nome del file INI come parametro. Se il file non esiste, viene creato
automaticamente. Sar quindi possibile leggere i valori utilizzando metodi di lettura
come ReadString,ReadDate ReadInteger o ReadBool. In alternativa, se si desidera leggere
unintera sezione del file ini, possibile utilizzare il metodo ReadSection.
Analogamente, possibile scrivere valori utilizzando metodi come WriteBool,
WriteInteger, o WriteString.
Di seguito riportato un esempio di lettura da un file ini delle informazioni di
configurazione nel costruttore di una scheda e di scrittura dei valori nel gestore di
evento OnClose.
__?aatcaII ...,c .c ..c
Lc ,
aev Lc iccx ~,,ci>xc.i.c, 'L.L' ,
, >ci.Lcc '.', ',', ,
c. >ci.Lcc '.', 'c.', ,
i, >ci.. '.', 'i,',
'c.i i,' ,
>ci. '.', 'L.ix', ?aIae
...ic .s.ix..c.
...ic .s..i,
ieIete ,
Lc ,
aev Lciccx ~,,ci>xc.i.c, 'L.L' ,
>cLcc '.', ',', , ,
>cLcc '.', 'c.', c. ,
>c. '.', 'i,', i, ,
>c '.', 'L.ix',
...ic .s.ix..c. ,
4-12 G u i d a a l l a p r o g r a mma z i o n e
O p e r a z i o n i c o n f i l e i n i e c o n i l R e g i s t r o d i s i s t e m a
ieIete ,
Ognuna delle routine Read accetta tre parametri. Il primo parametro identifica la
sezione del file ini. Il secondo parametro identifica il valore che si desidera leggere e
il terzo un valore predefinito nel caso la sezione o il valore non esista nel file ini.
Esattamente come i metodi Read gestiscono le situazioni in cui una sezione o un
valore non esistono, le routine Write creano la sezione e/o il valore nel caso esse non
esistano. La prima volta che viene eseguito, il codice di esempio crea un file INI
simile al seguente:
,.
,
c..
i,c.i i,
L.ix
Alle successive esecuzioni dellapplicazione, i valori del file ini saranno letti al
momento della creazione della scheda, e riscritti nel file nellevento OnClose.
Utilizzo di TRegistryIniFile
La maggior parte delle applicazioni a 32-bit memorizzano le proprie informazioni nel
file di registro invece che nel file ini poich il file di registro gerarchico e non
soggetto ai limiti sulle dimensione dei file ini. Se si abituati ad utilizzare i file ini e si
vogliono spostare invece le informazioni di configurazione nel file di registro,
possibile utilizzare la classe TRegistryIniFile. Si potrebbe anche volere utilizzare
TRegistryIniFile in applicazioni multipiattaforma nel caso si voglia utilizzare il
Registro di sistema in Windows e un file ini in Linux. possibile scrivere la maggior
parte dellapplicazione in modo che utilizzi il tipo TCustomIniFile. necessario solo
condizionare il codice che crea unistanza di TRegistryIniFile (in Windows) o
TMemIniFile (in Linux) e assegnarla al TCustomIniFile utilizzato dallapplicazione.
TRegistryIniFile progettata per far s che le voci del file di registro assomiglino alle
voci del file INI. Tutti i metodi di TIniFile e di TMemIniFile (lettura e scrittura)
esistono in TRegistryIniFile.
Quando si costruisce un oggetto TRegistryIniFile , il parametro che si passa (il nome
file per un oggetto IniFile oppure un oggetto TmemIniFile) diventa un valore di
chiave nelle chiavi utente nel file di registro e tutte le sezioni e i valori dipendono da
quella radice. Tutte le sezioni e i valori sono ramificazioni di quella radice.
TRegistryIniFile semplifica notevolmente linterfaccia del file di registro, tanto che lo
si utilizzer al posto del componente di TRegistry, anche se non si sta convertendo del
codice esistente o scrivendo unapplicazione cross-platform.
Uso di TRegistry
Se si sta scrivendo unapplicazione solamente per Windows e la struttura del
Registro di sistema familiare, possibile utilizzare TRegistry. A differenza di
TRegistryIniFile, che utilizza le stesse propriet e metodi degli altri componenti per
file ini, le propriet e i metodi di TRegistry corrispondono pi direttamente alla
struttura del Registro di sistema. Ad esempio, TRegistry permette di specificare sia la
U t i l i z z o d i B a s e C L X 4-13
O p e r a z i o n i c o n l e l i s t e
chiave radice che la sottochiave, mentre TRegistry assume HKEY_CURRENT_USER
come chiave radice. Oltre ai metodi per aprire, chiudere, salvare, spostare, copiare e
cancellare chiavi, TRegistry permette di specificare il livello di accesso che si desidera
utilizzare.
_
TRegistry non utilizzabile per programmi multipiattaforma.
Lesempio seguente recupera un valore da una voce del file di registro:
-c.c cs,,>
~s. ccsic~s. c.i.c
~s. .,
cs cs aev cs_~,
tt,
cs>c -_~_.~-L.,
isc cccisc .c . .i ccic . .cs cxs
cs>,ccc.i.c,.isc,
. cs>ci..'~',
__?IaaII,
ieIete cs,
tetata .,
__?IaaII,
ieIete c.,s, .cs c s ccc
4-18 G u i d a a l l a p r o g r a mma z i o n e
O p e r a z i o n i c o n e l e n c h i d i s t r i n g h e
Elenchi di stringhe a lungo termine
Se un elenco di stringhe deve essere disponibile in un qualunque momento durante
lesecuzione dellapplicazione, costruire lelenco allavvio dellapplicazione e
distruggerlo prima che lapplicazione termini.
1 Nel file unit della scheda principale dellapplicazione, aggiungere un campo di
tipo TStrings alla dichiarazione della scheda.
2 Scrivere un costruttore per la scheda principale che viene eseguito prima che la
scheda appaia. Dovrebbe creare un elenco di stringhe e dovrebbe assegnarlo al
campo dichiarato al punto precedente.
3 Scrivere un gestore di evento che liberi lelenco di stringhe nellevento OnClose
della scheda.
Questo esempio utilizza un elenco di stringhe a lungo termine per registrare i clic che
lutente fa con il mouse sulla scheda principale, quindi salva lelenco in un file prima
del termine dellapplicazione.
-c.c c>
-,i.i .s,
-c.c ''
-,i.i ,ic.ics.i_
-,i.i cscc '...'
. .,
__?aatcaII ...,c .c
..c
c.s>.icciccx~,,ci>xc.i.c, '',.ic c s
ieIete c.s,
icc , .,,
c.s>~...i'c. i `., `.',,~~.L. ,i.. i s c s
.c . .c,
cc cc.,.,.>.ic. .,.>.ic-c .,
.>cc,
?et Iat , .c.>cs>, --
.>iis>cx.,. -
.>iis>cx-c.c.>cs>.s,,
.c.>cs>.s,,
.>iis>s> cic.,
.>iis>i.ccc,
.>.c,
tetata ~ic . ,
tetata ~ic - .,
tetata ~ic .,
tetata ~ic - .,
tetata.~ic ic, .,
Il problema che questo approccio richiede dei parametri aggiuntivi per la funzione
di conversione, il che significa che impossibile semplicemente registrare la stessa
funzione per ogni valuta europea. Per evitare di dovere scrivere due nuove funzioni
di conversione per ogni valuta europea, possibile utilizzare le stesse due funzioni
trasformandole in membri di una classe.
Creazione della classe di conversione
La classe deve essere un discendente di TConvTypeFactor. TConvTypeFactor definisce
due metodi, ToCommon e FromCommon, per la conversione in entrambi i sensi delle
unit di misura di base di una famiglia di conversione (in questo caso, da e in Euro).
Come nel caso delle funzioni che si utilizzano direttamente quando si registra
ununit di conversione, questi metodi non hanno alcun parametro aggiuntivo e
pertanto necessario fornire, sotto forma di membri privati della classe di
conversione, il numero di cifre per larrotondamento e il fattore di conversione. Lo si
pu vedere nellesempio EuroConv nella directory demos\ConvertIt (vedere
euroconv.pas):
cIaaa tscL:xtLsxsx:::ox ,cic pabIIc s,cic
ptIvate
U t i l i z z o d i B a s e C L X 4-33
C o n v e r s i o n e d i m i s u r e
.ic .,
pabIIc
__?aatcaII ,cicceaat i. ~i.,
ceaat ~s. ~csc,, ceaat ieabIe ~ic, ceaat .ic ~.,
,cic~i., ~csc,, ~ic,
vIttaaI ieabIe ..ceaat ieabIe ~ic,
vIttaaI ieabIe ...ceaat ieabIe ~ic,
. ~.,
iis>.c> cc,
iis>.c , ,
iis>c , ,
iis>s> cicc,
iis>>.i.c '~i',
iis>cx iis>.c.sx, iis>.c.s,'s s c c. . c c' ,
c,i,
I? .cc. .i . c. c ,cssc.
I? .cc>Lcs.__cIaaaIicsx
~ccc, ttae,
U s o d e i c o n t r o l l i 6-3
I m p l e m e n t a z i o n e d e l d r a g a n d d r o p n e i c o n t r o l l i
Rilascio di elementi
Se un controllo indica che pu accettare un elemento trascinato, necessario gestire
lelemento che viene rilasciato su di esso. Per gestire gli elementi rilasciati, si deve
collegare un gestore allevento OnDragDrop del controllo che accetta lelemento
rilasciato. Come levento drag-over, levento drag-and-drop indica la sorgente
dellelemento trascinato e le coordinate del cursore del mouse sul controllo
accettante. Lultimo parametro consente di monitorare il percorso compiuto da un
oggetto durante il trascinamento; ad esempio, si potrebbe utilizzare questa
informazione per modificare il colore dei componenti, man mano che loggetto passa
sopra di essi.
Nellesempio che segue, una vista ad albero della directory,che accetta elementi
trascinati da una casella di riepilogo di file, risponde spostando i file nella directory
su cui questi vengono rilasciati.
veIi __?aatcaII .ccc.i,ccc .c.c, ccc .cc,
Iat ., Iat
I? .cc>Lcs.__cIaaaIicsx
I? ic
csx>,.ic,
,
6-4 G u i d a a l l a p r o g r a mma z i o n e
I m p l e m e n t a z i o n e d e l d r a g - a n d - d o c k n e i c o n t r o l l i
Personalizzazione delle operazioni di drag-and-drop con un oggetto
drag
Per personalizzare il comportamento drag-and-drop delloggetto possibile usare un
discendente di TDragObject. Per impostazione predefinita, gli eventi drag-over e
drag-and-drop indicano la sorgente dellelemento trascinato e le coordinate del
cursore del mouse sul controllo accettante. Per ottenere altre informazioni dello stato,
derivare da TDragObject o da TDragObjectEx(solo per VCL) un oggetto drag custom e
ridefinirne i metodi virtuali. Creare loggetto drag custom nellevento OnStartDrag.
Di solito, il parametro sorgente degli eventi drag-over e drag-and-drop il controllo
che inizia loperazione di trascinamento. Se unoperazione che coinvolge gli stessi
tipi di dati pu essere iniziata da tipi di controllo differenti, il sorgente deve
supportare ciascun tipo di controllo. Comunque, se si utilizza un discendente di
TDragObject, il sorgente lo stesso oggetto drag; se ogni controllo crea lo stesso tipo
di oggetto drag nel proprio evento OnStartDrag, il controllo di destinazione deve
essere in grado di gestire un solo tipo di oggetto. Gli eventi drag-over e drag-and-
drop possono riferire se il sorgente un oggetto drag, invece del controllo,
chiamando la funzione IsDragObject.
I discendenti di TDragObjectEx (solo per VCL) vengono liberati automaticamente al
contrario dei discendenti di TDragObject. Se si hanno discendenti di TDragObject che
non vengono liberati esplicitamente, possibile modificarli in modo che discendano
invece da TDragObjectEx in modo da evitare perdite di memoria.
Gli oggetti drag consentono di trascinare elementi fra una scheda implementata nel
file EXE principale dellapplicazione e una scheda implementata utilizzando una
DLL, o fra schede implementate utilizzando DLL differenti.
Modifica del puntatore di trascinamento del mouse
Impostando la propriet DragCursor del componente sorgente possibile
personalizzare laspetto del puntatore del mouse durante le operazioni di
trascinamento).
Implementazione del drag-and-dock nei controlli
I discendenti di TWinControl possono agire come posizioni di aggancio e i
discendenti di TControl possono, invece, comportarsi come finestre figlio che
vengono agganciate alle posizioni specificate. Per esempio, per fornire una posizione
di aggancio al margine sinistro di una finestra scheda, si deve allineare un riquadro
al margine sinistro della scheda e renderlo una posizione di aggancio. Quando i
controlli agganciabili vengono trascinati nel riquadro e vengono rilasciati, diventano
controlli figlio del riquadro.
Trasformazione di un controllo con finestra in una posizione di aggancio
Trasformazione di un controllo in un figlio agganciabile
Controllo della modalit di aggancio dei controlli figlio
U s o d e i c o n t r o l l i 6-5
I m p l e m e n t a z i o n e d e l d r a g - a n d - d o c k n e i c o n t r o l l i
Controllo della modalit di sgancio dei controlli figlio
Controllo della modalit di risposta dei controlli figlio alle operazioni drag-and-
dock
_
Le propriet drag-and-dock sono disponibili nella VCL ma non in CLX.
Trasformazione di un controllo con finestra in una posizione di
aggancio
Per rendere un controllo finestra una posizione di aggancio:
1 Impostare la propriet DockSite a true.
2 Se loggetto della posizione di aggancio non deve apparire se non contiene un
client agganciato, impostare la sua propriet AutoSize a true. Quando AutoSize
true, la posizione di aggancio ha come dimensione 0 finch non accetta un
controllo figlio per laggancio. Quindi, viene ridimensionata in modo tra trovare
posto intorno al controllo figlio.
Trasformazione di un controllo in un figlio agganciabile
Per trasformare un controllo in un figlio agganciabile:
1 Impostare la sua propriet DragKind a dkDock. Quando DragKind dkDock, il
trascinamento del controllo lo sposta in una nuova posizione di aggancio o sgancia
il controllo in modo che diventi una finestra mobile. Quando DragKind dkDrag
(impostazione predefinita), il trascinamento del controllo avvia unoperazione
drag-and-drop che deve essere implementata usando gli eventi OnDragOver,
OnEndDrag e OnDragDrop.
2 Impostare la sua propriet DragMode a dmAutomatic. Quando DragMode
dmAutomatic, il trascinamento (per loperazione drag-and-drop o di aggancio, in
funzione di DragKind) viene iniziato automaticamente quando lutente avvia il
trascinamento del controllo con il mouse. Quando DragMode dmManual, ancora
possibile iniziare unoperazione drag-and-dock (o drag-and-drop) chiamando il
metodo BeginDrag.
3 Impostare la sua propriet FloatingDockSiteClass per indicare il discendente
TWinControl che ospiter il controllo quando sar sganciato e lasciato come
finestra mobile. Quando il controllo viene rilasciato in una posizione diversa da
quella di aggancio, viene creato dinamicamente un controllo finestra di questa
classe, che diventa il genitore del figlio agganciabile. Se il controllo del figlio
agganciabile un discendente di TWinControl, non necessario creare una distinta
posizione di aggancio mobile per ospitare il controllo, anche se pu essere
opportuno specificare una scheda per ottenere un bordo e una barra del titolo. Per
omettere una finestra contenitore dinamica, si deve impostare
FloatingDockSiteClass alla stessa classe del controllo; in questo modo diventer una
finestra mobile senza alcun genitore.
6-6 G u i d a a l l a p r o g r a mma z i o n e
I m p l e m e n t a z i o n e d e l d r a g - a n d - d o c k n e i c o n t r o l l i
Controllo della modalit di aggancio dei controlli figlio
Un posizione di aggancio accetta automaticamente i controlli figlio quando vi
vengono rilasciati sopra. Per la maggior parte dei controlli il primo figlio viene
agganciato per riempire larea client, il secondo la divide in due regioni distinte, e
cos via. I controlli pagina agganciano i figli in nuovi fogli di tabulazione (o fondono i
fogli di tabulazione se il figlio un altro controllo pagina).
Tre eventi consentono alle posizioni di aggancio di limitare ulteriormente il modo in
cui vengono agganciati i controlli figlio:
__ptepett, c.cL.c c.cL. teaic.cL., vtItec.cL.,
t,peie? veIi __?aatcaII __cIeaate c.cL.c.sc.ccc .c.c,
c.c, ..scc L.ccccc, ceaat ..s. .sc.s, beeI ic.,
OnGetSiteInfo si verifica nella posizione di aggancio quando lutente trascina un figlio
agganciabile sul controllo. Questo evento consente alla posizione di indicare se
accetter o meno il controllo specificato dal parametro DockClient come figlio, e in
caso di risposta positiva, dove deve essere agganciato il figlio. Quando si verifica
OnGetSiteInfo, InfluenceRect viene inizializzato alle coordinate dello schermo della
posizione di aggancio, e CanDock viene inizializzato a true. Modificando
InfluenceRect, pu essere creata una regione di aggancio pi limitata, mentre il figlio
pu essere rifiutato impostando CanDock a false.
__ptepett, c.cc c.c teaic.c, vtItec.c,
t,peie? veIi __?aatcaII __cIeaate c.cc.sc.ccc .c.c,
ic.ccc .cc, Iat ., Iat , i.ic .ic, beeI ~ccc,,
OnDockOver si verifica nella posizione di aggancio quando lutente trascina sul
controllo un figlio agganciabile. Corrisponde allevento OnDragOver in una normale
operazione drag-and-drop. Deve essere utilizzato per segnalare che il figlio pu
essere rilasciato dalla posizione di aggancio, impostando il parametro Accept. Se il
controllo agganciabile stato rifiutato dal gestore di evento OnGetSiteInfo (forse
perch il tipo di controllo era errato), levento OnDockOver non verr attivato.
__ptepett, c.,c c., teaic.,, vtItec.,,
t,peie? veIi __?aatcaII __cIeaate c.,c.sc.ccc .c.c,
ic.ccc .cc, Iat ., Iat ,
OnDockDrop si verifica nella posizione di aggancio quando lutente rilascia un figlio
agganciabile sul controllo. Corrisponde allevento OnDragDrop in una normale
operazione drag-and-drop. Deve essere utilizzato per eseguire un adattamento
necessario per accettare il controllo come controllo figlio. Laccesso al controllo figlio
pu essere ottenuto usando la propriet Control del TDockObject specificato dal
parametro Source.
Controllo della modalit di sgancio dei controlli figlio
Una posizione di controllo consente automaticamente ai controlli figlio di essere
sganciati quando vengono trascinati ed hanno la propriet DragMode impostata a
dmAutomatic. Le posizioni di aggancio possono rispondere quando i controlli figlio
U s o d e i c o n t r o l l i 6-7
O p e r a z i o n i c o n t e s t o n e i c o n t r o l l i
vengono trascinati fuori, e possono anche impedire lo sganciamento in un gestore di
evento OnUnDock:
__ptepett, c.c c. teaic., vtItec.,
t,peie? veIi __?aatcaII __cIeaate c.c.sc.ccc .c.c,
c, .c.ic, beeI ~.,
Il parametro Client indica il controllo figlio che sta tentando lo sganciamento, mentre
il parametro Allow consente alla posizione di aggancio (Sender) di rifiutare lo
sganciamento. Quando si implementa un gestore di evento OnUnDock, pu risultare
utile conoscere quali altri figli (eventuali) sono al momento agganciati. Queste
informazioni sono disponibili nella propriet a sola lettura DockClients, che un array
indicizzato di TControl. Il numero di client agganciati viene indicato dalla propriet a
sola lettura DockClientCount.
Controllo della modalit di risposta dei controlli figlio alle operazioni
drag-and-dock
I controlli figlio agganciabili hanno due eventi che si verificano durante le operazioni
drag-and-dock: OnStartDock, analogo allevento OnStartDrag di unoperazione drag-
and-drop, consente al controllo figlio agganciabile di creare un oggetto
trascinamento personalizzato. OnEndDock, analogamente allevento OnEndDrag, si
verifica al termine del trascinamento.
Operazioni con testo nei controlli
Le sezioni seguenti spiegano come utilizzare le varie funzioni dei controlli RichEdit e
Memo. Alcune funzioni qui descritte valgono anche per i controlli di editing.
Impostazione dellallineamento del testo
Aggiunta di barre di scorrimento in fase di esecuzione
Aggiunta delloggetto clipboard
Selezione di testo
Selezione di tutto il testo
Operazioni taglia, copia e incolla del testo
Cancellazione del testo selezionato
Disattivazione delle voci di menu
Preparazione di un menu a comparsa
Gestione dellevento OnPopup
Impostazione dellallineamento del testo
In un componente RichEdit o Memo, il testo pu essere allineato a sinistra, a destra o
al centro. Per cambiare lallineamento del testo, impostare la propriet Alignment del
componente di editing. Lallineamento ha effetto solo se la propriet WordWrap
true; se lallineamento alla riga successiva disattivato, non esiste alcun margine
rispetto al quale effettuare lallineamento.
6-8 G u i d a a l l a p r o g r a mma z i o n e
O p e r a z i o n i c o n t e s t o n e i c o n t r o l l i
Ad esempio, il codice seguente tratto dallesempio RichEdit imposta lallineamento a
seconda del pulsante scelto:
avItcaIatc.>.iii,>~.c
c.>ci.ccc,
Iat ~..c.L.cx,
caat c.i.c,1 '~',
?et ci c ~, c ., c-- i ,sscc .cs
c.i.c, c,
avItca cc,cc.i.c
I? Iatc ~ c.s. cc .c
cs>Lc.L.cx ~..c.L.cx, c .i.c i c cc s c.
U s o d e i c o n t r o l l i 6-15
A g g i u n t a d i g r a f i c i a i c o n t r o l l i
Disegno di elementi owner-draw
Le viste elenco e i controlli pagina hanno una propriet di nome OwnerDraw che
attiva o disattiva il tracciamento predefinito. Invece, il sistema operativo genera
eventi per ciascun elemento visibile del controllo. Lapplicazione gestisce gli eventi
per disegnare gli elementi.
Per disegnare gli elementi in un controllo owner-draw, occorre fare quanto descritto
qui di seguito per ciascun elemento visibile del controllo. Si deve usare un unico
gestore di evento per tutti gli elementi.
1 Dimensionare, se necessario, lelemento.
Gli elementi con le stesse dimensioni (per esempio, con uno stile casella di
riepilogo di lsOwnerDrawFixed), non richiedono alcun dimensionamento.
2 Disegno dellelemento.
Dimensionamento degli elementi owner-draw
Prima di dare allapplicazione la possibilit di disegnare tutti gli elementi di un
controllo owner-draw variabile, il sistema operativo genera un evento a misura di
elemento. Questo evento comunica allapplicazione dove lelemento appare sul
controllo.
C++Builder determina le dimensioni dellelemento (generalmente, sono grandi a
sufficienza per visualizzare il testo dellelemento con il font corrente). Lapplicazione
pu gestire levento e modificare il rettangolo scelto. Per esempio, se si prevede di
sostituire una bitmap per il testo dellelemento, bene modificare il rettangolo in
modo che abbia le dimensioni del bitmap. Se si desidera un bitmap e il testo, si deve
regolare il rettangolo in modo che sia abbastanza grande per entrambi.
Per modificare le dimensioni di un elemento owner-draw, occorre collegare un
gestore allevento a misura di elemento nel controllo owner-draw. Il nome
dellevento varia in funzione del controllo. Le caselle di riepilogo e quelle combinate
usano OnMeasureItem. Le griglie non hanno alcun evento a misura di elemento.
Il dimensionamento di un evento ha due importanti parametri: il numero di indice
dellelemento e le dimensioni dellelemento stesso. Le dimensioni sono variabili:
lapplicazione pu crearle pi piccole o pi grandi. Le posizioni degli elementi
successivi dipendono dalle dimensioni di quelli precedenti.
Per esempio, in una casella di riepilogo owner-draw variabile, se lapplicazione
imposta laltezza del primo elemento a cinque pixel, il secondo elemento dister sei
pixel, e cos via. Sia nelle caselle di riepilogo sia in quelle combinate lunico aspetto
dellelemento che lapplicazione pu cambiare laltezza. La larghezza sempre
quella del controllo.
Le griglie owner-draw non possono modificare le dimensioni delle loro celle quando
disegnano. Le dimensioni di ciascuna riga e di ciascuna colonna vengono impostate
prima di disegnare dalle propriet ColWidths e RowHeights.
6-16 G u i d a a l l a p r o g r a mma z i o n e
A g g i u n t a d i g r a f i c i a i c o n t r o l l i
Il seguente codice, collegato allevento OnMeasureItem di una casella di riepilogo
owner-draw, aumenta laltezza di ciascun elemento dellelenco per contenere la sua
bitmap associata.
veIi __?aatcaII .sx.ciscLc. , Iat L.cx,
Iat -c c i -c s ,issc. c c.cccc
_
Occorre convertire gli elementi dalla propriet Objects nellelenco di stringhe. Objects
una propriet di tipo TObject che pertanto pu contenere qualsiasi tipo di oggetto.
Quando si recuperano gli oggetti dallarray, occorre riconvertirli nel tipo effettivo
degli elementi.
Disegno di elementi owner-draw
Quando unapplicazione ha bisogno di disegnare o di ridisegnare un controllo
owner-draw, il sistema operativo genera eventi draw-item per ciascun elemento
visibile del controllo. A seconda del controllo, lelemento pu anche ricevere gli
eventi di tracciamento per lelemento nel suo complesso o per i singoli sottoelementi.
Per disegnare un elemento di un controllo owner-draw, si deve collegare un gestore
allevento draw-item per quel controllo.
I nomi degli eventi per il disegno personalizzato di solito iniziano con uno dei
seguenti modi:
OnDraw, come OnDrawItem o OnDrawCell
OnCustomDraw, come OnCustomDrawItem
OnAdvancedCustomDraw, come OnAdvancedCustomDrawItem
Levento draw-item contiene i parametri che indentificano lelemento da disegnare, il
rettangolo in cui disegnare e solitamente alcune informazioni sullo stato
dellelemento (per esempio, se lelemento ha il fuoco). Lapplicazione gestisce ciascun
evento rappresentando lelemento appropriato nel rettangolo dato.
Per esempio, il codice seguente mostra come disegnare gli elementi in una casella di
riepilogo che ha delle bitmap associate a ciascuna stringa. Il codice collega questo
gestore allevento OnDrawItem per la casella di riepilogo:
veIi __?aatcaII .sxi.Lc. , Iat L.cx,
cc cc, .ci..ic .ic
.i, .i, .i, sx>Lc.s>cccs,L.cx,
sx>iis>i.c., , - ., .i,, .i. c c.i,
sx>iis>cxc. - .i,>. - ., , - .,
sx>Lc.s>.s,L.cx, i. .c c cx s
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-1
C a p i t o l o
7
Capitolo7Creazione di applicazioni,
componenti e librerie
In questo capitolo viene fornita una panoramica sulluso di C++Builder per la
creazione di applicazioni, librerie e componenti.
Creazione di applicazioni
C++Builder usato principalmente per la progettazione e la costruzione dei seguenti
tipi di applicazioni:
Applicazioni GUI
Applicazioni per console
Applicazioni di servizio (solo per applicazioni Windows)
Package e DLL
Generalmente, le applicazioni GUI hanno uninterfaccia di facile impiego. Le
applicazioni per console vengono eseguite da una finestra della console. Le
applicazioni di servizio sono eseguite come servizi Windows. Questi tipi di
applicazioni vengono compilati come eseguibili con codice di avvio.
Si possono creare altri tipi di progetto, come package e DLL, che portano alla
realizzazione di package o di librerie collegabili dinamicamente. Queste applicazioni
producono un codice eseguibile senza codice di avvio. Fare riferimento al paragrafo
Creazione di package e di DLL on page 7-10.
Applicazioni GUI
Unapplicazione con interfaccia utente grafica (GUI) viene progettata utilizzando
funzionalit grafiche come finestre, menu, finestre di dialogo e altre funzionalit che
la rendono facile da usare. Quando si compila unapplicazione GUI, viene generato
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-2
C r e a z i o n e d i a p p l i c a z i o n i
un file eseguibile con codice di avvio. Leseguibile generalmente fornisce la
funzionalit di base del programma, tanto che i programmi pi semplici sono
costituiti esclusivamente da un file. possibile estendere lapplicazione chiamando le
DLL, i package e gli altri file di supporto dalleseguibile.
C++Builder offre due modelli di applicazione UI:
Single document interface (SDI)
Multiple document interface (MDI)
Oltre che con il modello di implementazione delle applicazioni, il comportamento
del progetto in fase di progettazione e di esecuzione dellapplicazione pu essere
modificato tramite le opzioni di progetto dellIDE.
Modelli di interfaccia utente
Le schede possono essere implementate come schede MDI (Multiple document
interface) o SDI (Single document interface). In unapplicazione MDI possibile
aprire allinterno di ununica finestra genitore pi di un documento o finestra figlio.
Ci vale per applicazioni come i fogli di lavoro o gli elaboratori testo.
Unapplicazione SDI, invece, generalmente contiene ununica vista del documento.
Per rendere una scheda unapplicazione SDI, occorre impostare la propriet
FormStyle delloggetto Form a fsNormal.
Per ulteriori informazioni sullo sviluppo dellinterfaccia utente per unapplicazione,
consultare il Capitolo 8, Sviluppo dellinterfaccia utente dellapplicazione.
Applicazioni SDI
Per creare una nuova applicazione SDI:
1 Selezionare File|New|Other per richiamare la finestra di dialogo New Items.
2 Fare clic sulla pagina Projects e fare doppio clic su SDI Application.
3 Fare clic su OK.
Per impostazione predefinita, la propriet FormStyle delloggetto Form fsNormal,
chioschi C++Builder presuppone che tutte le nuove applicazioni siano di tipo SDI.
Applicazioni MDI
Per creare una nuova applicazione MDI:
1 Selezionare File|New|Other per richiamare la finestra di dialogo New Items.
2 Fare clic sulla pagina Projects e fare doppio clic su MDI Application.
3 Fare clic su OK.
Le applicazioni MDI richiedono una maggiore pianificazione e sono in un certo senso
pi complesse da progettare di quelle SDI. Le applicazioni MDI generano finestre
figlio che risiedono allinterno della finestra client; la scheda principale contiene le
schede figlio. Per specificare se una scheda figlio (fsMDIForm) o la scheda principale
(fsMDIChild), occorre impostare la propriet FormStyle delloggetto TForm.
consigliabile definire una classe base per le schede figlio e derivare ogni scheda figlio
da questa classe, per evitare di dover ridefinire le propriet della scheda figlio.
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-3
C r e a z i o n e d i a p p l i c a z i o n i
Le applicazioni MDI spesso includono sul menu principale una finestra popup che
contiene elementi quali Cascade e Tile per la visualizzazione di pi finestre in
modalit differenti. Quando una finestra figlio viene ridotta a icona, la sua icona
situata nella scheda MDI genitore.
Per riassumere ci che necessario fare per creare le finestre per lapplicazione MDI:
1 Creare la scheda della finestra principale o finestra MDI genitore. Impostare la sua
propriet FormStyle a fsMDIForm.
2 Creare un menu per la finestra principale che include File|Open, File|Save e
Window che abbia gli elementi Cascade, Tile e Arrange All.
3 Creare le schede MDI figlio e impostare le loro propriet FormStyle a fsMDIChild.
Impostazioni delle opzioni per lIDE, il progetto e la compilazione
Per specificare le diverse opzioni per il progetto, utilizzare il comando Project|
Options. Per maggiori informazioni, consultare la Guida in linea.
Impostazione delle opzioni predefinite del progetto
Per cambiare le opzioni predefinite che valgono per tutti i progetti, si deve ricorrere
alla finestra di dialogo Project Options e contrassegnare la casella Default nellangolo
in basso a destra. Per impostazione predefinita, tutti i nuovi progetti utilizzeranno le
opzioni correnti selezionate.
Modelli di programmazione
I modelli di programmazione sono scheletri di strutture comunemente utilizzate, che
possibile aggiungere al codice sorgente e quindi completare. In C++Builder sono
inclusi alcuni modelli di codice standard, come quelli per gli array, per le classi, per
la dichiarazioni di funzioni, nonch molte istruzioni.
possibile anche scrivere dei modelli propri per codificare delle strutture di impiego
frequente. Ad esempio, se si desidera utilizzare nel codice un ciclo for, si pu inserire
il seguente modello:
?et , ,
Per inserire un modello di codice nel Code editor, premere Ctrl-j e selezionare il
modello di codice che si intende utilizzare. A questa raccolta possibile aggiungere
anche dei propri modelli. Per aggiungere un modello:
1 Scegliere il comando Tools|Editor Options.
2 Fare clic sul separatore Code Insight.
3 Nei sezione Template, fare clic su Add.
4 Dopo Shortcut name scrivere un nome per il modello, immettere una breve
descrizione del nuovo modello e fare clic su OK.
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-4
C r e a z i o n e d i a p p l i c a z i o n i
5 Aggiungere il codice del modello nella casella di testo Code.
6 Fare clic su OK.
Applicazioni per console
Le applicazioni per console sono programmi a 32-bit che vengono eseguiti senza
uninterfaccia grafica, solitamente in una finestra per console. Queste applicazioni di
solito non richiedono uninterazione con lutente ed eseguono un numero limitato di
funzioni.
Per creare una nuova applicazione per console:
1 Selezionare lopzione di menu File|New|Other ,quindi nella finestra di dialogo
New Items selezionare lopzione Console Wizard.
2 Nella finestra di dialogo Console Wizard, selezionare lopzione Console
Application, scegliere il tipo di file sorgente (C o C++) per il modulo principale del
progetto, o specificare un file esistente che contenga una funzione main o
winmain, quindi fare clic sul pulsante OK.
C++Builder creer un file di progetto per questo tipo di file sorgente e visualizzer il
Code editor.
Utilizzo di VCL e CLX in applicazioni per console
_
Quando si crea una nuova applicazione per console, lIDE non crea una nuova
scheda. Viene visualizzato solo il Code editor.
Nelle applicazioni per console possibile tuttavia utilizzare la VCL e la CLX. Per fare
ci occorre indicare nel Console Wizard che si intende utilizzare la VCL o la CLX
(selezionare lopzione Use VCL oppure Use CLX). Se nel Wizard non si indica che si
vuole utilizzare la VCL o la CLX, in seguito non sar pi possibile utilizzare alcuna
classe della VCL o della CLX in quella applicazione. Se si tenta di farlo, il linker
generer una serie di errori.
Le applicazioni per console dovrebbero gestire tutte le eccezioni per impedire alle
finestre di visualizzare una finestra di dialogo durante la sua esecuzione.
Applicazioni di servizio
Le applicazioni di servizio accettano richieste dalle applicazioni client, elaborano tali
richieste e restituiscono informazioni allapplicazione client. Solitamente vengono
eseguite in background, con poca o nulla interazione con lutente. Esempi di
applicazioni di servizio sono i server Web, i server FTP o di posta.
Per creare unapplicazione che implementi un servizio Win32:
1 Scegliere File|New|Other e fare doppio clic su Service Application nella finestra di
dialogo New Items. In questo modo si aggiunge una variabile di nome Application
al progetto, che di tipo TServiceApplication.
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-5
C r e a z i o n e d i a p p l i c a z i o n i
2 Apparir una finestra Service che corrisponde a un servizio (TService). Per
implementare il servizio, occorre impostarne le propriet e i gestori di evento
nellObject Inspector.
3 Scegliendo File|New|Other e selezionando Service dalla finestra di dialogo New
Items, possibile aggiungere ulteriori servizi allapplicazione del server. Non
possibile aggiungere servizi ad unapplicazione che non sia di servizio. Anche se
possibile aggiungere un oggetto TService, lapplicazione non generer gli eventi
necessari, n effettuer le chiamate appropriate ad Windows a favore del servizio.
4 Una volta creata l applicazione di servizio, possibile installarne i servizi con
Service Control Manager (SCM). Le altre applicazioni potranno quindi attivare tali
servizi inviando delle richieste a SCM.
Per installare i servizi dellapplicazione, eseguire il programma utilizzando lopzione
/INSTALL. Lapplicazione installer i suoi servizi e terminer, emettendo un
messaggio di conferma dellavvenuta installazione dei servizi. Se si esegue
lapplicazioni di servizio utilizzando lopzione /SILENT possibile evitare la
visualizzazione del messaggio di conferma.
Per disinstallare i servizi, eseguire lapplicazione dalla riga comandi utilizzando
lopzione /UNINSTALL. ( possibile utilizzare anche lopzione /SILENT per
sopprimere il messaggio di conferma emesso in fase di disinstallazione).
Esempio Questo servizio ha un TServerSocket la cui porta impostata a 80. Questa la porta
predefinita dei browser Web per effettuare richieste ai server Web e dei server Web
per fornire risposte ai browser. Questo particolare esempio produce un documento
di testo di nome WebLogxxx.log (dove xxx ThreadID) nella directory C:\Temp. Ci
deve essere un unico server in ascolto nella porta stabilita, in modo che, se c un
server Web, si avr la certezza che non sta ascoltando (il servizio viene interrotto).
Per vedere il risultato: aprire un browser Web sulla macchina locale e immettere
localhost (senza virgolette) per lindirizzo. Probabilmente il browser si disattiver,
ma a questo punto sar disponibile un file di nome Weblogxxx.log nella directory
C:\Temp.
1 Per creare lesempio, scegliere il comando File|New |Other e selezionare nella
finestra di dialogo New Items lopzione Service Application. Appare la finestra
Service1.
2 Aggiungere alla finestra del servizio (Service1) un componente ServerSocket
prelevandolo dalla pagina Internet della Component palette).
3 Aggiungere alla classe TService1 un membro dati privato di tipo TMemoryStream.
L intestazione della unit dovrebbe assomigliare al seguente:
-I?aie? -
-ie?Iae -
-IacIaie .ss,,>
-IacIaie isscs,,>
-IacIaie .c.,,>
-IacIaie .c..,,,>
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-6
C r e a z i o n e d i a p p l i c a z i o n i
cIaaa .ccc pabIIc .ccc
-eaiI?
4 Selezionare ServerSocket 1, il componente aggiunto al passo 1. Fare doppio clic
sullevento OnClientRead nellObject Inspector ed aggiungere il seguente gestore di
evento:
veIi __?aatcaII .ccc.cc.c.ccci.ccc .c.c,
s..c.c .c.c
caat ..c .,
c .c.c>ccccc,
vaIIe c >
tt,
..c caat .icc,
.c.c>cccc.veIi ..c, c,
.ci.>c..c, c,
__?IaaII,
.cc..c,
.ci.>.cc., s.c,
~s. c 'c.,cc',
c c - L..cccci.>ci.L - '',
.ci.>.iccc,
5 Infine, selezionare Service1 facendo clic nellarea del client della finestra (non sul
ServiceSocket). Fare doppio clic sullevento OnExecute nellObject Inspector ed
aggiungere il seguente gestore di evento:
veIi __?aatcaII .ccc.cccxccc.ccc .c.c
ptIvate
ptetectei
veIi __?aatcaII xccc,
pabIIc
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-8
C r e a z i o n e d i a p p l i c a z i o n i
__?aatcaII .,i.ci.beeI cic.s,c.c.,
,
3 Nel file .cpp della unit, creare una variabile globale per unistanza di
TSparkyThread:
.,i.ci. .,i.ci.,
4 Aggiungere il codice seguente al file .cpp del costruttore TSparkyThread:
__?aatcaII .,i.ci..,i.ci.beeI cic.s,c.c.
ci.cic.s,c.c.
5 Aggiungere il codice seguente al file .cpp del metodo Execute di TSparkyThread (la
funzione di thread):
veIi __?aatcaII .,i.ci.xccc
.c c.ic.
cc,,
.cc,,
6 Selezionare la finestra del servizio (Service1), e fare doppio clic sullevento OnStart
nellObject Inspector. Aggiungere il seguente gestore di evento OnStart:
veIi __?aatcaII .ccc.ccc.i.ccc .c.c, beeI .ic.
.,i.ci.>cs.c,
c. ttae,
.,i.ci.>.s,c.,
.isc. ttae,
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-9
C r e a z i o n e d i a p p l i c a z i o n i
.,i.ci.>c.ic,
.,,c. ttae,
tetata ic ic,
,
ieabIe i.icieabIe ic
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-13
C r e a z i o n e d i D L L c o n t e n e n t i c o m p o n e n t i V C L e C L X
tetata ic .,
Nel codice precedente viene esportata la funzione changeValue, che viene resa
pertanto disponibile alle applicazioni che la chiamano. Le funzioni dblValue e
halfValue sono interne, per cui non possono essere chiamate dallesterno della DLL.
Ulteriori informazioni sulla creazione di DLL si trovano in Microsoft Win32 SDK
Reference.
Creazione di DLL contenenti componenti VCL e CLX
Uno dei punti di forza delle DLL il fatto che una DLL creata con un determinato
strumento di sviluppo pu spesso essere utilizzata da unapplicazione scritta con
uno strumento di sviluppo differente. Quando la DLL contiene dei componenti VCL
(per esempio, delle schede) che devono essere utilizzate dallapplicazione chiamante,
bisogna preparare delle routine di interfaccia esportate che utilizzino le convenzioni
di chiamata standard, evitare il mangling dei nomi di C++, mentre non richiesto che
lapplicazione chiamante supporti la libreria VCL o CLX per poter funzionare. Per
creare componenti VCL o CLX che possano essere esportati, utilizzare i package di
runtime. Per ulteriori informazioni, consultare il Capitolo 15, Uso di package e di
componenti.
Si supponga, per esempio, di voler creare una DLL per visualizzare questa semplice
finestra di dialogo:
Il codice della DLL della finestra di dialogo il seguente:
.~L.-
-..c. ..i-
-.c.c ..i-
-c.c isscs,,>
-c.c cs,,>
-c.c c..s,,>
-c.c c.s,,>
7-14 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e d i D L L c o n t e n e n t i c o m p o n e n t i V C L e C L X
__pabIIaaei L.iic. .,cs
icc icccx,
cs,
.,
veIi __?aatcaII csc.ccc .c.c,
veIi __?aatcaII .c.ccc .c.c,
ptIvate sc .cciis
beeI cic,
pabIIc sc .cciis
vIttaaI __?aatcaII cs.i.,c .c,
beeI __?aatcaII ccic,
,
cx,c. c.icc .c
exteta '' __iecIapec .cx, beeI L.ccs.i,
-c..
.~L...
-c.c cc>
-,i.i .s,
-c.c '..i'
__?aatcaII cs.ics.i.,c .c
..c
cic ?aIae,
cic ttae,
sc,
cic ?aIae,
sc,
c cic,
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-15
C o l l e g a m e n t o d e l l e D L L
cx,c. si.i. -- c.icc .c i cis
beeI L.ccs.i
beeI cic,
cs.i cs.i aev cs.i.,
cs.i>....i,
cic cs.i>ccic,
ieIete cs.i,
tetata cic,
I contesti numerici di aiuto sono la forma standard delle richieste di Help nelle
applicazioni eseguite in ambiente Windows che utilizzano il sistema WinHelp;
bench supportate dalla CLX, se ne sconsiglia lutilizzo nelle applicazioni CLX
perch la maggior parte dei sistemi di Help di Linux non sono in grado di
comprenderle.
Alle implementazioni di ICustomHelpViewer viene richiesto di fornire il supporto per
richieste di aiuto in base a una parola chiave, mentre alle implementazioni
IExtendedHelpViewer viene richiesto il supporto per le richieste di aiuto in base al
contesto.
ICustomHelpViewer fornisce tre metodi per la gestione di aiuto in base a una parola
chiave:
UnderstandsKeyword
GetHelpStrings
ShowHelp
7-32 G u i d a a l l a p r o g r a mma z i o n e
A t t i v a z i o n e d e l l H e l p n e l l e a p p l i c a z i o n i
Iat__?aatcaII Ls.-c,c.c.csi.sc..ceaat ~s. -c,.
il primo dei tre metodi chiamati dallHelp Manager, il quale chiamer ogni
visualizzatore di Help registrato passandogli la stessa stringa per chiedergli se in
grado di fornire un aiuto per quella stringa; il visualizzatore dovrebbe risponde con
un valore integer che indica quante differenti pagine della guida pu visualizzare in
risposta a quella richiesta di Help. Per determinare tale valore, il visualizzatore pu
utilizzare un qualsiasi metodo- allinterno dellIDE il visualizzatore HyperHelp
gestisce il proprio indice e lo utilizza per la ricerca. Se il visualizzatore non in grado
di fornire un aiuto per questa parola chiave dovrebbe restituire zero. I numeri
negativi vengono interpretati come se fossero zero, ma questo comportamento non
garantito nelle versioni successive.
cIaaaea:sttIaLIat__?aatcaII Ls.-c,c.cc-c,.sceaat ~s.
-c,.
viene chiamato dallHelp Manager nel caso vi sia pi di un visualizzatore in grado di
fornire un aiuto su un argomento. Il visualizzatore dovrebbe restituire uno
TStringList liberato dallHelp Manager. Le stringhe nella lista restituita dovrebbero
corrispondere alle pagine disponibili per quella parola chiave, ma le caratteristiche di
quella mappatura possono essere determinate dal visualizzatore. Nel caso del
visualizzatore WinHelp in Windows e del visualizzatore HyperHelp in Linux,
lelenco di stringhe contiene sempre esattamente una voce. HyperHelp fornisce una
propria indicizzazione e la sua duplicazione in unaltra posizione produrrebbe una
duplicazione senza puntatore. Nel caso del visualizzatore Man page (Linux), la lista
di stringhe formata da stringhe multiple, una per ogni sezione del manuale che
contiene una pagina per quella parola chiave.
veIi__?aatcaII Ls.-c,c.c..-c,ceaat ~s. -c,.
viene chiamato dallHelp Manager nel caso abbia bisogno che il visualizzatore di
Help visualizzi un aiuto per una particolare parola chiave. Questa lultima
chiamata a metodo delloperazione; il sistema garantisce che non sar mai chiamato a
meno che prima non venga chiamato il metodo UnderstandsKeyword.
Visualizzazione degli indici
ICustomHelpViewer fornisce due metodi relativi alla visualizzazione degli indici:
CanShowTableOfContents
ShowTableOfContents
Il meccanismo del loro funzionamento simile a quello delle operazioni di richiesta
di help in base a una parola chiave: per prima cosa lHelp Manager interroga tutti i
visualizzatori di Help chiamando ICustomHelpViewer::CanShowTableOfContents() e
successivamente richiama un particolare visualizzatore di Help chiamando
ICustomHelpViewer::ShowTableOfContents().
perfettamente normale che un particolare visualizzatore si rifiuti di supportare
richieste per la visualizzazione di un indice. Questo il caso, ad esempio, del
visualizzatore Man page, perch il concetto di indice non si addice alla modalit di
funzionamento di Man page; il visualizzatore HyperHelp, invece, supporta un indice
passando la richiesta di visualizzare lindice direttamente a HyperHelp su Linux e a
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-33
A t t i v a z i o n e d e l l H e l p n e l l e a p p l i c a z i o n i
WinHelp su Windows. Non normale, tuttavia, che unimplementazione di
ICustomHelpViewer risponda a una richiesta che perviene da CanShowTableOfContents
con true e poi ignori le richieste che pervengono da ShowTableOfContents.
Implementazione IExtendedHelpViewer
ICustomHelpViewer fornisce solo un supporto diretto per Help basati su parole
chiave. Alcuni sistemi di Help (specialmente WinHelp) funzionano associando
numeri (conosciuti come ID di contesto) a parole chiave in un modo interno al
sistema di Help e quindi non visibile allapplicazione. Tali sistemi richiedono che
lapplicazione supporti lHelp in base al contesto, vale a dire lapplicazione richiama
il sistema Help con quel contesto, invece che con una stringa, e il sistema di Help
traduca tale numero.
Le applicazioni scritte nella CLX e nella CLX possono dialogare con sistemi che
richiedono un Help in base al contesto estendendo loggetto che implementa
ICustomHelpViewer in modo che implementi anche IExtendedHelpViewer.
IExtendedHelpViewer fornisce anche un supporto per dialogare con sistemi di Help
che permettono di passare direttamente ad argomenti di livello pi alto invece di
utilizzare ricerche per parole chiave. Il visualizzatore natico WinHelp compie
loperazione automaticamente.
IExtendedHelpViewer espone quattro funzioni. Due di esse - UnderstandsContext e
DisplayHelpByContext - sono utilizzate per supportare gli Help in base al contesto; le
altre due - UnderstandsTopic and DisplayTopic - sono utilizzate per supportare gli
argomenti.
Quando un utente dellapplicazione preme il tasto F1, lHelp Manager chiama
Iat__?aatcaII Lxc.c.-c,c.c.csi.scxceaat Iat cxL, ~s.
-c,c.i.c
e il controllo attivato attualmente supporta un Help in base al contesto invece che
basato su parola chiave. Come nel caso di ICustomHelpViewer::UnderstandsKeyword,
lHelp Manager interroga in sequenza tutti i visualizzatori di Help registrati. A
differenza del caso con ICustomHelpViewer::UnderstandsKeyword(), per, se pi di un
visualizzatore supporta un determinato contesto, viene attivato il primo
visualizzatore registrato che supporta quel certo contesto.
LHelp Manager chiama
veIi__?aatcaII Lxc.c.-c,c.cs,i-c,cxceaat Iat cxL, ~s.
-c,c.i.c
dopo aver eseguito la scansione ciclica dei visualizzatori di Help registrati.
Le funzioni per il supporto degli argomenti operano in modo analogo:
beeI__?aatcaII Lxc.c.-c,c.c.csi.s,cceaat ~s. ,c
viene utilizzata per eseguire la scansione ciclica dei visualizzatori di Help e chiedere
se supportano un argomento;
veIi__?aatcaII Lxc.c.-c,c.cs,i,cceaat ~s. ,c
7-34 G u i d a a l l a p r o g r a mma z i o n e
A t t i v a z i o n e d e l l H e l p n e l l e a p p l i c a z i o n i
viene utilizzata per richiamare il primo visualizzatore registrato che riferisce di
essere in grado di fornire laiuto per quellargomento.
Implementazione IHelpSelector
IHelpSelector viene utilizzato in combinazione con ICustomHelpViewer. Quando
esistono pi visualizzatori di Help che sostengono di essere in grado di fornire un
supporto per una certa parola chiave, per un contesto o per un determinato
argomento, o di essere in grado di fornire un indice, lHelp Manager deve effettuare
una scelta. Nel caso di contesti o di argomenti, lHelp Manager seleziona sempre il
primo visualizzatore di Help che sostiene di essere in grado di fornire il supporto.
Nel caso delle parole chiave o dellindice, per impostazione predefinita lHelp
Manager selezioner il primo visualizzatore Help. Questo comportamento pu
essere ridefinito da unapplicazione.
Per ridefinire la decisione dellHelp Manager in questi casi, lapplicazione deve
registrare una classe che fornisca unimplementazione dellinterfaccia
IHelpSelector.IHelpSelector esporta due funzioni: SelectKeyword, e TableOfContents.
Entrambe accettano come argomento un TStrings contenente, ad uno ad uno, o le
possibili corrispondenze con la parola chiave o i nomi dei visualizzatori che
sostengono di essere in grado di fornire un indice. Chi implementa la funzione deve
restituire lindice (in TStringList) che rappresenta la stringa selezionata, TStringList
viene quindi liberata dallHelp Manager.
_
LHelp Manager potrebbe fare confusione se le stringhe vengono riorganizzate; si
consiglia a chi implementa IHelpSelector di astenersi dal fare ci. Il sistema di Help
supporta un solo HelpSelector; quando si registrano nuovi selettori, qualsiasi selettore
precedentemente esistente viene scollegato.
Registrazione di oggetti di sistema di Help
Affinch lHelp Manager possa comunicare con loro, gli oggetti che implementano
ICustomHelpViewer, IExtendedHelpViewer, ISpecialWinHelpViewer e IHelpSelector
devono essere registrati con lHelp Manager.
Per registrare con lHelp Manager oggetti di sistema di Help, necessario:
Registrare il visualizzatore di Help.
Registrare il selettore di Help.
Registrazione dei visualizzatori di Help
La unit che contiene limplementazione di oggetto deve utilizzare HelpIntfs. Nel file
header della unit che lo implementa si deve dichiarare unistanza delloggetto.
La unit implementante deve includere una direttiva di avvio pragma che chiama un
metodo che assegna la variabile di istanza e la passa alla funzione RegisterViewer.
RegisterViewer una funzione esportata da HelpIntfs.pas che accetta come argomento
uno ICustomHelpViewer e restituisce uno IHelpManager. Lo IHelpManager dovrebbe
essere memorizzato per un successivo utilizzo.
C r e a z i o n e d i a p p l i c a z i o n i , c o mp o n e n t i e l i b r e r i e 7-35
U t i l i z z o d e l l H e l p i n u n a p p l i c a z i o n e V C L
Il file .cpp corrispondente contiene il codice per registrare linterfaccia. Per
linterfaccia descritta sopra, il codice di registrazione assomiglia al seguente:
veIi L.cccs
-c,L.,c.c ciiss,
ci .i.c_cisLs.-c,c.c>ciiss,
ci>~..c.,
-c,L.scscc.cci, ciiss>.iic,
css.>....i,
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-7
U s o d e l l e s c h e d e
css. aev css.taIa,
css.>....i,
ieIete css.,
Il gestore di evento dellesempio cancella la scheda dopo averla chiusa, in modo che
non occorrer ricrearla se occorrer usare ResultsForm in qualche altro punto
dellapplicazione. Se la scheda fosse visualizzata usando Show, non potrebbe essere
cancellata allinterno del gestore di evento, perch Show termina mentre la scheda
ancora aperta.
_
Se si crea una scheda usando loperatore new, bisogna ricordarsi di controllare che
non sia nellelenco Auto-create forms della pagina Project Options|Forms. Nello
specifico, se la nuova scheda viene creata senza cancellare la scheda omonima
dallelenco, C++Builder crea la scheda in fase di avvio e questo gestore di evento crea
una nuova istanza della scheda, sovrascrivendo il riferimento allistanza creata
automaticamente. Questa istanza esiste ancora, ma lapplicazione non pu pi
accedervi. Dopo che il gestore di evento ha terminato lesecuzione, la variabile
globale non punta pi a una scheda valida. Qualsiasi tentativo di dereferenziare la
variabile globale bloccher probabilmente lapplicazione.
Creazione di schede non modali come finestre
Occorre garantire che le variabili di riferimento per le schede non modali esistano
finch la scheda in uso. Questo vuol dire che queste variabili devono avere un
campo dazione globale. Nella maggior parte dei casi si usa la variabile globale di
riferimento creata insieme alla scheda (il nome della variabile che corrisponde alla
propriet name della scheda). Se l applicazione richiede altre istanze della scheda,
occorre dichiarare variabili globali distinte (di tipo puntatore alla classe form) una
per ciascuna istanza.
Creazione di unistanza di scheda mediante una variabile locale
Un modo pi sicuro per creare unistanza univoca di una scheda modale consiste
nellusare una variabile locale nel gestore di evento come riferimento a una nuova
istanza. Se si usa una variabile locale, non importa se ResultsForm stata creata
automaticamente o meno. Il codice nel gestore di evento non fa alcun riferimento alla
variabile globale della scheda. Per esempio:
veIi __?aatcaII .i..sc.ccc .c.c
Si noti che listanza globale della scheda non viene mai usata in questa versione del
gestore di evento.
Normalmente, le applicazioni usano le istanze globali delle schede. Tuttavia, se
occorre una nuova istanza di una scheda modale, e si usa quella scheda in una
sezione limitata dellapplicazione, come una singola funzione, unistanza locale
solitamente il modo pi sicuro ed efficace per lavorare con la scheda.
8-8 G u i d a a l l a p r o g r a mma z i o n e
U s o d e l l e s c h e d e
Naturalmente, non possibile usare le variabili locali nei gestori di evento per le
schede non modali, perch devono avere un campo dazione globale per garantire
che le schede esistano finch sono utilizzate. Show termina non appena si apre la
scheda, quindi se stata usata una variabile locale, questa variabile uscir
immediatamente dal campo dazione.
Passaggio di altri argomenti alle schede
Normalmente, le schede per lapplicazione vengono create dallinterno dellIDE.
Quando vengono create in questo modo, le schede hanno un costruttore che accetta
un argomento, Owner, che il proprietario della scheda da creare. (Il proprietario
loggetto applicazione o scheda chiamante). Owner pu essere NULL.
Per passare alla scheda altri argomenti, si deve creare un altro costruttore e istanziare
la scheda usando l operatore new. La classe della scheda di esempio sotto riportata
mostra un costruttore aggiuntivo, con un ulteriore argomento whichButton. Questo
nuovo costruttore viene aggiunto manualmente alla classe della scheda.
cIaaa css. pabIIc .
avItca .c
caae
cssicc>i, ' ,c.c. c .s c',
bteak,
caae .
cssicc>i, ' ,c.c. c scc. c',
bteak,
caae
cssicc>i, ' ,c.c. c . c',
8-10 G u i d a a l l a p r o g r a mma z i o n e
U s o d e l l e s c h e d e
eIae c scccc.
c '',
veIi .sc. s
c s,
I? . c. . cxss
. s .>c,
. s.c . c c i.c s
Per prima cosa il gestore di evento verifica che ColorForm esista controllando se il
puntatore NULL. Quindi, riceve il valore della propriet CurrentColor di ColorForm.
La richiesta del CurrentColor chiama la sua funzione getter getColor mostrata di
seguito:
. .c
tetata c,
c s,
c '',
Notare che il gestore di evento memorizza il nome del colore selezionato nella stringa
address che stata passata al costruttore.
Per usare efficacemente ColorForm, la scheda chiamante deve passare il costruttore a
un puntatore a una stringa esistente. Per esempio, si supponga che ColorForm stata
istanziata da una scheda chiamata ResultsForm in risposta a un clic su un pulsante
chiamato UpdateButton di ResultsForm. Il gestore di evento dovrebbe essere simile al
seguente codice:
veIi __?aatcaII css.,.icc.ccc .c.c
. s,
cs,
I? s ''
. s.c . c c i.c s
eIae
. s.c csc cccisc c .is ,c.c.
veIi css.c. s
c cis sc
i>scc i>scc,
possibile fornire un gestore di evento che risponda a uno dei tre diversi livelli:
lazione, la lista di azioni o lapplicazione. Ci si deve occupare di ci solo se si utilizza
una nuova azione generica invece di unazione standard predefinita. Se si utilizzano
le azioni standard non ce ne si deve occupare, perch le azioni standard hanno un
comportamento incorporato che viene eseguito quando si verificano questi eventi.
I gestori di evento risponderanno agli eventi in base al seguente ordine:
Lista di azioni
Applicazione
Azione
Quando lutente fa clic su un controllo client, C++Builder chiama il metodo Execute
dellazione che dapprima rimanda alla lista di azioni, quindi alloggetto Application,
quindi allazione stessa nel caso non venga gestita n dalla lista di azioni n
dalloggetto Application. Per essere pi precisi, C++Builder segue questa sequenza
di smistamento quando cerca un modo per rispondere allazione di un utente:
1 Se si fornisce un gestore di evento OnExecute per la lista di azioni e tale gestore in
grado di gestire lazione, lapplicazione procede.
Il gestore di evento della lista di azioni ha un parametro di nome Handled, che, per
impostazione predefinita, restituisce false. Se il gestore stato assegnato ed in
grado di gestire levento restituisce true, e la sequenza di elaborazione termina a
questo punto. Per esempio:
veIi __?aatcaII .~csxccc~cisc~c ~c, beeI -i.c.
-i.c. ttae,
Se non si imposta Handled a true nel gestore di evento della lista di azioni, allora
lelaborazione continua.
2 Se non stato preparato un gestore di evento OnExecute per la lista di azioni
oppure se il gestore di evento non in grado di gestire lazione, viene scatenato il
8-28 G u i d a a l l a p r o g r a mma z i o n e
U s o d e l l e l i s t e d i a z i o n i
gestore di evento OnActionExecute dellapplicazione. Se gestisce lazione,
lapplicazione procede.
Loggetto globale Application riceve un evento OnActionExecute nel caso nessuna
delle liste di azioni dellapplicazione sia in grado di gestire un evento. Come il
gestore di evento OnExecute dellelenco di azioni, il gestore di OnActionExecute ha
un parametro Handled che, per impostazione predefinita, restituisce false. Se un
gestore di evento stato assegnato ed in grado di gestire levento, restituisce true
e la sequenza di elaborazioni termina a questo punto. Per esempio:
veIi __?aatcaII .~,,cixccc~cisc~c ~c, beeI -i.c.
j
Non aggiungere al gestore di evento OnUpdate codice con lunghi tempi di
esecuzione. Questa operazione viene eseguita ogniqualvolta lapplicazione inattiva.
Se il gestore di evento impiega troppo tempo, influenzer negativamente le
prestazioni dellintera applicazione.
Classi di azione predefinite
possibile aggiungere allapplicazione azioni predefinite facendo clic destro
sullAction Manager e selezionando il comando New Standard Action. Verr
visualizzata la finestra di dialogo New Standard Action Classes che elenca le classi di
azione predefinite e le azioni standard associate. Queste sono azioni gi incluse in
C++Builder e sono oggetti che eseguono automaticamente determinate azioni. Le
azioni predefinite sono organizzate nelle seguenti classi:
Tabella 8.3 Classi di azioni
Classe Descrizione
Edit Azioni standard di editing: Utilizzate con controlli di editing come
destinazione. TEditAction la classe di base dei discendenti, ognuno dei
quali ridefinisce individualmente il metodo ExecuteTarget in modo da
implementare le attivit di copia, taglia e incolla utilizzando la clipboard.
Format Azioni standard di formattazione: Utilizzate con controlli rich text per
impostare opzioni di formattazione del testo come grassetto, corsivo,
sottolineato, barrato, e cos via.TRichEditAction la classe di base dei
discendenti, ognuno dei quali ridefinisce individualmente i metodi
ExecuteTarget e UpdateTarget in modo da implementare le attivit di
formattazione della destinazione.
Help Azioni standard di Help: Utilizzate con qualsiasi destinazione.
THelpAction la classe di base dei discendenti, ognuno dei quali
ridefinisce individualmente il metodo ExecuteTarget in modo da passare
il comando a un sistema di Help.
Window Azioni standard di finestra: Utilizzate con schede come destinazioni in
unapplicazione MDI. TWindowAction la classe di base dei discendenti,
ognuno dei quali ridefinisce individualmente il metodo ExecuteTarget in
modo da implementare le attivit di disposizione, sovrapposizione,
chiusura o affiancamento di finestre figlio in applicazioni MDI.
8-30 G u i d a a l l a p r o g r a mma z i o n e
U s o d e l l e l i s t e d i a z i o n i
Tutti gli oggetti azione sono descritti nella Guida di riferimento in linea. Per i dettagli
sul loro funzionamento, consultare la Guida in linea.
Scrittura di componenti azione
possibile anche creare proprie classi di azione predefinite. Quando si scrivono
proprie classi di azione, possibile incorporare la capacit di essere eseguite su
alcune classi di oggetti di destinazione. A questo punto, sar possibile utilizzare le
azioni custom in modo analogo a quello utilizzato per le classi di azione predefinite.
Vale a dire, se lazione in grado di individuare e di applicare se stessa a una classe
di destinazione, possibile assegnare semplicemente lazione a un controllo client, ed
essa agir sulla destinazione che sia necessario scrivere un gestore di evento.
Gli scrittori di componenti possono utilizzare le classi nelle unit QStdActns e
DBActns come esempi per derivare le proprie classi di azione per implementare
comportamenti specifici per alcuni controlli o componenti. Le classi di base di queste
azioni specializzate (TEditAction, TWindowAction, e cos via) di solito ridefiniscono
File Azioni su file: Utilizzate per operazioni su file come File Open, File Run
o File Exit.
Search Azioni di ricerca: Utilizzato con opzioni di ricerca. TSearchAction
implementa il comportamento comune per quelle azioni che
visualizzano una finestra di dialogo non modale in cui lutente pu
immettere una stringa di ricerca per effettuare ricerche in un controllo di
editing.
Tab Azioni per controlli multipagina: Utilizzate per spostarsi fra le varie
pagine di un controllo multipagina, come per i pulsanti Prev e Next di
un wizard.
List Azioni per controlli elenco: Utilizzate per la gestione degli elementi in un
controllo list view.
Dialog Azioni per finestre di dialogo: Utilizzato con componenti finestra di
dialogo. TDialogAction implementa il comportamento comune per quelle
azioni che, quando eseguite, visualizzano una finestra di dialogo. Ogni
classe discendente rappresenta una finestra di dialogo specifica.
Internet Azioni Internet: Utilizzato per funzioni quali la navigazione in Internet,
lo scaricamento di file e linvio di posta.
DataSet Azioni DataSet: Utilizzato con componenti dataset come destinazione.
TDataSetAction la classe di base dei discendenti, ognuno dei quali
ridefinisce individualmente i metodi ExecuteTarget e UpdateTarget in
modo da implementare le attivit di navigazione ed editing della
destinazione.
TDataSetAction introduce una propriet DataSource che garantisce che le
azioni vengano eseguite su quel dataset. Se DataSource NULL, viene
usato il controllo associato ai dati che in quel momento ha il fuoco.
Tools Strumenti: Strumenti aggiuntivi come TCustomizeActionBars per la
visualizzazione automatica della finestra di dialogo di personalizzazione
delle bande di azioni.
Tabella 8.3 Classi di azioni
Classe Descrizione
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-31
U s o d e l l e l i s t e d i a z i o n i
HandlesTarget, UpdateTarget e altri metodi in modo da limitare la destinazione
dellazione a una determinata classe di oggetti. Normalmente, le classi discendenti
ridefiniscono ExecuteTarget per eseguire un compito specialistico. Questi metodi sono
descritti nella tabella seguente :
Registrazione delle azioni
Quando si scrivono le proprie azioni, possibile registrarle in modo da consentirne la
visualizzazione nellAction List editor. Le azioni vengono registrate e de-registrate
utilizzando le routine globali nella unit Actnlist:
exteta tckss veIi __?aatcaII csc~csceaat ~s. ic.i.c, .ciiss
ceaat ~isscs, ceaat Iat ~isscs_..c, :xetacIaaa cscc),
exteta tckss veIi __?aatcaII csc~cs.ciiss ceaat ~isscs, ceaat Iat
~isscs_..c,
Quando si chiama RegisterActions, le azioni che si registrano vengono visualizzate
nellAction List editor in modo che siano utilizzabili da parte delle applicazioni.
possibile indicare un nome di categoria per organizzare le azioni, oltre a un
parametro Resource che permette di indicare i valori predefiniti delle propriet.
Per esempio, il seguente codice registra con lIDE le azioni standard nella unit
MyAction:
aaeeapace .~c
Metodo Descrizione
HandlesTarget Chiamato automaticamente quando lutente richiama un oggetto (come un
pulsante di una barra pulsanti o una voce di menu) collegato con lazione. Il
metodo HandlesTarget permette alloggetto action di indicare se opportuna
o meno lesecuzione, utilizzando come destinazione loggetto specificato
dal parametro Target. Per i dettagli, consultare Come le azioni trovano le
proprie destinazioni a pagina 8-28.
UpdateTarget Chiamato automaticamente quando lapplicazione inattiva in modo che le
azioni si possano aggiornare in funzione delle condizioni. Utilizzare al posto
di OnUpdateAction. Per i dettagli, consultare Aggiornamento delle azioni a
pagina 8-29.
ExecuteTarget Chiamato automaticamente al posto di OnExecute quando lazione viene
scatenata in risposta allazione di un utente (ad esempio, quando lutente
seleziona una voce di menu o preme un pulsante strumento collegato con
questa azione). Per i dettagli, consultare Cosa accade quando si scatena
unazione a pagina 8-27.
8-32 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
Quando si chiama UnRegisterActions, le azioni non vengono pi visualizzate
nellAction List editor.
Creazione e gestione dei menu
I menu forniscono agli utenti un modo facile per eseguire comandi raggruppati
logicamente. Il Menu Designer di Delphi consente di aggiungere facilmente un
menu, gi progettato o confezionato su misura, alla scheda. sufficiente aggiungere
un componente menu alla scheda, aprire il Menu Designer e scrivere le voci menu
direttamente nella finestra del Menu Designer. possibile aggiungere o cancellare le
voci di menu, o trascinarle e rilasciarle per risistemarle in fase di progettazione.
Non occorre neanche eseguire il programma per vedere i risultatila progettazione
immediatamente visibile nella scheda, che appare proprio come apparir in fase di
esecuzione. Il codice pu modificare i menu anche in fase di esecuzione, per fornire
ulteriori informazioni o opzioni allutente.
Questo capitolo spiega come usare il Menu Designer per progettare barre di menu e
menu (locali) a comparsa. Esso tratta i seguenti modi di lavorare con i menu in fase di
progettazione e in fase di esecuzione:
Apertura del Menu Designer.
Costruzione di menu.
Editing delle voci di menu nellObject Inspector.
Uso del menu contestuale Menu Designer.
Uso dei modelli di menu.
Salvataggio di un menu come modello.
Aggiunta di immagini alle voci di menu.
Figura 8.3 Terminologia dei menu
Apertura del Menu Designer
I menu vengono progettati utilizzando il Menu Designer. Prima di iniziare a usare il
Menu Designer, necessario aggiungere alla scheda un componente TMainMenu o
TPopupMenu. Entrambi i componenti menu sono collocati sulla pagina Standard
della Component palette.
Figura 8.4 Componenti MainMenu e PopupMenu
Acceleratore di
tastiera
Separatore
Voci di menu sulla barra dei menu
Voci di menu in un elenco di menu
Scorciatoia di tastiera
Componente MainMenu
Componente PopupMenu
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-33
C r e a z i o n e e g e s t i o n e d e i m e n u
Un componente MainMenu crea un menu che viene collegato alla barra del titolo
della scheda. Un componente PopupMenu crea un menu che appare quando lutente
fa clic con il tasto destro nella scheda. I menu a comparsa non hanno una barra di
menu.
Per aprire il Menu Designer, selezionare un componente menu sulla scheda, e quindi
scegliere:
Fare doppio clic sul componente menu.
oppure
Dalla pagina Properties dellObject Inspector, selezionare la propriet Items, e
quindi fare doppio clic [Menu] nella colonna Value, oppure fare clic sul pulsante
ellissi (...).
Il Menu Designer viene visualizzato, con la prima voce di menu (vuota)
evidenziata nel Designer, e la propriet Caption selezionata nellObject Inspector.
Figura 8.5 Menu Designer per un menu principale
Costruzione di menu
Si aggiunga un componente menu alla scheda, o alle schede, per ogni menu da
includere nellapplicazione. possibile costruire ciascuna struttura di menu
completamente ex-novo, o iniziare da uno dei modelli di menu predefiniti.
Questa sezione illustra i principi per la creazioni di un menu in fase di progettazione.
Per ulteriori informazioni sui modelli di menu, consultare Uso dei modelli di menu
a pagina 8-41.
Assegnazione dei nomi dei menu
Come tutti i componenti, quando alla scheda viene aggiunto un componente menu,
C++Builder gli d un nome predefinito; per esempio, MainMenu1. possibile dare al
menu un nome pi significativo.
C++Builder aggiunge il nome del menu alla dichiarazione di tipo della scheda, e
quindi questo nome appare nel Component list.
Segnaposto per la
voce di menu
8-34 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
Assegnazione dei nomi delle voci di menu
Al contrario del componente menu stesso, occorre dare esplicitamente un nome alle
voci di menu via via che vengono aggiunte alla scheda. possibile farlo in due modi:
Scrivere direttamente il valore per la propriet Name.
Scrivere prima il valore per la propriet Caption, e lasciare a C++Builder il compito
di derivare la propriet Name dal caption.
Per esempio, se viene data a una voce di menu una valore della propriet Caption
di File, C++Builder assegna alla voce di menu una propriet Name di File1. Se viene
compilata la propriet Name prima di compilare la propriet Caption, C++Builder
lascia la propriet Caption vuota finch non viene scritto un valore.
_
Se vengono immessi nella propriet Caption caratteri non validi per gli
identificatori C++, C++Builder modifica conseguentemente la propriet Name. Per
esempio, se si desidera che il caption inizi con un numero, C++Builder fa
precedere il numero con un carattere per derivare la propriet Name.
La seguente tabella mostra alcuni esempi di ci, presupponendo che tutte le voci
di menu mostrate appaiano nella stessa barra di menu.
Come il componente menu, C++Builder aggiunge qualsiasi nome di voce di menu
alla dichiarazione di tipo della scheda, e quei nomi quindi appaiono nella
Component list.
Aggiunta, inserimento e cancellazione delle voci di menu
Le seguenti procedure descrivono come eseguire i principali compiti coinvolti nella
costruzione della struttura del menu. Ciascuna procedura assume che sia aperta la
finestra Menu Designer.
Per aggiungere voci di menu in fase di progettazione:
1 Selezionare la posizione in cui creare la voce di menu.
Se il Menu Designer stato appena aperto, la prima posizione sulla barra di menu
gi selezionata.
Tabella 8.4 Esempi di caption e loro nomi derivati
Caption del
componente Nome derivato Spiegazione
&File File1 Rimuove la e commerciale
&File (2nd occurrence) File2 Ordina numericamente le voci duplicate
1234 N12341 Aggiunge una lettera prima e lordine numerico
1234 (2nd occurrence) N12342 Aggiungi un numero per eliminare lambiguit al
nome derivato
$@@@# N1 Rimuove tutti i caratteri non standard, aggiungendo
una lettere prima e lordine numerico
- (hyphen) N2 Ordinamento numerico della seconda occorrenza di
caption senza alcun carattere standard
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-35
C r e a z i o n e e g e s t i o n e d e i m e n u
2 Iniziare a scrivere per immettere il caption. O immettere prima la propriet Name
collocando specificamente il cursore nellObject Inspector e immettendo un valore.
In questo caso, occorre allora selezionare di nuovo la propriet Caption ed
immettere un valore.
3 Premere Invio.
Viene selezionato il successivo placeholder per una voce di menu.
Se prima viene immessa la propriet Caption, usare i tasti cursore per ritornare alla
voce di menu appena immessa. C++Builder visualizzer di aver compilato la
propriet Name in base al valore immesso per il caption. (Consultare il paragrafo
Assegnazione dei nomi delle voci di menu a pagina 8-34.)
4 Continuare limmissione dei valori per le propriet Name e Caption per ciascuna
nuova voce da creare, o premere Esc per ritornare alla barra dei menu.
Usare i tasti cursore per spostarsi dalla barra dei menu nel menu, e quindi
spostarsi tra le voci dellelenco; premere Invio per completare unazione. Per
ritornare alla barra dei menu, premere Esc.
Per inserire una nuova voce di menu vuota:
1 Collocare il cursore su una voce di menu.
2 Premere Ins.
Le voci di menu vengono inserite a sinistra della voce selezionata sulla barra dei
menu, e sopra la voce selezionata nellelenco del menu.
Per cancellare una voce di menu o comando:
1 Collocare il cursore sulla voce di menu da cancellare.
2 Premere Del.
_
Non possibile cancellare il placeholder predefinito che appare sotto lultima voce
immessa nellelenco del menu, o vicino allultima voce sulla barra dei menu. Questo
placeholder non appare nel menu in fase di esecuzione.
8-36 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
Figura 8.6 Aggiunta di voci di menu a un menu principale
Aggiunta di barre separatrici
Le barre separatrici inseriscono una riga tra le voci di menu. possibile usare queste
barre per indicare raggruppamenti allinterno dellelenco del menu, o semplicemente
per fornire uninterruzione visuale di un elenco.
Per rendere la voce di menu una barra separatrice, scrivere un trattino () per il
caption.
Specifica dei tasti di scelta rapida e delle scorciatoie di tastiera
I tasti di scelta rapida consentono allutente di accedere ad comando di menu dalla
tastiera premendo Alt+ la lettera appropriata, indicata nel codice dalla e commerciale
precedente. Nel menu, la lettera dopo la e commerciale appare sottolineata.
C++Builder controlla automaticamente lesistenza di tasti di scelta rapida duplicati e
li corregge in fase di esecuzione. Questo comportamento garantisce che tutti i menu
generati dinamicamente in fase di esecuzione non contengano tasti di scelta rapida
duplicati e che tutti gli elementi di menu abbiano un tasto di scelta rapida. possibile
disattivare questo controllo automatico impostando la propriet AutoHotkeys di un
elemento di menu a maManual.
Per specificare un tasti di scelta rapida:
Aggiungere una e commerciale davanti alla lettera appropriata.
Per esempio, per aggiungere un comando di menu Save con la S come tasto
acceleratore, scrivere .ic.
Le scorciatoie di tastiera consentono allutente di eseguire lazione senza accedere
direttamente al menu, scrivendo la combinazione di tasti della scorciatoia.
Per specificare una scorciatoia di tastiera:
Le funzionalit WYSIWYG del Menu Designer mostrano le
voci di menu man mano che il menu viene creato.
Viene creato un oggetto TMenuItem e la
propriet Name viene impostata alla propriet
Caption specificata (eliminando eventuali
caratteri non ammessi e aggiungendo un
suffisso numerico).
Segnaposto per
la voce di menu
Barra del menu
Barra del titolo (mostra la propriet
Name per un componente Menu)
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-37
C r e a z i o n e e g e s t i o n e d e i m e n u
Usare lObject Inspector per immettere un valore per la propriet ShortCut, o
selezionare una combinazione di tasti dallelenco a discesa.
Questo elenco solo un sottoinsieme delle combinazioni valide che possono essere
scritte.
Quando viene aggiunta una scorciatoia, essa appare vicino al titolo della voce di
menu.
j
Le scorciatoie di tastiera, a differenza degli acceleratori, non sono soggette al
controllo automatico per lesistenza di duplicati. Il controllo di univocit deve essere
eseguito manualmente.
Creazione di sottomenu
Molti menu di applicazioni contengono elenchi a discesa che appaiono vicino a una
voce di menu per fornire ulteriori comandi collegati. Tali elenchi vengono indicati da
una freccia a destra della voce di menu. C++Builder supporta tutti i livelli di
sottomenu desiderati.
Organizzando la struttura dei menu in questo modo, si pu salvare lo spazio
verticale dello schermo. Tuttavia, per progettazioni ottimali forse meglio non usare
pi di due o tre livelli nella progettazione dellinterfaccia. (Per i menu popup,
potrebbe essere opportuno usare un solo sottomenu.)
Figura 8.7 Strutture di menu annidate
Per creare un sottomenu:
1 Selezionare la voce di menu sotto cui si desidera creare un sottomenu.
2 Premere Ctrl per creare il primo segnaposto, o fare clic con il tasto destro e
scegliere Create Submenu.
3 Scrivere un nome per la voce del sottomenu, o trascinare una voce di menu
esistente su questo segnaposto.
4 Premere Invio, o , per creare il successivo segnaposto.
5 Ripetere i punti 3 e 4 per ciascuna voce da creare nel sottomenu.
6 Premere Esc per ritornare al precedente livello di menu.
Voci di menu sulla
barra dei menu
Voci di menu in
una lista di menu
Voci di menu
annidate
8-38 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
Creazione di sottomenu per retrocessione dei menu esistenti
possibile creare un sottomenu inserendo una voce dalla barra dei menu (o da un
modello di menu) tra le voci di menu di un elenco. Quando un menu viene spostato
in una struttura di menu esistente, tutte le voci associate lo seguono, creando un
menu completamente intatto. Questo vale anche per i sottomenu. Spostando una
voce di menu in un sottomenu esistente si crea solo un altro livello di annidamento.
Spostamento delle voci di menu
In fase di progettazione, per spostare le voci di menu basta semplicemente trascinare
e rilasciare. possibile spostare le voci della barra dei menu, o in un altro posto
dellelenco del menu, o in un menu completamente diverso.
Lunica eccezione a ci di tipo gerarchico: non possibile degradare una voce dalla
barra dei menu nel suo stesso menu; n possibile spostare una voce di menu nel suo
stesso sottomenu. Per, si pu spostare qualsiasi voce in un altro menu,
indipendentemente dalla sua posizione originaria.
Durante il trascinamento, il cursore cambia forma per indicare se possibile
rilasciare la voce di menu nella nuova locazione. Quando viene spostata una voce di
menu, si sposta anche qualsiasi voce al di sotto di essa.
Per spostare una voce di menu lungo la barra dei men:,
1 Trascinare la voce lungo la barra dei menu finch la punta della freccia del cursore
di trascinamento punta alla nuova locazione.
2 Rilasciare il pulsante del mouse per abbandonare la voce di menu nella nuova
locazione.
Per spostare una voce in un elenco di menu:
1 Trascinare la voce lungo la barra dei menu finch la punta della freccia del cursore
di trascinamento punta al nuovo menu.
Questo obbliga il menu ad aprirsi, consentendo di trascinare la voce nella sua
nuova locazione.
2 Trascinare la voce di menu nellelenco, rilasciando il pulsante del mouse per
abbandonare la voce di menu nella nuova locazione.
Aggiunta di immagini alle voci di menu
Le immagini possono aiutare gli utenti a navigare nei menu facendo corrispondere
glyph e immagini allazione della voce di menu, in modo analogo alle immagini della
barra strumenti. possibile aggiungere singole bitmap alle voci di menu oppure
possibile organizzare le immagini per lapplicazione in una lista di immagini e
aggiungerle a un menu prelevandole dalla lista di immagini. Se nellapplicazione si
utilizzano numerose bitmap delle stesse dimensioni, utile collocarle in una lista di
immagini.
Per aggiungere una singola immagine a un menu o a una voce di menu, impostarne
la propriet Bitmap in modo che faccia riferimento al nome della bitmap che sar
utilizzata sul menu o sulla voce di menu.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-39
C r e a z i o n e e g e s t i o n e d e i m e n u
Per aggiungere unimmagine a una voce di menu utilizzando una lista di immagini:
1 Rilasciare un oggetto TMainMenu o TPopupMenu su una scheda.
2 Rilasciare un oggetto TImageList sulla scheda.
3 Aprire lImageList editor facendo doppio clic sulloggetto TImageList.
4 Fare clic su Add per selezionare la bitmap o il gruppo di bitmap da usare nel
menu. Fare clic su OK.
5 Impostare la propriet Images delloggetto TMainMenu o TPopupMenu allImageList
appena creato.
6 Creare le voci di menu e di sottomenu come precedentemente descritto.
7 Selezionare la voce di menu per la quale si desidera unimmagine nellObject
Inspector e impostare la propriet ImageIndex al corrispondente numero
dellimmagine nellImageList (il valore predefinito per ImageIndex 1, che non
visualizza alcuna immagine).
_
Usare immagini 16 per 16 pixel per una visualizzazione corretta nel menu. Anche se
possibile usare altre dimensioni, quando si usano immagini pi grandi o pi piccole
potrebbero nascere problemi di allineamento e di coerenza.
Visualizzazione del menu
In fase di progettazione, possibile visualizzare il menu nella scheda senza prima
eseguire il codice del programma. (I menu del componente a comparsa sono visibili
nella scheda in fase di progettazione, ma ci non succede per gli stessi menu a
comparsa. Usare il Menu Designer per visualizzare un menu a comparsa in fase di
progettazione.)
Per visualizzare il menu:
1 Se la scheda visibile, fare clic sulla scheda, o dal menu View, scegliere la scheda
di cui si vuole visualizzare il menu.
2 Se la scheda ha pi di un menu, selezionare il menu desiderato dallelenco a
discesa della propriet Menu della scheda.
Il menu appare nella scheda esattamente come apparir quando il programma
viene eseguito.
Editing delle voci di menu nellObject Inspector
Questa sezione ha trattato come impostare alcune propriet per le voci di menuper
esempio, le propriet Name e Captionusando il Menu Designer.
La sezione ha anche descritto come impostare le propriet di una voce di menu, come
ShortCut, direttamente nellObject Inspector, proprio come si farebbe per qualsiasi
componente selezionato nella scheda.
Quando si modifica una voce di menu usando il Menu Designer, le sue propriet
vengono ancora visualizzate nellObject Inspector. Si pu passare il fuoco allObject
Inspector e continuare l lediting delle propriet della voce di menu. Oppure si pu
8-40 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
selezionare la voce di menu dal Component list nellObject Inspector e modificarne le
propriet senza aprire sempre il Menu Designer.
Per chiudere il Menu Designer e continuare la modifica delle voci di menu:
1 Passare il fuoco dalla finestra Menu Designer allObject Inspector facendo clic
sulla pagina Properties dellObject Inspector.
2 Chiudere il Menu Designer coma al solito.
Il fuoco rimane nellObject Inspector, dove possibile continuare lediting delle
propriet per la voce di menu selezionata. Per modificare unaltra voce di menu,
selezionarla dal Component list.
Uso del menu contestuale Menu Designer
Il menu contestuale di Menu Designer fornisce un rapido accesso ai comandi pi
usati del Menu Designer, e alle opzioni relative ai modelli di menu. Per ulteriori
informazioni sui modelli di menu, consultare Uso dei modelli di menu a
pagina 8-41.)
Per visualizzare il menu contestuale, fare clic con il tasto destro sulla finestra Menu
Designer, o premere Alt+F10 mentre il cursore si trova nella finestra.
I comandi del menu contestuale
La seguente tabella riporta i comandi del menu contestuale Menu Designer.
Passaggio da un menu allaltro in fase di progettazione
Se per la scheda occorre creare molti menu, si pu usare il menu contestuale Menu
Designer o lObject Inspector per selezionare e spostarsi facilmente dalluno allaltro.
Tabella 8.5 Comandi del menu contestuale Menu Designer
Comando Azione
Insert Inserisce un placeholder sopra o a sinistra del cursore.
Delete Cancella la voce di menu selezionata (e tutti i suoi sottoelementi, se ne
esistono).
Create Submenu Crea un placeholder a un livello annidato e aggiunge una freccia alla
destra della voce di menu selezionata.
Select Menu Apre un elenco di menu nella scheda corrente. Facendo doppio clic su un
nome di menu si apre la finestra designer per il menu.
Save As Template Apre la finestra di dialogo Save Template, dove possibile salvare un
menu che potrebbe essere utile in futuro.
Insert From
Template
Apre la finestra di dialogo Insert Template, dove possibile selezionare
un modello da riutilizzare.
Delete Templates Apre la finestra di dialogo Delete Templates, dove possibile cancellare
un qualsiasi modello esistente.
Insert From
Resource
Apre la finestra di dialogo Insert Menu from file Resource, dove
possibile scegliere un file .rc oppure .mnu da aprire nella scheda corrente.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-41
C r e a z i o n e e g e s t i o n e d e i m e n u
Per usare il menu contestuale per passare da un menu allaltro di una scheda:
1 Fare clic destro nel Menu Designer e scegliere Select Menu.
Viene visualizzata la finestra di dialogo Select Menu.
Figura 8.8 Finestra di dialogo Select Menu
Questa finestra di dialogo elenca tutti i menu associati alla scheda il cui menu
attualmente aperto nel Menu Designer.
2 Dallelenco della finestra di dialogo Select Menu, scegliere il menu da visualizzare
o modificare.
Per usare Object Inspector to switch between menus in a form:
1 Passare il fuoco sulla scheda da cui scegliere i menu.
2 Dal Component list, selezionare il menu da modificare.
3 Sulla pagina Properties dellObject Inspector, selezionare la propriet Items per
questo menu, e quindi fare clic sul pulsante ellissi o doppio clic su [Menu].
Uso dei modelli di menu
C++Builder fornisce molti menu gi progettati, o modelli di menu, che contengono i
comandi usati pi frequentemente. possibile usare questi menu nella applicazioni
senza modificarli (a parte la scrittura del codice), o come punto di partenza,
personalizzandoli come si farebbe con un proprio menu progettato in precedenza. I
modelli di menu non contengono qualsiasi codice di gestore di evento.
I modelli di menu forniti con C++Builder sono memorizzati nella sottodirectory BIN
di uninstallazione predefinita. Questi file hanno estensione .dmt (modelli di menu di
C++Builder.
Inoltre, possibile salvare un modello di qualsiasi menu progettato usando Menu
Designer. Dopo aver salvato un menu come modello, possibile usarlo come
qualsiasi menu gi progettato. Quando un particolare modello di menu non serve
pi, possibile cancellarlo dallelenco.
Per aggiungere un modello di menu allapplicazione:
1 Fare clic con il tasto destro sul Menu Designer e scegliere Insert From Template.
8-42 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
(Se non ci sono modelli, lopzione Insert From Template nel menu contestuale
appare attenuata.)
Viene aperta la finestra di dialogo Insert Template, con un elenco di modelli di
menu disponibili.
Figura 8.9 Esempio di finestra di dialogo Insert Template per i menu
2 Selezionare il modello di menu da inserire, quindi premere Invio o scegliere OK.
Questa operazione inserisce il menu nella scheda alla posizione del cursore. Per
esempio, se il cursore su una voce di menu di un elenco, il modello di menu
viene inserito sopra la voce selezionata. Se il cursore sulla barra dei menu, il
modello viene inserito a sinistra del cursore.
Per cancellare un modello di menu:
1 Fare clic con il tasto destro sul Menu Designer e scegliere Delete Templates.
(Se non ci sono modelli, lopzione Delete Templates del menu contestuale appare
attenuata.)
Viene aperta la finestra di dialogo Delete Templates, con un elenco di modelli
disponibili.
2 Selezionare il modello di menu da cancellare, e premere Del.
C++Builder cancella il modello dallelenco e dal disco rigido.
Salvataggio di un menu come modello
Qualsiasi menu progettato pu essere salvato come modello, in modo da poterlo di
nuovo. I modelli di menu possono essere usati per fornire alle applicazioni un
aspetto armonioso, o come punto di partenza per ulteriori personalizzazioni.
I modelli di menu salvati vengono memorizzati nella sottodirectory BIN come file
.dmt.
Per salvare un menu come modello:
1 Progettare il menu da riutilizzare.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-43
C r e a z i o n e e g e s t i o n e d e i m e n u
Questo menu pu contenere tutte le voci, i comandi e i sottomenu preferiti; tutto
ci che si trova nella finestra Menu Designer attiva verr salvato come menu
riutilizzabile.
2 Fare clic con il tasto destro sul Menu Designer e scegliere Save As Template.
Viene visualizzata la finestra di dialogo Save Template.
Figura 8.10 Finestra di dialogo Save Template per menu
3 Nella casella di modifica Template Description, scrivere una breve descrizione per
questo menu, e quindi scegliere OK.
La finestra di dialogo Save Template si chiude, salvando il progetto del menu e
ritornando alla finestra Menu Designer.
_
La descrizione immessa viene visualizzata solo nelle finestre di dialogo Save
Template, Insert Template e Delete Templates. Non collegata alla propriet Name o
Caption per il menu.
Convenzioni per lassegnazione dei nomi delle voci di menu e dei gestori di
evento di un modello
Quando si salva un menu come modello, C++Builder non salva la sua propriet
Name, poich ogni menu deve avere un nome caratteristico allinterno del campo
dazione del suo proprietario (la scheda). Tuttavia, quando in una scheda viene
inserito il menu come modello usando il Menu Designer, allora C++Builder genera
nuovi nomi per il menu stesso e per tutte le sue voci.
Per esempio, si supponga di salvare un menu File come modello. Nel menu originale,
questo menu stato chiamato MyFile. Se tale menu viene inserito come modello in un
nuovo menu, C++Builder gli assegna il nome File1. Se il menu viene inserito in un
menu con una voce di menu chiamata File1, C++Builder gli assegna il nome File2.
C++Builder non salva neanche tutti i gestori di evento OnClick associata a un menu
salvato come modello, poich non c alcun modo per verificare se il codice valido
nella nuova scheda. Quando viene generato un nuovo gestore di evento per la voce
di menu di un modello, C++Builder genera ancora il nome del gestore di evento.
8-44 G u i d a a l l a p r o g r a mma z i o n e
C r e a z i o n e e g e s t i o n e d e i m e n u
possibile associare facilmente le voci del modello di menu ai gestori di evento
OnClick esistenti nella scheda.
Manipolazione delle voci di menu in fase di esecuzione
Qualche volta, potrebbe essere necessario aggiungere delle voci di menu a una
struttura di menu esistente mentre lapplicazione in esecuzione, in modo da fornire
ulteriori informazioni o opzioni allutente. possibile inserire una voce di menu
usando il metodo Add o Insert della voce di menu, o in alternativa nascondere e
mostrare le voci di un menu cambiando la loro propriet Visible. La proprietVisible
determina se la voce viene visualizzata nel menu. Per attenuare una voce di menu
senza nasconderla, usare la propriet Enabled.
Per esempi che usano le propriet Visible e Enabled della voce di menu, consultare
Disattivazione delle voci di menu a pagina 6-10.
Nelle applicazioni MDI (Multiple Document Interface) e OLE (Object Linking and
Embedding), possibile anche fondere le voci contenute in una barra di menu
esistente. La seguente sezione tratta questo argomento in dettaglio.
Fusione dei menu
Per le applicazioni MDI, come unapplicazione di esempio di editor di testi, e per le
applicazioni client OLE, il menu principale dellapplicazione deve essere in grado di
ricevere voci di menu da unaltra scheda o dalloggetto server OLE. Spesso, ci viene
chiamato fusione di menu. bene ricordare che la tecnologia OLE utilizzabile solo in
applicazioni Windows e non disponibile per lo sviluppo di applicazioni
multipiattaforma.
I menu da fondere vengono preparati specificando i valori di due propriet:
Menu, una propriet della scheda
GroupIndex, una propriet delle voci del menu
Specifica del menu attivo: propriet Menu
La propriet Menu specifica il menu attivo per la scheda. Le operazioni per la fusione
dei menu valgono solo per il menu attivo. Se la scheda contiene pi di un
componente menu, possibile cambiare il menu attivo in fase di esecuzione
impostando la propriet Menu nel codice. Per esempio,
.>.c .cc..c,
Determinazione dellordine delle voci di menu fuse: propriet GroupIndex
La propriet GroupIndex determina lordine in cui le voci di menu fuse appaiono nella
barra dei menu condivisa. Le voci di menu della fusione possono sostituire quelle
sulla barra del menu principale, o essere mischiate.
Il valore predefinito per GroupIndex 0. Quando si specifica un valore per GroupIndex
si devono applicare diverse regole:
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-45
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
I numeri pi bassi appaiono prima (pi a sinistra) nel menu.
Per esempio, impostare la propriet GroupIndex a 0 (zero) per un menu che debba
essere sempre il primo a sinistra, come un menu File. Analogamente, specificare
un numero alto (non necessariamente in sequenza) per un menu che debba essere
sempre il primo a destra, come un menu Help.
Per sostituire le voci del menu principale, dare alle voci sul menu figlio lo stesso
valore GroupIndex.
Questa regola applicabile ai raggruppamenti e alle singole voci. Per esempio, se
la scheda principale ha una voce di menu Edit con un valore GroupIndex di 1,
possibile sostituirla con una o pi voci dal menu della scheda figlia dando anche a
questa un valore GroupIndex di 1.
Fornendo alle stesse voci del menu figlio lo stesso valore GroupIndex si tiene il loro
ordine intatto quando vengono fuse nel menu principale.
Per inserire le voci senza sostituire quelle del menu principale, lasciare spazio
nellintervallo numerico delle voci del menu principale e inserire i numeri dalla
scheda figlia.
Per esempio, numerare le voci del menu principale 0 e 5, e inserire le voci del
menu figlio numerandole 1, 2, 3 e 4.
Importazione dei file risorsa
C++Builder supporta menu costruiti con altre applicazioni, purch siano nel formato
file risorsa standard (.RC) di Windows. Tali menu possono essere importati
direttamente nel progetto C++Builder, risparmiando il tempo e la fatica di costruire
di nuovo i menu che sono stati creati altrove.
Per caricare i file menu .RC esistenti:
1 Nel Menu Designer, collocare il cursore nel punto in cui far apparire il menu.
Il menu importato pu far parte di un menu in costruzione, o essere un menu
completo.
2 Fare clic con il tasto destro e scegliere Insert From Resource.
Viene visualizzata la finestra di dialogo Insert Menu From Resource.
3 Nella finestra di dialogo, selezionare il file risorsa da caricare e scegliere OK.
Il menu appare nella finestra Menu Designer.
_
Se il file risorsa contiene pi di un menu, occorre prima salvare ciascun menu come
un file risorsa distinto prima di importarlo.
Progettazione di barre strumenti e di coolbar
Una barra strumenti un pannello, solitamente nella parte superiore di una scheda
(sotto la barra dei menu), che contiene pulsanti e altri controlli. Una coolbar (chiamata
8-46 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
anche rebar) una particolare barra strumenti che visualizza i controlli su bande
mobili e ridimensionabili. Se vi sono pi pannelli allineati al bordo superiore della
scheda, essi vengono impilati in verticale, in base alla sequenza con cui sono stati
aggiunti.
_
Le coolbar non sono disponibili in CLX per applicazioni multipiattaforma.
Su una barra strumenti possono essere messi controlli di qualsiasi tipo. Oltre ai
pulsanti, potrebbe essere opportuno mettere griglie per luso dei colori, barre di
scorrimento, etichette, e cos via.
Esistono molti modi per aggiungere una barra strumenti a una scheda:
Collocare un pannello (TPanel) sulla scheda e aggiungervi i controlli (di solito
pulsanti di scelta rapida).
Usare un componente barra strumenti (TToolBar) invece di TPanel, e aggiungervi i
controlli. TToolBar gestisce i pulsanti e altri controlli, sistemandoli in righe e
regolandone automaticamente dimensioni e posizioni. Se sulla barra strumenti
vengono usati controlli pulsante di strumento (TToolButton), TToolBar facilita il
raggruppamento dei pulsanti per funzione e fornisce altre opzioni di
visualizzazione.
Usare un componente coolbar (TCoolBar) e aggiungervi i controlli. La coolbar
visualizza i controlli su bande mobili e ridimensionabili indipendenti.
Il modo in cui implementare la barra strumenti dipende dallapplicazione. Il
vantaggio di usare il componente Panel sta nel fatto che si ha il controllo totale
dellaspetto della barra strumenti.
Usando componenti barra strumenti e coolbar, si garantisce allapplicazione di avere
laspetto di unapplicazione Windows, poich vengono usati i controlli Windows
nativi. Se questi controlli del sistema operativo in futuro cambiano, anche
lapplicazione potrebbe cambiarli. Inoltre, dal momento che la barra strumenti e la
coolbar fa affidamento sui componenti standard di Windows, lapplicazione richiede
COMCTL32.DLL. Le barre strumenti e le coolbar non vengono supportate dalle
applicazioni WinNT 3.51.
Nelle sezioni seguenti viene descritta la procedura per:
Aggiungere una barra strumenti e i corrispondenti controlli pulsante di scelta
rapida usando il componente barra strumenti.
Aggiungere una barra strumenti e i corrispondenti controlli pulsante strumento
usando il componente barra strumenti.
Aggiungere una coolbar usando il componente coolbar.
Rispondere ai clic.
Aggiungere barre strumenti e coolbar nascoste.
Nascondere e mostrare barre strumenti e coolbar.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-47
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
Aggiunta di una barra strumenti usando un componente panel
Per aggiungere una barra strumenti a una scheda usando il componente panel:
1 Aggiungere alla scheda un componente panel (dalla pagina Standard della
Component palette).
2 Impostare la propriet Align del pannello a alTop. Quando allineato alla parte
superiore della scheda, il pannello conserva laltezza, ma adegua la sua larghezza
a quella dellarea client della scheda, anche se la finestra cambia dimensioni.
3 Aggiungere i pulsanti di scelta rapida o altri controlli al pannello.
I pulsanti di scelta rapida sono progettati per lavorare sui pannelli della barra
strumenti. Un pulsante di scelta rapida, normalmente, non ha alcun caption, ma solo
un piccolo grafico (chiamato glyph), che rappresenta la funzione del pulsante.
I pulsanti di scelta rapida hanno tre possibili modi di funzionamento. Essi possono
Agire come normali pulsanti a pressione
Attivare e disattivare quando vi si fa clic sopra
Agire come un insieme di pulsanti radio
Per implementare i pulsanti di scelta rapida sulle barre strumenti:
Aggiungere un pulsante di scelta rapida a un pannello della barra strumenti.
Assegnare un glyph al pulsante di scelta rapida.
Impostare la condizione iniziale di un pulsante di scelta rapida.
Creare un gruppo di pulsanti di scelta rapida.
Consentire la commutazione dei pulsanti.
Aggiunta di un pulsante di scelta rapida a un pannello
Per aggiungere un pulsante di scelta rapida a un pannello della barra strumenti,
collocare il componente pulsante di scelta rapida (dalla pagina Additional della
Component palette) sul pannello.
Il pannello, e non la scheda, possiede il pulsante di scelta rapida, in modo che
spostando o nascondendo il pannello si sposta o si nasconde anche il pulsante di
scelta rapida.
Laltezza predefinita del pannello 41, mentre quella dei pulsanti di scelta rapida
25. Se la propriet Top di ciascun pulsante viene impostata a 8, essi verranno centrati
verticalmente. Limpostazione predefinita della griglia blocca automaticamente il
pulsante di scelta rapida in quella posizione verticale.
Assegnazione del glifo a un pulsante di scelta rapida
Ogni pulsante di scelta rapida ha bisogno di unimmagine grafica, detta anche glifo,
per indicare allutente la funzione svolta. Se viene fornita solo unimmagine, il
pulsante di scelta rapida manipola quellimmagine per indicare che stato premuto,
non premuto, selezionato o disattivato. Se si preferisce, possibile fornire anche
specifiche immagini distinte per ciascuno stato.
8-48 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
Normalmente, i glifi vengono assegnati ai pulsanti di scelta rapida in fase di
progettazione, anche se possibile assegnare glifi differenti in fase di esecuzione.
Per assegnare un glifo a un pulsante di scelta rapida in fase di progettazione:
1 Selezionare il pulsante di scelta rapida.
2 NellObject Inspector, selezionare la propriet Glyph.
3 Fare doppio clic sulla colonna Value a fianco di Glyph per aprire il Picture Editor e
selezionare la bitmap desiderato.
Impostazione della condizione iniziale di un pulsante di scelta rapida
I pulsanti di scelta rapida sfruttano il proprio aspetto per dare allutente indizi
relativi al loro stato e alla loro funzione. Poich non hanno alcuna etichetta,
importante usare le parti visuali corrette per aiutare gli utenti.
La Tabella 8.6 elenca alcune azioni che possibile impostare per cambiare laspetto di
un pulsante di scelta rapida:
Se lapplicazione ha uno strumento di disegno predefinito, essere certi che il suo
pulsante sulla barra strumenti premuto quando lapplicazione viene avviata. Per
eseguire questa operazione, impostare la sua propriet GroupIndex a un valore
diverso da zero e la sua propriet Down a true.
Creazione di un gruppo di pulsanti di scelta rapida
Spesso, una serie di pulsanti di scelta rapida rappresenta un insieme di scelte che si
escludono a vicenda. In questo caso, occorre riunire i pulsanti in un gruppo, in modo
che il clic su un qualsiasi pulsante del gruppo obblighi gli altri pulsanti a risalire.
Per associare un qualsiasi numero di pulsanti di scelta rapida in un gruppo,
assegnare lo stesso numero a ciascuna propriet GroupIndex del pulsante di scelta
rapida.
Il modo pi facile per compiere questa operazione quello di selezionare tutti i
pulsanti desiderati nel gruppo, e, con lintero gruppo selezionato, impostare
GroupIndex a un valore caratteristico.
Come consentire la commutazione dei pulsanti
Qualche volta, si vuole avere la possibilit di fare clic su un pulsante gi premuto di
un gruppo e riportarlo su, non lasciando nel gruppo alcun pulsante premuto. Un tale
pulsante viene chiamato commutatore. Usare AllowAllUp per creare un pulsante di
Tabella 8.6 Impostazione dellaspetto di pulsanti scelta rapid a
Per fare in modo che un pulsante di
scelta rapida: Nella barra strumenti, impostare:
Appaia premuto La propriet GroupIndex a un valore diverso da zero e la
sua propriet Down a true.
Appaia disattivato La propriet Enabled a false.
Abbia un margine sinistro La propriet Indent a una valore maggiore di 0.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-49
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
gruppo che agisce come un commutatore: facendo clic su esso una prima volta,
rimane gi; facendo clic di nuovo, ritorna su.
Perch un pulsante di scelta rapida di gruppo diventi un commutatore, impostare la
sua propriet AllowAllUp a true.
Impostando AllowAllUp a true per tutti i pulsanti di scelta rapida di un gruppo, si
imposta automaticamente lo stesso valore di propriet per tutti i pulsanti del gruppo.
Ci consente al gruppo di agire come un normale gruppo, con un solo pulsante
premuto alla volta, ma consente anche ai pulsanti di essere contemporaneamente
tutti su.
Aggiunta di una barra strumenti usando il relativo componente
Il componente barra strumenti (TToolBar) offre caratteristiche di gestione e di
visualizzazione dei pulsanti che i componenti pannello non hanno. Per aggiungere
una barra strumenti a una scheda usando questo componente:
1 Aggiungere alla scheda un componente barra strumenti (dalla pagina Win32 della
Component palette). La barra strumenti viene allineata automaticamente alla
parte superiore della scheda.
2 Aggiungere alla barra i pulsanti strumento o altri controlli.
I pulsanti strumento sono progettati per lavorare sui componenti barra strumenti.
Come i pulsanti di scelta rapida, i pulsanti strumento possono:
Agire come normali pulsanti a pressione.
Attivare e disattivare quando vi si fa clic sopra.
Agire come un insieme di pulsanti radio.
Per implementare i pulsanti strumento su una barra strumenti:
Aggiungere un pulsante strumento
Assegnare le immagini ai pulsanti strumento
Impostare laspetto dei pulsanti strumento
Creare un gruppo di pulsanti strumento
Consentire la commutazione di pulsanti strumento
Aggiunta di un pulsante strumento
Per aggiungere un pulsante strumento a una barra strumenti, fare clic con il tasto
destro sulla barra strumenti e scegliere New Button.
La barra strumenti possiede il pulsante strumento, cos che, spostando o
nascondendo la barra strumenti, si sposta o si nasconde anche il pulsante. Inoltre,
tutti i pulsanti strumento sulla barra strumenti mantengono automaticamente
laltezza e la larghezza. Sulla barra strumenti possibile rilasciare altri controlli dalla
Component palette, e manterranno automaticamente unaltezza uniforme. I controlli,
inoltre, vanno automaticamente a capo e iniziano una nuova riga quando la
dimensione orizzontale della barra strumenti non sufficiente a contenerli.
8-50 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
Assegnazione di immagini ai pulsanti strumento
Ogni pulsante strumento ha una propriet ImageIndex che determina quale immagine
appare su di esso in fase di esecuzione. Se al pulsante strumento viene fornita solo
unimmagine, il pulsante manipola quellimmagine per indicare che il pulsante
disattivato. Per assegnare le immagini ai pulsanti strumento in fase di progettazione:
1 Selezionare la barra strumenti sulla quale devono apparire i pulsanti.
2 NellObject Inspector, assegnare un oggetto TImageList alla propriet Images della
barra strumenti. Un elenco di immagini una raccolta di icone o bitmap con le
stesse dimensioni.
3 Selezionare un pulsante strumento.
4 NellObject Inspector, assegnare un intero alla propriet ImageIndex del pulsante
strumento che corrisponde allimmagine dellelenco da assegnare al pulsante.
possibile specificare anche immagini distinte che appaiono sui pulsanti strumento
quando vengono disattivati e quando sono sotto il puntatore del mouse. Per eseguire
questa operazione, assegnare immagini distinte alle propriet DisabledImages e
HotImages della barra strumenti.
Impostazione dellaspetto di un pulsante strumento e delle condizioni iniziali
La Tabella 8.7 elenca alcune azioni che possibile impostare per cambiare laspetto di
un pulsante strumento:
_
Luso della propriet Flat di TToolBar richiede la versione 4.70 o successive di
COMCTL32.DLL.
Per forzare una nuova riga di controlli dopo un determinato pulsante, strumento,
selezionare il pulsante strumento che deve apparire per ultimo nella riga e impostare
la sua propriet Wrap a true.
Per disattivare la caratteristica auto-wrap di una barra strumenti, impostare la
propriet Wrapable della barra strumenti a false.
Creazione di gruppi di pulsanti strumento
Per creare un gruppo di pulsanti strumento, selezionare i pulsanti da associare e
impostare la loro propriet Style a tbsCheck; quindi impostare la loro propriet
Grouped a true. La selezione di un pulsante strumento di gruppo obbliga gli altri
Tabella 8.7 Impostazione dellaspetto di pulsanti strumento
Per fare in modo che un pulsante
strumento: Nella barra strumenti, impostare
Appaia premuta (La propriet Style (su un pulsante strumento) a tbsChecke
e la propriet Down a true.
Appaia disattivato La propriet Enabled a false.
Abbia un margine sinistro La propriet Indent a una valore maggiore di 0.
Appaia con i bordi pop-up,
rendendo perci la barra strumenti
trasparente
La propriet Flat a true.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-51
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
pulsanti del gruppo a pop up, che un utile modo di rappresentare un insieme di
scelte che si escludono a vicenda.
Una qualsiasi sequenza ininterrotta di pulsanti strumento adiacenti con Style
impostata a tbsCheck e Grouped impostata a true forma un singolo gruppo. Per
spezzare un gruppo di pulsanti strumento, separare i pulsanti con un qualsiasi:
Pulsante strumento la cui propriet Grouped false.
Pulsante strumento la cui propriet Style non impostata a tbsCheck. Per creare
spazi o divisioni sulla barra strumenti, aggiungere un pulsante strumento la cui
propriet Style tbsSeparator o tbsDivider.
Un altro controllo che non sia un pulsante strumento.
Come consentire pulsanti strumento commutati
Usare AllowAllUp per creare un pulsante strumento di gruppo che agisce come un
commutatore: facendo clic su esso una prima volta, rimane gi; facendo clic di
nuovo, ritorna su.Perch un pulsante strumento di gruppo diventi un commutatore,
impostare la sua propriet AllowAllUp a true.
Come i pulsanti di scelta rapida, impostando AllowAllUp a true per tutti i pulsanti
strumento di un gruppo, si imposta automaticamente lo stesso valore di propriet
per tutti i pulsanti del gruppo.
Aggiunta di un componente coolbar
_
Il componente TCoolBar richiede la versione 4.70 o successiva di COMCTL32.DLL e
non disponibile in CLX.
Il componente coolbar (TCoolBar) detto anche rebar visualizza controlli con
finestra su bande mobili e ridimensionabili in modo indipendente. Lutente pu
posizionare le bande trascinando i grip di ridimensionamento sul lato sinistro di
ciascuna banda.
Per aggiungere una coolbar a una scheda in unapplicazione Window:
1 Aggiungere alla scheda un componente coolbar (dalla pagina Win32 della
Component palette). La coolbar viene allineata automaticamente alla parte
superiore della scheda.
2 Aggiungere alla barra i controlli windowed dalla Component palette.
Solo i componenti della VCL che discendono da TWinControl sono controlli con
finestra. possibile aggiungere alla coolbar controlli grafici, come etichette o
pulsanti, ma non appariranno su bande distinte.
8-52 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
Impostazione dellaspetto della coolbar
Il componente coolbar offre molte utili opzioni di configurazione. La Tabella 8.8
elenca alcune azioni che possibile impostare per cambiare laspetto di un pulsante
strumento:
Per assegnare immagini alle singole bande, selezionare la coolbar e fare doppio clic
sulla propriet Bands nellObject Inspector. Quindi selezionare una banda e assegnare
un valore alla sua propriet ImageIndex.
Risposta ai clic
Quando lutente fa clic su un controllo, come un pulsante su una barra strumenti,
lapplicazione genera un evento OnClick a cui possibile rispondere con un gestore
di evento. Poich OnClick levento predefinito dei pulsanti, possibile generare uno
scheletro di gestore di evento facendo doppio clic sul pulsante in fase di
progettazione.
Assegnazione di un menu a un pulsante strumento
Se viene usata una barra strumenti (TToolBar) con pulsanti strumento (TToolButton),
possibile associare un menu a uno specifico pulsante:
1 Selezionare il pulsante strumento.
2 NellObject Inspector, assegnare un menu a comparsa (TPopupMenu) alla propriet
DropDownMenu del pulsante strumento.
Tabella 8.8 Impostazione dellaspetto di un pulsante cool
Per fare in modo che la coolbar: Nella barra strumenti, impostare:
Venga ridimensionata automaticamente
per alloggiare le bande che contiene
La propriet AutoSize a true.
Mantenga le bande a unaltezza
uniforme
La propriet FixedSize a true.
Venga orientata verticalmente invece
che orizzontalmente
La propriet Vertical a true. Questa operazione cambia
leffetto della propriet FixedSize.
Impedisca alle propriet Text delle
bande la visualizzazione in fase di
esecuzione
La propriet ShowText a false. Ciascuna banda di una
coolbar ha una sua propriet Text.
Rimuova il bordo che la circonda La propriet BandBorderStyle a bsNone.
Impedisca agli utenti di cambiare
lordine delle bande in fase di
esecuzione. (Lutente pu sempre
spostare e ridimensionare le bande.)
FixedOrder a true.
Crei unimmagine per lo sfondo della
coolbar
La propriet Bitmap alloggetto TBitmap.
Scelga un elenco di immagini da
visualizzare a sinistra di qualsiasi banda
La propriet Images alloggetto TImageList.
S v i l u p p o d e l l i n t e r f a c c i a u t e n t e d e l l a p p l i c a z i o n e 8-53
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
Se la propriet AutoPopup del menu impostata a true, apparir automaticamente
quando il pulsante viene premuto.
Aggiunta di barre strumenti nascoste
Le barre strumenti non devono essere visibili tutte le volte. Infatti, spesso comodo
avere a disposizione un gran numero di barre strumenti, ma mostrarle solo quando
lutente desidera usarle. Altrettanto spesso, quindi, viene creata una scheda che ha
molte barre strumenti, ma tutte o in parte nascoste.
Per creare una barra strumenti nascosta:
1 Aggiungere alla scheda un componente barra strumenti, coolbar o pannello.
2 Impostare la propriet Visible del componente a false.
Anche se la barra strumenti rimane visibile in fase di progettazione in modo da
poterla modificare, rimane nascosta in fase di esecuzione finch lapplicazione non la
rende specificamente visibile.
Come nascondere e mostrare le barre strumenti
Spesso, opportuno che unapplicazione abbia barre strumenti multiple, ma non si
vuole ingombrare la scheda visualizzandole tutte insieme. Oppure, si pu lasciare
agli utenti la possibilit di decidere se visualizzare le barre strumenti. Come tutti i
componenti, le barre strumenti possono essere mostrate o nascoste, secondo le
necessit, in fase di esecuzione.
Per nascondere o mostrare una barra strumenti in fase di esecuzione, impostare la
sua propriet Visible, rispettivamente, a false o true. Normalmente, questa
operazione viene eseguita in risposta a particolari eventi dellutente o a modifiche nel
modo operativo dellapplicazione. Per eseguire questa operazione, normalmente c
un pulsante close su ciascuna barra strumenti. Quando lutente fa clic su quel
pulsante, lapplicazione nasconde la corrispondente barra strumenti.
anche possibile fornire strumenti per la commutazione della barra strumenti. nel
seguente esempio, una barra strumenti di penne viene commutata da un pulsante
sulla barra strumenti principale. Poich ciascun clic preme o rilascia il pulsante, un
gestore di evento OnClick pu mostrare o nascondere al barra strumenti Pen a
seconda che il pulsante sia su o gi.
veIi __?aatcaII ..cc.ccc .c.c
.ci>scc .c>.,
8-54 G u i d a a l l a p r o g r a mma z i o n e
P r o g e t t a z i o n e d i b a r r e s t r u m e n t i e d i c o o l b a r
T i p i d i c o n t r o l l i 9-1
C a p i t o l o
9
Capitolo9Tipi di controlli
I controlli sono componenti visuali che aiutano a progettare linterfaccia utente.
Questo capitolo descrive i vari controlli che possibile utilizzare, tra cui controlli di
testo, controlli di input, pulsanti, controlli elenco, controlli di raggruppamento,
controlli di visualizzazione, griglie, editor di valori di elenco e controlli grafici.
Per la creazione di un controllo grafico consultare il Capitolo 54, Creazione di un
controllo grafico. Per sapere come implementare tali controlli vedere il Capitolo 6,
Uso dei controlli.
Controlli di testo
Molte applicazioni utilizzano controlli di testo per mostrare il testo allutente.
possibile utilizzare:
Controlli di editing, che permettono allutente di aggiungere testo.
Utilizzare questo
componente: Per consentire allutente di:
TEdit Modificare una singola riga di testo.
TMemo Modificare pi righe di testo.
TMaskEdit Immettere un testo in modo conforme a un particolare formato, come un
codice postale oppure un numero di telefono.
TRichEdit Modificare pi righe di testo utilizzando il formato rich text (solo per la
VCL).
9-2 G u i d a a l l a p r o g r a mma z i o n e
C o n t r o l l i d i t e s t o
Controlli per la visualizzazione del testo ed etichette, che non consentono
allutente di aggiungere testo:
Controlli di editing
I controlli di editing mostrano del testo allutente e gli consentono di immettere del
testo. Il tipo di controllo utilizzato a questo scopo dipende dalle dimensioni e dal
formato delle informazioni.
TEdit e TMaskEdit sono semplici controlli di testo che includono una casella di
modifica per una singola linea di testo in cui possibile inserire informazioni.
Quando la casella di modifica riceve il fuoco, viene visualizzato un punto di
inserimento lampeggiante.
possibile includere del testo nella casella di modifica assegnando un valore di
stringa alla propriet Text. Laspetto del testo nella casella di modifica viene
controllato assegnando dei valori alla propriet Font. possibile specificare il tipo di
carattere, le dimensioni, il colore e gli attributi del carattere. Gli attributi influiscono
su tutto il testo nella casella di modifica e non possono essere applicati a singoli
caratteri.
Una casella di modifica pu essere progettata in modo che modifichi le proprie
dimensioni a seconda delle dimensioni del font utilizzato. Loperazione possibile
impostando la propriet AutoSize a true. possibile limitare il numero di caratteri
che una casella di modifica pu contenere assegnando un valore alla propriet
MaxLength.
TMaskEdit uno speciale controllo per lediting che convalida il testo immesso a
fronte di una maschera che codifica i possibili formati validi che un testo pu
assumere. La maschera pu anche formattare il testo che viene mostrato allutente.
TMemo e TRichEdit permettono allutente di aggiungere diverse righe di testo.
Utilizzare questo
componente: Per consentire allutente di:
TTextBrowser Visualizzare un file di testo o una semplice pagina HTML che gli utenti
possono scorrere.
TTextViewer Visualizzare un file di testo o una semplice pagina HTML. Gli utenti
possono far scorrere la pagina o fare clic sui collegamenti per visualiz-
zare altre pagine e immagini.
TLCDNumber Visualizzare informazioni numeriche con un formato digitale.
TLabel Visualizzare del testo in un controllo senza finestra.
TStaticText Visualizzare testo in un controllo con finestra.
T i p i d i c o n t r o l l i 9-3
C o n t r o l l i d i t e s t o
Propriet dei controlli di editing
Di seguito sono elencate alcune importanti propriet dei controlli testo:
Controlli memo e rich edit
Entrambi i controlli TMemo e TRichEdit gestiscono pi linee di testo.
iis>.c> .c>c.,
I? .c.c ...c
iis>.c>.c ,s..,
eIae I? .c.c is.c
iis>.c>.c ,sis,
eIae I? .c.c .c
iis>.c>.c ,s,
eIae I? .c.c is.c
iis>.c>.c ,sis,
eIae I? .c.c is.c
iis>.c>.c ,sis,
eIae I? .c.c ci.c
iis>.c>.c ,sci,
10-8 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
Il gestore di evento visto in precedenza potebbe essere ulteriormente ridotto
ponendo le costanti relative allo stile della penna nelle propriet Tag dei pulsanti
relativi allo stile delle penne. In questo caso, il codice dellevento sarebbe simile al
seguente::
veIi __?aatcaII ..c.c.cccc .c.c
I? .c.c>Lcs. __cIaaaIi.,cc.
iis>.c>.c .c.c .,cc. .c.c>i,
iis>s> s>ic..,
I? .c.c ..s
iis>s>.c cs..,
eIae I? .c.c cis
iis>s>.c csci,
eIae I? .c.c -.is
iis>s>.c cs-.i,
eIae I? .c.c ccis
iis>s>.c cscci,
eIae I? .c.c iis
iis>s>.c csii,
eIae I? .c.c iis
iis>s>.c csii,
eIae I? .c.c sss
iis>s>.c csss,
eIae I? .c.c isss
iis>s>.c csiss,
I? .c.c>Lcs. __cIaaaIi.,cc.
iis>s>.c s.c .,cc. .c.c>i,
iis>.c,,
iis>cc., c-c,
iis>.c, c-c,
iis>cc., ,
Disegno di spezzate
Oltre alle singole linee, il canvas pu disegnare anche spezzate, cio gruppi di un
numero qualunque di segmenti consecutivi.
Per disegnare una spezzata su un canvas, si deve chiamare il metodo Polyline del
canvas.
Il parametro passato al metodo Polyline un array di punti.Si pu pensare ad una a
spezzata come allesecuzione di un MoveTo sul primo punto e di un LineTo su ciascun
punto successivo. Per disegnare pi linee, Polyline pi rapido delluso dei metodi
MoveTo e LineTo, in quanto viene eliminato loverhead derivante dalle successive
chiamate.
Il metodo seguente, per esempio, disegna un rombo in una scheda:
veIi __?aatcaII ...iccc .c.c
. cccs,,
cccs, ., ,
cccs, ., ,
cccs,. ., ,
cccs, .., ,
cccs,1 ., ,
iis>.ccccs, 1,
Si noti che lultimo parametro di Polyline lindice dellultimo punto, e non il numero
di punti.
Disegno di figure
I canvas hanno metodi per disegnare tipi differenti di figure. Il canvas disegna il
contorno di una figura con la sua penna, quindi ne riempie linterno con il suo
pennello. La linea che rappresenta il bordo della figura controllata dalloggetto Pen
attivo.
In questa sezione vengono trattati i seguenti argomenti:
10-12 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
Disegno di rettangoli ed ellissi.
Disegno di rettangoli arrotondati.
Disegno di poligoni.
Disegno di rettangoli ed ellissi
Per disegnare un rettangolo o unellisse su un canvas, si deve chiamare il metodo
Rectangle o il metodo Ellipse del canvas, passando le coordinate di un rettangolo di
contorno.
Il metodo Rectangle disegna il rettangolo di contorno; Ellipse disegna unellisse che
tocca tutti i lati del rettangolo.
Il metodo seguente disegna un rettangolo riempiendo il quadrante superiore sinistro
di una scheda, quindi disegna unellisse nella stessa area:
veIi __?aatcaII ...iccc .c.c
Disegno di poligoni
Per disegnare un poligono con un numero qualsiasi di lati su un canvas, si deve
chiamare il suo metodo Polygon.
Polygon accetta come unico parametro un array di punti. Questi vengono collegati
con la penna, e lultimo punto viene collegato al primo per chiudere il poligono.
Dopo aver disegnato le linee, Polygon usa il pennello per riempire larea allinterno
del poligono.
Ad esempio, il codice seguente disegna un triangolo rettangolo nella met inferiore
sinistra di una scheda:
veIi __?aatcaII ...iccc .c.c
. cccs,,
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-13
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
cccs, ., ,
cccs, ., c-c,
cccs,. .c.,c-c,
iis>.cccs,.,
i. .c,
i. .ccic,
i. .,sc,
i. ..cc,
caae .c
iis>.cx, ,
iis>c., ,
bteak,
caae .ccic
iis>ccicx, , ., ,
bteak,
caae .,sc
iis>,scx, , ., ,
bteak,
caae ..cc
iis>ccicx, , ., , x ..,
.,
bteak,
i. ?aIae,
I? i.
caae .c
iis>.cx, ,
iis>c.c.x, .c.,
iis>.cx, ,
iis>c., ,
bteak,
caae .ccic
iis>ccicx, , .c.x, .c.,
iis>ccicx, , ., ,
bteak,
caae .,sc
iis>,scx, , .c.x, .c.,
iis>,scx, , ., ,
bteak,
caae ..cc
iis>ccicx, , .c.x, .c.,
x .c.x., .c..,
iis>ccicx, , ., ,
x .., .,
10-16 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
bteak,
.c. .., ,
iis>.c>..c ,.,,
iis>.c>..c ~..c,
avItca i.
caae .c
iis>.c,c.x, ,c.,
iis>c.x, .,
bteak,
caae .ccic
iis>ccic,c.x, ,c., .x, .,
bteak,
caae .,sc
iis>,sc,c.x, ,c., .x, .,
bteak,
caae ..cc
iis>ccic,c.x, ,c., .x, .,
,c.x .x.,,c. ..,
bteak,
I? i.
Disegno su un grafico
Non sono necessari componenti per manipolare gli oggetti grafici dellapplicazione.
possibile costruire, prelevare, salvare e distruggere oggetti grafici senza dover
necessariamente disegnare qualcosa sullo schermo. Infatti, raramente le applicazioni
disegnano direttamente su una scheda. Pi spesso unapplicazione opera sui grafici e
poi utilizza un componente controllo immagine per visualizzare il grafico su una
scheda.
10-18 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
Una volta spostato il disegno dellapplicazione nel grafico del controllo immagine,
facile aggiungere le funzioni di stampa, di clipboard, di caricamento e salvataggio
per tutti gli oggetti grafici. Gli oggetti grafici possono essere file bitmap, metafile,
icone o qualsiasi altra classe di grafici installati, come, ad esempio, i grafici jpeg.
_
Poich si disegna su unimmagine fuori schermo come un canvas TBitmap,
limmagine non viene visualizzata finch un controllo non copia da una bitmap sul
canvas del controllo.Cio, quando si disegnano bitmap e si assegnano ad un controllo
immagine, limmagine appare solo quando il controllo ha lopportunit per elaborare
il messaggio Paint. Se, invece, si disegna direttamente sulla propriet canvas di un
controllo, loggetto Picture viene visualizzato immediatamente.
Come far scorrere i grafici
Il grafico non deve avere le stesse dimensioni della scheda: pu essere pi piccolo o
pi grande. Aggiungendo alla scheda un controllo casella di scorrimento e
collocando limmagine grafica al suo interno, possibile visualizzare grafici che sono
pi grandi della scheda o addirittura pi grandi dello schermo. Per aggiungere un
grafico con scorrimento, occorre prima aggiungere un componente TScrollBox e
quindi aggiungere il controllo immagine.
Aggiunta di un controllo immagine
Un controllo immagine un componente contenitore che consente di visualizzare
oggetti Bitmap. Un controllo immagine serve per contenere una bitmap che non
necessariamente viene visualizzata sempre, o che unapplicazione ha bisogno di
usare per generare altre figure.
_
Il paragrafoAggiunta di grafici ai controlli a pagina 6-12 illustra come usare i
grafici nei controlli.
Collocazione del controllo
Un controllo immagine pu essere collocato in qualsiasi punto di una scheda. Se si
desidera sfruttare la capacit del controllo immagine di autodimensionarsi in
funzione della figura, occorre impostare solo langolo superiore sinistro. Se il
controllo immagine un contenitore non visibile per una bitmap, si pu collocarlo in
un punto qualsiasi, proprio come se fosse un componente non visuale.
Se si rilascia il controllo immagine su una casella di scorrimento gi allineata allarea
client della scheda, ci garantisce che la casella aggiunger tutte le barre di
scorrimento necessarie per accedere alle parti fuori schermo dellimmagine. Dopo di
che si deve impostare la propriet del controllo immagine.
Impostazione delle dimensioni iniziali della bitmap
Quando si colloca un controllo immagine, questo solo un contenitore. Tuttavia, in
fase di progettazione, possibile impostare la propriet Picture del controllo
immagine in modo da contenere un grafico statico. Il controllo pu caricare la sua
immagine da un file anche in fase di esecuzione, come descritto nel paragrafo
Caricamento e salvataggio dei file grafici a pagina 10-20.
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-19
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
Per creare una bitmap vuota quando viene avviata lapplicazione:
1 Collegare un gestore allevento OnCreate per la scheda che contiene limmagine.
2 Creare un oggetto Bitmap, e assegnarlo alla propriet Picture->Graphic del
controllo immagine.
In questo esempio limmagine si trova nella scheda principale dellapplicazione,
Form1, cosicch il codice collega un gestore allevento OnCreate di Form1:
veIi __?aatcaII ..cicccc .c.c
Nel caso di applicazioni multipiattaforma, modificare il codice specifico per
Windows e per la VCL in modo che lapplicazione possa esere eseguita in ambiente
Linux. Ad esempio, nei nomi dei percorsi in Linux si utilizza come delimitatore una
barra diritta. Per ulteriori informazioni sulle applicazioni CLX e multipiattaforma ,
vedere il Capitolo 14, Sviluppo di applicazioni multipiattaforma.
Caricamento e salvataggio dei file grafici
Le immagini grafiche che esistono solo per la durata dellesecuzione di
unapplicazione hanno un valore molto limitato. Spesso, si preferisce usare la stessa
figura ogni volta o salvare una figura creata per usarla successivamente. Il
componente image facilita il caricamento delle immagini da un file e il loro
salvataggio.
I componenti usati per caricare, salvare e sostituire immagini grafiche supportano
molti formati grafici, compresi i file bitmap, i metafiles, i glifi, e cos via. Essi
supportano anche le classi grafiche installabili.
Il modo di caricare e di salvare i file grafici simile a quello di qualsiasi altro file e
viene descritto nelle seguenti sezioni:
Caricamento di unimmagine da un file.
Salvataggio di unimmagine in un file.
Sostituzione dellimmagine.
Caricamento di unimmagine da un file
Lapplicazione deve fornire la possibilit di caricare unimmagine da un file se ha
bisogno di modificarla o se si desidera memorizzarla in un file esterno, in modo che
un utente o unaltra applicazione possa modificarla.
Per caricare un file grafico in un controllo immagine, si deve chiamare il metodo
LoadFromFile delloggetto Picture del controllo immagine.
Il codice seguente riceve un nome di file da una finestra di dialogo per lapertura dei
file, e quindi carica quel file in un controllo immagine di nome Image:
veIi __?aatcaII .,cc.ccc .c.c
I? ,c.cci>xccc
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-21
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
cc ,c.cci>c.i.c,
L.ic>.cc>i..ccc,
I? ccLs.,
L.ic>.cc>.icccc, sic . ici. i.c.
eIae .ic~sc..c.c, c.sc c i i.c
I? .ici>xccc c i .c i.c
Sostituzione dellimmagine
In qualsiasi momento possibile sostituire la e figura di un controllo immagine. Se si
assegna un nuovo grafico ad unimmagine che ne ha gi uno, il nuovo grafico
sostituisce quello esistente.
Per sostituire la figura di un controllo immagine, si deve assegnare un nuovo grafico
alloggetto Picture del controllo immagine.
Il processo adottato per la creazione del nuovo grafico identico a quello utilizzato
per creare il grafico iniziale (consultare Impostazione delle dimensioni iniziali della
bitmap a pagina 10-18), ma in questo caso si deve fornire anche un modo che
consenta alperch lutente di scegliere una dimensione diversa da quella standard
10-22 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
usata per il grafico iniziale. Un semplice modo per fornire questa opzione consiste
nel presentare una finestra di dialogo, come quella della Figura 10.1.
Figura 10.1 Finestra di dialogo Bitmap Dimension dalla unit BMPDlg
Questa particolare finestra di dialogo viene creata nella unit BMPDlg che fa parte del
progetto GraphEx (nella directory EXAMPLES\DOC\GRAPHEX).
Avendo questa finestra di dialogo nel progetto, aggiungere unistruzione include
relativa a BMPDlg.hpp nel file .cpp della scheda principale. Quindi, si pu collegare
un gestore allevento onClick della voce di menu File|New. Ecco un esempio:
veIi __?aatcaII ..c.c.ccc .c.c
i,cs.i, .i,,
.i.c sc .cs s .. .c.
.c....>~cc .c....>..,
i.c cc ..css is .c.i
.c....>..>cx L.L.ic>.cc>i,c>.,
.c....>-c.>cx L.L.ic>.cc>i,c>-c,
I? .c....>....i L~. . sc .cs cicc .i
.i, aev i,cs.i,, ccic i c. c.i, ccc
sc s,cc.c. ..css
.i,>. .L.c....>..>cx,
.i,>-c .L.c....>-c.>cx,
L.ic>.cc>i,c .i,, c,icc i,c . c. c.i,
cc .,., .cic i.c. .c
ieIete .i,,
_
Lassegnazione di una nuova bitmap alla propriet Graphic delloggetto Picture
provoca la copia del nuovo grafico nelloggetto ma loggetto non ne prende possesso.
Loggetto Picture gestisce il proprio oggetto grafico interno. . A causa di ci, il codice
precedente libera loggetto bitmap dopo avere fatto lassegnazione.
Uso della clipboard con i grafici
possibile usare la clipboard di Windows per copiare e incollare grafici allinterno
delle applicazioni o per scambiare grafici con altre applicazioni. Loggetto Clipboard
della VCL semplifica la gestione di diversi tipi di informazione, compresi i grafici.
Prima di poter usare loggetto clipboard nellapplicazione, necessario aggiungere
ad ogni file .cpp che dovr accedere ai dati della clipboard unistruzione include per
il file Clipbrd.hpp.
WidthEdit
HeightEdit
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-23
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
Per le applicazioni multipiattaforma, i dati memorizzati nella clipboard utilizzando
la CLX vengono memorizzati come un tipo MIME a cui associato un oggetto
TStream. Nella CLX sono previste le seguenti costanti predefinite per i tipi MIME
seguenti.
Operazioni di copia di grafici nella clipboard
Nella clipboard possibile copiare qualsiasi immagine, compreso il contenuto dei
controlli image. Una volta nella clipboard, limmagine disponibile per tutte le
applicazioni.
Per copiare unimmagine nella clipboard, bisogna assegnarla alloggetto clipboard
usando il metodo Assign.
Questo codice mostra come copiare unimmagine da un controllo immagine di nome
Image nella clipboard in risposta ad un clic sulla voce di menu Edit|Copy:
veIi __?aatcaII .,c.ccc .c.c
,ci.>~ssL.ic>.cc,
cc ~cc,
,c..c.c, c, ,cc c,ci.
L.ic>iis>,..c c.ccss, c, cc is .c
~cc cc, , L.ic>., L.ic>-c, c ..css . .ic
L.ic>iis>,cc~cc, L.ic>iis, ~cc, c, c.i, c sc.
L.ic>iis>,..c c..c,, csc .c.i ..c
Questo codice mostra come incollare una figura dalla clipboard in un controllo
immagine in risposta ad un clic su una voce di menu Edit|Paste:
veIi __?aatcaII ..iscc.ccc .c.c
i,cs.i, .i,,
I? ,ci.>-is.i_L.~.
L.ic>.cc>.i,>~ss,ci.,
Lo stesso esempio in un programma CLX multipiattaforma sarebbe simile al
seguente:
veIi __?aatcaII ..iscc.ccc .c.c
_i,cs.i, .i,,
I? ,ci.>..cs.c,.i,
L.ic>.cc>.i,>~ss,ci.,
iis>cx., , '-cc', .c cx i .,
iis>.c., , sc ,c ,s
Ora la pressione del pulsante del mouse imposta la posizione della penna, definendo
il punto iniziale della linea. Per disegnare una linea fino al punto in cui lutente
rilascia il pulsante, si deve rispondere ad un evento mouse-up.
Risposta ad unazione mouse-up
Ogni volta che lutente rilascia un pulsante del mouse si verifica un evento
OnMouseUp. Solitamente levento va alloggetto sul quale si trova il cursore del
mouse quando lutente preme il pulsante, che non necessariamente lo stesso
oggetto sul quale si trova il cursore quando il pulsante viene rilasciato. Ci consente,
per esempio, di disegnare una linea come se si estendesse oltre il bordo della scheda.
Per rispondere alle azioni mouse-up, si deve definire un gestore per levento
OnMouseUp.
Il codice seguente un semplice gestore di evento OnMouseUp che disegna una linea
fino al punto di rilascio del pulsante del mouse:
veIi __?aatcaII ...sc,ccc .c.c, .sc ,
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-27
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
...ic .., Iat ., Iat
iis>c., , .i. c cc ,s
Con questo codice, lo spostamento del mouse sulla scheda fa s che il disegno segua il
mouse, anche prima che il pulsante del mouse venga premuto.
Gli eventi mouse-move si verificano quando non sono stati premuti i pulsanti del
mouse.
Se si vuole tenere traccia del fatto che sia stato premuto un pulsante del mouse,
occorre aggiungere un campo oggetto alloggetto scheda.
Aggiunta di un campo ad un oggetto scheda per tenere traccia delle azioni del
mouse
Per tenere traccia del fatto che sia stato premuto o meno un pulsante del mouse,
occorre aggiungere un campo oggetto alloggetto scheda. Quando ad una scheda
viene aggiunto un componente, C++Builder aggiunge alloggetto scheda un campo
che rappresenta quel componente, in modo che sia possibile fare riferimento al
componente tramite il nome del campo. Inoltre, si possono aggiungere alla scheda
campi propri modificando la dichiarazione di tipo nel file header della scheda.
Nellesempio seguente la scheda ha bisogno di registrare se lutente ha premuto un
pulsante del mouse. Per farlo, essa aggiunge un campo booleana e ne imposta il
valore quando lutente preme il pulsante del mouse.
Per aggiungere un campo ad un oggetto, si deve modificare la definizione di tipo
delloggetto, specificando lidentificatore di campo e il tipo dopo la direttiva public
in fondo alla dichiarazione.
10-28 G u i d a a l l a p r o g r a mma z i o n e
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
CC++Builder possiede qualsiasi dichiarazione prima della direttiva public: questo
il punto in cui vengono immessi i campi che rappresentano i controlli e i metodi che
rispondono agli eventi.
Il codice seguente d ad una scheda un campo di nome Drawing di tipo bool, nella
dichiarazione delloggetto scheda. Inoltre, aggiunge due campi per memorizzare i
punti Origin e MovePt di tipo TPoint.
cIaaa . pabIIc .
i. ttae, sc c i. .i
iis>.c., , sc ,c ,s
I? i.
iis>c., , .i. . .sc s ..
Questo codice genera un disegno solo tra gli eventi mouse-down e mouse-up, ma
genera anche una linea scarabocchiata che traccia gli spostamenti del mouse anzich
una linea retta.
Il problema che ogni volta che il mouse si sposta, il relativo gestore di evento
chiama LineTo, il quale sposta la posizione della penna, e nel momento in cui viene
O p e r a z i o n i c o n e l e me n t i g r a f i c i e mu l t i me d i a l i 10-29
P a n o r a m i c a s u l l a p r o g r a m m a z i o n e d e i g r a f i c i
rilasciato il pulsante, si perde lindicazione del punto dal quale doveva partire la
linea retta.
Affinamento del disegno delle linee
Con i campi collocati per tracciare i vari punti, possibile rifinire il disegno di una
linea dellapplicazione.
Memorizzazione del punto di origine
Quando si disegnano linee, per tener traccia del punto in cui inizia la linea si utilizza
il campo Origin.
Origin deve essere impostato al punto in cui si verifica levento mouse-down, in
modo che il gestore di evento mouse-up possa usare Origin per indicare linizio della
linea, come in questo codice:
veIi __?aatcaII ...sc.ccc .c.c, .sc ,
...ic .., Iat ., Iat
i. ttae, sc c i. .i
iis>.c., , sc ,c ,s
.., , cc. .cc c c sis
iis>.cx, , .c ,c si ,
iis>c., , .i. c .. .c.s .,
i. ?aIae, cci c i. .i
I? i.
iis>.cx, , .c ,c si ,
iis>c., ,
10-30 G u i d a a l l a p r o g r a mma z i o n e
U s o d i c o m p o n e n t i m u l t i m e d i a l i
Questo codice registra la posizione attuale del mouse, ma le linee intermedie non
scompaiono, cosicch risulta difficile vedere la linea finale. Lesempio ha bisogno di
eliminare ogni linea prima di disegnare quella successiva, tenendo traccia di dove si
trovava quella precedente. Il campo MovePt consente di realizzare ci.
MovePt deve essere impostato al punto finale di ciascuna linea intermedia, in modo
che si possa usare MovePt e Origin per eliminare quella linea la volta successiva in cui
viene disegnata una linea:
veIi __?aatcaII ...sc.ccc .c.c, .sc ,
...ic .., Iat ., Iat
i. ttae, sc c i. .i
iis>.c., , sc ,c ,s
.., , cc. .cc c c sis
.c. .., , cc. is c.,
I? i.
-c.c c>
-,i.i .s,
-c.c '.'
-,i.i ,ic.ics.i_
Occorre completare il codice per il costruttore e per il metodo Execute. Le fasi relative
a tale operazione vengono descritte nelle sezioni successive.
S c r i t t u r a d i a p p l i c a z i o n i mu l t i - t h r e a d 11-3
D e f i n i z i o n e d i o g g e t t i t h r e a d
Inizializzazione del thread
Utilizzare il costruttore per inizializzare una nuova classe thread. qui che si pu
assegnare una priorit predefinita per il thread e indicare se verr rilasciato
automaticamente al termine dellesecuzione.
Assegnazione di una priorit predefinita
La priorit indica il grado di attenzione che il thread riceve quando il sistema
operativo programma il tempo che la CPU deve dedicare ad ogni thread
dellapplicazione. Per gestire operazioni per le quali il tempo determinante, si deve
usare un thread ad alta priorit, mentre per tutte le altre operazioni si pu ricorrere
ad un thread a bassa priorit. Per indicare la priorit delloggetto thread, impostare la
propriet Priority.
Se si sta scrivendo unapplicazione Windows, i valori di Priority sono disposti su una
scala, come descritto nella Tabella 11.1:
_
Se si scrive unapplicazione multipiattaforma, necessario utilizzare codice
differente per lassegnazione delle priorit in Windows e Linux. In Linux, Priority
un valore numerico che dipende dalle politiche di threading che puossono essere
cambiate solo dallutente root. Per i dettagli, consultare la versione CLX di TThread e
Priority nella Guida in linea.
j
Laumento della priorit del thread di unoperazione che richiede un uso intensivo
della CPU pu lasciare a bocca asciutta gli altri thread dellapplicazione. Esso si
applica solo ai thread che trascorrono la maggior parte del tempo in attesa di eventi
esterni.
Il codice seguente mostra il costruttore di un thread a bassa priorit che esegue
operazioni secondarie che non interferiranno con le altre prestazioni
dellapplicazione:
. ,L.c,
>c.,
.c.cci..c..sc,
S c r i t t u r a d i a p p l i c a z i o n i mu l t i - t h r e a d 11-5
D e f i n i z i o n e d i o g g e t t i t h r e a d
Synchronize aspetta il thread principale per avviare il ciclo di messaggi, dopo di che
esegue il metodo passato.
_
Dal momento che Synchronize usa il ciclo di messaggi, non funziona nelle
applicazioni console. Per proteggere laccesso agli oggetti VCL e CLX nelle
applicazioni per console, si devono, pertanto, usare altri meccanismi, come le sezioni
critiche.
Non occorre usare sempre il thread principale. Alcuni oggetti sono associati ai
thread. Omettendo luso del metodo Synchronize quando si certi che i metodi di un
oggetto sono thread-safe si miglioreranno le prestazioni, poich non occorrer
aspettare che il thread VCL o CLX avvii il proprio ciclo di messaggi. Non necessario
usare il metodo Synchronize nelle seguenti situazioni:
I componenti per laccesso ai dati sono thread-safe a patto che, per i dataset che
utilizzano BDE, ciascun thread abbia il proprio componente session di database.
Lunica eccezione si presenta quando si utilizzano i driver di Access Microsoft, che
sono costruiti usando una libreria Microsoft, che non thread-safe. Per dbDirect,
finch la libreria client del produttore thread-safe, i componenti dbDirect
saranno thread-safe. I componenti ADO e InterbaseExpress sono thread-safe.
Quando si usano componenti di accesso ai dati, occorre sempre passare al metodo
Synchronize tutte le chiamate che interessano i controlli associati ai dati. Quindi,
per esempio, occorre sincronizzare le chiamate che collegano un controllo dati ad
un dataset impostando la propriet DataSet delloggetto data source, ma non
occorre alcuna sincronizzazione per accedere ai dati di un campo del dataset.
Per maggiori informazioni sullutilizzo delle sessioni database con i thread, in
applicazioni che utilizzano BDE, consultare Gestione di sessioni multiple a
pagina 24-29.
Gli oggetti DataCLX sono thread-safe mentre gli oggetti VisualCLX non lo sono.
Gli oggetti grafici sono thread-safe. Non occorre usare il thread VCL principale
per accedere a TFont, TPen, TBrush, TBitmap, TMetafile (solo VCL), TDrawing(solo
CLX), o TIcon. Gli oggetti canvas possono essere utilizzati allesterno del metodo
Synchronize bloccandoli (vedere Blocco di oggetti a pagina 11-8).
Bench gli oggetti list non siano thread-safe, si pu usare una versione thread-safe,
TThreadList, al posto di TList.
Chiamare periodicamente la routine CheckSynchronize dallinterno del thread
principale dellapplicazione in modo che i thread in background possano
sincronizzare la propria esecuzione con il thread principale. Il momento ideale per
chiamare CheckSynchronize quando lapplicazione inattiva (ad esempio, da un
gestore di evento OnIdle ). Ci garantisce che sicuro effettuare chiamate ai metodi
nel thread di background.
Uso di variabili locali al thread
Il metodo Execute e tutte le routine che chiama hanno proprie variabili locali,
esattamente come qualsiasi altra routine di C++. Queste routine possono accedere
anche a tutte le variabili globali. Infatti, queste variabili forniscono un potente
meccanismo per la comunicazione tra i thread.
11-6 G u i d a a l l a p r o g r a mma z i o n e
D e f i n i z i o n e d i o g g e t t i t h r e a d
Qualche volta, tuttavia, pu risultare preferibile usare variabili che sono globali per
tutte le routine che vengono eseguite nel thread, ma non sono condivise con altre
istanze della stessa classe thread. Per ottenere questo risultato, occorre dichiarare le
variabili locali al thread. Creare una variabile locale al thread aggiungendo alla
dichiarazione della variabile il modificatore __thread. Ad esempio:
Iat __tateai x,
dichiara una variabile di tipo integer che privata per ciascun thread
dellapplicazione, ma globale allinterno di ciascun thread.
Il modificatore __thread pu essere utilizzato solamente per variabili globali (il cui
campo dazione il file) e statiche. Pointer e Function non possono essere variabili
thread. Non funzionano come variabili neppure i tipi che usano la semantica a sola
scrittura, cos come pure le variabili di tipo AnsiStrings. Un elemento di programma
che richieda una inizializzazione o una finalizzazione al momento dellesecuzione
non pu essere dichiarato di tipo __thread.
Le seguenti dichiarazioni richiedono una inizializzazione al momento
dellesecuzione e pertanto non sono consentite.
Iat . ,
Iat __tateai x . , ci
La creazione di unistanza di una classe mediante un costruttore o un distruttore
definito dallutente richiede una inizializzazione al momento dellesecuzione e non ,
pertanto, consentita:
cIaaa .
. ,
-. ,
,
. __tateai .ciss, ci
Controllo del termine da parte di altri thread
Il thread inizia lesecuzione quando viene chiamato il metodo Execute (vedere
Esecuzione di oggetti thread a pagina 11-12) e continua finch Execute non finisce.
Ci riflette il modello che prevede che il thread esegua una specifica operazione e
quindi si fermi non appena ha terminato. Qualche volta, tuttavia, unapplicazione ha
bisogno di un thread da eseguire finch non viene soddisfatto un criterio esterno.
Controllando la propriet Terminated, si pu consentire ad altri thread di segnalare al
thread attivo che il momento di terminare lesecuzione. Quando un altro thread
tenta di interrompere il thread attivo, chiama il metodo Terminate. Terminate imposta
la propriet Terminated del thread attivo a true. Spetta al metodo Execute
implementare il metodo Terminate controllando e rispondendo alla propriet
Terminated. Il seguente esempio mostra un modo per eseguire questa operazione:
veIi __?aatcaII .ci.xccc
vaIIe c.ic.
.c....cis.,
S c r i t t u r a d i a p p l i c a z i o n i mu l t i - t h r e a d 11-7
C o o r d i n a m e n t o d e i t h r e a d
Gestione delle eccezioni nella funzione di thread
Il metodo Execute deve intercettare tutte le eccezioni che si verificano nel thread. Se
non si riesce a intercettare uneccezione nella funzione di thread, lapplicazione
potrebbe provocare violazioni di accesso. Ci potrebbe non essere evidente quando si
sta sviluppando lapplicazione, in quanto lIDE intercetta le eccezioni, ma quando si
eseguir lapplicazione esternamente al debugger, leccezione causer un errore di
esecuzione e lapplicazione si bloccher.
Per intercettare le eccezioni che si verificano allinterno della funzione di thread,
aggiungere un blocco try...catch allimplementazione del metodo Execute:
veIi __?aatcaII .ci.xccc
tt,
vaIIe c.ic.
.c....cis.,
catca
. s.c . cxcc,s
s.,
__?IaaII,
,c..>ccisc,
s ,s ci.s>c.s,
?et Iat , ,s>, --
.ccssLc.,s>Lc.s,,
ci.s>c.s,
Nellesempio precedente gli elementi della lista erano accessibili solo quando il
metodo WaitFor indicava che la lista era stato effettivamente riempita. Questo valore
restituito deve essere assegnato dal metodo Execute del thread che era atteso.
Tuttavia, poich i thread che chiamano WaitFor vogliono conoscere il risultato
dellesecuzione del thread e non il codice che chiama Execute, il metodo Execute non
restituisce alcun valore. Invece, il metodo Execute imposta la propriet ReturnValue.
ReturnValue viene quindi restituito dal metodo WaitForquando viene chiamato da
altri thread. I valori restituiti sono interi. Lapplicazione determina il loro significato.
Attesa che venga completata unoperazione
Qualche volta necessario aspettare che un thread finisca una certa operazione
piuttosto che attendere che uno specifico thread termini lesecuzione. Per ottenere
questo risultato, occorre usare un oggetto evento. Gli oggetti evento (TEvent) devono
essere creati con un campo dazione globale in modo che possano agire come segnali
visibili per tutti i thread.
Quando un thread completa unoperazione da cui dipendono altri thread, chiama
TEvent::SetEvent. SetEvent attiva il segnale, in modo che tutti gli altri thread che
S c r i t t u r a d i a p p l i c a z i o n i mu l t i - t h r e a d 11-11
C o o r d i n a m e n t o d e i t h r e a d
controllano sapranno che loperazione stata completata. Per disattivare il segnale,
usare il metodo ResetEvent.
Per esempio, si consideri una situazione in cui si deve aspettare che terminino
lesecuzione diversi thread anzich uno solo. Dal momento che non si sa quale thread
finir per ultimo, non basta usare il metodo WaitFor di uno dei thread. Occorre,
invece, che ogni thread incrementi un contatore quando ha finito, e che lultimo
thread segnali la fine dellintera operazione attivando un evento. Instead, you can
have each thread increment a counter when it is finished, and have the last thread
signal that they are all done by setting an event.
Il codice seguente mostra la fine del gestore di evento OnTerminate per tutti i thread
che devono completare lesecuzione. CounterGuard un oggetto sezione critica
globale, che impedisce che pi thread utilizzino il contatore contemporaneamente.
Counter una variabile globale che conta il numero di thread che sono stati
completati.
veIi __?aatcaII ii..cis.ci.c.icccc .c.c
ci.>~cc, c. c cc
I? c .ccc.c c ci cc
c>.cc, si . s s c is ci.
ci.>ccisc, ccisc c c. c cc
veIi .ci..c.i.c
-~.~._L. .,
...,c x,
.s..i.c '.ci..i.c',
...ci.L ,
...is ,
__tt,
iscxcc, x1, , s.c..s.c.,. ,
__except ..L._.L._.L.
_
Impostare .s..i.c al nome della classe thread.
Il debugger rileva leccezione e controlla il nome del thread nella struttura che gli
stata passata. Durante le operazioni di debug, il debugger mostra il nome del
thread nel campo Thread ID della finestra Thread Status.
2 Aggiungere allinizio del metodo Execute una chiamata al nuovo metodo SetName:
.c.i.c,
.icc cxs F.~.~ .c. c.c cc
.cc.ic.iic., scic,
catca Lccic ic
.c cc . ci i. . c cxcc,
tatev, c. c cxcc,
veIi ._c.ic
,.'xcc, ci',
ic,
.c ._c.ic is c c.i .c
sc_c.ic._c.ic,
i .cc.ic s ccics i cxcc, cccisc c sc ic s cic
i ccisc c ci s i cc., ._c.ic s cic.
.cc.ic, ,
Se una funzione specifica quali sono le eccezioni sollevate e solleva uneccezione non
specificata, viene chiamata una funzione unexpected. possibile specificare la
funzione unexpected con set_unexpected. Se non si specifica una funzione unexpected,
viene chiamata la funzione unexpected.
G e s t i o n e d e l l e e c c e z i o n i 12-7
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
Eccezioni strutturate in ambiente Win32
Win32 supporta la gestione delle eccezioni strutturate basate su C, che sono simili
alle eccezioni di C++. Esistono, comunque, alcune differenze fondamentali che
richiedono un utilizzo attento quando vengono mescolate con codice C++ per la
gestione delle eccezioni.
Quando si utilizza la gestione delle eccezioni strutturate nelle applicazioni
C++Builder, occorre tenere presente quanto segue:
Le eccezioni strutturate del C possono essere utilizzate in programmi C++.
Le eccezioni C++ non possono essere utilizzate in programmi C, in quanto
richiedono che il loro gestore sia specificato tramite la parola chiave catch, e catch
non consentita nei programmi C.
Uneccezione generata da una chiamata alla funzione RaiseException viene gestita
mediante il blocco try/__except (C++) o __try/__except (C). (Si possono anche
utilizzare i blocchi try/__finally oppure __try/__finally. Vedere Sintassi delle
eccezioni strutturate a pagina 12-7.) Tutti i gestori dei blocchi try/catch vengono
ignorati quando viene chiamata la funzione RaiseException.
Le eccezioni che non sono gestite dalle applicazioni non generano una chiamata a
terminate(), ma vengono passate invece al sistema operativo (in generale, il
risultato finale la fine del processo).
I gestori di eccezioni non ricevono una copia delloggetto eccezione, a meno che
non la richiedano.
Nei programmi C e C++ si possono utilizzare le seguenti funzioni di supporto delle
eccezioni C:
GetExceptionCode
GetExceptionInformation
SetUnhandledExceptionFilter
UnhandledExceptionFilter
C++Builder non limita lutilizzo della funzione UnhandledExceptionFilter al filtro di
eccezione dei blocchi __try/__except o try/__except. Comunque, il comportamento
del programma non definito quando questa funzione viene chiamata al di fuori del
blocco __try/__except o try/__except.
Le applicazioni CLX in esecuzione su Linux non supportano eccezioni strutturate C/
C++.
Sintassi delle eccezioni strutturate
In un programma C le parole chiave ANSI compatibili utilizzate per implementare le
eccezioni strutturate sono __except, __finally e __try.
_
La parola chiave __try pu apparire soltanto in programmi C. Se si vuole scrivere del
codice portabile, nei programmi C++ non si deve utilizzare la gestione delle eccezioni
strutturate.
12-8 G u i d a a l l a p r o g r a mma z i o n e
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
Sintassi per la gestione delle eccezioni try-except
La sintassi per la gestione delle eccezioni try-except la seguente:
ccc
s.c c.,si __tt, ..
s.c c.,si tt, .. i --
csc
__except cs,cssc s.c c.,si
Sintassi della terminazione try-finally
Nel caso della terminazione try-finally la sintassi ::
ccc
s.c c.,si __tt, ..
s.c c.,si tt, .. i --
c.i.c
__?IaaII, s.c c.,si
Gestione delle eccezioni strutturate
Le eccezioni strutturate possono essere gestite utilizzando unestensione della
gestione delle eccezioni di C++:
.,
__cxcc,__cx,__
i.c cc
__cx,__ unespressione che pu assumere uno dei tre valori seguenti:
Win32 fornisce due funzioni che possono essere utilizzate per ricercare informazioni
sulleccezione attiva: GetExceptionCode() e GetExceptionInformation(). Se si vuole
chiamare una funzione come parte dellespressione filtro sopra indicata, queste
funzioni devono essere chiamate direttamente dallinterno del contesto di __except():
-c.c ..s>
-c.c cxc,>
Valore Descrizione
EXCEPTION_CONTINUE_SEARCH (0) Il gestore delle eccezioni non stato indicato e il
sistema operativo continua a cercarlo.
EXCEPTION_CONTINUE_EXECUTION (-1) Continua lesecuzione nel punto delleccezione.
EXCEPTION_EXECUTE_HANDLER (1) Attiva il gestore delle eccezioni. Se il codice stato
compilato con il distruttore di cleanup abilitato (-
xd, opzione attiva per impostazione predefinita),
tutti i distruttori per gli oggetti locali creati tra il
punto di eccezione e il gestore di eccezioni vengono
chiamati quando viene scaricato lo stack. Lo scarico
dello stack viene completato prima dellattivazione
del gestore.
G e s t i o n e d e l l e e c c e z i o n i 12-9
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
.c_.c..L._.L.. ,
..L._.L.. x, ,
.,
__cxcc,.c_.cx, cxcc,L..i
Oppure, se si preferisce utilizzare loperatore virgola per assegnazioni annidate nelle
chiamate a funzioni, vedere lesempio seguente:
__cxcc,x, cxcc,L..i, .c_.cx,
Filtri delle eccezioni
Unespressione filtro pu richiamare una funzione filtro, ma la funzione filtro non
pu chiamare GetExceptionInformation. possibile passare alla funzione filtro il valore
restituito da GetExceptionInformation come parametro.
Per passare linformazione EXCEPTION_POINTERS ad un gestore di eccezioni,
lespressione o la funzione filtro devono copiare il puntatore o i dati da
GetExceptionInformation in una posizione a cui il gestore pu accedere
successivamente.
Nel caso di istruzioni try-except annidate, ogni espressione filtro dellistruzione
viene valutata finch non viene individuato EXCEPTION_EXECUTE_HANDLER o
EXCEPTION_CONTINUE_EXECUTION. Unespressione filtro pu richiamare
GetExceptionInformation per ottenere informazioni sulleccezione.
A patto che GetExceptionInformation o GetExceptionCode siano chiamate direttamente
nellespressione fornita a __except, si pu usare una funzione per determinare cosa
fare con uneccezione anzich tentare di creare unespressione C++ complessa. Quasi
tutte le informazioni necessarie per gestire uneccezione possono essere ricavate dal
risultato di GetExceptionInformation(). GetExceptionInformation() restituisce un
puntatore ad una struttura EXCEPTION_POINTERS:
sc ..L._.L..
..L._ xcc,cc.,
.. cx,
,
EXCEPTION_RECORD contiene la stato indipendente dalla macchina:
sc ..L._
xcc,.c,
xcc,is,
sc ..L._ xcc,cc.,
. xcc,~..css,
..cc.ii.ccs,
xcc,L..i,..L._.~.L.._.~~..,
,
12-10 G u i d a a l l a p r o g r a mma z i o n e
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
Generalmente, la funzione filtro analizza le informazioni contenute in
ExceptionRecord per decidere come rispondere. Talvolta si ha bisogno di
informazioni pi specifiche (specialmente se lazione da intrapendere
EXCEPTION_CONTINUE_EXECUTION: se non si fa nulla, il codice che ha causato
leccezione sar eseguito nuovamente). In questi casi, laltro campo della struttura
EXCEPTION_POINTERS fornisce lo stato del processore al momento delleccezione.
Se questa struttura viene modificata e il filtro restituisce
EXCEPTION_CONTINUE_EXCEPTION, tale valore viene usato per impostare lo
stato del thread prima di procedere con lesecuzione. Per esempio:
sic x.c..L._.L.. x,
c,
..L._ x x,>xcc,cc.,
.. xc x,>cx,
s.c x>xcc,.c
cisc ..L._~.L.
.,s, s.cc c. i c.cc..c. cci.,
s sc, c cc x
--xc>,,
c ..L._.L._.L.,
cci.,
cisc ..L._~.._L~L.
c ..L._._-~.,
cci.,
.c.i
c ,
c ..L._.L._.~-,
cci.,
,
c c,
..L._.L.. x,,
.c,
__cxcc,x.cx, cxcc,L..i
ic,
Abbinamento di eccezioni strutturate con C++
Bisogna essere consapevoli delle conseguenze derivanti dallutilizzo delle eccezioni
strutturate nei programmi C++. Innanzi tutto, anche se C++Builder implementa le
G e s t i o n e d e l l e e c c e z i o n i 12-11
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
eccezioni C++ con le eccezioni strutturate Win32, le eccezioni C++ sono trasparenti
ad un blocco __except.
Un blocco try pu essere seguito esattamente da un blocco except o da almeno un
blocco catch. Il tentativo di abbinarli genera un errore in fase di compilazione. Il
codice necessario per gestire entrambi i tipi di eccezione deve essere semplicemente
annidato allinterno di due blocchi try:
..L._.L.. x,,
.c,
__cxcc,x.cx, cxcc,L..i
cic
La specifica di una funzione throw() non incide sul comportamento di un programma
rispetto ad uneccezione Win32. Inoltre, uneccezione non gestita viene
eventualmente gestita dal sistema operativo (se un debugger non la gestisce prima), a
differenza di quanto fanno i programmi C++ che chiamano terminate().
Tutti i moduli compilati con lopzione -xd del compilatore (attiva per impostazione
predefinita) richiameranno i distruttori di tutti gli oggetti con memorizzazione di
tipo auto. Si ha lo scarico dello stack dal punto in cui si verificata leccezione fino al
punto in cui essa viene catturata.
Eccezioni basate su C in un programma di esempio C++
.i. css
~c cxcc,
i i cisc. cxcc,
i -- cxcc,,-i..ic c .c c
-- i.s __.i
-c.c s.>
-c.c s>
-c.c ...s>
ciss xcc,
,cc
xcc,ci s '..' .i s.,s,
xcc,cs xcc, c .i s.,c.i,
-xcc, .ccc, .i,
ci .s cs c .i,
,ic
ci .i,
,
12-12 G u i d a a l l a p r o g r a mma z i o n e
E c c e z i o n i s t r u t t u r a t e i n a m b i e n t e W i n 3 2
.i
.i c, ., ,
. ,
,
,s'~c cxcc,',
c . ,
__cxcc,..L._._-~.
,s'i i cisc. cxcc,',
.xcc,'-i..ic c .c c ',
ciccs xcc, c
,.'i -- xcc, `s ', c.s,
__.i
,s'-- i.s __.i ',
c c,
-c.c s.>
-c.c ...s>
.i
.i c, ., ,
. ,
,
,s'~ cxcc,',
c . ,
__cxcc,..L._._-~.
,s'i i cxcc,',
__.i
,s'c __.i s cxccc. ',
. ,
.,
,s'. cxcc,',
c . ,
__cxcc,..L._._-~.
,s'i i cxcc,',
__.i
,s'. cxcc, i,,cc., c __.i s cxcccs',
G e s t i o n e d e l l e e c c e z i o n i 12-15
G e s t i o n e d e l l e e c c e z i o n i V C L / C L X
c c,
ci , ,
, ,
,.' ci . i',
G e s t i o n e d e l l e e c c e z i o n i 12-17
G e s t i o n e d e l l e e c c e z i o n i V C L / C L X
Le classi utilizzate da C++Builder sono le stesse utilizzate da Delphi e sono
disponibili soltanto per le applicazioni VCL e CLX di C++Builder. Sono derivate da
TObject e richiedono di appoggiarsi alla VCL o alla CLX.
Di seguito sono riportate alcune caratteristiche della gestione delle eccezioni di
C++Builder:
Non si responsabili del rilascio delloggetto eccezione.
Le eccezioni del sistema operativo devono essere intercettate per riferimento.
Non si pu sollevare di nuovo uneccezione di sistema operativo una volta che si
usciti dal frame di intercettazione e loperazione di intercettazione stata
effettuata tramite i frame di intercettazione della VCL o della CLX.
Non si pu sollevare di nuovo uneccezione di sistema operativo una volta che si
usciti dal frame di intercettazione e loperazione di intercettazione stata
effettuata tramite i frame di intercettazione del sistema operativo.
Gli ultimi due punti possono essere sintetizzati in questo modo: una volta che
leccezione di sistema operativo stata intercettata come uneccezione C++, essa non
pu essere sollevata di nuovo come un+eccezione di sistema operativo o come
un+eccezione della VCL o della CLX, a meno che non ci si trovi nella struttura dello
stack di intercettazione.
Gestione delle eccezioni della VCL e della CLX
C++Builder amplia la semantica per la gestione delle eccezioni software sollevate
dalla VCL e dalla CLX o, analogamente, delle eccezioni sollevate da C++, in cui la
classe di eccezione da sollevare derivata da TObject. In questo caso, si applica una
coppia di regole derivanti dal fatto che le classi in stile VCL possono essere allocate
solo nello heap.
Le classi di eccezione in stile VCL possono essere intercettate solo per puntatore,
se si tratta di uneccezione software, o per riferimento (che la modalit preferita).
Uneccezione in stile VCL deve essere sollevata mediante la sintassi per valore.
Classi di eccezioni VCL e CLX
C++Builder include un vasto gruppo di classi di eccezione native per la gestione
automatica degli errori di divisione per zero, degli errori di I/O su file, degli errori di
conversione di tipo e di molte altre condizioni di eccezione. Tutte le classi di
eccezione VCL e CLX discendono da un oggetto radice di nome Exception. Exception
incapsula le propriet fondamentali e i metodi per tutte le eccezioni ti tipo VCL e
fornisce uninterfaccia compatibile in modo che le applicazioni gestiscano le
eccezioni.
Le eccezioni possono essere passate ad un blocco catch che accetta un parametro di
tipo Exception. Per intercettare le eccezioni VCL e CLX, utilizzare la seguente sintassi:
cic cxcc,_ciss cxcc,_iicc
12-18 G u i d a a l l a p r o g r a mma z i o n e
G e s t i o n e d e l l e e c c e z i o n i V C L / C L X
Si deve specificare la classe di eccezione che si vuole intercettare e fornire una
variabile tramite la quale fare riferimento alleccezione.
Lesempio seguente mostra come sollevare uneccezione VCL o CLX:
veIi __?aatcaII ..xcc,ccc .c.c
tt,
catcaceaat xcc,
...cssic~s.iss.i.c- .cssic,
pabIIc
vIttaaI veIi __aticaII .i-c.veIi ,
,
Di solito, quando si dichiara una classe interfaccia, il codice C++Builder dichiara
anche una classe DelphiInterface corrispondente che semplifica loperativit con
linterfaccia:
t,peie? .sc.c,Lc.icc L-c. > _._L-c.,
Per informazioni sulla classe DelphiInterface, vedere Interfacce Delphi a
pagina 13-21.
IUnknown e IInterface
Tutte le interfacce di Object Pascal discendono da un singolo antenato comune,
IInterface. Non necessario che le classi interfaccia di C++ utilizzino IInterface come
classe di base, nel senso che una classe in stile VCL pu utilizzarle come classi di base
aggiuntive, ma il codice VCL e CLX che opera con le interfacce presume che siano
presenti i metodi di IInterface.
Nella programmazione COM, tutte le interfacce discendono da IUnknown. Il
supporto COM nella VCL basato su una definizione di IUnknown che mappa
direttamente a IInterface. Ci significa che, in Object Pascal, IUnknown e IInterface sono
identici.
La definizione Object Pascal di IUnknown, tuttavia, non corrisponde alla definizione
di IUnknown utilizzata in C++Builder. Il file unknwn.h definisce IUnknown in modo
tale da includere i seguenti tre metodi:
vIttaaI -. .~ _cLc.icc ceaat L ., veIi ,, ,
vIttaaI . .~ ~..c. ,
vIttaaI . .~ ccisc ,
Ci corrisponde alla definizione di IUnknown che definito da Microsoft come parte
delle specifiche COM.
_
Per informazioni su IUnknown e sul suo utilizzo, vedere il Capitolo 38, Panoramica
sulle tecnologie COM oppure consultare la documentazione Microsoft.
A differenza di quanto accade in Object Pascal, la definizione di IInterface di
C++Builder non equivalente alla definizione di IUnknown. IInterface invece un
discendente di IUnknown che comprende un metodo aggiuntivo, Supports:
c.,ic ,ci.c >
-. __aticaII .,,sc,Lc.icc> s.iL.
tetata _cLc.icc__aaIie?,
13-4 G u i d a a l l a p r o g r a mma z i o n e
M o d e l l i d i o g g e t t i C + + e O b j e c t P a s c a l
teIatetptet_caat veIi>atatIc_caat >s.iL.,
tetata Lc.icc.ccc_~..c.,
tetata Lc.icc.ccc_ccisc,
I? _.c
tatev xcc,'_.c s .c',
ptIvate
Iat _.c,
,
Iat .iveIi
Questo esempio presenta uneccezione nel costruttore di Base. Poich Base viene
costruita prima di Derived, not_zero, non stata ancora inizializzata con il valore di 42
passato al costruttore. Si tenga presente che non possibile inizializzare i membri
dati della classe in stile VCL prima che vengano chiamati i costruttori della sua classe
base.
Distruzione di oggetti
Due meccanismi, riguardanti la distruzione degli oggetti, funzionano
differentemente in C++ e in Object Pascal. Questi sono:
distruttori chiamati a causa delle eccezioni presentate dai costruttori
i metodi virtuali chiamati dai distruttori
Le classi in stile VCL abbinano i metodi di questi due linguaggi. Gli aspetti vengono
discussi qui di seguito.
13-14 G u i d a a l l a p r o g r a mma z i o n e
M o d e l l i d i o g g e t t i C + + e O b j e c t P a s c a l
Eccezioni sollevate dai costruttori
Se si verifica uneccezione durante la costruzione delloggetto, i distruttori vengono
chiamati in modo differente in C++ e in Object Pascal. Si prenda come esempio una
classe C, derivata da una classe B, che derivata da una classe A:
cIaaa ~
c.
,
cIaaa pabIIc ~
c.
,
cIaaa pabIIc
c.
,
Supponendo che si sia verificata uneccezione nel costruttore della classe B durante la
costruzione di unistanza di C, questi sarebbero i risultati in C++, in Object Pascal e in
classi in stile VCL:
In C++ prima vengono chiamati i distruttori per tutti i membri dati delloggetto
completamente costruiti di B, quindi viene chiamato il distruttore di A, e
successivamente vengono chiamati i distruttori per tutti i membri dati delloggetto
completamente costruiti di A. Comunque, i distruttori per B e C non vengono
chiamati.
In Object Pascal solo il distruttore della classe istanziata viene chiamato
automaticamente. Questo il distruttore per C. Come avviene con i costruttori,
esclusivamente responsabilit del programmatore chiamare inherited nei
distruttori. In questo esempio, se si suppone che tutti i distruttori chiamano
inherited, allora i distruttori per C, B e A vengono chiamati in questo ordine.
Inoltre, indipendentemente dal fatto che inherited sia gi stata o meno chiamata
nel costruttore di B prima che si verificasse leccezione, il distruttore di A viene
chiamato perch inherited stato chiamato nel distruttore di B. La chiamata al
distruttore per A indipendente dal fatto che il suo costruttore sia stato
effettivamente chiamato. Inoltre, fattore pi importante, poich di solito i
costruttori chiamano immediatamente inherited, il distruttore per C viene
chiamato indipendentemente dal fatto che il corpo del suo costruttore sia stato o
no completamente eseguito.
Nelle classi in stile VCL le basi della VCL o della CLX (implementate in Object
Pascal) seguono il metodo Object Pascal di chiamata dei distruttori. Le classi
derivate (implementate in C++) non seguono esattamente nessuno dei metodi del
linguaggio. Succede invece che vengono chiamati tutti i distruttori; ma i corpi di
quelli che non saranno stati chiamati secondo le regole del linguaggio C++, non
vengono immessi.
Le classi implementate in Object Pascal, pertanto, forniscono unopportunit per
elaborare qualsiasi codice di cleanup scritto nel corpo del distruttore. Ci vero
anche per il codice che libera memoria per i sotto-oggetti (membri dati che sono
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-15
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
oggetti) che vengono costruiti prima che si verifichi uneccezione del costruttore. Si
deve tenere presente che, per le classi in stile VCL, il codice di cleanup pu non
essere elaborato per la classe istanziata o per le sue basi implementate con C++,
anche se vengono chiamati i distruttori.
Per maggiori informazioni sulla gestione delle eccezioni in C++Builder, consultare
Gestione delle eccezioni VCL/CLX a pagina 12-15.
Metodi virtuali chiamati dai distruttori
Linvio dei metodi virtuali nei distruttori segue lo stesso modello definito per i
costruttori. Questo significa che per le classi in stile VCL, la classe derivata viene
distrutta per prima, ma il tipo runtime delloggetto rimane quello della classe
derivata in tutte le successive chiamate ai distruttori della classe base. Pertanto, se i
metodi virtuali vengono chiamati nei distruttori della classe base VCL o CLx, c il
rischio che linvio riguardi una classe che gi stata distrutta.
AfterConstruction e BeforeDestruction
TObject propone due metodi virtuali, BeforeDestruction e AfterConstruction, che
consentono ai programmatori di scrivere del codice che viene elaborato
rispettivamente prima e dopo la distruzione e la creazione degli oggetti.
AfterConstruction viene chiamato dopo la chiamata dellultimo costruttore.
BeforeDestruction viene chiamato prima che venga chiamato il primo distruttore.
Questi metodi sono pubblici e vengono chiamati automaticamente.
Funzioni virtuali di classe
Object Pascal ha il concetto di funzione virtuale di classe.Lanalogo C++ sarebbe una
funzione virtuale statica, se fosse possibile; ma C++ non ha alcun corrispondente di
questo tipo di funzione. Queste funzioni vengono chiamate con sicurezza allinterno
della VCL e della CLX. Tuttavia, in C++Builder non verr mai chiamata una funzione
di questo tipo. + possibile identificare queste funzioni nei file header in quanto sono
precedute dal seguente commento:
i ciss .c.
Supporto per i tipi di dati Object Pascal e per le strutture del
linguaggio
Per supportare la VCL e la CLX, C++Builder implementa, traduce o mette comunque
in relazione la maggior parte dei tipi di dati, dei costrutti e delle strutture del
linguaggio Object Pascal con quelli del linguaggio C++. Ci viene realizzato nei
seguenti modi:
Typedefs per i tipi C++ nativi
Classes, strutture e modelli di classe
Equivalenti del linguaggio C++
13-16 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
Macro
Parole chiave che sono estensioni del linguaggio ANSI standard
Non tutti gli aspetti del linguaggio Object Pascal coincidono perfettamente con quelli
del C++. A volte, luso di queste parti del linguaggio pu far s che lapplicazione
abbia dei comportamenti inattesi. Ad esempio:
Alcuni tipi esistono in Object Pascal e in C++, ma vengono definiti in modo
diverso. Essi possono richiedere una particolare attenzione quando il codice viene
condiviso dai due linguaggi.
Alcune estensioni sono state aggiunte a Object Pascal con lo scopo di supportare
C++Builder. Occasionalmente esse possono avere una notevole incidenza a livello
di interoperativit.
I tipi e i costrutti del linguaggio Object Pascal che hanno alcun corrispondente nel
linguaggio C++ saranno evitati in C++Builder quando il codice viene condiviso tra
questi linguaggi.
La sezione successiva presenta un riepilogo dei modi in cui C++Builder implementa
il linguaggio Object Pascal, e alcuni suggerimenti su quando occorre usare una certa
prudenza.
Typedef
La maggior parte dei tipi di dati intrinseci Object Pascal viene implementata in
C++Builder usando un typedef per un tipo C++ nativo. Questi si trovano in
sysmac.h. Ogni qual volta possibile, opportuno usare il tipo C++ nativo, anzich il
tipo Object Pascal.
Classi che supportano il linguaggio Object Pascal
Alcuni tipi di dati e costrutti del linguaggio Object Pascal che non hanno un
equivalente incorporato in C++ vengono implementati come classi o strutture. I
modelli di classe vengono usati anche per implementare i tipi di dati e i costrutti del
linguaggio Object Pascal, come set, da cui pu essere dichiarato uno specifico tipo. Le
relative dichiarazioni si trovano nei seguenti file header:
dstring.h
wstring.h
sysclass.h
syscomp.h
syscurr.h
sysdyn.h
sysopen.h
sysset.h
systdate.h
systobj.h
systvar.h
sysvari.h
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-17
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
Le classi implementate in questi file header sono state create per supportare i tipi
nativi usati nelle routine Object Pascal. Esse sono destinate ad essere usate quando
queste routine vengono chiamate nel codice basato su VCL o CLX.
Equivalenti del linguaggio C++ presenti nel linguaggio Object Pascal
I parametri var e untyped di Object Pascal non sono nativi di C++. Entrambi hanno
degli equivalenti nel linguaggio C++ che vengono usati in C++Builder.
Parametri var
C++ e Object Pascal condividono la logica del passaggio per riferimento. Questi
sono argomenti modificabili. In Object Pascal vengono chiamati parametri var. La
sintassi per le funzioni che richiedono un parametro var
pteceiate .cvat x Lcc,
In C++ questi tipi di parametro devono essere passati per riferimento:
veIi .cIat x,
I riferimenti e i puntatori di C++ possono essere usati per modificare loggetto.
Tuttavia, un riferimento il corrispondente pi vicino ad un parametro var in
quanto, a differenza di un puntatore, un riferimento non pu essere rebound e un
parametro var non pu essere assegnato una seconda volta; anche se possibile
cambiare il valore di ci a cui fa riferimento.
Parametri senza tipo
Object Pascal consente luso di parametri di tipo non specificato. Questi parametri
vengono passati alle funzioni senza alcun tipo definito. La funzione ricevente deve
ricondurre il parametro ad un tipo noto prima di usarlo. C++Builder interpreta i
parametri di tipo non specificato come puntatori a vuoto (void *). La funzione
ricevente deve ricondurre il puntatore vuoto ad un puntatore del tipo desiderato.
Questo un esempio:
Iat ..cveIi ..i.c
Open array
Object Pascal ha un costrutto open array che permette di passare a una funzione un
array di dimensioni non specificate. Mentre in C++ non esiste alcun supporto diretto
per questo tipo, una funzione Object Pascal che ha un parametro array aperto pu
essere chiamata passando esplicitamente il puntatore al primo elemento di un array,
e il valore allultimo indice (il numero di elementi dellarray meno uno). Per esempio,
la funzione Mean in math.hpp ha questa dichiarazione in Object Pascal:
13-18 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
?aactIea .ciii atta, e? cc xc.c.,
La dichiarazione in C++
xc.c. __?aatcaII .ciceaat ieabIe ii, ceaat Iat ii_..c,
Il codice seguente illustra la chiamata della funzione Mean da C++:
ieabIe ., , 11, ,
cx,c s,cc. is .cx
Iea ieabIe x .ci., .,
ccc sc s.c. csc i c ccc ic s ,issc.
Iea ieabIe .ci., aIzee?. aIzee?., ,
sc .ic ss,c
Iea ieabIe . .ci., ~~.L.. ,
_
In casi simili allesempio sopra riportato, ma dove la funzione Object Pascal aspetta
un parametro var, i parametri di dichiarazione di funzione C++ non saranno const.
Calcolo del numero di elementi
Quando si usa sizeof(), la macro ARRAYSIZE o la macro EXISTINGARRAY per
calcolare il numero di elementi di un array, occorre prestare attenzione a non usare
invece un puntatore allarray. Passare invece il nome dello stesso array:
ieabIe ., , 11, ,
Iat ~~.L.., aIzee?.aIzee?., > .1 >
ieabIe ,. .,
Iat . ~~.L.,., aIzee?,.aIzee?,., > 1 > >
Prendere il sizeof di un array non equivale a prendere il sizeof di un puntatore.
Per esempio, data la seguente dichiarazione,
ieabIe .,,
ieabIe , .,
che assume le dimensioni dellarray come mostrato
aIzee?.aIzee? .,
non equivale a calcolare le dimensioni del puntatore:
aIzee?,aIzee?,,
Questo esempio e quelli seguenti usano la macro ARRAYSIZE anzich loperatore
sizeof(). Per maggiori informazioni sulla macro ARRAYSIZE, consultare la Guida in
linea.
Array temporanei
Object Pascal fornisce il supporto per il passaggio di array aperti temporanei senza
nome alle funzioni. In C++ non esiste alcuna sintassi che svolga questa operazione.
Tuttavia, poich le definizioni di variabili possono essere mischiate con altre
istruzioni, un modo per risolvere il problema quello di fornire semplicemente la
variabile con un nome.
Object Pascal:
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-19
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
cs .ci,, 11, ,
C++, usando un array temporaneo con nome:
ieabIe ., , 11, ,
tetata .ci., ~~.L.. ,
Per restringere il campo dazione dellarray temporaneo con nome ed evitare
conflitti con altre variabili locali, consigliabile aprire un nuovo campo dazione:
Iea ieabIe x,
ieabIe ., 11, , ,
x .ci., ~~.L.. ,
Macro OPENARRAY
La macro OPENARRAY definita in sysopen.h pu essere usata come alternativa ad
una variabile con nome per passare un open array temporaneo ad una funzione che
acquisisce un open array per valore. Luso della macro assume questo formato
..~~, ic, ic., ic , ics
dove T il tipo open array da costruire e i parametri value sono utilizati per
compilare larray. Le parentesi per racchiudere gli argomenti dei valori sono
necessarie. Ad esempio:
veIi s._cIat c_c.c, ~s. ceaat c_.s
13-20 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
Con la macro OPENARRAY possono essere passati fino a 19 valori. Se fosse
necessario un array pi grande, occorrerebbe definire una variabile esplicita. Inoltre,
usando la questa macro, si paga un ulteriore piccolo costo in fase di esecuzione,
dovuto sia alla spazio richiesto per lallocazione dellarray sottostante sia alla
ulteriore copia di ciascun valore.
Macro EXISTINGARRAY
La macro EXISTINGARRAY definita in sysopen.h pu essere usata per passare un
array esistente al posto di un open array. Luso della macro assume questo formato
Iea ieabIe .ciceaat ieabIe ii, ceaat Iat ii_..c,
ieabIe ., , 1, .. ,
.ci.L.L.~~ .,
_
La sezione Calcolo del numero di elementi a pagina 13-18 vale anche per la macro
EXISTINGARRAY.
Funzioni C++ che accettano argomenti di tipo open array
Quando si scrive una funzione C++ a cui verr passato un array aperto da Object
Pascal, importante conservare esplicitamente la semantica del passaggio per
valore. In particolare, se la dichiarazione per la funzione corrisponde al passaggio
per valore, bisogna accertarsi di aver copiato esplicitamente tutti gli elementi prima
di modificarli. In Object Pascal un array aperto un tipo incorporato e pu essere
passato per valore. In C++ il tipo array aperto viene implementato usando un
puntatore, il quale modifica larray originale, a meno che non ne venga fatta una
copia locale.
Tipi definiti in altro modo
I tipi che in Object Pascal e C++ vengono definiti in modo diverso normalmente non
sono causa di preoccupazioni. I rari casi in cui sono problematici risultano
difficilmente individuabili. Per tale motivo, questi tipi vengono trattati in questa
sezione.
Tipi di dati booleani
In Object Pascal il valore True per i tipi di dati ByteBool, WordBool e LongBool viene
rappresentato con 1. False viene rappresentato con 0.
_
Il tipo di dati Boolean rimane costante (true = 1, false = 0)).
Mentre il tipo bool di C++ converte correttamente questi tipi di Object Pascal,
nascono problemi quando vengono condivise una funzione WinAPI o una qualsiasi
altra funzione che usa un tipo BOOL di Windows rappresentato con 1. Se viene
passato un valore ad un parametro di tipo BOOL, esso vale 1 in Object Pascal e 1 in
C++. Pertanto, se tra questi due linguaggi viene condiviso del codice, qualsiasi
confronto dei due identificatori pu risultare errato, a meno che non siano entrambi 0
(False, false). Per aggirare lostacolo, si pu usare il seguente metodo di confronto:
~ ,
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-21
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
La Tabella 13.2 mostra i risultati delluso di questo metodo di confronto
delluguaglianza:
Con questo metodo di confronto qualunque serie di valori sar calcolata
correttamente.
Tipi di dati char
Il tipo char in C++ con segno, mentre in Object Pascal senza segno. + molto raro
che si verifichi una situazione in cui questa differenza potrebbe diventare un
problema quando viene condiviso del codice.
Interfacce Delphi
l compilatore Object Pascal gestisce automaticamente molti dettagli durante le
attivit con le interfacce. Incrementa automaticamente il contatore dei riferimenti di
uninterfaccia quando il codice dellapplicazione acquisisce un puntatore
allinterfaccia e decrementa tale contatore quando linterfaccia esce dal campo di
validit.
In C++Builder, la classe modello DelphiInterface fornisce alle classi interfaccia di C++
solo una parte di tali automatismi. Per le propriet e i metodi nella VCL e nella CLX
che utilizzano i tipi interfaccia in Object Pascal, i wrapper di C++ utilizzano una
DelphiInterface che costruita utilizzando la classe interfaccia sottostante.
Il costruttore DelphiInterface, il costruttore copia, loperatore di assegnazione e il
distruttore incrementano o decrementano alloccorrenza il contatore dei riferimenti.
Tuttavia, DelphiInterface non cos conveniente quanto il supporto offerto dal
compilatore per le interfacce in Object Pascal. Altri operatori che forniscono laccesso
al puntatore allinterfaccia sottostante non gestiscono il conteggio dei riferimenti
perch la classe non pu sempre dire quando opportuno farlo. Potrebbe essere
necessario chiamare esplicitamente AddRef o Release per essere certi che il conteggio
dei riferimenti sia corretto.
Stringhe di risorse
Se nel codice presente una unit Pascal che usa stringhe di risorse, il compilatore
Pascal (DCC32) genera una variabile globale e una corrispondente macro del
preprocessore per ciascuna stringa di risorse quando genera il file header. Le macro
vengono usate per caricare automaticamente le stringhe di risorse, e sono destinate
Tabella 13.2 Confronto delluguaglianza !A == !B di variabili BOOL
Object Pascal C++ !A == !B
0 (False) 0 (false) !0 == !0 (TRUE)
0 (False) 1 (true) !0 == !1 (FALSE)
1 (True) 0 (false) !1 == !0 (FALSE)
1 (True) 1 (true) !1 == !1 (TRUE)
13-22 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
ad essere usate nel codice C++ dovunque si fa riferimento alla stringa di risorse. Per
esempio, la sezione resourcestring nel codice Object Pascal pu contenere
aaIt c.c.,
Iatet?ace
teaeatceattIa
i c cic. .c icccss s csccs,
IepIeeeatatIea
beIa
eai.
Il codice corrispondente generato dal compilatore Pascal per C++Builder sar
exteta .~~ .sc.cscc cscc. _i,
-ie?Iae .c._i .sc.i.cscc..c._i
Questo consente di usare le stringhe di risorse Object Pascal esportate senza dover
chiamare in modo esplicito LoadResourceString.
Parametri predefiniti
La versione pi recente del compilatore Pascal accetta parametri predefiniti per i
costruttori per compatibilit con C++. A differenza di C++, i costruttori Object Pascal
possono per avere stesso numero e gli stessi tipi di parametri, poich ad essi viene
attribuito un nome univoco. In tali casi nei costruttori Object Pascal vengono usati
parametri fittizi per distinguerli quando vengono generati i file header di C++. Per
esempio, per una classe chiamata TInCompatible, i costruttori Object Pascal
potrebbero essere
ceaattactet cic~.c .,c,
ceaattactet cic.c.~.c .,c,
che porterebbero, senza parametri predefiniti, al seguente codice ambiguo in C++ per
entrambi i costruttori:
__?aatcaII L.,iccisscs.,c .c, -- cs . c .isci cic
csc
__?aatcaII L.,iccisscs.,c .c, -- cs . c .isci cic.c.
csc
Tuttavia, usando parametri predefiniti, per una classe chiamata TCompatible, i
costruttori Object Pascal sono
ceaattactet cic~.c .,c,
ceaattactet cic.c.~.c .,c, .. Lcc ,
Essi portano al seguente codice non ambiguo in C++Builder:
__?aatcaII .,iccisscs.,c .c, -- cs . c .isci cic
csc
__?aatcaII .,iccisscs.,c .c, .., -- cs . c .isci
cic.c. csc
_
Il problema principale con i parametri predefiniti che DCC32 rimuove il valore
predefinito del parametro predefinito. Un errore in tale operazione pu generare
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-23
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
ambiguit qualora non ci siano parametri predefiniti. Bisogna tenerne conto quando
si usano classi VCL o CLX oppure componenti di produttori terzi.
Informazioni di tipo runtime
Object Pascal ha costrutti di linguaggio che hanno a che fare con RTTI. Alcuni hanno
equivalenti in C++. Essi vengono elencati nella Tabella 13.3:
Nella Tabella 13.3, ClassName un metodo TObject che restituisce una stringa
contenente il nome del tipo attuale delloggetto, indipendentemente dal tipo di
variabile dichiarata. Gli altri metodi RTTI introdotti in TObject non hanno equivalenti
in C++. Essi sono tutti pubblici e sono elencati qui di seguito:
ClassInfo restituisce un puntatore alla tabella contenente le informazioni di tipo
runtime (RTTI) del tipo di oggetto.
ClassNameIs determina se un oggetto di uno specifico tipo.
ClassParent restituisce il tipo dellantenato diretto della classe. Nel caso di TObject
ClassParent restituisce nil perch TObject non non ha alcun parente. Viene usato
dagli operatori is e as, e dal metodo InheritsFrom.
ClassType determina dinamicamente il tipo attuale di un oggetto. Viene usato
internamente dagli operatori is e as di Object Pascal.
FieldAddress usa RTTI per ottenere lindirizzo di un campo pubblicato. Viene usato
internamente dal sistema steaming.
InheritsFrom determina la relazione tra due oggetti. Viene usato internamente
dagli operatori is e as di Object Pascal.
MethodAddress usa RTTI per trovare lindirizzo di un metodo. Viene usato
internamente dal sistema steaming.
Alcuni di questi metodi di TObject sono destinati principalmente alluso interno da
parte del compilatore o del sistema streaming. Per maggiori informazioni, consultare
la Guida in linea.
Tabella 13.3 Esempi di correlazioni RTTI da Object Pascal a C++
RTTI Object Pascal RTTI C++
if Sender is TButton... if (dynamic_cast <TButton*> (Sender)
// dynamic_cast restituisce NULL in caso di errore.
b := Sender as TButton;
(* genera uneccezione in caso di
errore *)
TButton& ref_b = dynamic_cast <TButton&> (*Sender)
// genera uneccezione in caso di errore.
ShowMessage(Sender.ClassName); ShowMessage(typeid(*Sender).name());
13-24 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
Tipi non mappati
Tipi real a 6 byte
Il vecchio formato a virgola mobile a 6 byte di Object Pascal ora viene chiamato
Real48. Il vecchio tipo Real ora un double. C++ non ha un equivalente per il tipo
Real48. Conseguentemente, non si deve usare del codice Object Pascal che includa
questo tipo con il codice C++. Altrimenti, il generatore del file header generer un
messaggio.
Arrays come tipi restituiti da funzioni
In Object Pascal una funzione pu richiedere come argomento, o restituire come tipo,
un array. Per esempio, la sintassi per una funzione GetLine che restituisce un array di
80 caratteri
t,pe
c_ii atta,, e? caat,
?aactIea cc c_ii,
C++ non ha un equivalente di questa funzione. In C++ gli array non sono consentiti
come tipi restituiti da funzioni. E tantomeno C++ accetta array come tipo di
argomento di una funzione.
bene tenere presente che, sebbene la VCL e la CLX non abbiano alcuna propriet
che sia un array, il linguaggio Object Pascal lo consente. Dal momento che le
propriet possono usare i metodi di lettura e di scrittura Get e Set, che richiedono e
restituiscono valori del tipo della propriet, in C++Builder non possibile avere una
propriet di tipo array.
_
Le propriet array, che sono valide anche in Object Pascal, non sono un problema in
C++ perch il metodo Get prende un valore di indice come parametro, mentre il
metodo Set restituisce un oggetto del tipo contenuto dallarray. Per maggiori
informazioni sulle propriet array, consultare Creazione di propriet array a
pagina 47-8.
Estensioni di parole chiave
Questa sezione descrive le estensioni di parole chiave conformi con lo standard
ANSI, implementate in C++Builder per supportare la VCL e la CLX. Per un elenco
completo delle parole chiave e delle relative estensioni in C++Builder, consultare la
Guida in linea.
__classid
Loperatore __classid viene usato dal compilatore per generare un puntatore a vtable
per il classname specificato. Questo operatore viene usato per ottenere la classe meta
da una classe.
Sintassi __cIaaaIicissi.c
Per esempio, __classid viene usato per la registrazione di editor di propriet, di
componenti e di classi, e con il metodo InheritsFrom di TObject. Il codice seguente
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-25
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
illustra luso di __classid per la creazione di un nuovo componente derivato da
TWinControl:
aaeeapace ..c
__closure
La parola chiave __closure serve per dichiarare uno speciale tipo di puntatore ad una
funzione membro. Nel linguaggio C++ standard, il solo modo per ottenere un
puntatore a una funzione membro consiste nellutilizzare il nome del membro per
esteso, come mostrato nellesempio seguente:
cIaaa cisc
pabIIc
veIi .cIat x ,
,
t,peie? veIi cisc ,isc.c.ccIat,
Iat .iIat ic, caat i,
cisc ciscccc,
,isc.c.cc . cisc.c, c ,c .c.cc .c
i .c c ,c .c.cc
ciscccc.,
tetata ,
pabIIc
veIi c._.cIat ,
,
Iat .iIat ic, caat i,
.cc. .cc.ccc,
,isc.c.cc . .cc.c._.c, L~
tetata ,
13-26 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
Lestensione della parola chiave __closure permette di aggirare questa limitazione e
di fare qualcosa in pi. Utilizzando un closure possibile ottenere un puntatore a
funzione membro di un oggetto (cio una particolare istanza di una classe). Loggetto
pu essere qualsiasi oggetto, indipendentemente dalla sua gerarchia di eredit. Il
puntatore this delloggetto viene utilizzato automaticamente quando si chiama la
funzione membro mediante il closure. Lesempio seguente mostra come dichiarare e
utilizzare un closure. Si presume che le classi base e derivate fornite in precedenza
siano state definite.
Iat .iIat ic, caat i,
.cc. .cc.ccc,
veIi __cIeaate .cc.sc,
.cc.sc .cc.cccc._.c, c i ,c c c._.c .c.cc
.c c csc s isscic. . c
,ici ccc, .cc.ccc
.cc.sc, i c._.c c csc
tetata ,
~ csc i. i i.c i. c .
veIi __cIeaate .sc Iat,
Li.c c csc
.sc ,c>.c,
sc c csc ci c .c.cc .c
.sc,
tetata,
.cc. .cc.ccc,
veIi __cIeaate .cc.scIat,
.cc.sc .cc.cccc._.c, .i.c is cc.c
.cc.sc,
c ci sc ,cs i.c i csc,
c ci is c i ,c c .c .c.cc .c
c cisc ciss
.c.cc.ccc,
tetata ,
Notare che si sta passando un puntatore a unistanza della classe derivata e lo si sta
utilizzando per ottenere un puntatore a una funzione membro nella classe base una
cosa che il linguaggio C++ standard non consente di fare.
S u p p o r t o d e l l i n g u a g g i o C + + p e r l a V C L e l a C L X 13-27
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
I closure sono una parte fondamentale dellambiente RAD di C++ Builder. Essi
danno la capacit di assegnare un gestore di evento nellObject Inspector. Ad
esempio, un oggetto TButton ha un evento di nome OnClick. Nella classe TButton,
levento OnClick una propriet che utilizza nella sua dichiarazione lestensione
della parola chiave __closure. La parola chiave __closure permette di assegnare alla
propriet una funzione membro di unaltra classe (di solito una funzione membro in
un oggetto TForm). Quando si colloca un oggetto TButton su una scheda e quindi si
crea un gestore per levento OnClick del pulsante, C++Builder crea una funzione
membro nel TForm genitore del pulsante e assegna quella funzione membro
allevento OnClick di TButton. In questo modo, il gestore di evento viene associato a
quella particolare istanza di TButton e a nessun altro.
Per ulteriori informazioni su eventi e closure, vedere il Chapter 48, Creazione di
eventi.
__property
La parola chiave __property dichiara un attributo di una classe. Le propriet
appaiono al programmatore esattamente come qualsiasi altro attributo (campo) di
una classe. Tuttavia, come la sua controparte Object Pascal, la parola chiave
__property di C++Builder aggiunge molte altre funzionalit altre alla semplice
capacit di esaminare e modificare il valore dellattributo. Poich gli attributi della
propriet controllano completamente laccesso alla propriet, non esistono
limitazionni sul modo in cui si implementa la propriet allinterno della stessa classe.
Sintassi __ptepett, type propertyName,index1Type index1,indexNType indexN attributes ,
in cui
type un tipo di dati intrinseco o dichiarato in precedenza.
propertyName un qualsiasi identificativo valido.
indexNType un tipo di dati intrinseco o dichiarato in precedenza.
indexN il nome di un parametro indice che sar passato alle funzioni read e write
della propriet.
attributes una sequenza separata da virgole di read, write, stored, default (o
nodefault), o index.
I parametri indexN fra parentesi quadre sono facoltativi. Se presenti, dichiarano una
propriet array. I parametri index vengono passati ai metodi read e write della
propriet array.
Lesempio seguente mostra alcune dichiarazioni di propriet semplici:
cIaaa .,cxi.,c
ptIvate
Iat x,,
?Ieat ccs,,,
ptetectei
Iat ci.. tetatax,
veIi .c.Iat c.x x c.x,
ieabIe c.,c.
s.c c.,i i. c i .i , ic
13-28 G u i d a a l l a p r o g r a mma z i o n e
S u p p o r t o p e r i t i p i d i d a t i O b j e c t P a s c a l e p e r l e s t r u t t u r e d e l l i n g u a g g i o
tetata,