Esempi

Senza.VBP

Costruzione di un’applicazione priva di finestre.

 

File/Rimuovi File e Inserisci/Modulo, inserire il codice in Oggetto (generale) e Routine Main.

 

Sub Main ()

Beep

End Sub

La routine Main () è eseguita senza che sia necessaria la presenza di un form. Utile per applicazioni che comunicano con altre applicazioni, inoltre con Load e Show si possono visualizzare finestre in applicazioni che in origine non ne posseggono.

 


 

Calc.vbp

Inserire nel form tre TextBox: primo addendo, secondo addendo e somma.

Oggetto Proprietà Impostazione

Form1 Caption Calcolatrice

Label1 Caption +

BorderStyle 1

Command1 Caption =

Doppio clic su CommandButton, inserire il codice

 

Private Sub Command1_Click ()

Dim op1 As Single

Dim op2 As Single

op1 = Val(Text1.Text)

op2 = Val(Text2.Text)

Text3.Text = Format$(op1 + op2, "###,###,###")

End Sub

L’utente può passare da una casella di testo all’altra con TAB o con il mouse. Quando un controllo contiene il punto di inserimento si dice che possiede il focus. La casella di somma non deve ricevere il focus per questo TabStop = False (rimozione dell’ordine di tabulazione), si usa la proprietà TabIndex per l’impostazione dell’ordine di tabulazione.

L’evento GotFocus si verifica quando l’evidenziazione è spostata su un oggetto.

L’evento LostFocus si verifica quando l’evidenziazione è rimossa dall’oggetto.

L’utente non usa <CR>, allora il pulsante "uguale" diventa quello di default ed è indicato con bordo nero spesso, per attivarlo Default = True.

Formattazione dell’output

 

Format$ (1234.56,"###.#") ‘= 1234.5

Format$ (1234.56,"00000.000") ‘= 01234.560

Format$ (1234.56,"###,###.0") ‘= 1,234.56

Format$ (1234.56,"$#,000.00") ‘= $1,234.56

Format$ (Now,"hh:mm:ss) ‘= "20.18.23"

Format$ (Now,"dd/mm/yy") ‘= "27/01/94"

Format$ (Now,"dddd, dd - mmmm - yyyy") ‘= "mercoledì, 27 - gennaio - 1994"

 


 

EDITOR.VBP

Utilizziamo delle nuove proprietà della TextBox, il testo può essere lungo al massimo 64K con più righe ed a capo automatico.

Oggetto Proprietà Impostazione

Form1 Caption Editor

Text1 Name PadText

Multiline True

ScrollBars 2 - Vertical

Label1 Caption +

BorderStyle 1

CommandButton Name ClearButton

Caption &Cancella Tutto (la & sta per ALT+C)

CommandButton Name CutButton

Caption &Taglia (la & sta per ALT+T)

CommandButton Name PasteButton

Caption &Incolla (la & sta per ALT+I)

Quando si cancella la finestra di editor il focus è mantenuto sul pulsante, per ritornare all’editor clic o TAB: è poco professionale, Il codice deve essere:

 

Private Sub ClearButton_Click ()

PadText.Text = ""

PadText.SetFocus ‘ritorna il focus all’editor

End Sub

Prima di tagliare, il testo deve essere salvato negli appunti, il codice deve essere:

 

Private Sub CutButton_Click()

Clipboard.Clear

Clipboard.SetText PadText.SelText ‘stringa con i caratteri tagliati

PadText.SelText = ""

PasteButton.Enabled = True

PadText.SetFocus

End Sub

Private Sub PasteButton_Click()

PadText.SelText = Clipboard.GetText

PadText.SetFocus

End Sub

Il pulsante Incolla quando, si entra in editor, deve essere disabilitato (grigio) per le modalità Windows, allora bisogna settare la proprietà Enable = False e nel codice di Taglia l’istruzione: PasteButton.Enabled = True. Vale, all’inizio la stessa regola, per Taglia e Cancella Tutto, per questo in PadText si può sfruttare l’evento Change che è attivato quando si modifica la casella di testo. Enabled deve essere impostato per tutti e tre i pulsanti. Il codice nella casella di testo deve essere:

 

Private Sub PadText_Change ()

CutButton.Enabled = True

ClearButton.Enabled = True

End Sub

 


 

Clipboard (Appunti)

Strumento che consente di trasferire dati tra le varie applicazioni, i metodi sono:

Clear Cancella gli Appunti

GetText Preleva il testo negli Appunti

GetData Preleva l’immagine negli Appunti

SetData Incolla l’immagine negli Appunti

GetFormat Preleva il formato (testo o immagine) negli Appunti

SetText Incolla il testo negli Appunti

 


 

Editor1.VBP

Progettare i menu a tendina per i form nell'Editor di menu. È possibile visualizzare questa finestra scegliendo Strumenti/Editor di menu...CTRL+E oppure facendo clic sul pulsante Editor di menu sulla barra degli strumenti. I menu sono costituiti da un titolo del menu, voci di menu e barre di separazione. Il menu è un controllo, come una casella di testo o un pulsante di comando. In modo analogo agli altri controlli, il menu dispone di un insieme predefinito di proprietà ed eventi. Per definire le modalità di risposta di ciascun comando di menu ad un evento Click, scrivere una routine di eventi per ciascun comando. Per esempio, su File/Esci il codice deve essere:

 

Private Sub ExitItem_Click()

End

End Sub

Per la creazione di menu, attenersi alle seguenti indicazioni standard.

Raggruppare i comandi correlati in un menu in modo logico per gli utenti dell'applicazione. Gli utenti che hanno familiarità con Windows, ad esempio, si aspettano che i comandi Nuovo, Apri e Chiudi siano contenuti nel menu File. Per un esempio, fare riferimento alle applicazioni per Windows disponibili.

Nei menu contenenti molti comandi, separare i gruppi di comandi correlati con una barra di separazione. Le barre di separazione sono create utilizzando un singolo trattino (-) nella casella "Caption" dell'Editor di menu.

Caption Name Shortcut

&File FileMenu

&Apri LoadItem

Sa&lva con nome SaveItem

- Separator

&Esci ExitItem

&Modifica ModificaMenu

Tag&lia CutItem CTRL+X

I&ncolla PasteItem CTRL+V

&Cancella tutto ClearItem CTRL+C

Adesso bisogna trasferire il codice dai pulsanti ai menu, doppio clic sul pulsante Taglia, sostituire CutButton_Click() con CutItem_Click() e selezionare nella finestra di codice l’oggetto CutItem; stesso procedimento per gli altri due. I menu non essendo oggetti come i pulsanti, il focus appartiene sempre alla Textbox, quindi SetFocus si può cancellare in tutti e tre i casi. I tre pulsanti sono inattivi all’avvio dell’editor, quindi pure le voci del menu Modifica, si usa la proprietà Enabled, basta modificare in PadText_Change():

CutButton.Enabled con CutItem.Enabled

ClearButton.Enabled con ClearItem.Enabled ed in CutItem_Click()

PasteButton.Enabled con PasteItem.Enabled.

Adesso bisogna rimuovere i pulsanti e rendere inattive (grigie) le voci del menu Modifica. Selezionare Strumenti/Editor di menu...CTRL+E togliere il segno di spunta di Enabled in tutti e tre i casi. Selezione dei font da menu, in una Textbox si può usare solo un tipo di font per volta; aggiungere il menu:

Caption Name Index

F&ont FontMenu

Courier FFF 0

Termianl FFF 7

per i font non conviene avere un nome diverso, ma una Matrice di controlli (è costituita da un gruppo di controlli dello stesso tipo, con lo stesso nome e le stesse routine di eventi, al massimo 32767; vantaggi: minore numero di risorse e stesso codice per più controlli); a Caption diversi (Helv, Courier, Symbol) corrisponde lo stesso Name = FFF. Visual BASIC non assegna, come nei pulsanti, Index in modo automatico ma bisogna usare la casella Index mettendo i valori da zero a sette.

Clic su una voce qualsiasi per il codice:

 

Private Sub FFF_Click(Index As Integer)

Dim i As Integer

Select Case Index

Case 0

PadText.FontName = "Courier"

Case 1

PadText.FontName = "Helv"

Case 2

PadText.FontName = "Roman"

Case 3

PadText.FontName = "Modern"

Case 4

PadText.FontName = "Script"

Case 5

PadText.FontName = "Symbol"

Case 6

PadText.FontName = "System"

Case 7

PadText.FontName = "Terminal"

End Select

For i = 0 To 7

FFF(i).Checked = False

Next i

FFF(Index).Checked = True

End Sub

Per sapere quale font è attivo nel menu occorre il segno di spunta: per le caselle di testo il font attivo è Helv, per spuntarlo selezionare Checked. Per aggiungere al menu i tasti di scelta rapida basta anteporre la & alla lettera desiderata. Ogni tasto deve essere esclusivo all’interno del suo livello, in pratica due nomi di menu della stessa barra non possono usare lo stesso tasto e due voci del menu non devono avere la stessa lettera.

Per aggiungere al menu i tasti scorciatoia basta evidenziare un menu e selezionare Shortcut e scegliere per esempio CTRL A.

La proprietà Visible delle voci di menu permette di nascondere le voci stesse.

 


 

Controlli per lo stato dei tasti

Inserire nel progetto Strumenti/Controlli aggiuntivi.../Microhelp key State Control (sono indicatori che mostrano lo stato dei tasti) e per ogni controllo impostare la proprietà Style in questo modo:

0 Caps Lock (Bloc Maiusc);

1 Num Lock (Bloc Num);

2 Insert (Ins);

3 Scroll Lock (Bloc Scorr).

 


 

Agenda.VBP

È possibile inserire voci di menu con Load ed eliminarle con Unload, purché siano parte di una matrice di controlli, per questo si deve avere sempre almeno una voce, affinché le altre siano aggiunte a questa. Si disegna il menu.

Caption Name Index

&File FileMenu

Aggiungi nome corrente AddNameItem

- SeparatorItem

(blank) NNN 0

&Esci ExitItem

Clic su Aggiungi nome corrente, in Oggetto (generale) e Routine (dichiarazioni) e digitare:

 

Private Names(1 To 10) As String

Private Numbers(1 To 10) As String

Clic su AddNameItem, inserire

 

Private Sub AddNameItem_Click ()

Static n As Byte ‘numero di voci del menu

n = n + 1 ‘aggiunge una voce

Load NNN(n)

NNN(0).Visible = False

NNN(n).Caption = Text1.Text

NNN(n).Visible = True

Names(n) = Text1.Text

Numbers(n) = Text2.Text

End Sub

Dopo aver aggiunto i nomi al menu, è possibile con un clic visualizzare Nome e Numero, selezionare NNN_Click ed inserire il codice:

 

Private Sub NNN_Click (Index As Integer)

Text1.Text = Names(Index)

Text2.Text = Numbers(Index)

End Sub

 


 

popup.VBP

I menu Pop-Up (menu di scelta rapida, menu contestuali) sono menu visualizzati nel form quando si fa clic con il pulsante destro del mouse e sono indipendenti dai menu a tendina e dalla barra degli strumenti. È possibile visualizzare un solo menu pop-up alla volta. Per creare un menu che non è visualizzato nei menu a tendina, bisogna rendere invisibile il nome del menu in fase di progettazione (casella "Visible"). Visual BASIC mette a disposizione automaticamente un menu pop-up per il controllo TextBox. Se si crea un menu pop-up personalizzato, è visualizzato per primo il menu di sistema e dopo il menu personalizzato.

La Barra degli Strumenti, integra i menu a tendina, e fornisce una rappresentazione grafica dei comandi dell’applicazione. È inoltre possibile utilizzare le descrizioni dei comandi, che consentono di visualizzare il nome di ciascun pulsante al semplice passaggio del mouse sul pulsante stesso. L’evento click su questi pulsanti deve essere uguale all’evento click sul corrispondente elemento del menu a tendina.

Caption Name Index Visible

Hidden mnu200 non spuntato

Ripristina formato mnu201 0

Minimize mnu202 1

Maximize mnu203 2

 

Private ix, iy As Single 'coordinate dell'info_icona

Private nome_info As String 'testo dell'info

Private MsgLin(10) As String

Private MsgLine(10) As String

Private Sub sposta_info()

Label1.Top = iy

Label1.Left = ix

Label1.Visible = True

Label1.Caption = nome_info

End Sub

Private Sub cmdToolBar_Click(Index As Integer)

mnu101_Click (Index)

End Sub

Private Sub cmdToolBar_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

panMsgLine.Caption = MsgLine(Index)

ix = X + cmdToolBar(Index).Left

iy = Y + 490

nome_info = MsgLin(Index)

sposta_info

End Sub

Private Sub Form_Load()

Dim i As Integer

Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2

mnu300.Caption = Chr(8) & mnu300.Caption

MsgLine(0) = "Gestione anagrafiche Clienti e Fornitori"

MsgLine(1) = "Schede carico e scarico di Magazzino"

MsgLine(2) = "Bolle, Fatture e Note di credito"

MsgLine(3) = "Chiusure: giornaliera - mensile - annuale"

MsgLine(4) = "Elaborazioni Statistiche"

MsgLine(5) = "Procedura di Back-Up e Restore"

MsgLine(7) = "Uscita dal programma"

MsgLin(0) = "Gestione"

MsgLin(1) = "Magazzino"

MsgLin(2) = "Fatture"

MsgLin(3) = "Chiusure"

MsgLin(4) = "Elaborazioni"

MsgLin(5) = "Back-Up"

MsgLin(7) = "Uscita"

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Label1.Visible = False

End Sub

Private Sub mnu101_Click(Index As Integer)

If Index = 7 Then End

MsgBox MsgLine(Index), 64, "Procedura da attivare"

End Sub

Private Sub mnu201_Click(Index As Integer)

frmMain.WindowState = Index

End Sub

Private Sub panToolBar_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

panMsgLine.Caption = "Clickare il tasto destro sopra la figura dell'omino..."

End Sub

Private Sub picMain_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 2 Then PopupMenu mnu200, 2

End Sub

 


 

Evento MouseDown

È generato quando l’utente preme semplicemente un pulsante del mouse in un determinato punto del form, della PictureBox e della Label; per l’evento Click, invece, si deve premere e rilasciare il pulsante. La routine riceve i seguenti argomenti: x, y posizione del puntatore espressa in twip; Button quale pulsante è stato premuto codificandolo in questo modo.

VALORE BINARIO SIGNIFICATO

1 0000000000000001 è stato premuto il pulsante sinistro

2 0000000000000010 è stato premuto il pulsante destro

4 0000000000000100 è stato premuto il pulsante centrale

Shift indica se, mentre era premuto il pulsante del mouse, era premuto anche il tasto CTRL, il tasto MAIUSC o il tasto ALT.

VALORE BINARIO SIGNIFICATO

0 0000000000000000 non è premuto né MAIUC né CTRL

1 0000000000000001 è premuto il tasto MAIUSC

2 0000000000000010 è premuto il tasto CTRL

4 0000000000000100 è premuto il tasto ALT

 

Private Sub Form_MouseDown (Button As Integer, Shift As Integer, x As Single, y As Single)

Text1.Text = Str$(x)

Text2.Text = Str$(y)

Select Case Button

Case 1

Text3.Text = "Pulsante sinistro"

Case 2

Text3.Text = "Pulsante destro"

End Select

End Sub

 


 

Evento MouseUp

È generato quando un pulsante del mouse è rilasciato.

 


 

Evento MouseMove

È generato quando si preme un pulsante e si muove il mouse: valori restituiti per Button.

VALORE BINARIO SIGNIFICATO

0 0000000000000000 non è premuto nessun pulsante

1 0000000000000001 è premuto solo il pulsante sinistro

2 0000000000000010 è premuto solo il pulsante destro

3 0000000000000011 sono premuti i pulsanti destro e sinistro

4 0000000000000100 è premuto solo il pulsante centrale

5 0000000000000101 sono premuti i pulsanti centrale e sinistro

6 0000000000000110 sono premuti i pulsanti centrale e destro

7 0000000000000111 sono premuti tutti e tre i pulsanti

Stili del puntatore del mouse, è la proprietà MousePointer. Per visualizzare un puntatore personalizzato:

 

Screen.MousePointer = 99

Screen.MouseIcon = LoadPicture ("c:\windows\pointer\pippo.ico")

 


 

Clipper.VBP

L’esempio illustra la determinazione del controlo attivo; la proprietà ActiveControl consente di determinare quale sia il controllo attivo e di fare riferimento ad esso nel modo consueto. L’applicazione possiede due caselle di testo e due menu Copia ed Incolla, quando l’utente seleziona del testo è necessario determinare a quale casella l’utente si sta riferendo. A questo scopo, va verificato qual è il controllo attivo, in pratica a quale controllo è assegnato il focus.

 

Private Sub CopyItem_Click ()

Clipboard.SetText Screen.ActiveControl.SelText

End Sub

Private Sub PasteItem_Click ()

Screen.ActiveControl.SelText = Clipboard.GetText()

End Sub

È disponibile anche ActiveForm che consente di determinare quale form è attivo, contiene il valore Me per il form corrente. Inoltre, si può verificare di quanti form è dotata l’applicazione con Forms.Count.

 


 

Casella.VBP

La casella di messaggio visualizza una stringa e l’utente può rispondere solo tramite pulsanti, usata per informazioni (applicazione, autore) e messaggi di errore.

 

RetVal% = MsgBox (messaggio$ [,tipo [,titolo$]])

dove gli argomenti hanno il seguente significato:

messaggio$ è il messaggio che si vuole visualizzare

tipo indica i pulsanti e/o le icone che si vogliono inserire nella casella:

0 solo il pulsante OK (default)

1 OK e Annulla

2 Termina, Riprova, Ignora

3 Sì, No, Annulla

4 Sì, No

5 Riprova, Annulla

16 Stop

32 punto interrogativo inscritto in un cerchio, (richiesta)

48 punto esclamativo inscritto in un cerchio, (avvertimento)

64 "i" minuscola inscritta in un cerchio, (informazione)

0 il primo pulsante ha il focus per default

256 il secondo pulsante ha il focus per default

512 il terzo pulsante ha il focus per default

i valori possono essere sommati, 20 = 0 + 4 + 16 (OK, Sì, No, Stop)

titolo$ titolo della casella, al massimo 255 caratteri

RetVal% ritorna il pulsante premuto dall’utente:

1 OK

2 Annulla

3 Termina

4 Riprova

5 Ignora

6 Sì

7 No

Oggetto Proprietà Impostazione

Form1 Caption Windows Shell

Label1 Caption About

Inserire il codice.

 

Private Sub Label1_Click ()

Dim RetVal As Byte

RetVal=MsgBox("Questo pulsante visualizza informazioni di about...", 65, "About")

End Sub

La casella di input accetta una stringa d’input da parte dell’utente.

 

RetString$ = InputBox$ (prompt$ [,titolo$ [,default$ [,x% [,y%]]]])

dove gli argomenti hanno il seguente significato:

RetString$ la stringa digitata dall’utente nella casella

prompt$ il tipo d’input atteso

default$ stringa di default, se l’utente non specifica una risposta diversa

x%, y% posizione della casella in twip rispetto all’angolo superiore sinistro

Per dimostrare questo funzionamento, si usa la funzione:

 

RetVal = Shell (comando$ [,tipofinestra$])

dove gli argomenti hanno il seguente significato:

comando$ nome dell’applicazione EXE, BAT, COM, PIF

tipofinestra$ opzioni di avvio della finestra 1 finestra normale, con focus

2 ridotta, con focus

3 ingrandita, con focus

4 normale, senza focus

7 ridotta, senza focus

RetVal ritorna l’ID dell’applicazione.

Disegnare il menu.

Caption Name

&File FileMenu

Ese&gui... RunItem

- Separator

&Esci ExitItem

Siccome ci sono i tre punti l’utente si aspetta una finestra di dialogo dove digitare il nome dell’applicazione da eseguire. Clic su Esegui..., inserire il codice:

 

Private Sub RunItem_Click ()

Dim RetVal As String

Dim pippo As Long

'se si sceglie annulla dalla InputBox$ ritorna una stringa nulla

RetVal = InputBox$("Applicazione da eseguire:", "Esegui...", "Notepad")

If RetVal <> "" Then

pippo = Shell(RetVal, 1)

Else

Exit Sub

End If

End Sub

 


 

Casella1.VBP

Utilizza le finestre multiple, a partire da casella.mak si inserisce una nuova finestra, si crea un nuovo form con Inserisci/Form.

Oggetto Proprietà Impostazione

Form1 Caption Esegui...

Name RunDialog

ControlBox False

BorderStyle 3

TextBox

CommandButton Name OKButton

Caption OK

Default True

TabStop True

CommandButton Name CancelButton

Caption Annulla

Cancel True

Siccome è una finestra di dialogo di tipo modal, l’utente non potrà effettuare nessuna operazione prima di aver soddisfatto la richiesta di questa finestra. L’evento che provoca la visualizzazione della finestra di dialogo è RunItem_Click() della voce File/Esegui... doppio clic su questa opzione compare il codice dell’istruzione shell inserito in precedenza, adesso invece si deve visualizzare la finestra di dialogo:

 

Private Sub RunItem_Click ()

RunDialog.Show 1

End Sub

il form RunDialog è visualizzato anche se non è in memoria perché il metodo Show lo carica automaticamente. L’istruzione per visualizzare e caricare un nuovo form è:

 

Form1.Show [modal%]

- modal = 0, l’utente può usare altri Form, mentre Form1 è visualizzato;

- modal = 1, tutte gli altri form dell’applicazione sono inattivi: è di tipo modal.

Doppio clic su OK ed inserire il codice:

 

Sub OKButton_Click ()

Dim RetVal As Intger

RetVal = Shell(Text1.Text, 1)

Unload RunDialog

End Sub

Dopo aver eseguito la Shell, si deve eliminare la visualizzazione della finestra di dialogo; in questo modo, quando l’applicazione Windows si conclude, si ritorna a Windows Shell e non alla finestra di dialogo. Doppio clic su Annulla, inserire il codice:

 

Sub CancelButton_Click ()

'RunDialog.Hide elimina la visualizzazione del form

Unload RunDialog 'scarica il form dalla memoria

End Sub

 


 

Pannello.VBP

Serve a personalizzare gli aspetti di un’applicazione. Disegnare il menu.

Caption Name Shortcut

&File FileMenu

&Pannello di controllo... ControlPanelItem CTRL+P

- Separator

&Esci ExitItem

Inserisci/Form con i seguenti oggetti.

Oggetto Proprietà Impostazione

Form1 Caption Pannello di controllo

Name ControlPanel

TextBox1 Name NewCaption

Caption (si modifica il titolo in Form1)

Label1 Caption Titolo dell’applicazione

CommandButton1 Caption OK

Name OKButton

CommandButton Caption Annulla

Name CancelButton

Doppio clic su Annulla ed inserire il codice:

 

Private Sub CancelButton_Click ()

Unload ControlPanel

End Sub

Doppio clic su OK ed inserire il codice:

 

Private Sub OKButton_Click ()

Form1.Caption = NewCaption.Text

Form1.Height = NewHeight.Value

Form1.Width = NewWidth.Value

‘si deve riportare il colore impostato nello sfondo della finestra principale.

Form1.BackColor = RGB(NewRed.Value, NewGreen.Value, NewBlue.Value)

Unload ControlPanel

End Sub

L’unità di misura di default in Visual BASIC è il twip, che equivale ad 1/1440 di pollice. Per modificare l’altezza e la larghezza della finestra si usano le proprietà Form1.Height e Form1.Width leggendo i valori attuali tramite Val(). Tuttavia, non è semplice esprimere la misura in twip, si possono usare allora le barre di scorrimento con le loro proprietà.

Min, è il valore numerico che si assegna all’estremità superiore sinistra, tutte le proprietà possono assumere valori compresi tra 0 e 32767.

Max, è il valore che si assegna all’estremità inferiore destra.

Value, è il valore corrente che corrisponde alla casella che si muove all’interno della barra, Min <= Value <= Max.

LargeChange, indica l’entità della modifica subita da Value ogni volta che l’utente fa clic nella barra.

SmallChange, indica l’entità della modifica subita da Value ogni volta che l’utente fa clic sulle frecce.

L’evento principale correlato alle barre di scorrimento è l’evento Change, che si verifica ogni volta che la casella è spostata; tuttavia, in questo caso si vuole che le modifiche abbiano effetto solo quando l’utente fa clic si OK.

Posizionare nel form i seguenti oggetti.

Oggetto Proprietà Impostazione

Label Name Label2

Caption Nuova altezza

VScrollBar Name NewHeight

Min 1440

Max 7200

LargeChange 1000

SmallChange 500

Label Name Label3

Caption Nuova larghezza

VScrollBar Name NewWidth

Min 2880

Max 10080

Le dimensioni della finestra sono:

Pollici Twip

Minima 1" * 2" (altezza * larghezza) 1440 * 2880

Massima 5" * 7" 7200 * 10080

Doppio clic su File/Pannello di controllo... ed inserire il codice:

 

Private Sub ControlPanelItem_Click ()

ControlPanel.NewCaption.Text = Form1.Caption

ControlPanel.NewHeight.Value = Form1.Height

ControlPanel.NewWidth.Value = Form1.Width

‘‘preleva il colore di sfondo della finestra principale e lo carica nel pannello di controllo

ControlPanel.NewColor.BackColor = Form1.BackColor

ControlPanel.Show 1

End Sub

Quando l’utente seleziona questa voce, si devono caricare i controlli del pannello di controllo con le impostazioni correnti della finestra e visualizzare quindi il pannello sullo schermo. Se si usano le barre di scorrimento si possono reimpostare le dimensioni della finestra; ciò non costituisce un vantaggio significativo, dal momento che si possono trascinare i bordi, ma ha un valore esemplificativo.

I colori sono determinati da tre fattori cromatici indipendenti: il rosso, il verde ed il blu. Ogni valore di colore varia da 0 a 255, tutti e tre sono poi sommati in un Long e la somma è inserita nelle proprietà Backcolor, Forecolor.

Visual BASIC mette a disposizione i seguenti metodi:

la funzione RGB(), che consente di combinare i valori dei colori;

la funzione QBColor(), seleziona un colore compreso tra zero e quindici;

l’impostazione diretta in un Long, &H00FF0000&;

le proprietà Forecolor e Backcolor.

Il metodo: [oggetto.]Point (x,y) ritorna il valore in un Long del colore.

Posizionare nel form i seguenti oggetti.

Oggetto Proprietà Impostazione

VScrollBar Name NewRed, NewGreen, NewBlue

Min 0

Max 255

LargeChange 20

SmallChange 10

Label Name NewColor

La label NewColor offre all’utente un riscontro visivo immediato del colore.

Doppio clic su Rosso (Verde e Blu) ed inserire il codice:

 

Sub NewRed_Change ()

NewColor.BackColor = RGB(NewRed.Value, NewGreen.Value, NewBlue.Value)

End Sub

Questa routine è richiamata ogni volta che NewRed.Value subisce una modifica. Sebbene si possa leggere questo valore quando è premuto OK e modificare Form1.BackColor, si può usare questo valore anche per mostrarlo in NewColor.

 


 

Mdi.VBP

L’interfaccia MDI (Multiple Document Interface) è stata progettata appositamente per applicazioni orientate a documenti. L’icona di un form secondario ridotto a icona non è visualizzata nel desktop, ma nel form MDI. Quando un form secondario è ingrandito, la relativa didascalia è unita alla didascalia del form MDI e visualizzata nella barra del titolo del form MDI. Sono varie finestre presenti contemporaneamente sullo schermo, è possibile spostare la finestra nella finestra principale ma non al di fuori di essa, è consentito l’uso di un solo form MDI per applicazione. Inserisci/Form MDI

Oggetto Proprietà Impostazione

Form1 MDIChild True

Form2 MDIChild True

Quando si esegue l’applicazione, inizialmente compare solo Form1; per visualizzare Form2 si aggiunga il seguente codice:

 

Sub Form_Click ()

Form2.Show

End Sub

Ora quando si fa clic su Form1 compare Form2.

 


 

Sovrap.VBP

L’esempio illustra il passaggio di form alle routine, si tratta di un’opzione molto utile se si hanno numerosi form ai quali si vogliono applicare le stesse istruzioni o che si vogliono coordinare, in pratica quante più finestre si devono gestire nello stesso modo tanto più utile è il raggruppamento del codice di gestione in una sola routine. L’applicazione deve gestire quattro form, facendo clic l’utente deve poter sovrapporre le finestre ed assegnare a tutte le stesse dimensioni. Si può cominciare verificando che tutte le finestre siano visualizzate sullo schermo. Form1 deve essere il form iniziale.

 

Private Sub Form_Load ()

Form2.Show

Form3.Show

Form4.Show

End Sub

A questo punto si può aggiungere il CommandButton Sovrapposte.

 

Sub Command1_Click ()

Cascade Form1

Cascade Form2

Cascade Form3

Cascade Form4

End Sub

La routine Cascade() dispone le finestre, per passare i form si usa la dichiarazione As Form; dato che i form devono essere sovrapposti, bisognerà mantenere la posizione dell’angolo superiore sinistro di ciascuno di essi fra una chiamata e l’altra ecco perché le coordinate devono essere Static.

 

Private Sub Cascade (TheForm As Form)

Static TopX, TopY As Integer

TheForm.Width = Screen.Width / 4

TheForm.Height = Screen.Height / 4

TheForm.Move TopX, TopY

TopX = TopX + Screen.Width / 10

TopY = TopY + Screen.Height / 10

End Sub

Per modificare il titolo del form si usa il seguente codice.

 

Private Sub CambiaNome (TheForm As Form)

TheForm.Caption = "Hello, World"

End Sub

A questo punto, è necessario passare il Form1 alla routine, con questo codice.

 

Sub Form_Click ()

CambiaNome Me

End Sub

Non è possibile utilizzare CambiaNome() Form1 perché potrebbero essere in esecuzione più copie di Form1, si usa la parola riservata Me che si riferisce al form corrente.

 


 

Desktop.mak

Lo scopo è quello di consentire all’utente di fare clic su un controllo e di trascinarlo. Si utilizza la proprietà DragMode e l’evento DragDrop del form. I nomi delle applicazioni sono inseriti nelle Label invece che in TextBox (ad esse non sono associati gli eventi Click e DblClick). Si disegnano due rettangoli anziché utilizzare Frame (sono essi stessi dei controlli e quindi ciascuno avrebbe un proprio evento DragDrop).

 

Private Sub Form_Load ()

CurrentY = ScaleWidth / 20

CurrentX = ScaleWidth / 9

Print "Ufficio";

CurrentX = 5 * ScaleWidth / 9

Print "Casa"

Line (ScaleWidth/9, 2*ScaleHeight / 9)-(4 * ScaleWidth / 9, 8 * ScaleHeight / 9), , B

Line (5 * ScaleWidth/9, 2*ScaleHeight / 9)-(8*ScaleWidth/9, 8*ScaleHeight / 9), , B

End Sub

Ora bisogna inserire le Label contenenti i nomi delle applicazioni e rendere possibile il loro trascinamento. Si creino quattro Label con Caption = LLL per creare una matrice di controlli.

 


 

Il metodo Drag

Control.Drag 0 annulla il trascinamento.

 

Control.Drag 1 lo inizia.

 

Control.Drag 2 lo termina.

Il metodo Drag è necessario solo se DragMode è impostato a manuale (0), ma può essere utilizzato anche se è impostato ad automatico (1).

L’evento DragDrop: si verifica quando un controllo è rilasciato su un oggetto.

L’evento DragOver: si verifica quando un controllo è trascinato su un oggetto.

La proprietà DragIcon: indica l’icona da utilizzare quando l’utente trascina un controllo.

 


 

La proprietà DragMode

Può essere impostata a manuale (0, default), o automatico (1) per controllare il trascinamento dei controlli. Se è automatico, l’utente può trascinarlo quando lo desidera ma il controllo non risponde ad altre azioni del mouse. Se è manuale il trascinamento deve essere gestito con il metodo Drag. Si utilizza il trascinamento manuale, quando l’utente preme un pulsante mentre il puntatore del mouse si trova su un controllo il cui DragMode è impostato a manual, è generato un evento MouseDown() con il seguente codice.

 

Private Sub LLL_MouseDown (Index As Integer, Button As Integer, Shift As Integer,

X As Single,Y As Single)

LLL(Index).Visible = 0 ‘rende invisibile la Label per trascinarla

LLL(Index).Drag 1

End Sub

L’operazione successiva consiste nel rispondere quando l’utente rilascia il pulsante del mouse, posizionando la Label; l’evento che si verifica è DragDrop e gli argomenti passati sono le coordinate x e y della nuova posizione ed il controllo che è stato spostato.

 

Private Sub Form_DragDrop (Source As Control, X As Single, Y As Single)

If TypeOf Source Is Label Then

Source.Drag 2

Source.Visible = -1 ‘rende visibile la Label

Source.Move (X - Source.Width / 2), (Y - Source.Height / 2)

End If

End Sub

Si può utilizzare Source come un qualunque controllo, ma come si fa a sapere che tipo di controllo è stato spostato?

I nomi Label1 o Text1 non sono disponibili durante l’esecuzione, allora si può conoscere il tipo di controllo con TypeOf (al posto del segno di uguaglianza si usa Is).

Visual BASIC non sposta la Label che è stata trascinata nella nuova posizione nel momento in cui è rilasciata, ma è il programmatore con il metodo Move che sposta il controllo nella nuova posizione. Adesso bisogna rendere attiva la procedura DblClick().

Private Sub LLL_DblClick (Index As Integer)

Dim Result As Integer

Resultval = Shell(LLL(Index).Tag, 1)

End Sub

Quale applicazione è avviata?

Si usa la proprietà Tag che consente di associare una stringa ad un controllo, in modo che sia possibile durante l’esecuzione identificare il controllo su cui si sta lavorando, in questo caso si immagazzineranno il percorso ed il nome del file di ciascuna applicazione nella proprietà Tag della Label corrispondente.

 


 

Spread.VBP

Il controllo Grid consente di visualizzare le informazioni in celle. Le righe e le colonne possono essere di tipo:

fisso, non è possibile eseguire scorrimenti (colore grigio);

mobile, consentono di eseguire scorrimenti (colore bianco).

Non è possibile inserire testo in fase di progettazione, ma solo in fase di esecuzione con le proprietà:

Text, inserisce testo in una cella o lo stesso testo in un intervallo;

Clip, inserisce testo diverso in più celle, è necessario usare TAB Chr (9) per indicare la cella successiva e CR Chr (13) per indicare la riga successiva.

Oggetto Proprietà Impostazione

Form1 Caption Spreadsheet

Windowstate Maximized

Grid Cols 15

Rows 25

ColWidth larghezza colonna

RowHeight altezza riga

Si assegnano le etichette alle celle del foglio, nell’evento Form_Load(), i numeri vanno alle righe e le lettere alle colonne.

 

Private Sub Form_Load()

Static Items(1 To 6) As String

Dim loop_index As Integer

Grid1.ColWidth(2) = 1000

Grid1.ColWidth(1) = 1000

Items(1) = "Affitto"

Items(2) = "Cibo"

Items(3) = "Automobile"

Items(4) = "Telefono"

Items(5) = "Gas"

tems(6) = "TOTALE"

Grid1.Row = 1

For loop_index = 1 To 24

Grid1.Col = 0

Grid1.Row = loop_index

Grid1.Text = Str$(loop_index)

Next loop_index

For loop_index = 1 To 6

Grid1.Col = 0

Grid1.Row = loop_index

Grid1.Text = Str$(loop_index)

Grid1.Col = 2

Grid1.Text = Items(loop_index)

Next loop_index

Grid1.Col = 1

Grid1.Row = 0

For loop_index = 1 To 14

Grid1.Col = loop_index

Grid1.Text = Chr$(Asc("A") - 1 + loop_index)

Next loop_index

' si evidenzia la cella corrente

Grid1.Row = 1

Grid1.Col = 1

End Sub

Ora, si possono leggere i valori inseriti nelle celle (tutte quelle a cui si è assegnata un’etichetta, eccetto l’ultima), a questo scopo si usa l’evento:

 

Private Sub Grid1_KeyPress(KeyAscii As Integer)

Dim OldRow, OldCol, row_index As Integer

Dim sum As Currency

Grid1.Text = Grid1.Text + Chr$(KeyAscii)

OldRow = Grid1.Row

OldCol = Grid1.Col

Grid1.Col = 1 'Somma i numeri nella prima colonna

Grid1.Row = 0

sum = 0

For row_index = 1 To 5

Grid1.Row = row_index

sum = sum + Val(Grid1.Text)

Next row_index

Grid1.Row = 6 'si inserisce il valore di sum% nella cella del totale

Grid1.Text = Format(Str$(sum), "Currency")

Grid1.Row = OldRow

Grid1.Col = OldCol

End Sub

 


 

Alarm.VBP

Il controllo Timer è collegato al trascorrere del tempo, per esempio il controllo dell’orologio del sistema. La proprietà Interval (valore compreso tra 1 e 65.535) non determina la durata, ma la frequenza. Maggiore è la frequenza (valori piccoli di Interval), maggiore è il tempo di elaborazione utilizzato per la risposta agli eventi, con conseguente rallentamento delle prestazioni generali del sistema. Per tenere conto di un certo margine di errore, si consiglia di impostare un intervallo pari a metà del livello di precisione desiderato. Per esempio, 500 per 1 secondo. Inserire nel form.

Oggetto Proprietà Impostazione

TextBox Name AlarmSettingl

Label Name Display

Timer Interval 1000 (1000 msec = 1 sec)

 

Private Sub Display_Click ()

Display.Caption = Time$

End Sub

Ogni volta che l’utente digita, si verificano tre eventi:

KeyDown preme un tasto;

KeyUp rilascia un tasto;

KeyPress ritorna il valore del carattere.

Ogni routine di evento accetta due argomenti:

Keycode codice ANSI (non ASCII) del tasto premuto o rilasciato;

Shift riporta lo stato dei tasti MAIUSC, ALT e CTRL.

Inoltre, KeyDown e KeyUp non considerano la differenza tra maiuscolo e minuscolo, allora bisogna esaminare Shift: questo argomento è uno se MAIUSC è stato premuto, due se è premuto CTRL, quattro per ALT. Per esempio, vale cinque se sono premuti contemporaneamente ALT e MAIUSC. Lo scopo è quello di limitare la digitazione dell’utente, nell’esempio i caratteri da zero a nove ed i due punti; doppio clic su AlarmSetting e selezionare KeyPress, il codice è:

 

Private Sub AlarmSetting_KeyPress (KeyAscii As Integer)

Key$ = Chr$(KeyAscii)

If ((Key$ < "0" Or Key$ > "9") And Key$ <> ":") Then

Beep

KeyAscii = 0

End If

End Sub

Il codice ASCII in KeyAscii è convertito in carattere e confrontato, se non è corretto emette un Beep ed è cancellato. Il Timer si usa per mantenere aggiornato l’orologio, produce l’evento Timer, il codice è il seguente:

 

Private Sub Timer1_Timer ()

If (Time$ >= AlarmSetting.Text And AlarmOn) Then Beep

Display.Caption = Time$

End Sub

All’orario impostato per la sveglia, questa procedura emette un Beep. Gli orologi però hanno due possibilità: allarme attivo o inattivo, per questo motivo bisogna aggiungere alla destra di Textbox due Optionbutton: Alarm On e Alarm Off. La procedura collegata a questi pulsanti deve poter comunicare con quella corrente, Timer1_Timer(), tramite una variabile globale: Private AlarmOn As Integer. L’ultima istruzione aggiorna il display. Alarm Off deve essere attivo quando l’utente avvia l’orologio. Sono pulsanti di scelta mutuamente esclusivi, il modo più semplice per gestirli è quello di assegnare lo stesso Name = OnOffButton, Visual BASIC assegna automaticamente un indice e chiede se deve creare l’array, doppio clic su uno dei due pulsanti per il codice:

 

Private Sub OnOffButton_Click (Index As Integer)

If (Index = 1) Then

AlarmOn = True

Else

AlarmOn = False:End If

End Sub

 


 

Alarm1.VBP

Cancellare i due pulsanti; la proprietà Caption della singola voce di menu permette di modificare la voce stessa durante l’esecuzione. Disegnare il menu.

Caption Name

Alarm AlarmMenu

AlarmOff OnOffItem

Clic sulla voce di menu.

 

Private Sub OnOffItem_Click ()

If (AlarmOn) Then

AlarmOn = False

OnOffItem.Caption = "Alarm Off"

Else

AlarmOn = True

OnOffItem.Caption = "Alarm On"

OnOffItem.Checked = True

End If

End Sub

 


 

Alarm2.VBP

Disegnare il menu.

Caption Name

Alarm AlarmMenu

AlarmOn AlarmOnOnItem

AlarmOff AlarmOffItem

Clic su AlarmOn per il codice.

 

Private Sub AlarmOnItem_Click ()

If (AlarmOn) Then

AlarmOn = False

AlarmOffItem.Visible = True

AlarmOnItem.Visible = False

AlarmOffItem.Checked = True

Else

AlarmOn = True

AlarmOnItem.Visible = True

AlarmOffItem.Visible = False

AlarmOnItem.Checked = True

End If

End Sub

 


 

Conversioni.vbp

Il Command1 esegue la conversione binario-decimale.

 

Private Sub Command1_Click()

Dim r, a, i, x As Integer

Dim RetString As String

RetString = InputBox("Inserisci il numero binario - non esistono controlli! - partendo dall'MSB...", "Numeri Binari")

If RetString = "" Then Exit Sub

r = 0

a = Len(RetString$)

For i = 1 To Len(RetString$)

a = a - 1

x = Val(Mid$(RetString$, i, 1))

r = (r + (x * 2 ^ a))

Next i

Text1.Text = "Il numero decimale vale: " & r

End Sub

Il Command2 esegue la conversione decimale-binario.

 

Private Sub Command2_Click()

Dim r(1 To 32) As Integer

Dim x, n, quoz, resto, i As Integer

Dim RetString As String

Form1.Cls

Text1.Text = ""

RetString = InputBox(" Inserisci il numero - non esistono controlli! - decimale...", "Numeri Decimali")

If RetString = "" Then Exit Sub

x = 1

n = Val(RetString$)

a = n

If n <> 1 Then

Do

'quoz = Int(n / 2)

quoz = n \ 2

'resto = (n - (2 * (Int(n / 2))))

resto = n Mod 2

n = quoz

r(x) = resto

x = x + 1

Loop Until quoz = 1

End If

r(x) = 1

Print: Print: Print: Print: Print: Print: Print: Print

Print "IL NUMERO DECIMALE "; a; " IN BINARIO DIVENTA ": Print

For i = x To 1 Step -1

Print r(i);

'Text1.Text = r(i)

Next i

End Sub

Quicksort.vbp

Private Array(1 To 9) As Integer

Il Command1 esegue la ricerca binaria.

 

Private Sub Command1_Click()

Dim basso, alto, meta, SearchValue As Integer

Array(1) = 1

Array(2) = 2

Array(3) = 3

Array(4) = 4

Array(5) = 5

Array(6) = 6

Array(7) = 7

Array(8) = 8

Array(9) = 9

SearchValue = 8

Print

Print "Ricerca del valore 8 nell'elenco ordinato"

Print

basso = LBound(Array, 1)

alto = (UBound(Array, 1) - 1)

Do While (basso <= alto)

meta = (basso + alto) / 2

I if SearchValue = Array(meta) Then

Print "Valore"; SearchValue; "nell'elenco"

Exit Do

ElseIf SearchValue < Array(meta) Then

alto = meta - 1

Else: basso = meta + 1

End If

Loop

End Sub

Il Command2 esegue l’ordinamento con il metodo del quick sort.

 

Private Sub Command2_Click()

Dim i As Integer

Array(1) = 9

Array(2) = 8

Array(3) = 7

Array(4) = 6

Array(5) = 5

Array(6) = 4

Array(7) = 3

Array(8) = 2

Array(9) = 1

Print

Print " i Array(i)"

Print "--- --------"

For i = 1 To 9

Print i, Array(i)

Next i

Call SortQuick(Array(), 1, UBound(Array, 1))

Print

Print "Ordinamento..."

Print

Print " i Array(i)"

Print "--- --------"

For i = 1 To 9

Print i, Array(i)

Next i

End Sub

Private Sub SortQuick(ByRef Array() As Integer, ByVal SortFrom As Integer, ByVal SortTo As Integer)

Dim Temp, i, j As Integer

If SortFrom >= SortTo Then Exit Sub

If SortFrom + 1 = SortTo Then 'Ultimo caso

If Array(SortFrom) > Array(SortTo) Then

Temp = Array(SortFrom)

Array(SortFrom) = Array(SortTo)

Array(SortTo) = Temp

End If

Else 'Il problema va suddiviso

AtRandom = (SortFrom + SortTo) \ 2

Test = Array(AtRandom)

Temp = Array(AtRandom)

Array(AtRandom) = Array(SortTo)

Array(SortTo) = Temp

Do 'Divisione in due partizioni

For i = SortFrom To SortTo - 1

If Array(i) > Test Then Exit For

Next i

For j = SortTo To i + 1 Step -1

If Array(j) < Test Then Exit For

Next j

If i < j Then

Temp = Array(i)

Array(i) = Array(j)

Array(j) = Temp

End If

Loop Until i >= j

Temp = Array(i)

Array(i) = Array(SortTo)

Array(SortTo) = Temp

Call SortQuick(Array(), SortFrom, i - 1)

Call SortQuick(Array(), i + 1, SortTo)

End If

End Sub

 


 

Grafica (Paint.vbp)

È possibile disegnare in due tipi di oggetti: i form e le PictureBox. In entrambi si deve impostare la proprietà Autoredraw = True, per permettere a Visual BASIC di ridisegnare automaticamente la grafica presente nel caso sia coperta da altre finestre.

Si possono usare:

controlli (oggetti) grafici: Image, Line, Shape;

metodi grafici: Cls, PSet, Line, Circle.

Il sistema di coordinate parte da (0,0), angolo superiore sinistro.

Esistono cinque proprietà predefinite:

Height altezza esterna della finestra incluse la barra del titolo e del menu;

Width larghezza esterna della finestra;

ScaleWidth altezza dell’area di disegno in twip;

ScaleHeight larghezza dell’area di disegno;

DrawWidth dimensione dell’oggetto grafico, per default un pixel.

 


 

Disegno di punti

[oggetto.]PSet [Step] (x,y) [,Color&]

dove l’argomento Step indica che le coordinate sono relative alla posizione corrente, specificata dalle proprietà Currentx e Currenty.

 

PSet (ScaleWidth / 2, Scaleheight / 2), RGB(255, 0, 0) 'pixel al centro della form

Picture1.PSet (Picture1.ScaleWidth / 2, Picture1.Scaleheight / 2), RGB(255, 0, 0)

 


 

Disegno di linee

Esistono due possibilità:

lo strumento Line, usato però per impostare l’aspetto grafico delle finestre;

[oggetto.]Line [[Step] (x1,y1)] - [Step] (x2,y2) [, [color&], B [F]]

For i = 1 To 9

DrawWidth = i

Line (0, i * Scaleheight / 10)-(ScaleWidth, i * Scaleheight / 10)

Next i

DrawWidth = 1

Se non si specifica il punto di origine, è utilizzata la posizione grafica corrente, impostata al momento della pressione iniziale del pulsante del mouse: utile per disegnare a mano libera Line - (x,y). Sono disponibili sette diversi stili di linea con la proprietà DrawStyle:

0 Linea continua, valore di default

1 Linea tratteggiata

2 Linea punteggiata

3 Linea a trattini e punti

4 Linea a trattini e punti, due punti ogni trattino

5 Linea trasparente, non è visualizzata

6 Linea interna

 

For i = 1 To 7

DrawStyle = i - 1

Line (0, i * Scaleheight / 8)-(ScaleWidth, i * Scaleheight / 8)

Next i

Per DrawWidth maggiore di uno, gli stili di linea da uno a quattro risultano linee continue.

Sono disponibili diversi tipi di penna con la proprietà DrawMode:

4 Not Pen Disegna nel colore inverso a quello della penna

6 Invert Pen Inverte il contenuto dello schermo

7 Xor Pen Effettua uno xor di penna e schermo

11 No Pen Non disegna nulla

13 Copy Pen Disegna direttamente col colore della penna, default

 

DrawMode = 6

DrawWidth = 9

Line (0, 0)-(ScaleWidth, Scaleheight)

Line (0, Scaleheight)-(ScaleWidth, 0)

Quando si effettua uno xor rispetto a tutti uno, si ottiene il suo inverso: il bianco, per esempio, diventa nero. Se si effettua poi un nuovo xor si riotterrà il valore originale, bianco. Questo significa che si può disegnare usando la Xor Pen per far apparire qualcosa, e ridisegnando una seconda volta con la stessa penna il disegno precedente scompare: in questo modo funziona l’animazione e la crittografia.

 


 

Disegno di rettangoli

Esistono due possibilità:

lo strumento Shape, usato però per impostare l’aspetto grafico delle finestre;

opzione B del metodo Line

DrawWidth = 8

DrawStyle = 6

DrawMode = 6

Line (0, 0)-(ScaleWidth / 2, Scaleheight / 2), , B

Line (ScaleWidth / 4, Scaleheight / 4)-(3 * ScaleWidth / 4, 3 * Scaleheight / 4), , B

Line (ScaleWidth / 2, Scaleheight / 2)-(ScaleWidth, Scaleheight), , B

DrawWidth = 1

Sono disponibili diversi motivi di riempimento con la proprietà FillStyle:

0 Uniforme

1 Trasparente, default

2 Linee orizzontali

3 Linee verticali

4 Diagonali verso l’alto

5 Diagonali verso il basso

6 Intreccio

7 Intreccio diagonale

L’opzione F del metodo Line è usata per specificare che il retino di riempimento deve essere dello stesso colore del rettangolo. Il disegno di un rettangolo bianco uniforme, con bordi bianchi, è il metodo standard per cancellare il testo all’interno di form e PictureBox.

 

SX = ScaleWidth

SY = ScaleHeight

For i = 0 To 3

FillStyle = i

Line ((2 * i + 1) * SX / 9, SY / 5) - ((2 * i + 2) * SX / 9, 2 * SY / 5), , B

FilleStyle = i + 4

Line ((2 * i + 1) * SX / 9, 3 * SY / 5) - ((2 * i + 2) * SX / 9, 4 * SY / 5), , B

Next i

 


 

Disegno di cerchi

Si usa il metodo:

[oggetto.]Circle [Step] (x,y), raggio [, [color&] [, [inizio] [, [fine] [, rapporto]]]]

FillStyle = 5

ForeColor = RGB (255, 0, 0)

FillColor = ForeColor 'assegna al retino lo stesso colore

Circle (ScaleWidth / 4, Scaleheight / 4), Scaleheight / 5

FillStyle = 2

Circle (ScaleWidth / 2, Scaleheight / 2), Scaleheight / 3, , , , 2 'ellisse

Circle (3 * ScaleWidth / 4, 3 * Scaleheight / 4), Scaleheight / 5, , 0, 3.1415 'arco

 


 

Modifica del sistema di coordinate

Si usa il metodo: Scale (xalto, ysinistra) - (xdestra, ybasso)

Con questo comando, le coordinate dell’angolo superiore sinistro sono impostate a (xalto, ysinistra) e quelle dell’angolo inferiore destro a (xdestra, ybasso).

Si apra il progetto plotter.vbp con il seguente codice.

 

Private XVal(4), YVal(4) As Single ‘variabili a livello form

Private XBiggest, YBiggest As Single

Questo evento si verifica ogni volta che le dimensioni del form sono modificate.

 

Private Sub Form_Resize ()

Call Form_Paint

End Sub

Private Sub Form_Paint () 'programma grafico, assume l'origine a (0, 0)

Dim loop_index As Integer

Cls

XVal(1) = 1

YVal(1) = 200

XVal(2) = 2

YVal(2) = 95

XVal(3) = 4

YVal(3) = 350

XVal(4) = 5

YVal(4) = 425

XBiggest = 0

For loop_index = 1 To UBound(XVal)

If XVal(loop_index)>XBiggest Then XBiggest = XVal(loop_index)

Next loop_index

YBiggest = 0

For loop_index = 1 To UBound(YVal)

If YVal(loop_index)>YBiggest Then YBiggest = YVal(loop_index)

Next loop_index

Scale (0, YBiggest)-(XBiggest, 0) 'assume (0, 0) come origine

CurrentX = XVal(1)

CurrentY = YVal(1)

For loop_index = 1 To UBound(XVal)

Line -(XVal(loop_index), YVal(loop_index))

Next loop_index

End Sub

Il metodo Form_Resize() permette di ricreare l’immagine dopo che la finestra è stata ridotta ad icona o coperta da un’altra applicazione. Il modo più efficace è mettere tutto il codice per la grafica all’interno di Form_Paint(). Un’alternativa, senza usare codice, è utilizzare la proprietà Autoredraw = True con un enorme impegno di memoria.

 


 

La scala nella grafica

L’unità di misura di default è il twip; a volte però è più comodo usarne altre, per esempio i pixel. A tal fine, si usi la proprietà ScaleMode:

0 Definita dall’utente, ScaleWidth e ScaleHeight già impostate

1 Twip

2 Punti (72 punti per pollice)

3 Pixel (ScreenWidth e ScreenHeight dimensione dello schermo in pixel)

4 Carattere (120 twip sull’asse delle ascisse, 240 twip sull’asse delle ordinate)

5 Pollici (1440 twip)

6 Millimetri

7 Centimetri 8567 twip)

Non è necessario che le unità di altezza siano in relazione con quelle di larghezza, si può fissare come origine delle coordinate un punto diverso dall’angolo superiore sinistro con ScaleLeft e ScaleTop.

Le coordinate al centro dello schermo (0,0) Scale (-40,40) - (40,-40) sono:

ScaleLeft (- 40)

ScaleTop (+ 40)

ScaleHeight (- 80)

ScaleWidth (+ 80)

ScaleLeft + ScaleWidth (+ 40)

ScaleTop + ScaleHeight (- 40)

 


 

Caricamento d’immagine

È possibile inserire immagini ICO, BMP e WMF in:

form, con la proprietà Picture oppure con [oggetto.]Picture=LoadPicture (Filename$)

PictureBox, con la proprietà Picture e AutoSize = True

Image, con la proprietà Picture; non dispone dei metodi grafici standard come Line e Circle e differisce da una PictureBox per due motivi: le sue dimensioni sono impostate automaticamente in modo da corrispondere a quelle dell’immagine caricata e ponendo Stretch = True se ne possono modificare le dimensioni anche dopo il caricamento dell’immagine.

Le immagini, così come possono essere caricate, possono essere salvate con:

 

SavePicture [oggetto.]Image, Filename$

Per implementare lo scorrimento verticale e orizzontale di un bitmap di dimensioni maggiori della finestra, si utilizza la coppia di PictureBox: Picture1 (Autosize = False) contenitore vuoto e Picture2 (Autosize = True) che contiene effettivamente l’immagine disegnata all’interno di Picture1.

 

Private Sub Form_Load ()

Picture2.Move 0, 0

HScroll1.Max = Picture2.Width - Picture1.Width

VScroll1.Max = Picture2.Height - Picture1.Height

End Sub

Private Sub HScroll1_Change ()

Picture2.Left = -HScroll1.Value

End Sub

Private Sub VScroll1_Change ()

Picture2.Top = -VScroll1.Value

End Sub

Copiare un’immagine da un oggetto all’altro: Set Picture1.Picture = Picture2.Picture

Rimuovere un’immagine: Set Picture1.Picture = LoadPicture ("")

La proprietà Left indica la distanza tra l’angolo superiore sinistro del controllo e il lato sinistro del form. La proprietà Top indica la distanza tra l’angolo superiore sinistro del controllo e la parte inferiore del form.

 


 

Animazioni

Visual BASIC non gestisce la manipolazione dei pixel ad una velocità sufficiente per poter realizzare vere e proprie animazioni. Per esempio, nel progetto sprite.vbp è necessario impostare ScaleMode = Pixel e BackColor = Black. Inserire il seguente codice in ComamndButton.

 

Private Sub Command1_Click ()

Static SpriteArray(1 To 16) As String

Static Sprite(16, 16) As Long

Dim x, y, StepSize, i, ii, j, jj, CurrentColor As Integer

SpriteArray(1) = "00000000E0000000"

SpriteArray(2) = "00000000E0000000"

SpriteArray(3) = "0000000EEE000000"

SpriteArray(4) = "000000EE3EE00000"

SpriteArray(5) = "000000EE3EE00000"

SpriteArray(6) = "00000EE333EE0000"

SpriteArray(7) = "00000EE333EE0000"

SpriteArray(8) = "00E00EE333EE00E0"

SpriteArray(9) = "00EE00EE3EE00EE0"

SpriteArray(10) = "00EEE0EE3EE0EEE0"

SpriteArray(11) = "00EEEEEE3EEEEEE0"

SpriteArray(12) = "00EEE00E3E00EEE0"

SpriteArray(13) = "00EE004444400EE0"

SpriteArray(14) = "00E00004440000E0"

SpriteArray(15) = "0000000444000000"

SpriteArray(16) = "0000000040000000"

DrawMode = 7

BackColor = 0

GoSub MakeSprite

x = Int(ScaleWidth / 3)

y = ScaleHeight - UBound(SpriteArray, 1)

GoSub DrawSprite

Stepsize = Int(ScaleHeight / 10)

For i = (ScaleHeight - UBound(Sprite, 1)) To Stepsize Step -Stepsize

y = i

GoSub DrawSprite

y = i - Stepsize

GoSub DrawSprite

Next i

Exit Sub

MakeSprite:

For i = 1 To UBound(SpriteArray, 1)

For j = 1 To Len(SpriteArray(i))

CurrentColor = Asc(UCase$(Mid$(SpriteArray(i), j, 1)))

If CurrentColor<=Asc("9") Then

CurrentColor=CurrentColor-Asc("0")

Else

CurrentColor = CurrentColor - Asc("A") + 10

End If

Sprite(j, i) = QBColor(CurrentColor)

Next j

Next i

Return

DrawSprite:

For ii = 1 To UBound(Sprite, 1)

For jj = 1 To UBound(Sprite, 2)

PSet (x + ii - 1, y + jj - 1), Sprite(ii, jj)

Next jj

Next ii

Return

End Sub

L’ideale per le animazioni è realizzare l’immagine bitmap, quindi caricarla in Image tramite la proprietà Picture. Nella terminologia tecnica, l’immagine è definita sprite, dato che si tratta di un bitmap che non è modificato, ma solo mosso sullo schermo.

Aprire il progetto sprite1.vbp.

Oggetto Proprietà Impostazione

AniPushButton Frame inserire i file moon01-08.ico

 

Private Sub AniButton1_Click ()

Dim loop_index As Integer

For loop_index = Image1.Top To 0 Step -50

Image1.Move Image1.Left, loop_index

Next loop_index

End Sub

Per associare l’icona dell’astronave all’applicazione si usa la proprietà del form di nome Form1.Icon = sprite1.ico.

 


 

Controlli grafici

Il controllo grafico è Graph, i dati si caricano nel modo seguente.

Oggetto Proprietà Impostazione

Graph Graphdata 200 <CR>95<CR>0<CR>350<CR>425<CR>.

ColorData (0..15),

GraphType

PatternData (1..31)

GridStyle

GraphTitle

LeftTitle

BottomTitle

Si noti che non si è incrementato un contatore per puntare al successivo valore x, inoltre imposta automaticamente la scala delle y e non si è inserito codice. Si può modificare il colore, i motivi di riempimento, il grafico, aggiungere una griglia, dei titoli. Per cambiare il valore di uno solo dei punti si utilizza la proprietà ThisPoint, per esempio con il valore quattro salta il punto tre. Il grafico è spostato di una posizione lungo l’asse delle x; per correggere questo problema, si può impostare la proprietà XposData. Da un grafico a torta per estrarre una fetta si usa ExtraData = 1

 


 

Visualizzazione del testo grafico

Può essere stampato in tre contesti:

nel form

nella PictureBox

sulla stampante

Si usa il metodo: [oggetto.]Print [listaespressioni] [ í ; | ,ý ]

dove con il ‘;’, il cursore è posizionato al termine del testo che si stampa; mentre con la ‘,’ il cursore è posizionato nella zona (TAB, 14 caratteri) di stampa successiva.

 

Private Sub Form_Load ()

Print:Print:Print

Print Tab(10); "REGIONE"; Tab(30); "PRODOTTO"

Print

Print Tab(10); "Sicilia"; Tab(30); "Arance"

Print Tab(10); "Piemonte"; Tab(30); "Uva"

Print Tab(10); "Lombardia"; Tab(30); "Patate"

Print Tab(10); "Toscana"; Tab(30); "verze"

DrawWidth = 2

Line (650, 400)-(3700, 1900), , B:Line (650, 930)-(3700, 930)

End Sub

Il testo è stampato dalla posizione corrente del cursore, per modificarla si usa come al solito Currentx e Currenty. Il metodo Cls elimina il contenuto del form. Se si stampa in una PictureBox si deve conoscere la lunghezza della stringa, altrimenti il testo è troncato a destra. Si usano due metodi:

StringLength% = Picture1.TextWidth ("...") ‘lunghezza della stringa

Height% = TextHeight (2...") ‘altezza di una riga

L’esempio relativo si chiama stampa.vbp, da notare che nel codice c’è un altro particolare importante: il passaggio diretto di controlli come argomenti alle routine. È consigliabile in due casi:

quando si hanno numerosi controlli sui quali si devono svolgere operazioni ripetute, come nel caso in cui debbano essere inizializzati;

quando non si sa su quale controllo si dovrà agire, come in stampa.vbp.

Il codice relativo è il seguente.

 

Private StringToPrint As String

Sub Form_Load ()

Call PrintString(Picture1, "Questo è il momento per tutti gli uomini...")

End Sub

All’interno di PrintString() ci si può riferire alla PictureBox semplicemente come PBox.

 

Private Sub PrintString (PBox As Control, PString As String)

'la formattazione del testo in una Picture di dimensioni limitate costituisce un problema ‘frequente. Si suddivide la stringa da stampare PString in righe che possano essere ‘contenute nella Picture.

Dim PrintLine, NextWord, Temp As String

StringToPrint = PString:PrintLine = ""

'GetWords restituisce la parola successiva in PString

NextWord = GetWord()

Do While NextWord <> "" 'termina quando c'è una stringa nulla

Temp = PrintLine + NextWord

If PBox.TextWidth(Temp) > PBox.ScaleWidth Then

PBox.Print PrintLine 'Stampa prima che diventi troppo lunga.

PrintLine = NextWord

Else

PrintLine = Temp

End If

NextWord = GetWord()

Loop

PBox.Print PrintLine 'Stampa il rimanente.

End Sub

Function GetWord () As String

'lo scopo è quello di tagliare la prima parola della stringa StringToPrint, in altre parole si ‘deve trovare il primo spazio nella stringa e restituire tutto ciò che lo precede, nonché lo spazio stesso si usa la funzione Instr() per determinare se in StringToPrint c'è uno uno ‘spazio, se è uguale a zero non vi sono spazi.

If InStr(StringToPrint, " ") = 0 Then

GetWord = StringToPrint

StringToPrint = ""

'se c'è, significa la stringa si compone almeno di due parole si deve restituire la prima e tagliarla dalla stringa in modo da preparala per la successiva chiamata di GetWords$

Else

GetWord = Left$(StringToPrint, InStr(StringToPrint, " "))

StringToPrint=Right$(StringToPrint,Len(StringToPrint)-InStr(StringToPrint, " "))

End If

End Function

Esistono delle proprietà dei font su cui è possibile intervenire quando si stampa a video o su stampante, inclusi gli attributi del testo:

FontName Nome del font

FontSize Corpo del font in punti

FontBold Stampa in grassetto se true

FontItalic Stampa in corsivo se true

FontStrikethru Stampa in barrato se true

FontTransparent Determina se è utilizzato lo sfondo intorno ai caratteri

FontUnderline Stampa in sottolineato se true

 


 

Uso della stampante

Si usa il metodo:

 

Private Sub Form_Load ()

Form1.PrintForm

End Sub

che consente si stampare un’intero form, tuttavia, in questo modo si produce una stampa bitmap (pixel per pixel del contenuto dello schermo). Per ottenere una risoluzione più alta, si deve usare il metodo Print applicato all’oggetto Printer, che corrisponde alla stampante di default di Windows.

 

Private Sub Form_Load ()

Printer.CurrentX = 1440 ‘posiziona l’output di stampa

Printer.CurrentY = 2880

Printer.FontName = "Courier"

Printer.FontUnderline = True

Printer.Print "..."

Printer.NewPage

End Sub

 


 

File SEQUENZIALI.VBP

Si aggiunge il supporto dei file all’applicazione editor1.vbp. Si inizia dalla voce Apri...

 

Sub LoadItem_Click ()

È importante sapere se l’utente ha fatto clic sul pulsante Annulla; per questo motivo, si utilizzerà l’errore generato. Si utilizza il controllo degli errori nel modo seguente.

 

On Error Resume Next

CMDialog1.CancelError = -1

Inoltre, si può specificare il titolo della finestra di dialogo nel modo seguente.

 

CMDialog1.DialogTitle = "Apri file"

Si può specificare l’estensione per i file visualizzati inizialmente nella finestra di dialogo.

 

CMDialog1.Filter = "Solo testo | *.txt"

Inoltre è possibile specificare le impostazioni per l’apertura ed il salvataggio dei file.

OFN_READONLY Seleziona la casella Sola lettura.

OFN_OVERWRITEPROMPT Messaggio se il file esiste, l’utente può sovrascrivere.

OFN_HIDEREADONLY Nasconde la casella Sola lettura.

OFN_NOCHANGEDIR Disabilita il cambiamento di directory.

OFN_SHOWHELP Inserisce il pulsante della guida.

OFN_ALLOWMULTISELECT Consente la selezione di file multipli.

OFN_PATHMUSTEXIST L’utente può specificare solo un percorso valido.

OFN_CREATEPROMPT Richiede se l’utente vuole creare il file se non esiste.

OFN_SHAREWARE Ignora l’errore OFN_SHARINGVIOLATION.

OFN_NOREADONLYRETURN Il file non è a sola lettura.

 

CMDialog1.Flags = OFN_READONLY

Ora si visualizza la finestra di dialogo.

 

CMDialog1.Action = 1

Infine, dopo che l’utente ha chiuso la finestra di dialogo, si verificherà che non abbia fatto clic su Annulla e si legge il file.

 

If Err = 0 Then

Open CMDialog1.Filename For Input As #1

PadText.Text = Input$(LOF(1), #1)

Close #1

End If

End Sub

Nello stesso modo si può creare una finestra di dialogo per il salvataggio dei file.

 

Sub SaveItem_Click ()

On Error Resume Next

CMDialog1.CancelError = -1

CMDialog1.DialogTitle = "Salva file"

CMDialog1.Filter = "Solo testo | *.txt"

CMDialog1.Flags = OFN_READONLY

CMDialog1.Action = 2

If Err = 0 Then

Open CMDialog1.Filename For Output As #1

Print #1, PadText.Text

Close #1

End If

End Sub

Nello stesso modo si può creare una finestra di dialogo per la stampa.

 

Sub PrintItem_Click ()

On Error Resume Next

Si verifica se è stato premuto Annulla; controlla l’errore.

 

CMDialog1.CancelError = -1

CMDialog1.FromPage = 1 ‘pagina da cui inizia la stampa

CMDialog1.ToPage = 1 ‘pagina di fine stampa: una sola!

CMDialog1.Action = 5

If Error = 0 Then

Printer.Print PadText.Text

Printer.EndDoc

End If

End Sub

I flags che si possono utilizzare sono i seguenti.

PD_ALLPAGES Imposta il pulsante Tutto.

PD_SELECTION Imposta il pulsante Selezione.

PD_PAGENUMS Imposta il pulsante Pagine.

PD_NOSELECTION Non consente l’uso del pulsante Selezione.

PD_NOPAGENUMS Non consente l’uso del pulsante Pagine.

PD_COLLATE Imposta il pulsante Fascicola copie.

PD_PRINTTOFILE Imposta la casella Stampa su file.

PD_PRINTSETUP Visualizza la finestra Imposta stampante

PD_NOWARNING Disabilita i messaggi di avviso.

PD_RETURNDC Restituisce un handle hDC.

PD_RETURNIC Restituisce un information context.

PD_SHOWHELP Visualizza il pulsante guida.

PD_USEDEVMODECOPIES Non abilita la casella Numero di copie.

PD_HIDEPRINTTOFILE Nasconde la casella Stampa su file.

Nello stesso modo si può creare una finestra di dialogo per la selezione del colore del testo.

 

Sub ColoreItem_Click ()

CMDialog1.Color = PadText.ForeColor

CMDialog1.Action = 3

PadText.ForeColor = CMDialog1.Color

End Sub

I flags che si possono utilizzare sono i seguenti.

CC_RGBINIT Valore iniziale del colore.

CC_FULLOPEN Include i colori personalizzati.

CC_PREVENTFULLOPEN Non consente di aprire interamente la finetsra.

CC_SHOWHELP Visualizza il pulsante della guida.

Nello stesso modo si può creare una finestra di dialogo per la selezione dei font.

 

Sub FontItem_Click ()

On Error Resume Next

CMDialog1.CancelError = -1 'True

Bisogna prima caricare tutte le proprietà correnti del font in CMDialog in modo da potere visualizzare i default.

 

CMDialog1.FontName = PadText.FontName

CMDialog1.FontItalic = PadText.FontItalic

CMDialog1.FontStrikethru = PadText.FontStrikethru

CMDialog1.FontSize = PadText.FontSize

CMDialog1.FontUnderline = PadText.FontUnderline

CMDialog1.Color = PadText.ForeColor

Ora si può impostare la proprietò Flags.

 

CMDialog1.Flags = CF_SCREENFONTS Or CF_EFFECTS

CMDialog1.Action = 4

A questo punto, la finestra è visualizzata, ma se l’utente preme Annulla non si dovranno trasferire le impostazioni; basta mettere la proprietà CancelError = True

 

If Err = 0 Then

PadText.FontName = CMDialog1.FontName

PadText.FontItalic = CMDialog1.FontItalic

PadText.FontStrikethru = CMDialog1.FontStrikethru

PadText.FontSize = CMDialog1.FontSize

PadText.FontUnderline = CMDialog1.FontUnderline

PadText.ForeColor = CMDialog1.Color

End If

End Sub

Le impostazioni possibili per la proprietà Flags sono le seguenti.

CF_SCREENFONTS Selezione dei soli font per il video.

CF_PRINTERFONTS Selezione dei soli font per la stampante.

CF_BOTH Selezione di entrambi i tipi di font.

CF_SHOWHELP Visualizza il pulsante della guida nella finestra.

CF_EFFECTS Selezione degli effetti.

CF_APPLY Abilita il pulsante Apply.

CF_ANSIONLY Selezione dei soli font che utilizzano il set ANSI.

CF_NOVECTORFONTS Non consente l’uso dei font vettoriali.

CF_NOSIMULATIONS Non consente la simulazione dei font GDI.

CF_LIMITSIZE Limita la dimensione dei font.

CF_FIXEDPITCHONLY Uso dei soli font a dimensione fissa.

CF_WYSIWYG Uso dei soli font sia per il video che per la stampante.

CF_FORCEFONTEXIST Uso dei soli font esistenti.

CF_SCALABLEONLY Uso dei soli font scalabili.

CF_TTONLY Uso dei soli font TrueType.