Другие языки программирования и технологии

Delphi, вроде легкое дело, а что то я туплю

Этот опрос был, но этот более полный

Мне надо определить нужную строчку по буквам в ней. К примеру вот листбокс:
0. Вася Петров
1. Маша Петунина
2. Игорь Иванов
3. Петр Сидоров
Мне нужно найти строки где есть "Пет"(в данном случае 0, 1, 3). Как это делать?

позиции не знаю, там все заполняется рандомно.. . Можно выбирать несколько строк, суть в том что если в строке есть "1ур", то к переменной k прибавляется 5, если "2ур" то 10 и так далее до "4ур".
на самом деле проще, так как свойство Lines имеет тип TStrings, то можно вызвать все содержимое разом в виде одной строки и сразу прменить Pos.
то есть
..
uses
SysUtils, Classes;
..
function find_str( const SubStr: String; const List: TStrings ) : Integer;
var
P : Integer;
I : Integer;
begin
{изначально строка не обнаружена}
Result := -1;
{определяете позицию в стринглисте как в строке}
P := Pos( SubStr, List.Text );
{вычисляете строчку}
for I := 0 to ( List.Count - 1 ) do begin
{вычитаем длину строки листа из позиции в листе разложенном в строку}
Dec( P, Length( List[ I ] ) );
{позиция находится в строке в том случае, если вычитание ее длинны привело к отрицательному результату декремента}
if ( P <= 0 ) then begin
Result := I;
Exit;
end;
end;
end;
Однако так вы найдете только однократное вхождение, чтобы найти все вхождения нужно развить предыдущую функцию, указав начальный элемент и данную функцию в цикле до тех пор, пока все строки не будут осмотрены.
function FindStrInList( const SubStr: String; const List: TStrings; var StartPos: Integer ) : Integer;
var
P : Integer;
C : Integer;
Str : String;
I : Integer;
begin
Result := -1;
C := Length( List.Text ) - StartPos;
if ( C <= 0 ) then Exit;
Str := Copy( List.Text, StartPos, C );
P := Pos( SubStr, Str );
for I := 0 to ( List.Count - 1 ) do begin
if ( C > 0 ) then
Dec( C, Length( List[ I ] ) )
else
Dec( P, Length( List[ I ] ) )

if ( ( P + C ) <= 0 ) then begin
Result := I;
StartPos := P + Length( SubStr ) - 1;
Exit;
end;

end;
end;

{На самом деле не так уж важно, как вы получите какой нибудь объект TStrings и какую-нибудь строку для поиска, может быть это будут поля класса}
procedure MainProc ( const SubStr: String; const List: TStrings );
var
P : Integer;
SP : Integer;
begin
{начинаем поиск от начала строки}
P := 0;
repeate
{ вызываем поиск пока находятся подстроки}
SP := FindStrInList( SubStr, List, P );
if ( SP > 0 ) then
SomeOut( SP );//Какой-нибудь вывод результата
until ( SP > 0 );
end;
Максат Нартаевич
Максат Нартаевич
5 479
Лучший ответ
Я, конечно понимаю, что Вы бы хотели видеть в ответе сразу готовый код :) но это ж надо сидеть, писать, думать. А нужно этио все таки Вам :) поэтому только мысль -

Берете первую строку листбокса и в цикле начинаете ее посимвольное сравнение на вхождение заданного слова. При нахождении такого вхождения (совпадения) заносите в какой нибудь счетчик позицию (номер данной строки лист бокса)
И так продолжается до конца списка листбокса.

Затем из счетчика выводятся те строки в которых найдено вхождение.
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils,Classes ;

procedure Find(List:TStringList; vol:String);
var I:integer;
Begin
for I := 0 to List.Count - 1 do
if Pos(vol,list.Strings) <> 0 then
Writeln('Index to list = ',i);
End;

Var
strin:TStringList;
begin
try
strin:=TStringList.Create;
strin.Add('a');
strin.Add('s');
strin.Add('a');
strin.Add('s');
strin.Add('a');
strin.Add('s');

Find(strin,'a');
Readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.