![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбиение текста [D7, WinXP]
Newby © (2005-01-18 10:15:00)Вообщем есть текст типа (Hiall gohome stfuok) нужно зделать так, чтобы он был разбит на (Hiall), (gohome) и (stfuok), но пробелов между словами может любое кол-во..
Пробовал зделать с Copy, но там нужно знать скока будет пробелов.
default (2005-01-18 17:12:00) [21]
function StrDivParts(const S: String): TStrings;
var
i, j: Cardinal;
f: Boolean;
begin
Result := TStringList.Create;
j := 0;
f := False;
for i := 1 to Length(S) do
if S[i] <> ' ' then begin
Inc(j);
f:= True
end else if f then begin
Result.Add(Copy(S, i - j, j));
j := 0;
f := False
end;
if S[Length(S)] <> ' ' then Result.Add(Copy(S, i - j, j))
end;
или так
Александр Иванов (2005-01-18 15:55:00) [22]Newby (18.01.05 15:29) [5]
Семен Сорокин © (11.01.05 10:31) [6]
во еще вариант на рассмотрение :))
var
_text: string;
_i: integer;
begin
with TStringList.Create do
try
Delimiter := ' ';
DelimitedText := _text;
_text := EmptyStr;
for _i := 0 to Count-1 do
if Length(_text) < Length(Trim(Strings[_i])) then
_text := Trim(Strings[_i])
finally
Free
end
end;
В данном случае цикл по строкам просто лишний.
Newby (2005-01-18 15:29:00) [23]2 Александр
Иванов ссылка битая вроде...
2 PVOzerski
да забыл сказать, что код должен быть простым и наиболее быстро выполняемым, всёравно попробую.. thx..
2 Kerk
Ты ошибаешся,если интересно то я делаю клиента для WinLirc(программа которая ловит сигналы от самодельных ИК-портов). Вообще это моя первая программа за последнии 2 года(на делфи), но так как ничего подходящего ненашёл пришлось самому делать.
Буду рад помощи, а то порт уже как месяц собрал, а использовать могу тока в плэерах поддерживающих его =(
Kerk (2005-01-18 10:39:00) [24]Сабж смахивает на лабу с первого курса. Народ думать не хочет. :(
PVOzerski (2005-01-18 10:38:00) [25]вот тупой, не самый быстрый, но наглядный и эффективный путь.
Сейчас написал, проверил, вроде работает. Можешь еще добавить обработку ситуаций, когда new не срабатывает из-за нехватки памяти, конечно :^) Или переделать на tStringList, что еще лучше.
type
pWord=^tWord;
tWord=record
next:pWord;
w:string;
end;
function Split(s:string):pWord;
var
ww:pWord;
i:integer;
afterspace:boolean;
begin
Result:=nil;
afterspace:=true;
for i:=1 to length(s)do
if s[i]>' 'then //ну, или s[i]=' ', или s[i]in[ #9,' '] - см. сам
begin
if afterspace then
begin
ww:=Result;
new(Result);
Result.next:=ww;
Result.w:=s[i];
afterspace:=false;
end
else
Result.w:=Result.w+s[i];
end
else
afterspace:=true;
end;
Александр Иванов (2005-01-18 10:21:00) [26]Вам больше подойдет идея Семена Сорокина ©
Александр Иванов (2005-01-18 10:19:00) [27]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1105425565&n=0