Originariamente inviato da 123delphi321
la soluzione del listbox, certamente e' valida, ma il mio problema e' quello di dividere una stringa in tutte le sue parole.
ad esempio la seguente stringa: 'uno due tre'
esiste una funzione che mi dice che ci sono 3 parole?
cioe' che riconosce il numero di token e mi dica il token 1="uno"....?
Potresti sfruttare una funzionalità (per certi versi nuova, aggiunta a Delphi 7) della classe TStringList.
La classe TStringList memorizza al proprio interno una lista di stringhe, rappresentate comunque sottoforma di stringa unica con ritorni a capo per separare i singoli elementi.
La StringList possiede le proprietà Delimiter e DelimitedText che consentono di suddividere una stringa in più stringhe "virtuali".
Spiego tutto con un esempio pratico:
codice:
procedure TDemoForm.bbTokenizeClick(Sender: TObject);
var
SL: TStringList;
begin
SL := TStringList.Create;
try
SL.Delimiter := ' ';
SL.DelimitedText := edStrings.Text;
lblTokenCount.Caption := IntToStr(SL.Count);
lbxTokens.Items.Text := SL.Text;
finally
SL.Free;
end;
end;
Questo codice viene richiamato alla pressione del pulsante che avvia il processo di interpretazione del testo allo scopo di contarne e suddividerne le parole.
Viene creata un'istanza di TStringList: essa contiene internamente un testo (lungo fino a 2GB) che può essere letto e impostato attraverso la proprietà Text; se questo testo contiene dei ritorni a capo, essi vengono interpretati ed è possibile sfruttare questa elaborazione per vedere il testo nella sua interezza come una lista di "linee" di testo, separate appunto da ritorni a capo.
E' possibile impostare il testo usando la proprietà DelimitedText, come illustrato sopra: in questo caso, la proprietà Delimiter di tipo Char deve contenere il carattere che rappresenta il "separatore", il quale verrà sostituito dal ritorno a capo per spezzarne il testo in più righe.
Nell'esempio, il separatore viene impostato ad uno spazio vuoto, quindi viene assegnato alla proprietà DelimitedText il valore proveniente da una casella di testo TEdit (che magari contiene "uno due tre"); interpretando lo spazio come separatore, la StringList riempie la rappresentazione testuale interna con una stringa in cui il separatore è tramutato in ritorni a capo consentendo così di ispezionare le singole parole come elementi distinti; la proprietà Count determina il numero degli elementi caricati (3, in questo caso).
Il numero degli elementi viene visualizzato in una Label mentre le parole vengono assegnate alla proprietà Items di una ListBox per la visualizzazione su schermo, ma era possibile ispezionare la singola parola scrivendo pure qualcosa simile all'esempio che segue:
codice:
procedure TDemoForm.bbTokenizeClick(Sender: TObject);
var
SL: TStringList;
i: Integer;
begin
SL := TStringList.Create;
try
SL.Delimiter := ' ';
SL.DelimitedText := edStrings.Text;
for i := 0 to SL.Count - 1 do
ShowMessage(SL[i]);
finally
SL.Free;
end;
end;
Qui vengono visualizzate, una dopo l'altra, le singole parole all'interno di una finestra semplice di dialogo.
Da notare come sia veramente ridotta la quantità di codice da scrivere.