Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

разбивка строки на слова   Найти похожие ветки 

 
denis24   (2004-10-22 09:41) [0]

В сабже использую строку с эдита.Смотрю в дебугере ,там идет строка "1,2,3"
В цикле
while i<=Length(t)+1 do
   begin
   c:=t[i];
       .
       .
       .
Первый символ этой строки "#0".Почему?


 
Johnmen ©   (2004-10-22 09:56) [1]

Потому, что
1. Надо читать внимательно хелп. По string.
2. Надо задавать вопросы, не приводя общипанный кусок кода, а реальный полны код.


 
denis24   (2004-10-22 10:31) [2]

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;


 
П7   (2004-10-22 10:38) [3]

i := 1;

Символы в строке начитаются с 1 индекса...


 
Rem ©   (2004-10-22 10:38) [4]

procedure StringToWords(const T: string; const List: TStrings = nil);
begin
 if Assigned(List) then
 begin
   List.Delimiter := ",";
   List.DelimitedText := T;
 end;
end;


 
П7   (2004-10-22 10:42) [5]

Я использую вот такую не хитрую функцию, которая не зависит от всяких там левых модулей. Не быстро, но для моих целей очень удобно, каждый раз возвращает один кусок ДО разделителя и обрезает в основном тексте этот кусок и разделитель.

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;


 
denis24   (2004-10-22 11:07) [6]

Спасибо  to REM
Еще вопрос.Как организовать удаление повторяющихся значений в заполняемом таким образом srtingList.


 
Symb   (2004-10-22 11:28) [7]

В StringList не нужно ничего удалять. Просто перед заполнением у него надо выставить свойство Sorted в true, а Duplicates в dupIgnore. Тогда дублирующиеся строки он просто не будет добавлять.


 
denis24   (2004-10-24 17:02) [8]

Почему если я делаю сабж
procedure StringToWords(const T: string; const List: TStringlist = nil);
begin
if Assigned(List) then
begin

  List.Delimiter := ";";
  List.DelimitedText := T;

end;
end;
Мне побел между словами тоже воспринимает за символ-разделитель и соответственно разделяет на слова?


 
Yuri-7   (2004-10-24 23:20) [9]

strings.CommaText:=Edit1.Text; и в Strings - все слова.


 
ЮЮ ©   (2004-10-25 03:41) [10]

потому что " " является вторым 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);

т.е. "нарвавшись" на пробел мы, похоже, получаем новый элемент в списке



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.062 c
3-1097401586
StoneFace
2004-10-10 13:46
2004.11.07
Delphi и MS SQL Server 2000


14-1098293517
Knight
2004-10-20 21:31
2004.11.07
Вот сколько в Delphi пользуюсь и только сейчас возник вопрос...


14-1098172165
sanek_
2004-10-19 11:49
2004.11.07
HELP


1-1098580172
rerty
2004-10-24 05:09
2004.11.07
Win 98 -> XP, 2000(2003)


1-1098426203
kj
2004-10-22 10:23
2004.11.07
TService.LogMessage()