Jeg har laget en mere avansert funksjon:
// Hvis bBreakOnFirstFind er True, resulteres antall treff, og index'en til linjene blir lagt til FoundOutput.
// Ellers returner index'en til linjen
// Returnerer -1 hvis ingen treff
function StringSearch(SubStr: String; S: TStrings; bWholeSentence, bCaseSensitive,
bBreakOnFirstFind: Boolean; FoundOutput: TStrings = nil): Integer;
var
iItemsCount: Integer;
bFound: Boolean;
slFoundItems: TStringList;
begin
if FoundOutput <> nil then
FoundOutput.Clear;
slFoundItems := TStringList.Create;
iItemsCount := -1;
while iItemsCount < S.Count - 1 do
begin
Inc(iItemsCount);
bFound := False;
if bCaseSensitive then
begin
if bWholeSentence and (S.Strings[iItemsCount] = SubStr)
or not bWholeSentence and (Pos(SubStr, S.Strings[iItemsCount]) > 0) then
if not bFound then
bFound := True;
end
else
begin
if bWholeSentence and (LowerCase(S.Strings[iItemsCount]) = Lowercase(SubStr))
or not bWholeSentence and (Pos(Lowercase(SubStr), Lowercase(S.Strings[iItemsCount])) > 0) then
if not bFound then
bFound := True;
end;
if bFound then
begin
if bBreakOnFirstFind then
begin
Result := iItemsCount;
Break;
end
else
slFoundItems.Add(IntToStr(iItemsCount));
end
else
if bBreakOnFirstFind then
Result := -1;
end;
if not bBreakOnFirstFind then
begin
if FoundOutput <> nil then
FoundOutput.AddStrings(slFoundItems);
if slFoundItems.Count > 0 then
Result := slFoundItems.Count
else
Result := -1;
end;
slFoundItems.Free;
end;
Eksempel på hvordan det kalles:
Søker i ListBox2s Items, og viser antall treff, og hvilke linjer treffene ble funnet på:
procedure TForm1.Button1Click(Sender: TObject);
var
sSearchStr: String;
iIndex: Integer;
bCaseSensitive,
bWholeSentence,
bBreakOnFirstFind: Boolean;
slOutput: TStringList;
begin
// Skill mellom store og små bokstaver
bCaseSensitive := False;
// Må hele setningen være lik?
bWholeSentence := False;
// Stopp ved første treff
bBreakOnFirstFind := False;
// Hva vi skal søke etter
sSearchStr := ListBox1.Items.Strings[ListBox1.ItemIndex];
slOutput := TStringList.Create;
iIndex := StringSearch(sSearchStr, ListBox2.Items, bWholeSentence, bCaseSensitive, bBreakOnFirstFind, slOutput);
if iIndex > -1 then
ShowMessage(Format('Strengen ble funnet ved %d treff på følgende linjer:'#13#10'%s', [iIndex, slOutput.Text]))
else
ShowMessage('Strengen ble ikke funnet!');
slOutput.Free;
end;
Søker i ListBox2s Items og viser linjen strengen ble funnet på:
procedure TForm1.Button1Click(Sender: TObject);
var
sSearchStr: String;
iIndex: Integer;
bCaseSensitive,
bWholeSentence,
bBreakOnFirstFind: Boolean;
begin
// Skill mellom store og små bokstaver
bCaseSensitive := False;
// Må hele setningen være lik?
bWholeSentence := False;
// Stopp ved første treff
bBreakOnFirstFind := True;
// Hva vi skal søke etter
sSearchStr := ListBox1.Items.Strings[ListBox1.ItemIndex];
iIndex := StringSearch(sSearchStr, ListBox2.Items, bWholeSentence, bCaseSensitive, bBreakOnFirstFind, nil);
if iIndex > -1 then
ShowMessage(Format('Strengen ble funnet på linje %d', [iIndex]))
else
ShowMessage('Strengen ble ikke funnet!');
end;
Håper du kan bruke det!
-------------------------------------
I am AGAINST TCPA!!
[
http://www.againsttcpa.com/ ]
-------------------------------------
Mvh
DiZpel