Costruzione di unapplicazione 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.
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
Lutente può passare da una casella di testo allaltra 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 dellordine di tabulazione), si usa la proprietà TabIndex per limpostazione dellordine di tabulazione.
Levento GotFocus si verifica quando levidenziazione è spostata su un oggetto.
Levento LostFocus si verifica quando levidenziazione è rimossa dalloggetto.
Lutente non usa <CR>, allora il pulsante "uguale" diventa quello di default ed è indicato con bordo nero spesso, per attivarlo Default = True.
Formattazione delloutput
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"
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 alleditor clic o TAB: è poco professionale, Il codice deve essere:
Private Sub ClearButton_Click ()
PadText.Text = ""
PadText.SetFocus ritorna il focus alleditor
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 listruzione: PasteButton.Enabled = True. Vale, allinizio la stessa regola, per Taglia e Cancella Tutto, per questo in PadText si può sfruttare levento 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
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 limmagine negli Appunti
SetData Incolla limmagine negli Appunti
GetFormat Preleva il formato (testo o immagine) negli Appunti
SetText Incolla il testo negli Appunti
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 loggetto 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 allavvio delleditor, 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 allinterno 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).
È 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
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 dellapplicazione. È inoltre possibile utilizzare le descrizioni dei comandi, che consentono di visualizzare il nome di ciascun pulsante al semplice passaggio del mouse sul pulsante stesso. Levento click su questi pulsanti deve essere uguale allevento 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
È generato quando lutente preme semplicemente un pulsante del mouse in un determinato punto del form, della PictureBox e della Label; per levento 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
È generato quando un pulsante del mouse è rilasciato.
È 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")
Lesempio 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. Lapplicazione possiede due caselle di testo e due menu Copia ed Incolla, quando lutente seleziona del testo è necessario determinare a quale casella lutente 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 lapplicazione con Forms.Count.
La casella di messaggio visualizza una stringa e lutente 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 dallutente:
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 dinput da parte dellutente.
RetString$ = InputBox$ (prompt$ [,titolo$ [,default$ [,x% [,y%]]]])
dove gli argomenti hanno il seguente significato:
RetString$ la stringa digitata dallutente nella casella
prompt$ il tipo dinput atteso
default$ stringa di default, se lutente non specifica una risposta diversa
x%, y% posizione della casella in twip rispetto allangolo superiore sinistro
Per dimostrare questo funzionamento, si usa la funzione:
RetVal = Shell (comando$ [,tipofinestra$])
dove gli argomenti hanno il seguente significato:
comando$ nome dellapplicazione 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 lID dellapplicazione.
Disegnare il menu.
Caption Name
&File FileMenu
Ese&gui... RunItem
- Separator
&Esci ExitItem
Siccome ci sono i tre punti lutente si aspetta una finestra di dialogo dove digitare il nome dellapplicazione 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
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, lutente non potrà effettuare nessuna operazione prima di aver soddisfatto la richiesta di questa finestra. Levento che provoca la visualizzazione della finestra di dialogo è RunItem_Click() della voce File/Esegui... doppio clic su questa opzione compare il codice dellistruzione 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. Listruzione per visualizzare e caricare un nuovo form è:
Form1.Show [modal%]
- modal = 0, lutente può usare altri Form, mentre Form1 è visualizzato;
- modal = 1, tutte gli altri form dellapplicazione 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 lapplicazione 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
Serve a personalizzare gli aspetti di unapplicazione. 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 dellapplicazione
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
Lunità di misura di default in Visual BASIC è il twip, che equivale ad 1/1440 di pollice. Per modificare laltezza 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 allestremità superiore sinistra, tutte le proprietà possono assumere valori compresi tra 0 e 32767.
Max, è il valore che si assegna allestremità inferiore destra.
Value, è il valore corrente che corrisponde alla casella che si muove allinterno della barra, Min <= Value <= Max.
LargeChange, indica lentità della modifica subita da Value ogni volta che lutente fa clic nella barra.
SmallChange, indica lentità della modifica subita da Value ogni volta che lutente fa clic sulle frecce.
Levento principale correlato alle barre di scorrimento è levento Change, che si verifica ogni volta che la casella è spostata; tuttavia, in questo caso si vuole che le modifiche abbiano effetto solo quando lutente 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 lutente 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;
limpostazione 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 allutente 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.
Linterfaccia MDI (Multiple Document Interface) è stata progettata appositamente per applicazioni orientate a documenti. Licona 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 luso di un solo form MDI per applicazione. Inserisci/Form MDI
Oggetto Proprietà Impostazione
Form1 MDIChild True
Form2 MDIChild True
Quando si esegue lapplicazione, 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.
Lesempio illustra il passaggio di form alle routine, si tratta di unopzione 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. Lapplicazione deve gestire quattro form, facendo clic lutente 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 dellangolo superiore sinistro di ciascuno di essi fra una chiamata e laltra 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.
Lo scopo è quello di consentire allutente di fare clic su un controllo e di trascinarlo. Si utilizza la proprietà DragMode e levento 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.
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).
Levento DragDrop: si verifica quando un controllo è rilasciato su un oggetto.
Levento DragOver: si verifica quando un controllo è trascinato su un oggetto.
La proprietà DragIcon: indica licona da utilizzare quando lutente trascina un controllo.
Può essere impostata a manuale (0, default), o automatico (1) per controllare il trascinamento dei controlli. Se è automatico, lutente 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 lutente 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
Loperazione successiva consiste nel rispondere quando lutente rilascia il pulsante del mouse, posizionando la Label; levento 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 lesecuzione, 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 lesecuzione 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.
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, nellevento 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 unetichetta, eccetto lultima), a questo scopo si usa levento:
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
Il controllo Timer è collegato al trascorrere del tempo, per esempio il controllo dellorologio 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 lutente 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 dellutente, nellesempio 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 lorologio, produce levento Timer, il codice è il seguente:
Private Sub Timer1_Timer ()
If (Time$ >= AlarmSetting.Text And AlarmOn) Then Beep
Display.Caption = Time$
End Sub
Allorario 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. Lultima istruzione aggiorna il display. Alarm Off deve essere attivo quando lutente avvia lorologio. 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 larray, 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
Cancellare i due pulsanti; la proprietà Caption della singola voce di menu permette di modificare la voce stessa durante lesecuzione. 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
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
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 "Ricerca del valore 8 nell'elenco ordinato"
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 lordinamento 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 " i Array(i)"
Print "--- --------"
For i = 1 To 9
Print i, Array(i)
Next i
Call SortQuick(Array(), 1, UBound(Array, 1))
Print "Ordinamento..."
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
È 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 dellarea di disegno in twip;
ScaleHeight larghezza dellarea di disegno;
DrawWidth dimensione delloggetto grafico, per default un pixel.
[oggetto.]PSet [Step] (x,y) [,Color&]
dove largomento 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)
Esistono due possibilità:
lo strumento Line, usato però per impostare laspetto 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 lanimazione e la crittografia.
Esistono due possibilità:
lo strumento Shape, usato però per impostare laspetto 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 lalto
5 Diagonali verso il basso
6 Intreccio
7 Intreccio diagonale
Lopzione 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 allinterno 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
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 dellangolo superiore sinistro sono impostate a (xalto, ysinistra) e quelle dellangolo 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 limmagine dopo che la finestra è stata ridotta ad icona o coperta da unaltra applicazione. Il modo più efficace è mettere tutto il codice per la grafica allinterno di Form_Paint(). Unalternativa, senza usare codice, è utilizzare la proprietà Autoredraw = True con un enorme impegno di memoria.
Lunità 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 dallutente, 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 sullasse delle ascisse, 240 twip sullasse 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 dallangolo 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)
È 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 dellimmagine caricata e ponendo Stretch = True se ne possono modificare le dimensioni anche dopo il caricamento dellimmagine.
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 limmagine disegnata allinterno 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 unimmagine da un oggetto allaltro: Set Picture1.Picture = Picture2.Picture
Rimuovere unimmagine: Set Picture1.Picture = LoadPicture ("")
La proprietà Left indica la distanza tra langolo superiore sinistro del controllo e il lato sinistro del form. La proprietà Top indica la distanza tra langolo superiore sinistro del controllo e la parte inferiore del form.
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
Lideale per le animazioni è realizzare limmagine bitmap, quindi caricarla in Image tramite la proprietà Picture. Nella terminologia tecnica, limmagine è 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 licona dellastronave allapplicazione si usa la proprietà del form di nome Form1.Icon = sprite1.ico.
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 lasse 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 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
Lesempio 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
Allinterno 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
Si usa il metodo:
Private Sub Form_Load ()
Form1.PrintForm
End Sub
che consente si stampare unintero 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 alloggetto Printer, che corrisponde alla stampante di default di Windows.
Private Sub Form_Load ()
Printer.CurrentX = 1440 posiziona loutput di stampa
Printer.CurrentY = 2880
Printer.FontName = "Courier"
Printer.FontUnderline = True
Printer.Print "..."
Printer.NewPage
End Sub
Si aggiunge il supporto dei file allapplicazione editor1.vbp. Si inizia dalla voce Apri...
Selezionare la Common dialog nella ToolBox.
Posizionarla nel form, durante lesecuzione non è visibile.
Doppio clic ed inserire il codice.
Sub LoadItem_Click ()
È importante sapere se lutente ha fatto clic sul pulsante Annulla; per questo motivo, si utilizzerà lerrore 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 lestensione per i file visualizzati inizialmente nella finestra di dialogo.
CMDialog1.Filter = "Solo testo | *.txt"
Inoltre è possibile specificare le impostazioni per lapertura ed il salvataggio dei file.
OFN_READONLY Seleziona la casella Sola lettura.
OFN_OVERWRITEPROMPT Messaggio se il file esiste, lutente 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 Lutente può specificare solo un percorso valido.
OFN_CREATEPROMPT Richiede se lutente vuole creare il file se non esiste.
OFN_SHAREWARE Ignora lerrore 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 lutente 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 lerrore.
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 luso del pulsante Selezione.
PD_NOPAGENUMS Non consente luso 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 lutente 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 luso 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.