Ciao
per la lettura di un file puoi evitare l'approccio classico reset/readln a meno che tu non si a costretto per fare elaborazioni particolari
Puoi usare ad esempio TStringList (che discende da TStrings) e con una unica istruzione leggi tutto il file
ad esempio
procedure Leggi;
var sl: TStringList;
begin
sl:=TStringList.Create;
try
sl.LoadFromFile('nomefile.txt');
ShowMessage('righe lette: ' + IntToStr(sl.Count));
finally
sl.Free;
end;
end;
per popolare una listbox, basta far caso al fatto che la proprietà Items discende anch'essa da TStrings
e quindi:
...
ListBox1.Items.LoadFromFile('nomefile.txt');
...
Ciao
nomorelogic
Purtroppo non riesco a trovare sul web un esempio concreto (cioè dall'inizio alla fine) sull'apertura / lettura di un file.
Problema:
Aprire un banale file di testo e trasferire in una ListBox il suo contenuto.
1) Come rendere visibile (e ovviamente selezionare directory e file )la classica finestra di dialogo OpenDialog?
2) Come aprire correttamente un file per esaminare il contenuto?
1a) Come si può notare dai due screenshot, riesco a leggere il file, ma sono costretto a farlo in maniera diretta (cfr: NomeFile:= 'D:\IlMioFile.txt') dato che non sono riuscito a visualizzare la finestra di dialogo.
2a) Evidentemente manca qualcosa prima / dopo: FileOpen('D:\IlMioFile.txt',1)
Nonostante la brevità del programma, allego qui di seguito il sorgente (ovviamente stravolto a causa della traduzione automatica in italiano 😉) .
Grazie a chi vorrà aiutarmi, anche indicandomi semplicemente un link ove trovare un esempio semplice e COMPLETO (quelli che ho trovato sono indicazioni generiche, non soddisfacenti).
Per visualizzare la finestra di dialogo, esegui la funzione "Execute" del componente:
if OpenDialog1.Execute then
begin
//Qui esegui qualcosa se l'utente ha selezionato un file
//Nella proprietà OpenDialog1.FILES c'è l'elenco dei file che l'utente ha selezionato.
end
else
begin
//Qui esegui qualcosa se l'utente ha premuto il tasto "annulla"
end;
Per la lettura invece segui il consiglio di @nomorelogic.
P.S.: Non usare il "DoShow", è chiamato internamente dalla "Execute". Quel metodo, a mio personalissimo parere, non dovrebbe essere esposto pubblicamente. Ripeto, mio personalissimo parere.
Ciao
P.S. E per creare un file di testo in cui trasferire il contenuto di una ListBox? (Chiedo troppo, lo so...).
Usa il componente "TSaveDialog" (similmente a quanto fai con "TOpenDialog") e poi usi la funzione:
ListBox1.Items.SaveToFile(nomefile, .....);
dove "nomefile" è il nome ritornato dalla TSaveDialog.
Ciao
Intanto, @AlexLazarus e @giacomarko, cercate di usare il "code" (il diesis o cancelletto) per identificare il codice.
....
Esattamente come avevi fatto all'inizio .... aprendo il file e leggendolo con readln:
procedure TForm1.Button1Click(Sender: TObject);
Var
NomeFile, Elemento: string;
F: system.Text;
begin
ListBox1.Clear;
if OpenDialog1.Execute then
begin
NomeFile := OpenDialog1.FIleName;
if FileExists(NomeFile) then
begin
AssignFile(F, NomeFile);
reset (F);
while Not EOF(F) Do
begin
ReadLn(F, Elemento);
//Qui testi la riga letta, la modifichi, etc .... poi la puoi inserire nella ListBox
ListBox1.Items.Add(Elemento);
end;
CloseFile(F);
end;
end
else
begin
//Qui esegui qualcosa se l'utente ha premuto il tasto "annulla"
end;
end;
Ora per la scrittura dovresti, sulla base di quanto sopra e quanto detto nei post, riuscire a cavartela ... un pò di esercizio e di spremitura di meningi fà bene .....
Comunque se hai problemi siamo qua.
Ciao
Questo per scrivere, caso mai avessi trovato problemi ... ;)
procedure TForm1.Button1Click(Sender: TObject);
Var
i: integer;
NomeFile, Elemento: string;
F: system.Text;
begin
ListBox1.Clear;
if SaveDialog1.Execute then
begin
NomeFile := SaveDialog1.FIleName;
try
AssignFile(F, NomeFile);
ReWrite(F);
for i := 0 to ListBox1.Items.Count -1 do
begin
Elemento := ListBox1.Items[i];
//Qui testi la riga letta, la modifichi, etc .... poi la puoi scrivere nel file
WriteLn(F, Elemento);
end;
except on e: exception do
ShowMessage(e.Message);
end;
CloseFile(F);
end
else
begin
//Qui esegui qualcosa se l'utente ha premuto il tasto "annulla"
end;
end;
Ciao