![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Ситуация такая... Есть библиотека слов записанная например в lib.txt, которые мне нужно пытаться найти в тексте введенном в Мемо1. Помоги организовать =)
|
|
#2
|
||||
|
||||
|
Для поиска надо сделать сортировку слов. Если можно воспользоваться другим компонентом, то так:
Код:
Var List: TStringList;
Index: Integer;
begin
List := TStringList.Create;
List.Text := Memo1.Text;
List.Sort;
if List.Find('винт',Index) then MessageBox('Найдено в строке '+IntToStr(Index));Код:
procedure Sort(M: TMemo);
Var i,j: Integer;
S: String;
begin
for i := 0 to Memo1.Lines.Count - 1
do for j := i+1 to Memo1.Lines.Count - 1
do if Memo1.Lines[j] < Memo1.Lines[i]
then begin
S := Memo1.Lines[i];
Memo1.Lines[i] := Memo1.Lines[j];
Memo1.Lines[j] := S;
end;
end;
function Find(M: TMemo; S: String; var Index: Integer): Boolean;
function SubFind(M: TMemo; Min,Max: Integer; S: String): Integer;
begin
Result := -1;
if Max < Min then Exit;
Result := Min + (Max - Min) shr 1;
if S = M.Lines[Result] then Exit;
if S > M.Lines[Result]
then Result := SubFind(M, Result+1, Max, S)
else Result := SubFind(M, Min, Result-1, S);
end;
begin
Index := SubFind(M,0,M.Lines.Count-1,S);
end;
Var Index: Integer;
begin
Sort(Memo1);
if Find(Memo1,'винт',Index) then MessageBox('Найдено в строке '+IntToStr(Index));
end; |
|
#3
|
|||
|
|||
|
так с поиском разобрались, а как из ТХТ файла, в котором порядка 50 слов, выдергивать их по одиночке для поиска?
И можешь в крадце описать, что происходит в 1 и 2 кодах? Последний раз редактировалось deathor, 28.03.2009 в 23:18. |
|
#4
|
||||
|
||||
|
Ненадо выдергивать слова по одиночке, надо сразу загрузить в мемо содержимое текстового файла, т.к. и первый и второй варианты работают с уже загруженным списком. Загрузка реализуется методом самого компонента TMemo:
Код:
Memo1.Lines.LoadFromFile('c:\dictionary.txt');В первом варианте для поиска и сортировки используется компонет TStringList, собственно он и создан был для подобных операций. Сначала список сортируется, т.к. без этого невозможен корректный поиск методом Find. Во втором варианте делается тоже самое, что и в TStringList, только реализованы свои функции сортировки и поиска. Сортировку расписывать особо нечего, берется первый и следующий элемент, если первый элемент больше второго, то элементы меняются местами и так до конца списка. Это не самый быстрый способ сортировки, зато наиболее простой в реализации. С поиском тоже в принципе достаточно просто. Основное условие правильного поиска - обязательная сортировка. Берется список и сравнивается элемент из середины списка с поисковым значением. Если списочный элемент меньше, значит искомое слово находиться ближе к концу списка, если больше, то наоборот ближе к началу списка. Далее операция повторяется, только границы поисковые будут все время уменьшаться 1/2, 1/4, 1/8, 1/16 и т.д. пока не найдется нужный элемент. Данный способ сортировки очень быстр даже для очень больших списков. Если взять список в 100000 слов, то результат будет получен максимум за 16 проверок. |
|
#5
|
|||
|
|||
|
Что бы было понятно, что мне нужно провернуть скидываю код...
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, TLHelp32, PsAPI, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure GetProcessList(var sl: TStrings);
var
pe: TProcessEntry32;
ph, snap: THandle;
mh: hmodule;
procs: array[0..$FFF] of dword;
count, cm: cardinal;
i: integer;
ModName: array[0..max_path] of char;
begin
sl.Clear;
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
begin
snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
if integer(snap) = -1 then
begin
exit;
end
else
begin
pe.dwSize := sizeof(pe);
if Process32First(snap, pe) then
repeat
sl.Add(string(pe.szExeFile));
until not Process32Next(snap, pe);
end;
end
else
begin
if not EnumProcesses(@procs, sizeof(procs), count) then
begin
exit;
end;
for i := 0 to count div 4 - 1 do
begin
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false, procs[i]);
if ph > 0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
sl.Add(string(ModName));
CloseHandle(ph);
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tmp: TStrings;
begin
tmp := Memo1.Lines;
GetProcessList(tmp);
end;
procedure TForm1.Button2Click(Sender: TObject);
Var List: TStringList;
Index: Integer;
begin
List := TStringList.Create;
List.Text := Memo1.Text;
List.Sort;
Memo1.Text := List.text;
if List.Find('chrome',Index) then ShowMessage('Найдено в строках '+IntToStr(Index));
end;
end.ну а в ТХТ фале хранятся имена програм, которые нужно найти... |
|
#6
|
||||
|
||||
|
Понятно, замените в своем коде строчки:
Код:
sl.Add(string(ModName)); Код:
if List.Find('chrome',Index) then ShowMessage('Найдено в строках '+IntToStr(Index));Код:
sl.Add(ExtractFileName(string(ModName))); Код:
if List.Find('chrome.exe',Index) then ShowMessage('Найдено в строках '+IntToStr(Index)); |
|
#7
|
|||
|
|||
|
Спасибо. Конечно не совсем так, как я хотел, но всеже работает ) И как вместо chrome.exe вставить мои билиотечку из ТХТ?
|
|
#8
|
||||
|
||||
|
Т.е есть список имен программ имена которых надо предать анафеме и есть список запущеных процессов. Надо получить третий список в котором содержаться процессы преданные анафеме.
![]() Ну тогда можно так: Код:
procedure TForm5.Button2Click(Sender: TObject);
Var List1,List2: TStringList;
Index: Integer;
i: Integer;
begin
List1 := TStringList.Create;
List1.Text := Memo1.Text;
List1.Sort;
List2 := TStringList.Create;
List2.LoadFromFile('C:\BedProcess.txt');
for i := 0 to List2.Count - 1
do if List1.Find(List2.Strings[i],Index)
then ListBox1.AddItem(List2.Strings[i],nil);
end; |
|
#9
|
|||
|
|||
|
Спасибо! Все работает!
|