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, quest’ultima, 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 dall’uno all’altro ambiente non dovrebbe causare eccessivi traumi.   Il programmatore VBDOS non dovrebbe quindi sentirsi sminuito nell’imparare 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 nell’affrontare questo nuovo ambiente, ho voluto iniziarlo (questo documento) con un piccolo glossario di termini.
Cuneo, gennaio 1999

Glossario

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 dall’utente o dal sistema.
Controllo Oggetto dell’interfaccia utente, quale un pulsante di comando o una casella di testo, inserito in form. Possiede una serie di proprietà e risponde a certi eventi.
Evento Azione riconosciuta da un form o da un controllo per il quale è possibile scrivere un codice di risposta. Questo codice, scritto per rispondere ad un particolare evento di un certo controllo, viene collegato al controllo stesso e risiede in un procedura di evento. Gli eventi possono verificarsi come risultato di una azione dell’utente (clic con il pulsante del mouse sul controllo, ad esempio, oppure la pressione di un tasto sulla tastiera) oppure essere provocati dal sistema (eventi legati al timer del calcolatore). Ad ogni oggetto di VBDOS è associato un gruppo di eventi predefinito; quando uno di tali eventi si verifica, l’oggetto lo riconosce automaticamente, e reagisce di conseguenza.
Form Una finestra in cui vengono inseriti i controlli. I form costituiscono la base per la costruzione dell’interfaccia delle applicazioni.
Metodo Parola chiave, simile ad una funzione o ad una istruzione, che agisce su un form, un controllo od un oggetto speciale (gli oggetti speciali sono la CLIPBOARD, la PRINTER e lo SCREEN).
Modulo di codice Raccolta di procedure memorizzate in un singolo file e non collegate ad un form. Le procedure di un modulo di codice sono visibili a tutta l’applicazione, ossia vengono riconosciute in tutta l’applicazione.
Modulo di form Il file che contiene la rappresentazione di un form e il codice collegato al form.
Oggetto. Termine collettivo con cui si indicano i form, i controlli e gli oggetti speciali (CLIPBOARD, PRINTER, SCREEN).
Procedura Blocco di codice che può essere chiamato come istruzione singola. VBDOS supporta 2 tipi di procedure: la procedura FUNTION che restituiscono un valore, e le procedure SUB che non restituiscono un valore.
Procedura di evento Procedura chiamata da VBDOS per rispondere ad un evento specifico, che può essere provocato dall’utente o attivato dal sistema.
Procedure generali Sono le procedure non direttamente collegate ad un evento. In un modulo di form le procedure generali sono locali, ossia hanno un’area di validità (visibilità) limitata al modulo in cui si trovano. Le procedure generali di un modulo di codice possono essere invece chiamata da tutti i moduli dell’applicazione.
Proprietà Attributo di un form o di un controllo; definisce le caratteristiche di un oggetto, quali le dimensioni, la posizione, il colore, ecc. o un aspetto del suo comportamento (l’esser visibile o invisibile).

Creazione di una applicazione

Per applicazione si intende l’insieme 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, l’ambiente specializzato per la creazione degli elementi visivi delle applicazioni. Il Form Designer è un’utilità separata che serve a costruire l’interfaccia 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 dell’interfaccia utente dell’applicazione. E’ buona norma attribuire fin d’ora 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 l’aspetto 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 dall’utente 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 l’applicazione
Dal menu Esegui scegliere Avvia o premere Maiusc+F5. L’esecuzione consente l’analisi 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.

I controlli in VBDOS

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.

ELENCO DEI CONTROLLI

Check box Casella di controllo Controllo
Attiva o disattiva la selezione di una opzione
Visualizza un’opzione che l’utente può attivare o disattivare, e indicare come vera o falsa, mediante la selezione e l’annullamento della selezione. La lettera X che appare nella casella di controllo, fra due parentesi quadre, indica che l’opzione è 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 dell’esecuzione 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 l’elenco delle unità disco disponibili (A:, B:, C:, ecc.)

File List Elenco file File
Consente la selezione dei file
Visualizza l’elenco dei file di una directory (conosciuta sotto Windows 95 come "cartella") specificata al momento dell’esecuzione 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 (dall’alto 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 l’utente 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
L’utente 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 quell’opzione è Vera.

Picture Box Casella di immagine Immagine
Visualizza dei caratteri ASCII nel form
Visualizza del testo o l’output 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 all’utente 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 l’intervallo di tempo stabilito dal timer stesso è trascorso. La frequenza dell’intervallo è 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, l’elenco dei comandi disponibili per il titolo di menu scelto. Mediante il mouse (principalmente) ma anche mediante la tastiera e le frecce direzionali l’utente può selezionare una opzione.

LE PROPRIETA’

Le proprietà definiscono l’aspetto 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 l’allineamento del testo (destra, sinistra, centrato)
Archive Seleziona i file con l’attributo 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 all’interno 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 l’unità 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 l’altezza 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 l’altro
Hidden Seleziona i file con l’attributo 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 l’accesso agli elementi di una casella combinata o di riepilogo
ListCount Restituisce il numero degli elementi di una casella combinata o di riepilogo
ListIndex Restituisce l’indice dell’elemento 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à l’unità
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 l’altezza interna di un form o di un controllo
ScaleWidth Restitusice la larghezza interna di un form o di un controllo
ScrollBar Definisce l’aspetto 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 nell’ordine TAB
TabStop Determina se l’uso 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

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 dell’unità
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

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 EventualiArgomenti

Osservazioni: 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.

Elenco dei metodi

(in grassetto i più importanti ed utilizzati)

AddItem Aggiunge un elemento a una casella combinata o di riepilogo
Clear Cancella il contenuto dell’oggetto 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 dell’oggetto 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 un’immagine 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 nell’oggetto CLIPBOARD
TextHeight Restituisce l’altezza 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 l’oggetto CLIPBOARD CLEAR, GETTEXT, SETTEXT
Data/ora Ottenere la data o l’ora corrente DATE$, NOW, TIME$
  Impostare la data o l’ora 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 PRINT
  Cancellare il contenuto un oggetto, dello schermo, di un quadrante CLS
Intercettazione delgli errori Intercettare gli errori durante l’esecuzione 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 l’aspetto dell’output 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 l’input 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 un’espressione SGN
  Generare numeri casuali RND, RANDOMIZE
Stampa Controllare la stampante ENDDOC, NEWPAGE
  Controllare l’aspetto dell’output 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 dall’utente 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 dell’ambiente 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 l’istruzione OPTION EXPLICIT ; vi costringerà ad analizzare preventivamente il programma che vi accingere a scrivere e a non procedere per tentativi.

Inserite sempre, specie all’inizio 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
L’istruzione 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

Qual’è il codice migliore ?

Riutilizzate sempre il codice, se possibile: reinventare l’acqua calda non è attività particolarmente gratificante.

Qui di seguito trovate spezzoni di codice utili in ogni occasione.

SPEZZONI DI CODICE

Come accettare solo alcuni tasti.
Il codice indicato deve essere inserito all’occorrere dell’evento KeyPress di una casella di testo. I codici Ascii dei tasti numerici, e di altri tasti, sono i seguenti :

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

Il numero 8 rappresenta il codice del tasto grande con freccia a sinistra destinato alle correzioni (tasto ritorno unitario)

SUB Tx_KeyPress (KeyAscii as INTEGER)
    IF (KeyAscii < 48 OR KeyAscii > 57) AND KeyAscii <> 8 then
    KeyAscii = 0
    BEEP
    END ID
END SUB

Come spostare il focus tra una casella di testo e l’altra
Si suppone di aver realizzato una matrice di controlli (caselle di testo); in caso contrario questa operazione sarebbe pressochè impossibile. Questo codice deve essere inserite all’occorrere dell’evento KeyPress di una casella di testo.
Il codice Ascii del tasto di INVIO è appunto 13.
Indice è una varibile definita a livello di form o di modulo.
MaxInk è una variabile (od una costante) anch’essa definita a livello di form o di modulo

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: l’operatore / è diverso dall’operatore \.
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

ESERCIZI

Nelle due sezioni successive vengono illustrati alcuni esercizi. Quelli della prima sezione sono sviluppati in Basic tradizionale (senza sfruttare cioè l’interfaccia 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.

Esercizi in BASIC

1 - Media fra due numeri

Questo esercizio, sviluppato in Basic tradizionale, consente di calcolare la media fra due numeri immessi dall’utilizzatore. Il programma è abbastanza completo in quanto prevede un opportuno test per decidere quando terminare l’immissione 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 l’istruzione
Risposta = UCASE$(Risposta) che trasforma in maiuscolo l’eventuale "s" immesso dall’utilizzatore.
Il test diventa quindi più semplice e precisamente :
If Risposta = "S" then

2 – Tabellina pitagorica

Questo esercizio, sviluppato in Basic tradizionale, stampa sul video la tabellina pitagorica in tre diversi modi, uno migliore dell’altro.

‘=================
‘ 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 all’interno 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 l’effetto 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 l’effetto 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).
L’istruzione 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
  FOR d = i TO Lung
    PRINT MID$(Parola, i, 1);
  NEXT d

  PRINT

NEXT i

END

Note: C’è una linea del programma con una istruzione di assegnazione

Parola = "ciao"

Essa è commentata, al contrario dell’istruzione 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 dell’esercizio 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 dell’equazione 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

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 l’utente possa "elaborare" più parole dato che termina subito. Non è comunque difficile studiare un meccanismo per cui, una volta lanciato il programma, l’utente possa "rivoltare" una serie di parole.

 

 

 

Esercizi in VBDOS

1 - Media fra N numeri

Questo esercizio, sviluppato in VBDOS, consente di calcolare la media fra N numeri immessi dall’utilizzatore. 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 dell’ora. L’intervallo valido parte dal gennaio del 1973 e termina con il dicembre del 2078. Dopo tale data il VBDOS è da buttare

NOW(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 l’istruzione 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 dell’ambiente MS-DOS.

L’1 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 dell’istruzione INPUT #1, A$

che legge fino alla prima virgola o al primo spazio.

PRINT #1, A$ Scrive la variabile A$ su un file sequenziale; l’istruzione

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 all’interazione 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 è all’inizio del file.

LOF significa Lenght Of File