![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Спасибо! Все работает!
|