Aprire un file di testo
Sfruttiamo uno di questi
dialog per realizzare un semplice programma per leggere i file di tipo testo.
Chiameremo il nostro progetto “TxtExplorer”, quindi al momento del salvataggio
daremo questo nome al file di progetto mentre alla unit principale il nome “UTxtExplorer”.
Volendo possiamo usare lo stesso nome anche per la proprietà “Name” della form
principale, “FormTxtExplorer”. Questa è la tecnica che si utilizza di solito, in
questo modo se un progetto è formato da più form si intuisce subito quale unit è
la principale, quella che ha lo stesso nome del progetto, ma con suffisso “U”.
Centriamo la form a runtime e se volete inserite anche il componente per
modificare l’aspetto grafico, “TXPManifest”.
Ingrandiamo la nostra form e dalla tool palette, nella sezione “Standard”, prelevate il componente “TPanel” e posizionatelo sulla form, nell’object inspector selezionate la proprietà “Align” in questo modo:

vedrete subito che il componente si aggancia in basso e segue il resize della form a runtime. Infatti come si può intuire questa proprietà è l’allineamento dell’oggetto e leggendo le opzioni disponibili si capisce che è possibile agganciarlo su qualsiasi lato. Potete fare una prova al volo per vedere come si comporta, ma poi rimettete le cose come prima. Panel non è altro che un pannello contenitore con un effetto grafico di rilievo, ha alcune proprietà stilistiche che permettono di modificare il motivo del bordo (BevelEdges, BevelInner, BevelOuter, BevelKind) così da personalizzare l’effetto visivo. Provate alcune combinazioni per vedere l’effetto a runtime, noi per quello che ci serve lo useremo senza nessun effetto grafico, così da risultare invisibile a runtime:

capirete dopo perché serve invisibile. Ora posizionate nel riquadro del pannello un primo pulsante per chiudere il programma (e scriviamo il codice per uscire), poi un secondo che servirà per caricare il nostro file da visualizzare, che chiameremo “Browse...”. Posizionate sulla form anche il componente dialog che ci permette di leggere i file “OpenDialog” e nell’evento onClick del pulsante Browse scriviamo il codice per eseguire la finestra dialog.
La parte bassa della nostra form dovrebbe essere all’incirca così:

Inseriamo sulla nostra form anche il componente “TMemo”, prendendolo sempre dalla stessa sezione. Questo componente ci permette di visualizzare, scrivere e salvare del testo battuto sulla tastiera, noi lo useremo per visualizzare il file selezionato con la finestra dialog. Impostate la sua proprietà Align su alClient in modo che occupi tutto lo spazio disponibile della finestra che lo contiene, se non avessimo messo i pulsanti nel pannello venivano coperti risultando invisibili.
A questo punto abbiamo tutto quello che ci serve, ora dobbiamo passare il file letto dal dialog al componente memo. Il pulsante Browse per ora chiama solo la funzione Execute del dialog, però deve capire anche se l’utente preme il pulsante “Apri” di questa finestra. In effetti la funzione Execute di ogni dialog ritorna il valore True se viene premuto il pulsante “Apri”. Quindi verificando questa condizione possiamo sapere se l’utente ha scelto un file:
procedure TFormTxtExplorer.Button2Click(Sender: TObject);
begin
If OpenDialog1.Execute Then
Begin
End;
end;
Come abbiamo detto Execute ritorna True se viene scelto un file, il blocco If... Then verifica proprio questa condizione e se risulta True esegue tutto quello che c’è tra Begin ed End che segue. La cosa da fare ora è capire che file ha selezionato l’utente e inviarlo al componente TMemo, quindi abbiamo bisogno per prima cosa di una variabile di tipo stringa che memorizza il nome del file selezionato. L’oggetto OpenPictureDialog1 possiede molte proprietà tra le quali, come è ovvio che sia, il nome del file selezionato, questa proprietà si chiama “FileName”. Pertanto:
procedure TFormTxtExplorer.Button2Click(Sender: TObject);
VAR FileSelez : String;
begin
If OpenDialog1.Execute Then
Begin
FileSelez := OpenDialog1.FileName;
Caption := 'TxtExplorer - '+FileSelez;
End;
dove la seconda riga ci permette di visualizzare il nome del file anche nella caption della form. Ora che abbiamo il nome del file, per visualizzarlo facciamo uso della proprietà Lines del componente Memo, che gestisce il testo contenuto come faceva “Items” nel componente “ListBox”. Una delle proprietà è la procedura “LoadFromFile” che permette di caricare un file e visualizzarlo nel riquadro.
procedure TFormTxtExplorer.Button2Click(Sender: TObject);
VAR FileSelez : String;
begin
If OpenDialog1.Execute Then
Begin
FileSelez := OpenDialog1.FileName;
Caption := 'TxtExplorer - '+FileSelez;
Memo1.Lines.LoadFromFile(FileSelez);
End;
end;
Il codice evidenzia la procedura menzionata prima e il modo con cui gli viene passato il nome del file (compreso di percorso), in questo modo senza nessuna fatica per noi il contenuto del file viene visualizzato nel riquadro. Anche altri componenti utilizzano questa tecnica per leggere informazioni ed esiste anche il suo opposto, la procedura “SaveToFile” che permette di salvare il contenuto in un file.
Possiamo anche pensare di modificare il carattere utilizzato dal Memo, basta un ulteriore pulsante di fianco ai primi due e il dialog “TFontDialog”. Il nuovo pulsante si chiamerà “Carattere” e lancerà il dialog come abbiamo prima, cambiando solo il nome.
procedure TFormTxtExplorer.Button3Click(Sender: TObject);
begin
If FontDialog1.Execute Then
Memo1.Font := FontDialog1.Font;
end;
Subito dopo aver verificato che il pulsante “Ok” del dialog per i caratteri sia stato premuto, abbiamo scritto il codice per settare il font del Memo con quello selezionato dall’utente. Per fare in modo che il font visualizzato all’apertura del dialog sia lo stesso del visualizzatore di testo, basta inizializzare la proprietà Font del dialog con quella di Memo. Così:
procedure TFormTxtExplorer.Button3Click(Sender: TObject);
begin
FontDialog1.Font := Memo1.Font;
If FontDialog1.Execute Then
Memo1.Font := FontDialog1.Font;
end;
non credo ci sia niente da spiegare è abbastanza intuitivo. Se il contenuto è eccessivo non abbiamo la possibilità di sfogliare il testo infatti mancano le barre di scorrimento laterali, questo si risolve impostando la proprietà “ScrollBars” del componente Memo in questo modo:

Se provate a rilanciare il programma osserverete che entrambe le barre di scorrimento sono presenti con la possibilità implicita di usare la rotellina del mouse e con un menù locale già bello e fatto, provate.
Aprendo il dialog scopriamo però che possiamo selezionare qualsiasi tipo di file, ma noi abbiamo detto che questo componente visualizza solo i file di tipo testo. Se proviamo a caricare un file diverso da quello dichiarato scopriremo che non risulta leggibile, allora per ovviare a questo piccolo problema creeremo un filtro per evitare che il dialog visualizzi qualsiasi tipo di file, ma solo quelli di tipo testo. Tutti i dialog che accedono ai file hanno la possibilità di filtrare i dati visualizzati, questa operazione la si può fare in fase di editing selezionando la proprietà “Filter” del componente “OpenDialog” e premendo il piccolo pulsante con i tre puntini, che in gergo significa l’apertura di un’altra finestra.

In questa finestra bisognerà scrivere i vari filtri che la dialog utilizzerà, in “Filter Name” scriveremo il testo che comparirà nella lista a discesa della dialog mentre a destra, in corrispondenza di ogni voce, il filtro o i filtri che quella voce utilizzerà. Utilizzando più filtri per la stessa voce bisogna separarli con un “;”. Sembra complicato ma è più semplice di quello che si crede, ecco un po’ di esempi:
Tutti i formati *.exe;*.com;*.dll
Solo eseguibili *.exe
Tutti i tipi *.*
Alla fine la nostra finestra risulterà così:

Se premete il pulsante Browse a runtime vi accorgerete che la lista a discesa dei filtri è ora popolata con quelli che abbiamo scritto noi:

e finalmente verranno visualizzati solo quelli che vogliamo. Fatto questo possiamo pensare di dare la possibilità all’utente anche di salvare le eventuali modifiche fatte al testo visualizzato, per fare questo però vorrei utilizzare una sorta di sicurezza, per evitare che venga modificato del testo senza precauzione.
Sempre sul nostro Panel inseriamo un componente “TCheckBox” e un altro pulsante, uno dopo l’altro, checkBox1 lo chiamiamo “Modifica testo” mentre il pulsante “Salva in...”. Dovrebbe venire così:

Impostiamo la proprietà “ReadOnly” di Memo su True, in modo da impedire che venga modificato il contenuto visualizzato (ReadOnly letteralmente significa “sola lettura”). Per far si che possa essere modificato il testo bisogna selezionare CheckBox1, quindi nell’evento onClick di questo oggetto scrivere:
procedure TFormTxtExplorer.CheckBox1Click(Sender: TObject);
begin
If CheckBox1.Checked
Then Memo1.ReadOnly := False
Else Memo1.ReadOnly := True;
end;
Si capisce che se si modifica la selezione su CheckBox1 si modifica anche la proprietà di sola lettura di Memo. Per salvare il testo bisogna usare un altro dialog “TSaveDialog”, quindi lo prendiamo dalla tool palette e lo posiamo sulla form. Il pulsante Salva ovviamente richiamerà questo dialog:
procedure TFormTxtExplorer.Button4Click(Sender: TObject);
begin
If SaveDialog1.Execute Then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
Il codice che segue salva il contenuto di Memo nel file indicato dall’utente, se il file non esiste lo crea altrimenti sovrascrive a quello esistente. A proposito di sovrascrive sarebbe più opportuno avvertire l’utente quando si sta per sovrascrivere un file già esistente, pertanto nella proprietà “Options” della dialog “SaveDialog” selezionare:

Così se si seleziona un file dalla finestra di salvataggio che già esiste verrà avvertito. Ma io vorrei anche il pulsante disabilitato quando Memo è a sola lettura, allora modifichiamo la procedura dell’evento onClick di CheckBox1:
procedure TFormTxtExplorer.CheckBox1Click(Sender: TObject);
begin
If CheckBox1.Checked
Then Begin
Memo1.ReadOnly := False;
Button4.Enabled := True;
End
Else Begin
Memo1.ReadOnly := True;
Button4.Enabled := False;
End;
end;
La proprietà Enabled di un componente serve ad abilitarlo o disabilitarlo in qualsiasi momento, per un controllo più diretto del funzionamento. Ma bisogna disabilitarlo anche quando viene lanciato il programma, quindi nell’evento onCreate della form scriviamo:
procedure TFormTxtExplorer.FormCreate(Sender: TObject);
begin
Button4.Enabled := False;
end;
Se non riuscite a focalizzare la form usate la lista a discesa dell’object inspector:

Ora mi sembra che vada piuttosto bene, ma se apriamo la finestra di salvataggio la lista dei filtri è vuota, però possiamo scriverci dentro la stessa lista usata per OpenDialog. Sempre in onCreate della form:
procedure TFormTxtExplorer.FormCreate(Sender: TObject);
begin
Button4.Enabled := False;
SaveDialog1.Filter := OpenDialog1.Filter;
end;