![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
разбивка строки на слова
denis24 © (2004-10-22 09:41:00)В сабже использую строку с эдита.Смотрю в дебугере ,там идет строка '1,2,3'
В цикле
while i<=Length(t)+1 do
begin
c:=t[i];
.
.
.
Первый символ этой строки '#0'.Почему?
ЮЮ (2004-10-25 03:41:00) [1]потому что ' ' является вторым Delimiter-ом в коде
procedure TStrings.SetDelimitedText(const Value: string);
while (P^ > ' ')and (P^ <> Delimiter) do
{$IFDEF MSWINDOWS}
P := CharNext(P);
{$ELSE}
Inc(P);
{$ENDIF}
SetString(S, P1, P - P1);
т.е. "нарвавшись" на пробел мы, похоже, получаем новый элемент в списке
Yuri-7 (2004-10-24 23:20:00) [2]strings.CommaText:=Edit1.Text; и в Strings - все слова.
denis24 (2004-10-24 17:02:00) [3]Почему если я делаю сабж
procedure StringToWords(const T: string; const List: TStringlist = nil);
begin
if Assigned(List) then
begin
List.Delimiter := ';';
List.DelimitedText := T;
end;
end;
Мне побел между словами тоже воспринимает за символ-разделитель и соответственно разделяет на слова?
Symb (2004-10-22 11:28:00) [4]В StringList не нужно ничего удалять. Просто перед заполнением у него надо выставить свойство Sorted в true, а Duplicates в dupIgnore. Тогда дублирующиеся строки он просто не будет добавлять.
denis24 (2004-10-22 11:07:00) [5]Спасибо to REM
Еще вопрос.Как организовать удаление повторяющихся значений в заполняемом таким образом srtingList.
П7 (2004-10-22 10:42:00) [6]Я использую вот такую не хитрую функцию, которая не зависит от всяких там левых модулей. Не быстро, но для моих целей очень удобно, каждый раз возвращает один кусок ДО разделителя и обрезает в основном тексте этот кусок и разделитель.
function SplitString( sub : string; var str : string ) : string;
var
res : string;
cnt : integer;
sl : integer;
begin
cnt := Pos( sub, str );
sl := Length( sub );
if cnt > 0 then
begin
if sl > 1 then
res := '';
res := copy( str, 1, cnt - sl );
str := copy( str, cnt + sl, Length( str ) - ( cnt - sl - 1) );
end
else
begin
res := str;
str := '';
end;
Result := res;
end;
П7 (2004-10-22 10:38:00) [7]i := 1;
Символы в строке начитаются с 1 индекса...
Rem (2004-10-22 10:38:00) [8]
procedure StringToWords(const T: string; const List: TStrings = nil);
begin
if Assigned(List) then
begin
List.Delimiter := ',';
List.DelimitedText := T;
end;
end;
denis24 (2004-10-22 10:31:00) [9]StringToWords(edit1.Text),Words);
procedure StringToWords(const T:String;const List:Tstrings=nil);
var
i:integer;
s:string;
c:Char;
begin
i:=0;
s:='';
if t>'' then
begin
while i<=Length(t)+1 do
begin
c:=t[i];
if c<>',' then s:=s+c
else then Check;
i:=i+1;
end;
end;
end;
procedure Check();
begin
if (s<>'') then
begin
if List<>nil then List.Add(S);
end;
s:='';
end;
Johnmen (2004-10-22 09:56:00) [10]Потому, что
1. Надо читать внимательно хелп. По string.
2. Надо задавать вопросы, не приводя общипанный кусок кода, а реальный полны код.