Appunti sul linguaggio Visual Basic per DOS
di Ugo Bottari
Indice
Introduzione
Glossario
Creazione di una applicazione
I controlli in VBDOS
Elenco dei controlli
Le proprietà
Elenco delle proprietà
Gli eventi
Elenco degli eventi
I metodi
Elenco dei metodi
Elenco ragionato
delle funzioni
Consigli circa la programmazione
Spezzoni di codice
Esercizi
Esercizi in Basic
Esercizi in VBDOS
Uso dei file di dati con il
Visual Basic per DOS
Chi legge queste note saprà certamente che nulla è perfetto,
men che meno qualcosa che abbia a che fare con la programmazione
ed i computer in generale. Anzi !
INCIPIT, INTRODUZIONE, PREMESSA, FATE VOI
Il Visual Basic per DOS, prodotto dalla Microsoft, è (o meglio era)
disponibile in una unica versione, la 1.0: la celeberrima software house ha deciso,
qualche tempo fa, di sospendere il supporto di questo interessante prodotto. Questioni di
carattere esclusivamente commerciale hanno sancito la morte di un linguaggio che però
sopravvive, ampliato, nelle corrispondenti versioni per Windows.
Il Visual Basic per DOS, comunemente noto sotto il nome di VBDOS, ha, forse per primo,
proposto il modello di programmazione basato su eventi e interfaccia utente grafica (sia
pure ridotta, questultima, ad una interfaccia a carattere).
Il Visual Basic per Windows, comunemente noto sotto il nome di VB, riprende lo stile di
programmazione proposto dal VBDOS ma, rispetto a questo, richiede maggiori risorse
hardware e, soprattutto nelle versioni più recenti, uno sforzo non indifferente da parte
del programmatore per governare questo potente sistema di sviluppo software. Senza paura
di essere smentito posso affermare che il Visual Basic per Windows, e specificatamente le
versioni 5 e 6, hanno una tale complessità che è illusorio pensare che una
singola persona sia in grado di destreggiarsi fra tutte
le sue innumerevoli funzionalità; il programmatore VB dovrà perciò limitarsi a
specializzarsi in un certo settore: applicazioni gestionali oppure applicazioni grafiche
oppure applicazioni per il Web, e così via. Resta il VBDOS che, utilizzando un modello di
programmazione simile al VB, consente a chiunque, in poche ore, di imparare a programmare
(ed a divertirsi, il che non guasta ! ).
Come già detto i concetti di base del VBDOS sono presenti anche nel cugino VB per cui il
passaggio dalluno allaltro ambiente non dovrebbe causare eccessivi traumi.
Il programmatore VBDOS non dovrebbe quindi sentirsi sminuito nellimparare ad
utilizzare correttamente i form, le finestre, i pulsanti
rinunciando alla
coreografia di immagini, suoni e animazioni, caratteristica di Windows.
Per aiutare i neo-programmatori VBDOS ho riunito in questo documento qualche appunto,
consiglio, esercizio e, conscio della relativa difficoltà che qualcuno di essi potrebbe
avere nellaffrontare questo nuovo ambiente, ho voluto iniziarlo (questo documento)
con un piccolo glossario di termini.
Cuneo, gennaio 1999
Basato su eventi
Il modello di programmazione di VBDOS. A differenza delle applicazioni scritte con lo stile procedurale (tuttavia ancora supportato in questo linguaggio) le applicazioni basate su eventi sono costituite da codice che rimane inattivo fino a che non viene chiamato per rispondere ad un evento provocato dallutente o dal sistema.Per applicazione si intende linsieme di codice e di
elementi visivi che funzionano tutti insieme come un programma unico. Per creare una
applicazione occorre creare i moduli di form (estensione .FRM) ed i moduli di codice
(estensione . BAS). Alcune applicazioni più complesse potrebbero richiedere altri tipi di
file (vedi tabella sottostante).
I moduli di form comprendono anche codice.
Il file di progetto (quello con estensione .MAK) contiene i nomi di tutti i form e di
tutti i moduli di una applicazione. Una applicazione è composta da almeno un form o un
modulo BAS; nel primo caso si tratta di un vera a propria applicazione in Visual Basic per
DOS mentre nel secondo si tratta di una applicazioni in Basic, senza alcuna interfaccia visual.
Applicazioni più complesse comprendono più form e/o più moduli BAS; in questo caso deve
essere definito il file di avvio (menu Esegui, Imposta file avvio), ossia quello che viene eseguito per primo.
Come creare una applicazione VBDOS
1 Creare un nuovo progetto.
Dal menu File scegliere Nuovo progetto. Se non vi sono
progetti precedentemente caricati il contenuto dello schermo non cambierà.
I moduli di codice (quelli con estensione .BAS) vengono creati in ambiente di
programmazione (quello con la finestra blu) mentre i moduli di form (quelli aventi
estensione FRM) vengono creati in Form Designer (quello con la finestra grigia).
2 Creare un nuovo form
Dal menu File scegliere Nuovo form. Verrà avviato Form Designer,
lambiente specializzato per la creazione degli elementi visivi delle applicazioni.
Il Form Designer è unutilità separata che serve a costruire
linterfaccia utente (form e controlli) delle applicazioni.
3 Inserire i controlli nel form
Dal pannello degli strumenti (o dal menu Strumenti) scegliere i controlli che si
desidera inserire nel form. I controlli così aggiunti determinano il design
dellinterfaccia utente dellapplicazione. E buona norma attribuire fin
dora ai vari controlli un aspetto il più possibile simile a quello desiderato.
4 Definire le proprietà dei form e dei controlli
Dalla barra delle proprietà scegliere i valori da impostare, proprietà per proprietà.
Le impostazioni delle proprietà determinano laspetto ed il comportamento dei form e
dei controlli.
5 Scrivere il codice relativo ai form ed ai controlli.
Dal menu File di Form Designer scegliere Esci per tornare in ambiente
di programmazione ("finestra blu") salvando ovviamente quanto fin qui digitato.
Dal menu Modifica scegliere Procedure di evento oppure (più velocemente)
premere il tasto F12. Le procedure di evento vengono chiamate in risposta a un evento
causato dallutente o dal sistema. Scrivere le varie procedure di evento ed
(eventualmente) scrivere le procedure SUB e le procedure FUNCTION.
6 Salvare il progetto.
Dal menu File scegliere Salva progetto.
In generale i tipi di file vengono determinati dalla loro estensione secondo la seguente
tabella :
| Tipo di file | Estensione |
| Modulo di codice | BAS |
| Modulo di form | FRM |
| Libreria | LIB |
| Progetto | MAK |
| Eseguibile | EXE |
| File di include | BI |
| Libreria Quick | QLB |
| Testo | TXT |
7 Eseguire e provare lapplicazione
Dal menu Esegui scegliere Avvia o premere Maiusc+F5. Lesecuzione
consente lanalisi ed il test del codice prima della compilazione.
Per mettere a punto il codice usare le finestre Immediata e Debug, reperibili nel menu Finestre.
8 Creare un file eseguibile
Dal menu Esegui scegliere Crea file EXE.
Le applicazioni autonome possono essere create anche dalla riga di comando MS-DOS mediante
il compilatore ed il linker.
Per controllo si intende un oggetto da inserire in un form; i controlli
(ed i form stessi) possiedono delle proprietà che definiscono il loro aspetto ed il loro
comportamento.
I controlli agiscono in risposta a vari eventi i quali individuano determinate azioni.
I metodi indicano ad un controllo di intraprendere una determinata azione.
A ciascun controllo corrispondono una serie di eventi, metodi e proprietà che ne
definiscono la visualizzazione ed il comportamento.
Alcune proprietà, come pure alcuni eventi e alcuni metodi sono in comune fra tutti i
controlli disponibili. Altre proprietà (come pure certi metodi o certi eventi) sono
disponibili solo per particolari controlli.
Qui sotto è riportato un elenco di tutti i controlli disponibili nel VBDOS in lingua
italiana; di ciascuno di essi è specificato, con il carattere in corsivo) il nome in
inglese con cui esso è conosciuto (nome a cui a volte si fa riferimento nella
documentazione disponibile insieme al linguaggio). Nella prima riga è precisato anche il
nome del controllo così come esso è indicato nella casella degli strumenti.
Check box Casella di controllo Controllo
Attiva o disattiva la selezione di una opzione
Visualizza unopzione che lutente può attivare o disattivare, e indicare
come vera o falsa, mediante la selezione e lannullamento della selezione. La lettera
X che appare nella casella di controllo, fra due parentesi quadre, indica che
lopzione è stata selezionata.
Combo box Casella combinata Combinata
Consente di digitare un testo o di selezionare da un elenco
Consente di digitare un valore o di effettuare una selezione da un elenco di opzioni.
Riunisce le funzioni della casella di testo e della casella di riepilogo.
Dir List Elenco directory Dir
Consente la selezione di un percorso di directory
Visualizza la struttura ad albero delle directory (conosciute sotto Windows 95 come
"cartelle") e dei percorsi al momento dellesecuzione del programma
Drive List Elenco delle unità Unità
Consente la selezione di una unità disco
Si presenta con un riquadro (con barra di scorrimento laterale a destra) con
lelenco delle unità disco disponibili (A:, B:, C:, ecc.)
File List Elenco file File
Consente la selezione dei file
Visualizza lelenco dei file di una directory (conosciuta sotto Windows 95 come
"cartella") specificata al momento dellesecuzione del programma.
Frame Cornice Cornice
Consente di raggruppare, sia dal punto di vista logico che grafico, dei controlli
Appare sullo schermo sotto forma di rettangolo con una titolo (caption) in alto. Serve in
particolar modo per raggruppare i pulsanti di opzioni o altri controlli.
Hscroll Bar Barra di scorrimento orizz. ScorrOrizz
Consente la selezione in un intervallo di valori
Appare come una barra di scorrimento orizzontale (da sinistra a destra) dello schermo e
possiede le stesse proprietà del controllo di Windows 95
Vscroll Bar Barra di scorrimento verticale ScorrVert
Consente la selezione in un intervallo di valori
Appare come una barra di scorrimento verticale (dallalto verso il basso) dello
schermo e possiede le stesse proprietà del controllo di Windows 95
Command Pulsante di comando Comando
button Effettua una operazione quando viene scelto (premuto)
Esegue un comando o una azione specifica quando viene selezionato. Appare come un
rettangolo che modifica il suo aspetto (i suoi bordi) quando viene "premuto"
Label Etichetta Etichetta
Visualizza un testo non modificabile
E costituita da un testo, incorniciato o meno in un rettangolo, che lutente
non può modificare direttamente.
List Box Casella di riepilogo Riepilogo
Consente la selezione in un elenco
Elenca una serie di scelte possibili, in un elenco racchiuso in un riquadro verticale.
A destra appare una barra di scorrimento verticale.
Option Button Pulsante di opzione Opzione
Consente la selezione di un singolo elemento fra un gruppo
Lutente può attivare o disattivare un singolo elemento del gruppo. E
rappresentato graficamente da due parentesi aperte/chiuse. Un punto fra le due parentesi
significa che quellopzione è Vera.
Picture Box Casella di immagine Immagine
Visualizza dei caratteri ASCII nel form
Visualizza del testo o loutput grafico del metodo PRINT. Può anche essere
utilizzata per contenere dei pulsanti di opzione, similmente alla cornice.
Text Box Casella di testo Testo
Visualizza un testo modificabile
Fornisce allutente una zona speciale, detta "campo di modifica", per la
digitazione di testo. Il programma è in grado di leggerne il contenuto mediante la
proprietà "Text"
Timer Timer Timer
Specifica un intervallo di tempo per gli eventi del timer interno del computer
Produce una azione (speficicabile) quanto lintervallo di tempo stabilito dal
timer stesso è trascorso. La frequenza dellintervallo è memorizzata nella
proprietà "Interval" del controllo Timer
Menu Menu Usare Finestra Finestra creazione menu
Visualizza un elenco di voci fra cui selezionare una scelta
Visualizza, nella parte superiore del form, lelenco dei comandi disponibili per
il titolo di menu scelto. Mediante il mouse (principalmente) ma anche mediante la tastiera
e le frecce direzionali lutente può selezionare una opzione.
Le proprietà definiscono laspetto e il comportamento dei form e dei controlli.
Ogni proprietà riguarda una serie di controlli specifici.
Per impostare la proprietà ad un controllo usare la sintassi seguente :
NomeForm.NomeOggetto.Proprieta = impostazione
Osservazioni: NomeForm è il nome del form ed è facoltativo se è il medesimo del form in cui viene utilizzato il codice sopra scritto. Attenzione: fra NomeForm e NomeOggetto cè un punto, come pure fra NomeOggetto e Proprietà.
Esempi :
frmPinco.NumVolte.left = 12
NumVolte.Alignment = 2
Elenco delle proprietà
(in grassetto le più importanti ed utilizzate)
ActiveControl Restituisce il nome del controllo attivo
ActiveForm Restituisce il nome del form attivo
Alignment Specifica lallineamento del testo (destra, sinistra, centrato)
Archive Seleziona i file con lattributo archivio
Attached Determina se il form avrà una barra di scorrimento
AutoRedraw Detemina se il disegno automatico di un form o di una casella di immagine avrà
luogo o meno
AutoSize Indica se un controllo verrà ridimensionato per adattarsi al suo contenuto
BackColor Determina il colore di sfondo del controllo o del form
BorderStyle Determina lo stile del bordo del controllo o del form
Cancel Definisce il pulsante Annulla come pulsante di comando
Caption Definisce il testo che appare allinterno di un controllo e nella
barra del titolo del form
Checked Indica se una voce di menu è stata selezionata
ControlBox Colloca una casella nel menu Controllo di un form
ControlPanel Consente la definizione delle impostazioni di colore predefinite
CtlName Definisce il nome di un controllo
CurrentX Restituisce o imposta la coordinata X corrente
CurrentY Restituisce o imposta la coordinata Y corrente
Default Determina il pulsante predefinito di un form
DragMode Imposta una modalità per le operazioni di trascinamento e rilascio dei controlli
Drive Imposta o restituisce lunità disco corrente
Enable Consente o meno ad un form o ad un controllo di rispondere agli eventi
FileName Restituisce il nome del file selezionato al momento
ForeColor Determina il colore di primo piano (ossia del testo) di un form o di un
controllo
FormName Definisice il nome di un form. E analogo a CtlName di un controllo
FormType Spefifica un form di tipo MDI (contenitore)
Height Restituisce o imposta laltezza di un form, di un controllo o dello
schermo
Index numero che identifica un controllo come appartenente ad una matrice di
controlli
Interval Determina il lasso di tempo che intercorre fra un evento Timer e
laltro
Hidden Seleziona i file con lattributo nascosto
LargeChange Determina la quantità di scorrimento che si verifica quando si clicca su una
barra di scorrimento
Left Indica la posizione orizzontale, ossia della colonna, di un form o di un
controllo
List Consente laccesso agli elementi di una casella combinata o di riepilogo
ListCount Restituisce il numero degli elementi di una casella combinata o di
riepilogo
ListIndex Restituisce lindice dellelemento selezionato
Max Definisce il valore massimo della posizione di una barra di scorrimento orizz. o vert.
MaxButton Determina la presenza del pulsante Ingrandisci su un form
MousePointer Determina il carattere predefinito di rappresentazione del puntatore del
mouse
Min Definisce il valore minimo della posizione di una barra di scorrimento orizz. o vert
MultiLine Determina se una casella di testo può accettare o meno più righe
Normal Consente la visualizzazione dei file privi di attributo
Parent Restituisce il contenitore di un form o di un controllo
Path restituisce il percorso selezionato al momento, compresà lunità
Pattern Seleziona i nomi di file da visualizzare
PrintTarget Specifica la stampante di destinazione del metodo PRINTFORM
ReadOnly Seleziona i file con attributo di sola lettura
ScaleHeight Restitusice laltezza interna di un form o di un controllo
ScaleWidth Restitusice la larghezza interna di un form o di un controllo
ScrollBar Definisce laspetto e lo stile delle barre di scorrimento orizzontale o
verticale
SelLenght Restituisce la lunghezza del testo selezionato
SelStart Restituisce la posizione iniziale del testo selezionato
Sel Text Restituisce il testo selezionato al momento
Separator Determina se un controllo di menu viene visualizzato come separatore
SmallShange Determina la quantità di scorrimento che si verifica quanto si fa clic su una
barra di scorrimento orizzontale o verticale
Sorted Determina se un elenco verrà ordinato quanto vi si aggiunge un nuovo elemento
Style Determina lo stile di una casella combinata
System Seleziona i file con attributo Sistema
TabIndex Indica la posizione di un controllo nellordine TAB
TabStop Determina se luso del tasto di tabulazione è attivo o meno
Tag Memorizza dati unici in un singolo oggetto
Text Definisce il testo da visualizzare in un controllo
Top Indica la posizione verticale (riga) di un controllo o di un form
Value Restituisce lo stato corrente di un controllo
Visible Determina se un form o un controllo è visibile o meno
Width Restituisce la larghezza esterna di un form o di un controllo
WindowState Restituisce o imposta lo stato visivo di un form o di un controllo
Gli eventi individuano determinate azioni e rispondono di conseguenza.
Vengono usati con i form e i controlli per individuare ed effettuazione azioni specifiche.
Quanto un evento valido viene individuato viene eseguita una procedura SUB speciale,
chiamata "procedura di evento". Sono supportati numero eventi (ad esempio il
rilevamento della pressione dei tasti della tastiera e il click sui pulsanti del mouse).
Usare la sintassi semplificata (Utilizzare il tasto F12 per selezionare le Procedure di evento desiderate)
SUB NomeControllo_evento
. . . istruzioni
. . . istruzioni
END SUB
Attenzione : Fra NomeControllo e Evento cè un segno di sottolineatura.
Elenco degli eventi
(in grassetto i più importanti ed utilizzati)
Change Modifica il valore di un controllo
Click Click su un form o un controllo
DblClick Doppio click su un form o controllo
DragDrop Trascinamento e rilascio di un oggetto su un controllo
DragOver Trascinamento di un oggetto su un controllo
DropDown Discesa di un menu o delle parte elenco di una casella combinata
GotFocus Attivazione di un form o un controllo
KeyDown Pressione di un tasto della tastiera quanto un form o controllo è attivato
KeyPress Pressione di un tasto di carattere ASCII
KeyUp Rilascio di un tasto quanto un form o un controllo è attivato
Load Caricamento in memoria di un form
LostFocus Disattivazione di un form o di un controllo
MouseDown Pressione sul pulsante del mouse
MouseMove Spostamento del mouse
MouseUp Rilascio del pulsante del mouse
Paint Colorazione di un form o di un controllo
PathChange Assegnazione che provoca la modifica del percorso dellunità
PatternChange Assegnazione che provoca la modifica dello schema dei caratteri jolly per i
nomi di file
Resize Ridimensionamento del form
Timer Trascorrere del lasso di tempo impostato dalla proprietà Interval (millisecondi)
Unload Rimozione del form dalla memoria
I metodi indicano a un oggetto di intraprendere una determinata azione.
Per "metodo" si intende una parola chiave, simile a una funzione o ad una istruzione, che tuttavia agisce su un oggetto specificato (form o controllo o altri oggetti speciali tipo PRINTER, CLIPBOARD, SCREEN). I metodi indicano ad un oggetto di effettuare un certo tipo di azione. In alcuni casi tale azione restituisce un valore.
Usare la seguente sintassi :
NomeForm.NomeOggetto.Metodo EventualiArgomentiOsservazioni: NomeForm è il nome del form ed è facoltativo se è il medesimo dei form in cui viene utilizzato il codice sopra scritto.
Attenzione: fra NomeForm e NomeOggetto cè un punto, come pure fra NomeOggetto e Metodo.
(in grassetto i più importanti ed utilizzati)
AddItem Aggiunge un elemento a una casella combinata o di riepilogo
Clear Cancella il contenuto delloggetto CLIPBOARD
Cls Cancella il testo da un form a da una casella di immagine
Drag Inizia, conclude od annulla il trascinamento dei controlli
EndDoc Chiude il documento corrente
GetText Restituisce il testo delloggetto CLIPBOARD
Hide Nasconde un form e il suo contenuto
Move Sposta e ridimensiona un controllo o un form
NewPage Chiude la pagina corrente e si porta alla successiva
Print Visualizza i dati in un form o in una casella di immagine o li stampa su una
stampante
PrintForm Invia alla stampante unimmagine ASCII di un form
Refresh Ridisegna o aggiorna un form o un controllo
RemoveItem Rimuove un elemento da una casella combinata o di riepilogo
SetFocus Attiva un controllo specifico
SetText Colloca il testo nelloggetto CLIPBOARD
TextHeight Restituisce laltezza di una stringa
TextWidth restituisce la larghezza di una stringa
Show Rende visibili un form e il suo contenuto
ELENCO RAGIONATO DELLE FUNZIONI, DELLE ISTRUZIONI E DEI METODI
La tabella seguente elenca le funzioni, le istruzioni ed i metodi correlati, raggruppati per task di programmazione. Gli elementi elencati sotto una determinata categoria vengono spesso usati insieme. Le funzioni (o le istruzioni o i metodi) possono apparire in più di una categoria.
Categoria |
Azione |
Funzioni/istruzioni/metodi |
| Matrici | Dichiarazione ed inizializzazione delle variabili matrice | DIM, REDIM, STATIC |
| Reinizializzare le variabili di matrice | ERASE, REDIM, REDIM PRESERVE | |
| Trovare i limiti di una matrice | LBOUND, UBOUND | |
| Cambiare il limite inferiore predefinito delle matrici | OPTION BASE | |
| Controllo del flusso del programma | Ciclo | DO LOOP, FOR NEXT, WHILE END |
| Diramazione | GOSUB RETURN, GOTO, ON ERROR, ON GOSUB, ON GOTO | |
| Prendere decisioni | IF ENDIF, IFTYPEOF, SELECT CASE | |
| Uscire dal programma o sospenderlo | DOEVENTS, END, STOP, UNLOAD, SYSTEM, CHAIN, RUN | |
| Conversione | Valore ASCII in stringa | CHR$ |
| Stringa in valore ASCII | ASC | |
| Numero in stringa | STR$, FORMAT$ | |
| Stringa in numero | VAL | |
| Tipo di dati numerico in altro tipo | CCUR, CDBL, CINT, CLNG, CSNG, FIX, INT | |
| Numeri decimali in altre basi | HEX$, OCT$ | |
| Data in numero seriale | DATESERIAL, DATEVALUE | |
| Numero seriale in data | DAY, MONTH, WEEKDAY, YEAR, NOW | |
| Ora in numero seriale | TIMESERIAL, TIMEVALUE | |
| Numero seriale in ora | HOUR, MINUTE, SECOND, NOW | |
| Copia, taglia e incolla | Usare loggetto CLIPBOARD | CLEAR, GETTEXT, SETTEXT |
| Data/ora | Ottenere la data o lora corrente | DATE$, NOW, TIME$ |
| Impostare la data o lora | DATE$, TIME$ | |
| Cronometrare un processo | TIMER | |
| Grafica | Lavorare con i colori | QBCOLOR, POINT, RGB |
| Disegnare forme | LINE, CIRCLE, PSET | |
| Ottenere le dimensioni del testo | TEXTHEIGHT, TEXTWIDTH | |
| Immagini di schermo | GET, PUT | |
| Visualizzare il testo | ||
| Cancellare il contenuto un oggetto, dello schermo, di un quadrante | CLS | |
| Intercettazione delgli errori | Intercettare gli errori durante lesecuzione | ON ERROR, RESUME |
| Ottenere i dati riguardanti lo stato di errore | ERR, ERL | |
| Ottenere i messaggi di errore | ERROR$ | |
| Simulare gli errori di run-time | ERROR | |
| Input/Output su file | Accedere ad un file o crearlo | OPEN |
| Chiudere i file | CLOSE, RESET | |
| Scrivere in un file | PRINT #, PUT, WRITE # | |
| Controllare laspetto delloutput | SPC, TAB, WIDTH # | |
| Leggere da un file | GET, INPUT #, INPUT$, LINE INPUT # | |
| Ottenere le informazioni riguardanti un file | EOF, FILEATTR, FREEFILE, LOC, LOF, SEEK | |
| Impostare la posizione di lettura/scrittura di un file | SEEK | |
| Gestire le unità disco o le directory | CHDRIVE, CURDIR$, CHDIR, MKDIR, RMDIR | |
| Gestire i file | DIR$, KILL, LOCK UNLOCK, NAME | |
| Manipolazione di oggetti | Nascondere o mostrare i form | SHOW, HIDE |
| Caricare o scaricare gli oggetti | LOAD, UNLOAD | |
| Spostare o ridimensionare i controlli | MOVE | |
| Trascinare e rilasciare | DRAG | |
| Dirigere linput utente verso un controllo | SETFOCUS | |
| Aggiornare la visualizzazione | REFRESH | |
| Stampare i form | PRINTFORM | |
| Lavorare con caselle di riepilogo e caselle combinate | ADDITEM, REMOVEITEM | |
| Visualizzare le finestre di dialogo | INPUTBOX$, MSGBOX | |
| Funzioni matematiche | Calcoli generali | EXP, LOG, SQR |
| Trigonometria | ATN, COS, SIN, TAB | |
| Conversioni numeriche | FIX, INT | |
| Ottenere il valore assoluto | ABS | |
| Ottenere il segno di unespressione | SGN | |
| Generare numeri casuali | RND, RANDOMIZE | |
| Stampa | Controllare la stampante | ENDDOC, NEWPAGE |
| Controllare laspetto delloutput | SPC, TAB, TEXTHEIGHT, TEXTWIDTH | |
| Stampa | PRINT, PRINTFORM, LPRINT | |
| Procedure | Definire una procedura | FUNCTION, SUB |
| Chiamare una procedura SUB | CALL | |
| Uscita da una procedura | EXIT FUNCTION, EXIT SUB, END FUNCTION, END SUB | |
| Dichiarare un riferimento a una procedura esterna | DECLARE | |
| Stringhe | Formattare le stringhe | FORMAT$ |
| Creare delle stringhe di caratteri che si ripetono | SPACE$, STRING$ | |
| Lavorare con valori ASCII e ANSI | ASC, CHR$ | |
| Manipolare le stringhe | INTR$, LEFT$, MID$, LTRIM$, RIGHT$, RTRIM$ | |
| Convertire in lettere maiuscole o minuscole | LCASE$, UCASE$ | |
| Giustificare una stringa | LSET, RSET | |
| Ottenere la lunghezza di una stringa | LEN | |
| Variabili e costanti | Dichiarare variabili o costanti | CONST, DIM, STATIC, SHARED, COMMON |
| Assegnare un valore | LET | |
| Impostare il tipo di dati predefinito | DEFtipo | |
| Creare un tipo di dati definito dallutente | TYPE | |
| Varie | Eseguire altri programmi | SHELL, RUN, CHAIN |
| Gestire gli eventi | DOEVENTS | |
| Ottenere gli argomenti della riga di comando | COMMAND$ | |
| Ottenere le variabili di ambiente | ENVIRON$ | |
| Emettere un segnale acustico | BEEP |
CONSIGLI CIRCA LA PROGRAMMAZIONE IN VBDOS
Utilizzate sempre dei nomi significativi per definire le variabili (e
le costanti) ed i controlli; ciò, a maggior ragione, se si tratta di variabili (o
costanti) o controlli che definiscono entità significative nel programma.
Esempi: NumeroDiVolte invece di N, LbRisultato invece
di Etichetta1, TxNumero
invece di Testo1.
Come avrete notato il linguaggio propone sempre
Etichetta1, Etichetta2, Testo1, Testo2, ecc. come nome dei nuovi controlli.Utilizzate le costanti laddove possibile, anche in luogo di numeri:
Esempio :
CONST Destra = 1
Valutate sempre, prima di accingervi ad inserire dei controlli sul form, se non sia il caso di utilizzare una matrice di controlli; in caso affermativo, prima di lanciare la procedura di Copia e Incolla, sistemate tutte le proprietà del primo controllo (quello che avrà indice 0) nel miglior modo possibile.
Ricordate sempre che siete in un ambiente DOS in cui i nomi dei files seguono la sintassi 8+3 e quindi i nomi lunghi, caratteristici di Windows 95, Windows 98 e Windows NT, non sono supportati. Sempre per lo stesso motivo evitate di utilizzare le lettere accentate: potreste avere delle sorprese leggendo i vostri file al di fuori dellambiente VBDOS !
Premettete al nome dei controlli una sigla che li identifichi.
Esempio :
Utilizzando Lb per label od etichetta, Tx per casella di testo, ecc. un valido nome per una
etichetta potrebbe essere LbRisultato
Utilizzate con oculatezza le maiuscole e le minuscole, lasciando a
VBDOS il compito di trasformare tutte in maiuscole le parole che lui riconosce come parole
chiave. Ne consegue che non è possibile, ad esempio, definire una variabile con il nome NEXT perché NEXT è una parola chiave del linguaggio.
Esempio :
E meglio LbMinimoNumero oppure LBMINIMONUMERO ?
Riempite in tutti i casi la caption delle etichette, anche e soprattutto nei casi in cui tale caption è destinata ad essere modificata dal codice del programma (tipicamente in Form_Load); in questi casi utilizzate come caption lo stesso control name in modo da identificare di primo acchito il controllo sul form, in fase di progettazione grafica.
Inserite sempre listruzione
OPTION EXPLICIT ; vi costringerà ad analizzare preventivamente il programma che vi accingere a scrivere e a non procedere per tentativi.Inserite sempre, specie allinizio del programma, opportuni
commenti quali il titolo e le caratteristiche principali del programma; inserire ulteriori
commenti dove il codice vi pare più criptico. Potreste in un primo momento scrivere il
codice, come commento, in buon italiano e poi tradurlo in BASIC in un secondo momento.
Esempio :
LbMedio.CAPTION = STR$(Risultato) stampo il risultato
Inserite anche quelle istruzioni che sono sì inutili ma che rendono il
codice del programma più facile da leggere.
Esempio :
DIM Somma AS INTEGER
Somma = 0
Listruzione Somma = 0 a questo punto del programma
è inutile ma, come già detto, rende il programma più chiaro.
Se dovete fare una serie di operazioni consecutive su alcune variabili
spezzettate le istruzioni. In luogo di
Risult = (VAL(Nome$) + INT(Alfa + Beta^2)) ^2
Scrivete, se ritenete che ne valga la pena per la chiarezza del
procedimento adottato :
A1 = VAL(Nome$)
A2 = Alfa + Beta^2
A3 = INT (A2)
Risult = (A1 + A3) ^ 2
In questo caso, poiché A1, A3, A3 sono variabili intermedie
ho utilizzato nomi corti e non significativi.
Più istruzioni possono essere scritte sulla stessa riga, separate da
due punti.
Esempio :
A2 = Alfa + Beta^2 : A3 = INT (A2)
Intentate sempre (dicesi sempre) il codice; ne guadagna la
leggibilità, per voi e per gli altri; oggi come domani, dopodomani, fra un anno.
Esempio negativo :
FOR N = 1 TO 100
IF N = 12 OR N = 3 THEN TABULAZ = 12 ELSE TABULAZ
= 14
FOR A = 1 TO 2
BETA = A * N
NEXT A
IF BETA = 33 THEN PRINT
NEXT N
Esempio da imitare :
FOR N = 1 TO 100
IF N = 12 OR N = 3 THEN
TABULAZ = 12
ELSE
TABULAZ = 14
END IF
FOR A = 1 TO 2
BETA = A * N
NEXT A
IF BETA = 33 THEN PRINT
NEXT N
Riutilizzate sempre il codice, se possibile: reinventare lacqua calda non è attività particolarmente gratificante.
Qui di seguito trovate spezzoni di codice utili in ogni occasione.
Come accettare solo alcuni tasti.| Carattere | Codice ASCII |
| . | 46 |
| / | 47 |
| 0 | 48 |
| 1 | 49 |
| 2 | 50 |
| 7 | 55 |
| 8 | 56 |
| 9 | 57 |
| : | 58 |
| ; | 59 |
| < | 60 |
| = | 61 |
| > | 62 |
| ? | 63 |
| @ | 64 |
| A | 65 |
| B | 66 |
SUB Tx_KeyPress (KeyAscii as INTEGER)
IF (KeyAscii < 48 OR KeyAscii > 57) AND KeyAscii <> 8 then
KeyAscii = 0
BEEP
END ID
END SUB
SUB Tx_KeyPress (Index AS INTEGER, KeyAscii as INTEGER)
IF KeyAscii = 13
IF Indice < MaxNumeri THEN
Indice = Indice + 1
ELSE
Indice = 0
END IF
Tx(Indice).SETFOCUS
End if
END SUB
Fine del programma
Viene utilizzata la funzione MSGBOX la quale visualizza un messaggio in
una finestra di dialogo, attende la scelta di un pulsante e restituisce un valore che
indica il pulsante scelto. MSGBOX può anche essere utilizzata quale istruzione nel qual
caso essa visualizza semplicemente un messaggio in una finestra di dialogo.
Il numero 4 significa che nella finestra modale in cui apparire il messaggio compariranno
2 pulsanti: <SI> e <NO>. Sul primo pulsante cè il focus. Se avessi
voluto mettere il focus sul secondo avrei dovuto sommare a 4 il numero 256.
Il numero 6 significa che è stato scelto il pulsante <SI>. Il numero 7 avrebbe
rappresentato il <NO>.
MSGBOX è qui impiegata come funzione.
SUB BotEsci_Click()
Dim X as INTEGER
X = MSGBOX("Vuoi veramente terminare ?), 4, "FINE
PROGRAMMA"
IF X = 6 THEN END
END SUB
Pari o dispari
Questo spezzone di programma fa capire come si può individuare se un
numero è pari o dispari. Bisogna fare attenzione ai due segni di divisione:
loperatore / è diverso dalloperatore \.
Il secondo infatti effettua la divisione intera.
FOR i = 0 TO 12
IF i \ 2 = i / 2 THEN
PRINT i; " pari"
ELSE
PRINT i; " dispari"
END IF
NEXT i
Nelle due sezioni successive vengono illustrati alcuni esercizi. Quelli
della prima sezione sono sviluppati in Basic tradizionale (senza sfruttare cioè
linterfaccia grafica la parte visual per intenderci). Nella seconda
sezione gli esercizi, sviluppati in VBDOS, sono viceversa composti da un form (ossia da
una parte visual) di cui viene anche dato lo schema grezzo.
Gli esercizi sviluppati in Basic tradizionale sono facilmente convertibili in visual;
inoltre, proprio perché non sviluppati in un Basic tradizionale sono più facilmente portabili,
ossia possono essere realizzati utilizzando altri dialetti Basic e, al limite, altri
linguaggi.
1 - Media fra due numeri
Questo esercizio, sviluppato in Basic tradizionale, consente di calcolare la media fra due numeri immessi dallutilizzatore. Il programma è abbastanza completo in quanto prevede un opportuno test per decidere quando terminare limmissione dei dati.
=================
MEDIA.BAS
=================
OPTION EXPLICIT
COMMON Primo, Secondo AS Single
COMMON Media AS SINGLE
COMMON Risposta AS STRING
CLS
PRINT "Programma per il calcolo della media fra due numeri"
PRINT
PRINT
Ancora:
INPUT "Immetti il primo numero ", Primo
INPUT "Immetti il secondo numero ", Secondo
Media = (Primo + Secondo) / 2
PRINT "La media e "; Media
PRINT
INPUT "Vuoi continuare (S/N) ";Risposta
If Risposta ="S" OR Risposta = "s" THEN
PRINT
GOTO Ancora
END IF
PRINT
PRINT "Il programma e terminato"
END
Note : Invece del test
If Risposta="S" or Risposta="s" then si potrebbe utilizzare listruzione2 Tabellina pitagorica
Questo esercizio, sviluppato in Basic tradizionale, stampa sul video la tabellina pitagorica in tre diversi modi, uno migliore dellaltro.
=================
TABEL.BAS
=================
OPTION EXPLICIT
COMMON X AS INTEGER
COMMON Y AS INTEGER
CLS
FOR Y = 1 TO 10
FOR X = 1 TO 1
PRINT X * Y ; versione grezza
PRINT FORMAT$(X * Y, "000");" ";
versione migliore
PRINT RIGHT$(" " + STR$(X * Y), 4);" ";
versione super
NEXT X
PRINT
NEXT Y
END
Note : Delle 3 istruzioni PRINT
inserite
allinterno dei due cicli FOR
NEXT solo una
deve essere attiva (ossia non commentata con il segno di apostrofo) in un medesimo
momento.
Qui di seguito vengono riportati gli output ottenuti con le tre diverse versioni Ciò allo
scopo di studiare meglio leffetto delle istruzioni FORMAT$(),
RIGHT$(), STR$().
Grezza
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
ecc. ecc.
Come si vede leffetto non è particolarmente gradevole (si perdono gli allineamenti
fra le varie colonne).
Migliore
001 002 003 004 005 006 007 ecc.
002 004 006 008 010 012 014
ecc. ecc.
In questo caso gli i allineamenti fra le varie colonne sono perfetti ma disturbano un
po gli zeri iniziali.
Super
1 2 3 4 5 6 7
8 ecc
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24
ecc. ecc.
E evidente che questa è la soluzione da preferire, se si desidera avere un output
perfetto.
3 - Calcolo di pi greco
Questo esercizio, sviluppato in Basic tradizionale, stampa sul video il
valore di pi-greco (3.14159
) calcolato simulando il lancio di freccette in un
cerchio di raggio unitario; il cerchio è inscritto in un quadrato di lato 2.
Il medesimo programma può essere migliorato aggiungendo una parte che visualizza
graficamente sul video questi "lanci" virtuali (vedi esercizio N. 6)
=============
PIGRECO.BAS
=============
OPTION EXPLICIT
COMMON X AS SINGLE
COMMON Y AS SINGLE
COMMON Centri AS SINGLE
COMMON N AS INTEGER
COMMON PiGreco AS DOUBLE
CLS
FOR N = 1 TO 1000
X = RND(1)
Y = RND(1)
C = X * X + Y * Y
IF C <= 1 THEN
Centri = Centri + 1
END IF
PiGreco= (Centri * 4 ) / N
LOCATE 10,1
PRINT "Pi greco = "; PiGreco ; " ";
NEXT N
END
Note : L istruzione LOCATE 10,1
pone il cursore alla riga 10 (delle 25 che sono presenti in un video standard DOS) ed alla
colonna 1 (delle 80 presenti in un video standard).
Listruzione RND(1) restituisce un numero pseudo
casuale minore di 1 e maggiore di 0.
4 Calcolo di e (2.7182 )
Questo esercizio, sviluppato in Basic tradizionale, stampa sul video la base dei logaritmi naturali e. Il metodo usato calcola la somma degli inversi dei fattoriali.
E= 1 + 1 / 1! + 1 / 2! 1 / 3! + 1 / 4!
================
CALC_E_1.BAS
================
OPTION EXPLICIT
COMMON FAT AS DOUBLE fattoriale
COMMON E AS DOUBLE il numero e
COMMON N AS INTEGER contatore
COMMON NumeroIterazioni as LONG
CLS
Fat = 1 valori iniziali
E = 1 valori iniziali
INPUT "Introduci il numero delle iterazioni ", NumeroIterazioni
FOR N = 1 TO NumeroIterazioni
Fat = Fat * N
E = E + 1 / Fat
NEXT N
PRINT "e = "; E
END
Note: La convergenza della serie è molto rapida. Con 100 iterazioni si ottiene
2.71828182845905.
La funzione EXP(N) restituisce "e" elevato a N per cui
EXP(1) vale 2.718282
5 Anagrammi
Questo esercizio, sviluppato in Basic tradizionale, stampa gli
anagrammi di una parola.
'========================
' ANAGRAM.bas
' Data una stringa alfanumerica ne stampa tutti gli anagrammi,
' senza alcun controllo circa la loro logicita (degli anagrammi !)
'========================
OPTION EXPLICIT
COMMON Parola AS STRING ' parola da rivoltare
COMMON i AS INTEGER ' contatore
COMMON d AS INTEGER ' contatore
COMMON Lung AS INTEGER ' lunghezza della stringa
CLS
PRINT "ANAGRAMMA"
LOCATE 5, 1: INPUT "Introduci la parola ", Parola
Parola = "ciao" debug
'--- calcola la lunghezza della stringa, ossia conto il
' numero dei caratteri ("ROMA" e lunga 4 caratteri,
' "MARIO ROSSI" e lungo 11 caratteri: conta anche lo spazio !)
Lung = LEN(Parola)
PRINT
PRINT "Gli anagrammi di "; Parola; " sono : "
PRINT
FOR i = 1 TO Lung
NEXT i
END
Note: Cè una linea del programma con una istruzione di assegnazione
Parola = "ciao"
Essa è commentata, al contrario dellistruzione precedente, ma in fase di debug (ossia di collaudo) era il contrario; ciò serviva a provare il programma più agevolmente, senza dover essere ogni volta costretti ad immettere una parola.
6 - Calcolo di pi greco versione grafica
Questo esercizio, sviluppato in Basic tradizionale, è un miglioramento dellesercizio N. 3; disegna sullo schermo un cerchio con i punti che simulano i lanci delle "freccette".
'======================================================================' PIGRECO.bas Versione GRAFICA'' Calcola pi greco simulando un metodo "sperimentale" di
' lancio di freccette in un quadrato avente lato=2 con inscritta
' una circonferenza di raggio=1. Se la freccia e all'interno del
' circonferenza si conteggia un "centro".
' Il numero dei "centri" all'interno del cerchio e proporzionale
' alla sua area per cui si puo scrivere la proporzione :
' area quadrato : area quarto di cfr = numero tiri : numero centri
' ossia
' (1*1) : (1*1*pi)/4 = Tiri : Centri
' da cui, semplificando
' pi = (Centro * 4) / Tiri
'==============================
OPTION EXPLICIT
COMMON pi AS DOUBLE ' pi greco (3.1315....)
COMMON Tiri AS LONG ' contatore delle iterazioni
COMMON Centro AS LONG ' contatore dei "centri"
COMMON X AS SINGLE ' numero pseudocasuale (coordinata X)
COMMON Y AS SINGLE ' numero pseudocasuale (coordinata Y)
COMMON Raggio AS SINGLE ' risultato
COMMON Risp AS STRING ' risposta
'============================
SCREEN 11
LOCATE 1, 28: PRINT "CALCOLO DI PI GRECO"
LOCATE 28, 1: PRINT "Digita F per terminare"
CIRCLE (320, 240), 100 ' disegno un cerchio di raggio 100 pixel
' al centro dello schermo che ha dimensioni
' x=640 y=480
'---------------- ciclo di iterazioni
DO
X = RND(1)
Y = RND(1)
'--- disegno un punto alle coordinate volute
PSET (X * 100 + 320, Y * 100 + 240)
'
Tiri = Tiri + 1
Raggio = SQR(X * X + Y * Y)
'--- Verifico se il tiro entra nel quarto di cerchio
IF SQR(Raggio) < 1 THEN
Centro = Centro + 1
END IF
pi = (Centro * 4) / Tiri
LOCATE 25, 1:
PRINT "Pi Greco = "; pi; " ";
Risp = UCASE$(INKEY$)
LOOP UNTIL Risp = "F"
7 Equazione di secondo grado
Questo esercizio, sviluppato in Basic tradizionale, applica la nota formula di risoluzione dellequazione di secondo grado, prendendo anche in esame il caso di soluzioni immaginarie.
'=============================================
' SECONDO.bas
'
' Risoluzione equazioni di secondo grado
' a^2 + bx + c = 0
'=============================================
COMMON a, b, c AS SINGLE ' coefficienti
COMMON Delta AS SINGLE ' sotto radice
COMMON d AS SINGLE ' risultato di Delta
COMMON Reale AS SINGLE ' parte reale della soluzione
COMMON aa AS SINGLE ' risultato intermedio
COMMON X1, X2 AS SINGLE ' le due soluzioni
COMMON Risp AS STRING ' risposta standard
'------------ inizio programma
CLS
PRINT "RISOLUZIONE EQUIAZIONI DI SECONDO GRADO"
PRINT : PRINT "(Digita F per terminare)" : PRINT : PRINT
'----------- introduzione dei dati
CoeffInX2:
INPUT "Introduci il coefficiente di X^2 ", Risp
IF Risp = "F" OR Risp = "f" THEN END
IF Risp = "" THEN GOTO CoeffInX2
a = VAL(Risp)
IF a = 0 THEN
PRINT "'a' deve essere diverso da zero."
GOTO CoeffInX2
END IF
CoeffInX:
INPUT "Introduci il coefficiente di X ", Risp
IF Risp = "F" OR Risp = "f" THEN END
IF Risp = "" THEN GOTO CoeffInX
b = VAL(Risp)
TermineNoto:
INPUT "Introduci il termine noto ", Risp
IF Risp = "F" OR Risp = "f" THEN END
IF Risp = "" THEN GOTO TermineNoto
c = VAL(Risp)
'-------------- Da qui in poi effettuo i calcoli e stampo i risultati
Delta = b ^ 2 - 4 * a * c ' sotto radice
aa = 2 * a ' denominatore
' PRINT "Errore di arrotondamento "; Delta - ABS(Delta)
IF ABS(Delta) <= .00001 THEN
X1 = -b / 2 * a
PRINT "Due soluzioni eguali : "; X1
ELSE
IF Delta < 0 THEN
d = SQR(-Delta)
Reale = -b / aa
X1 = -d / aa
X2 = -X1
PRINT "Due soluzioni complesse coniugate"
PRINT "Prima soluzione : parte reale "; Reale, " parte immag. "; X1
PRINT "Seconda soluzione : parte reale "; Reale, " parte immag. "; X2
ELSE
'--- situazione standard
d = SQR(Delta)
X1 = (-b - d) / aa
X2 = (-b + d) / aa
PRINT "Due soluzioni reali"
PRINT "Prima soluzione : "; X1
PRINT "Seconda soluzione : "; X2
END IF
END IF
PRINT : PRINT
GOTO CoeffInX2
8 Contrario
Questo esercizio, sviluppato in Basic tradizionale, rivolta una stringa alfanumerica.
===========================================
CONTRARIO.BAS
Data una stringa alfanumerica ne stampa
il suo esatto contrario.
Esempio ROMA -à AMOR
============================================
OPTION EXPLICIT
COMMON Parola AS STRING parola da rivoltare
COMMON i AS INTEGER contatore
COMMON Lung AS INTEGER lunghezza della stringa
CLS
PRINT "CONTRARIO"
LOCATE 5,1 : INPUT "Introduci la parola ", Parola
--- Calcola la lunghezza della stringa, ossia il numero dei caratteri
"ROMA" è lunga 4 caratteri mentre "MARIO ROSSI" è lunga 11 caratteri
dato che conta anche lo spazio.
Lung = LEN(Parola)
PRINT "La parola " ; Parola ; " rivoltata e ";
FOR i = Lung TO 1 STEP 1
PRINT MID$(Parola, i, 1);
NEXT i
Nota: Il programma non prevede che lutente possa "elaborare" più parole dato che termina subito. Non è comunque difficile studiare un meccanismo per cui, una volta lanciato il programma, lutente possa "rivoltare" una serie di parole
.
1 - Media fra N numeri
Questo esercizio, sviluppato in VBDOS, consente di calcolare la media fra N numeri immessi dallutilizzatore. Il programma è strutturato in modo che sia abbastanza semplice modificarlo ed aggiungere altre caselle di testo per effettuare la media fra più numeri. Di questo esercizio, come pure dei successivi, viene fornito anche lo schema del form.
| MEDIA FRA N NUMERI |v||^|+
| +---------+ |
| Lb [Tx ] | ESCI | |
| +---------+ |
| Lb [Tx ] +---------+ |
| | CALCOLA | |
| Lb [Tx ] +---------+ |
| +---------+ |
| Lb [Tx ] | NUOVO | |
| +---------+ |
| |
| Valore minimo LbMinimo |
| |
| Valore medio LbMedio |
| |
| Valore massimo LbMassimo |
+--------------------------------------------+
Sono necessari:
'===========================================================================' MEDIA.FRM' Calcolo del valore minimo, medio e massimo di una piccola serie di numeri'============================================================================' Il programma è strutturato in modo che sia abbastanza semplice aggiungere altri numeri.
' Le uniche modifiche da fare sono :
' 1) modificare la costante MaxNumeri, la quale è visibile all'intero progetto
' 2) aggiungere manualmente una etichetta ed una casella di testo al form
con la funzione copia e incolla)
OPTION EXPLICIT
CONST MaxNumeri = 4
COMMON SHARED Indice AS INTEGER
'--- Le seguenti costanti sono utilizzate per definire
' l'allineamento (in pratica solo 'Destra' e utilizzata)
' in modo più chiaro ed evidente.
CONST Sinistra = 0
CONST Destra = 1
CONST Centro = 2
SUB BotCalcola_Click ()
'--- Effettuo il calcolo dei tre risultati. I calcoli
' vengono effettuati tutti in questa Sub
DIM NumeriValidi AS INTEGER ' numeri dei numeri validi introdotti
DIM i AS INTEGER
DIM Somma AS DOUBLE
DIM Minimo AS DOUBLE ' risultati
DIM Medio AS DOUBLE
DIM Massimo AS DOUBLE
'--- Calcolo quanti numeri validi ho introdotto
NumeriValidi = 0 ' istruzione inutile, immessa solo per chiarezza
FOR i = 0 TO MaxNumeri - 1
IF Tx(i).text <> "" THEN
NumeriValidi = NumeriValidi + 1
END IF
NEXT i
'--- Se non ho introdotto neanche un numero non ha senso
' effettuare i calcoli. Oltretutto rischio un errore
' di divisione per 0 qualche linea pi sotto.
IF NumeriValidi = 0 THEN
Tx(0).SETFOCUS
EXIT SUB
END IF
'--- Calcolo la somma dei numeri, per poter calcolare la media
Somma = 0 ' istruzione inutile, immessa solo per chiarezza
FOR i = 0 TO MaxNumeri - 1
Somma = Somma + VAL(Tx(i).text)
NEXT i
Medio = Somma / NumeriValidi
LbMedio.caption = STR$(Medio) ' stampo il risultato
'--- Calcolo il minimo e il massimo
Minimo = VAL(Tx(0).text)
Massimo = VAL(Tx(0).text)
FOR i = 1 TO MaxNumeri
IF VAL(Tx(i).text) > Massimo THEN Massimo = VAL(Tx(i).text)
IF VAL(Tx(i).text) < Minimo THEN Minimo = VAL(Tx(i).text)
NEXT i
LbMinimo.caption = STR$(Minimo) ' stampo il risultato
LbMassimo.caption = STR$(Massimo) ' stampo il risultato
'--- Rimetto il focus alla prima casella di testo
Tx(0).SETFOCUS
END SUB
SUB BotEsci_Click ()
'--- Termino il programma rivolgendo una domanda
DIM X AS INTEGER
X = MSGBOX("Vuoi veramente terminare", 4, "FINE")
IF X = 6 THEN END
END SUB
SUB BotNuovo_Click ()
'--- Azzero tutto, pronto ad un nuovo calcolo
DIM i AS INTEGER
'
LbMinimo.caption = ""
LbMedio.caption = ""
LbMassimo.caption = ""
FOR i = 0 TO MaxNumeri - 1
Tx(i).text = ""
NEXT i
'--- Rimetto il focus alla prima casella di testo
Tx(0).SETFOCUS
END SUB
SUB Form_Load ()
DIM i AS INTEGER
'--- Imposto una efficace e chiara caption ed azzero il contenuto delle
' caselle di testo
FOR i = 0 TO MaxNumeri - 1
Lb(i).caption = "Numero" + STR$(i + 1)
Tx(i).text = ""
NEXT i
'--- Svuoto il contenuto delle etichette destinate
' a contenere i 3 risultati
LbMinimo.caption = ""
LbMedio.caption = ""
LbMassimo.caption = ""
'--- Imposto l'allineamento a destra delle etichette
' destinate a contenere i 3 risultati
LbMinimo.alignment = destra
LbMedio.alignment = destra
LbMassimo.alignment = destra
'--- La variabile indice indica quale casella di testo
' ha il focus. Il suo valore varia fra 0 e MaxNumeri.
Indice = 0
END SUB
SUB Form_Paint ()
'--- Quando il form e disegnato il focus va sulla prima
' casella di testo, pronta ad accettare l'input dell'utente
Tx(0).SETFOCUS
END SUB
SUB Tx_KeyPress (Index AS INTEGER, Keyascii AS INTEGER)
'--- In questa sub faccio due cose
'--- Sposto il focus fra una casella di testo e l'altra
IF Keyascii = 13 THEN
IF Indice < MaxNumeri 1 THEN
Indice = Indice + 1 ' mi sposto alla casella con
' indice successivo
ELSE
Indice = 0 ' mi sposto alla prima casella di testo
END IF
Tx(Indice).SETFOCUS
Keyascii = 0 ' zittisco l'altoparlante
EXIT SUB
END IF
'--- Faccio in modo che solo i tasti numerici siano
' considerati validi. ossia solo quelli con codice
' Ascii tra 48 (lo "zero") e il 58 (il "nove) compresi
' Devo escludere da questo esame il tasto "ritorno
' unitario" che consente le correzioni alla digitazione.
IF (Keyascii < 48 OR Keyascii > 58) AND Keyascii <> 8 THEN
Keyascii = 0
BEEP ' emetto un suono in sovrappiu
END IF
END SUB
2 Data di nascita
Questo esercizio, sviluppato in VBDOS, consente di effettuare alcuni calcoli relativi a (ipotetiche) date di nascita. Anche di questo esercizio viene fornito lo schema grafico.
| NASCITA |v||^|+
| +---------+ |
| Questo programma calcola in che giorno | ESCI | |
| della settimana sei nato e quanti giorni +---------+ |
| hai vissuto +---------+ |
| | CALCOLA | |
| Giorno [Tx ] +-Sesso---------+ +---------+ |
| | | | NUOVO | |
| Mese [Tx ] | (*) femminile | +---------+ |
| | ( ) maschile | |
| Anno [Tx ] +---------------+ |
| |
| Sei nato di LbGiorno |
| e sei vissuto LbTotali ||
+-----------------------------------------------------------+
Sono necessari:
'===============' NASCITA.FRM
'===============
OPTION EXPLICIT
SUB BotCalcola_Click ()
DIM D AS LONG
D = DATESERIAL(VAL(Tx(2).Text), VAL(Tx(1).Text), VAL(Tx(0).Text))
LbGiorno.caption = FORMAT$(WEEKDAY(D))
SELECT CASE WEEKDAY(D)
CASE 7: LbGiorno.caption = "SABATO"
CASE 1: LbGiorno.caption = "DOMENICA"
CASE 2: LbGiorno.caption = "LUNEDI'"
CASE 3: LbGiorno.caption = "MARTEDI'"
CASE 4: LbGiorno.caption = "MERCOLEDI'"
CASE 5: LbGiorno.caption = "GIOVEDI"
CASE 6: LbGiorno.caption = "VENERDI'"
END SELECT
'--- Calcolo giorni di nascita
IF OptSesso(0).value = 0 THEN
LbTotali.caption = FORMAT$(INT(NOW) - D) + " giorni."
ELSE
LbTotali.caption = "... NON COMPUTABILE"
MSGBOX "Non e gentile chiedere l'età ad una signora !", 0, "MALEDUCATO !"
END IF
END SUB
SUB BotEsci_Click ()
END
END SUB
SUB BotNuovo_Click ()
DIM I AS INTEGER
FOR I = 0 TO 2
Tx(I).Text = ""
NEXT I
LbGiorno.caption = ""
LbTotali.caption = ""
END SUB
SUB Form_Load ()
DIM I AS INTEGER
FOR I = 0 TO 2
Tx(I).Text = ""
NEXT I
LbGiorno.caption = ""
LbTotali.caption = ""
'--- debug
Tx(0).Text = "19": Tx(1).Text = "5": Tx(2).Text = "1998"
END SUB
Note: Il programma sfrutta le funzionii
WEEKDAY(D)
trasforma un numero seriale di data e ora in un numero corrispondente al giorno della settimana; per numero seriale si intende un codice di data e ora usato da VBDOS per rappresentare i valori della data e dellora. Lintervallo valido parte dal gennaio del 1973 e termina con il dicembre del 2078. Dopo tale data il VBDOS è da buttareNOW(D)
restituisce un numero seriale corrispondente alla data ed ora correnti del sistema.
3 Roulette
Questo esercizio, sviluppato in VBDOS, simula in modo piuttosto efficace il gioco della roulette.
'================' ROULETTE.FRM'================DECLARE SUB AzzeraTutto ()CONST MaxNumeri = 12 ' debug, poi sara' 36'--- I valori delle 3 costanti seguenti debbono susseguirsi nello
' stesso ordine con cui e stata definita la matrice di controlli
' OptColore()
CONST Rosso = 0
CONST Nero = 1
CONST Verde = 2
CONST FattoreZero = 3 ' Quanto si incrementa la vincita se
' esce il numero zero ?
CONST FattoreColore = 2 ' Se si azzecca il colore si vince 2
' volte la posta
'--- Queste sono le costanti che definiscono il colore
CONST ColoreBianco = 7
CONST ColoreRosso = 4
CONST ColoreVerde = 2
SUB AzzeraTutto ()
'--- Azzero alcune caption e Text
LbNumero.caption = ""
LbColore.caption = ""
LbVincita.caption = ""
LbAttuale.caption = ""
Tx(0).text = "" : Tx(1).text = "" : Tx(2).text = ""
END SUB
SUB BotEsci_Click ()
END ' debug
DIM X AS INTEGER
X = MSGBOX("Vuoi veramente terminare ?", 4, "FINE PROGRAMMA")
IF X = 6 THEN END
END SUB
SUB BotLancia_Click ()
DIM Nuemro AS INTEGER
Numero = INT((MaxNumeri + 1) * RND)
LbNumero.caption = FORMAT$(Numero)
'--- Verifico il colore del numero
IF Numero \ 2 = Numero / 2 THEN
'--- pari
IF Numero = 0 THEN
LbColore.caption = "Verde"
LbColore.forecolor = ColoreVerde
Colore = Verde
ELSE
LbColore.caption = "Rosso"
LbColore.forecolor = ColoreRosso
Colore = Rosso
END IF
ELSE
LbColore.caption = "Nero"
LbColore.forecolor = ColoreNero
Colore = Nero
END IF
'--- Azzero alcune variabili (alcune di queste istruzioni sono inutili
' ma sono qui solo per chiarezza)
VincitaTotale = 0
VincitaNumero = 0
VincitaColore = 0
'--- Verifico se ho vinto riguardo il numero
Puntata = VAL(Tx(2).text)
NumeroProposto = VAL(Tx(1).text)
IF NumeroProposto = Numero THEN
IF Numero = 0 THEN
VincitaNumero = MaxNumeri * Puntata * FattoreZero
ELSE
VincitaNumero = MaxNumeri * Puntata
END IF
END IF
'--- Verifico se ho vinto riguardo il colore. In caso affermativo
' sommo la precedente (eventuale) vincita
'--- Dapprima individuo qual'e' il colore che io ho proposto
FOR i = 0 TO 2
IF OptColore(i).value = -1 THEN
ColoreProposto = i
EXIT FOR
END IF
NEXT i
'--- Verifico se ho vinto riguardo al colore
IF ColoreProposto = Colore THEN
VincitaColore = Puntata * FattoreColore
END IF
'--- Sommo le vincite e faccio le opportune considerazioni
' circa il capitale posseduto
VincitaTotale = VincitaNumero + VincitaColore
IF VincitaTotale > 0 THEN
Montepremi = VAL(Tx(0).text) + VincitaTotale
ELSE
Montepremi = VAL(Tx(0).text) - Puntata
END IF
'--- Finalmente stampo il risultato
LbVincita.caption = FORMAT$(VincitaTotale)
LbAttuale.caption = FORMAT$(Montepremi)
END SUB
SUB BotNuovo_Click ()
AzzeraTutto
Tx(0).SETFOCUS
END SUB
SUB Form_Load ()
LbColore.forecolor = ColoreBianco
'--- Centro il form sullo schermo
Left = (Screen.width - width) \ 2
Top = (Screnn.height - Height) \ 2
AzzeraTutto
'--- Le istruzioni seguenti sono qui solo per debug
OptColore(2).value = 1
Tx(0).text = "1000"
Tx(1).text = "3"
Tx(2).text = "100"
END SUB
Nota: viene utilizzata listruzione RND() la quale restituisce un numero casuale minore di 1 e maggiore di 0. Per avere un numero compreso fra 0 e 36 (il gioco delle roulette prevedere questo intervallo) ci si può ispirare alla seguente funzione che restituisce un numero casuale intero compreso fra LimiteInteferiore e LimiteSuperiore
N = INT ((limitesuperiore - limiteinferiore + 1)*RND + limiteinferiore)
Uso dei file di dati con il Visual Basic per DOS
Il Visual Basic per Dos, come del resto tutti gli altri dialetti Basic, offre tre modi primari di accesso ai file; il Visual Basic Professional per DOS ed il Visual Basic per Windows offrono alcuni ulteriori modi per registrare informazioni su file, molto più efficienti (ISAM il primo e DAO il secondo)
Accesso Tipo di file Istruzioni relative
Sequenziale Esclusivamente file di testo OPEN, LINE INPUT #, PRINT #, INPUT$,
CLOSE
Inoltre
INPUT #, WRITE #
Casuale o random Record a lunghezza fissa OPEN, PUT, LEN, GET, CLOSE
TYPE END TYPE
Binario Altri tipi di file OPEN, CLOSE, SEEK, INPUT$
Esempi delle istruzioni sopra citate (tipo sequenziale)
OPEN "NomFile.TXT" FOR INPUT AS #1 Apre il file NomFile.TXT e lo predispone alla lettura sul
canale 1.
NomFile.Txt può essere un nome qualsiasi (con eventualmente il percorso) purché rispetti le convenzioni dellambiente MS-DOS.
L1 rappresenta il numero del canale (può variare da 1 a 255); possono esserci, contemporareamente, più canali aperti.
OPEN "NomFile.TXT" FOR OUTPUT AS #1 Apre il file NomFile.TXT e lo predispone alla scrittura sul
canale 1
LINE INPUT #1, A$ Leggi i dati da un file sequenziale dianzi aperto e li
assegna alla variabile stringa A$; legge fino al simbolo di
ritorno a capo, a differenza dellistruzione INPUT #1, A$
che legge fino alla prima virgola o al primo spazio.
PRINT #1, A$ Scrive la variabile A$ su un file sequenziale; listruzione
WRITE #1, A$, B$ viceversa scrive le 2 variabili
racchiudendole fra virgolette e inserendo una virgola fra
variabile e variabile.
CLOSE #1 Chiude il canale numero 1 al flusso dei dati in ingresso o
in uscita. Prima di aprire un canale in modo lettura (o
scrittura) bisogna chiuderlo se esso è già stato
precedentemente aperto in modo scrittura (o lettura).
Altre istruzioni relative allinterazione con i file :
EOF La funzione EOF(NumeroFile) resituisce un valore
diverso da zero (ossia "Vero") alla fine di una file.
EOF significa End Of File.
LOF La funzione LOF(NumeroFile) restitituisce le dimensioni
(in byte) di un file aperto. Se restituisce zero significa
che si è allinizio del file.
LOF significa Lenght Of File