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

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

класс TStringList [D5, XP]


v_o_v_a ©   (2006-09-08 14:54:00) 

Здрасте. У класса TStringList есть метод Find. Можно както организовать поиск строки, если она извесна не полностью (предположим только начало или конец). Спасибо.


umbra   (2006-09-08 18:24:00) [1]

да лучше в процедуру вообще строку ( src.Text) передавать :), но надо ж это было к стринглисту привязять.


default   (2006-09-08 17:49:00) [2]

umbra ©   (08.09.06 17:01) [8]
в код не вникал
но, вначале s := src.Text; сделать обязан:)
а то очень непроизводительно каждый раз Text запрашивать


umbra   (2006-09-08 17:01:00) [3]

эх, позориться, так позориться :)
это точно работает!

TIntArray = array of Integer;
{...............................................}
procedure FindPattern(pattern: string; src: TStrings; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
SetLength(Indices, Length(Indices) + 1);
Indices[High(Indices)] := -1;
delimpos := 0;
repeat
   Inc(Indices[High(Indices)]);
   delimpos := PosEx(#13#10, src.Text, delimpos + 2);
until  delimpos >= matchpos;
matchpos := PosEx(pattern, src.Text, delimpos + 2);
Until matchpos = 0;
end;


umbra   (2006-09-08 16:46:00) [4]

дубль третий :)

type
TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
 SetLength(Indices, Length(Indices) + 1);
 Indices[High(Indices)] := -1
 repeat
    delimpos := 0;  
    Inc(Indices[High(Indices)]);
    delimpos := PosEx(#13#10, src.Text, delimpos + 2);
 until  delimpos >= matchpos;
 matchpos := PosEx(pattern, src.Text, delimpos + 2);
Until matchpos = 0;
end;


umbra   (2006-09-08 16:23:00) [5]

таки есть опечатки :)

type
TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
matchpos, delimpos, counter: integer;
begin
delimpos := 0;
counter := 0;
matchpos := PosEx(pattern, src.Text);
if matchpos = 0 then exit;
repeat
  SetLength(Indices, Length(Indices) + 1);
  Indices[High(Indices)] := -1
  repeat  
     Inc(Indices[High(Indices)]);
     delimpos := PosEx(#13#10, src.Text, delimpos);
  until  delimpos >= matchpos;
  matchpos := PosEx(pattern, src.Text, matchpos);
Until matchpos = 0;
end;


umbra   (2006-09-08 15:51:00) [6]

вот, например, процедура, возвращающая в параметре Indicesиндексы элементов стринглиста, в которых есть подстрока. Длина этого массива равна количеству таких элементов. Процедура не ищет пустых строк, но это поправимо. Не тестировал, возможны опечатки :)

type
 TIntArray: array of Integer;
{....................................................}
procedure FindPattern(pattern: string; src: TStringList; out Indices: TIntArray);
var
 matchpos, delimpos, counter: integer;
begin
 delimpos := 0;
 counter := 0;
 matchpos := PosEx(pattern, src.Text);
 if matchpos = 0 then exit;
 repeat
   SetLength(Indices, Length(Indices) + 1);
   Indices[High(Indices)] := -1
   repeat  
      Inc(Indices[High(Indices)]);
      delimpos := PosEx(ItemDelimiter, src.Text, delimpos);
   until  delimpos >= matchpos;
   matchpos := PosEx(pattern, src.Text, matchpos);
 Until matchpos = 0;
end;


han_malign   (2006-09-08 15:20:00) [7]


> второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.

Strings[Index - 1] < searchStr <= Strings[Index]
check (Index > 0)                      check (Index < Count)


Наиль   (2006-09-08 15:13:00) [8]

Только для начала строки.
Но перед этим список должен быть отсортирован.
CaseSensitive определяет учитывать ли регистр.
Если Find=true значит полное совпадение. Если нет, то смотри второй параметр (Index) он указывает на позицию предшествующую наиболее подходящему слову.


v_o_v_a   (2006-09-08 15:12:00) [9]

Жаль, что нельзя. спасибо


Dmitrij_K   (2006-09-08 15:05:00) [10]

Методом Find - нет.
Можно самому перебирать все строки и сравнивать по условию или
масками Masks.pas
или регулярным выражением TRegExpr


Наверх

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