Come giocare con i file di testo in Visual Basic: il CIF editor
Quale e' il piu' classico dei classici usi dei file di testo? Semplice: salvarci i documenti scritti con un editor di testo.
Questo articolo vi spieghera' come ottenere un semplice editor di testi da VB... ma soprattutto vi insegnera' alcune basi di gestione dei file di testo in VB.
Il progetto di base, come appena detto, e' un editor di testi assimilabile al blocco note di zio Bill.... ha principalmente 3 comandi: salva, apri e elimina file.
Una volta aperto un form di VB e sufficientemente ingrandito si dispongano in bell'ordine (!) i seguendi oggetti:
- 1 textbox a cui sia stato abilitato il multi-line dalla finestra delle proprieta'
- 4 pulsanti
- 1 textbox piccola senza multi-line
- 1 combobox
Questi sono i componenti essenziali. io ho poi aggiunto un altro pulsante con una funzione che mi rendeva il numero di caratteri digitati.... piccola comodita' per quando mando un SMS (prima lo scrivo in un editor di testi e poi lo incollo nel form sul WEB e mi serviva sapere quanto era lungo....). Ma a voi non frega nulla :).
Per prima cosa vediamo come il CIF editor gestisce i percorsi e i nomi dei file.
Per aprire un file e' necessario indicarne il percorso completo di nome in un'apposita textbox.... ho predisposto che all'evento Form1_load nella textbox appaia la directory in cui e' situato il file CIFeditor.exe. Per fare cio' e' sufficiente 1 riga di codice:
text1.text = app.path
Una volta scritto il percorso con il nome del file, si potra' scegliere in una combobox l'estensione che si vorra' dare al file.
Alla fine il nome del file sara' composto da:
percorso + nome + "." + estensione
Basta assegnare ad ogni variabile il valore appropriato e il gioco e' fatto.
Il primo pulsante che analizziamo serve per aprire un file di testo (o un qualsiasi altro file, a patto che l'estensione sia compresa tra quelle inserite nella combobox; aggiungerne una e' estremamente semplice: basta modificare la proprieta' "List" nell'apposita finestra.
Visual basic mette a disposizione vari modi di apertura di un file: pensiamo a Random, Binary, Input, Output. Ognuno di questi ha poi appositi comandi che permettono di leggere testo dal file o di scriverci dentro dei dati (Input, Line input, Get, Put, Print, Write).
E' importante non sbagliare corrispondenza tra modi di apertura e comandi di I/O: cosi' facendo si genererebbero errori di modalita' file non valida.
Per leggere dati formattati in un certo modo e per fare si' che anche altri programmi possano leggere gli stessi dati senza alcuna differenza, nel CIFeditor ho utilizzato il comando "Line input" e ho aperto il file in modalita' "Input".
Il problema che mi ha tenuto per giorni e notti attaccato al monitor e' che Line input legge solo la prima riga del file che apro. O meglio: se tento di leggere un file scritto con l'istruzione (ecco, non comandi, istruzioni!) Write me lo legge e formatta correttamente, ma se tento di aprire un file scritto, ad esempio, col WordPad....
Queste poche righe di codice sono state la soluzione al problema:
Open file For Input As #1
Do
Line Input #1, variabile
tutto = tutto & variabile & vbCrLf
Loop Until EOF(1)
Close #1
testo1.Text = tutto
La prima riga serve per aprire di fatto il file (se il file non esiste lo crea, ma se non esiste che diavolo lo apriamo fare??).
Le righe dalla seconda alla quinta inclusa sono un ciclo di iterazione per falso (ovvero si ripetono fino a quando la condizione posta dopo l'until rimane falsa) e servono per leggere i dati (formattati) dal file che vogliamo aprire e per assegnarli ad una variabile (tutto).
Praticamente il ciclo funziona cosi':
- Assegna alla variabile di nome "variabile" il contenuto di una riga del file
- Assegna alla variabile "tutto" il valore della variabile stessa + il valore della variabile "variabile" + il carattere di newline (vbcrlf = chr(13)+chr(10) ovvero enter + feed line)
- ripete tutto fino alla fine del file (EOF=end of file | 1=ID univoco di un file aperto in VB. lo si assegna ad un file nel momento della sua apertura ( "... As #1")
Ho dovuto mettere il carattere di newline perche' altrimenti non avrebbe rispettato tutti gli "a capi" ma mi avrebbe messo in fila tutte le righe del file...... e addio formattazione.
L'ultima riga provvede all'assegnazioen della variabile "tutto" alla proprieta' Text dell'oggetto testo1. OVVERO: visualizza nellateztbox testo1 il contenuto del file :)
Il secondo pulsante che andiamo ad analizzare serve per salvare quello che noi scriviamo in testo1 in un file.
Il codice
Open file For Output As #1
Print #1, testo1.Text
Close #1
e' semplice applicazione della funzione Print.... si da' l'ID del file, la variabile et voila'! il file si crea se non esiste o si aggiorna se esiste gia'.
NB: e' importante chiudere sempre il file alla fine dell'utilizzo onde evitare errori.
Il terzo pulsante serve per cancellare un file salvato che non ci serve piu'. E' una semplice funzione di VB: Kill(nomefile) e il gioco e' fatto (ovviamente in nomefile ci va anche il percorso...).
Il pulsante per determinare la lunghezza del testo scritto contiene un'altra semplice funzione di VB Len(variabile) e fa apparire la lunghezza in una label grazie al codice 'label1.caption="La lunghezza e' " & len(variabile) & " caratteri." '. Tutto li'.
Ovviamente il progamma necessita delle migliorie (migliore gestione degli errori e delle estensioni, features varie.....) ma e' solo una dimostrazione.
Lascio a voi l'onore.
Bene... questa volta abbiamo finito..... i sorgenti per fare delle prove li trovate allegati all'articolo..... avete tutto per scrivere l'editor di testi del nuovo millennio :)
mantis_
Sorgenti
VERSION 5.00
Begin VB.Form Form1
Caption = "Cif editor"
ClientHeight = 8175
ClientLeft = 60
ClientTop = 345
ClientWidth = 9630
Icon = "main.frx":0000
LinkTopic = "Form1"
MaxButton = 0 'False
MouseIcon = "main.frx":0442
ScaleHeight = 8175
ScaleWidth = 9630
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton Command6
Caption = "Stampa"
Height = 495
Left = 4680
TabIndex = 10
Top = 960
Width = 1095
End
Begin VB.CommandButton Command4
Caption = "Lunghezza testo"
Height = 495
Left = 6000
TabIndex = 8
Top = 960
Width = 1095
End
Begin VB.CommandButton Command1
Caption = "Apri"
Height = 495
Left = 2040
TabIndex = 7
Top = 960
Width = 1095
End
Begin VB.TextBox testo1
Height = 6015
Left = 0
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 6
Top = 2160
Width = 9615
End
Begin VB.CommandButton Command5
Caption = "Esci"
Height = 495
Left = 7320
TabIndex = 5
Top = 960
Width = 1095
End
Begin VB.CommandButton Command3
Caption = "Elimina"
Height = 495
Left = 3360
TabIndex = 4
Top = 960
Width = 1095
End
Begin VB.CommandButton Command2
Caption = "Salva"
Height = 495
Left = 720
TabIndex = 3
Top = 960
Width = 1095
End
Begin VB.ComboBox Combo1
Height = 315
ItemData = "main.frx":0884
Left = 6480
List = "main.frx":08A9
TabIndex = 2
Top = 360
Width = 1215
End
Begin VB.TextBox Text1
Height = 315
Left = 120
TabIndex = 0
Top = 360
Width = 5775
End
Begin VB.Label Label2
Height = 255
Left = 2280
TabIndex = 9
Top = 1680
Width = 4455
End
Begin VB.Label Label1
Caption = "."
Height = 255
Left = 6120
TabIndex = 1
Top = 600
Width = 135
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'CIF EDITOR by mantis_
'Ogni tentativo di non modifica del presente codice e' severamente vietato
'**********************************************************************************
Public Sub Command1_Click()
If Text1.Text = App.Path Then
MsgBox "Omissione del nome del file", vbCritical, "ERRORE"
Else
Dim nome As String
Dim est As String
Dim file As String
Dim punto As String
est = Combo1.Text
nome = Text1.Text
punto = "."
file = nome + punto + est
If Dir(file) = "" Then
MsgBox "File non trovato", vbOKOnly, "Errore"
Else
Open file For Input As #1
Do
Line Input #1, variabile
tutto = tutto & variabile & vbCrLf
Loop Until EOF(1)
Close #1
testo1.Text = tutto
End If
End If
End Sub
Private Sub Command2_Click()
Dim nome As String
Dim est As String
Dim file As String
Dim punto As String
If Text1.Text = App.Path Then
MsgBox "Omissione del nome del file", vbCritical, "ERRORE"
Else
est = Combo1.Text
nome = Text1.Text
punto = "."
file = nome + punto + est
Open file For Output As #1
Print #1, testo1.Text
Close #1
End If
End Sub
Private Sub Command3_Click()
If Text1.Text = App.Path Then
MsgBox "Omissione del nome del file", vbCritical, "ERRORE"
Else
Dim nome As String
Dim est As String
Dim file As String
Dim punto As String
est = Combo1.Text
nome = Text1.Text
punto = "."
file = nome + punto + est
Kill (file)
End If
End Sub
Private Sub Command4_Click()
Dim test As String
test = testo1.Text
Dim lunt As Integer
lunt = Len(test)
Label2.Caption = "La lunghezza del testo digitato Ë di " & lunt & " caratteri."
End Sub
Private Sub Command5_Click()
End
End Sub
Private Sub Command6_Click()
Open "lpt1:" For Output As #1
Print #1, Text1.Text & vbCrLf & vbCrLf & testo1.Text
Close #1
End Sub
Private Sub Form_Load()
percorso$ = App.Path
Text1.Text = percorso
End Sub
Private Sub Form_Resize()
If Form1.Height > 8580 Then Form1.Height = 8580
If Form1.Width > 9750 Then Form1.Width = 9750
End Sub