Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

разбивка строки на слова


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. Надо задавать вопросы, не приводя общипанный кусок кода, а реальный полны код.


Наверх

Титульная страница Поиск, карта сайта Написать письмо