Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.03.2009, 20:16
deathor deathor вне форума
Прохожий
 
Регистрация: 25.11.2008
Сообщения: 34
Репутация: 10
По умолчанию Поск слов из списка в MEMO

Ситуация такая... Есть библиотека слов записанная например в lib.txt, которые мне нужно пытаться найти в тексте введенном в Мемо1. Помоги организовать =)
Ответить с цитированием
  #2  
Старый 28.03.2009, 21:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для поиска надо сделать сортировку слов. Если можно воспользоваться другим компонентом, то так:
Код:
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  
Старый 28.03.2009, 22:10
deathor deathor вне форума
Прохожий
 
Регистрация: 25.11.2008
Сообщения: 34
Репутация: 10
По умолчанию

так с поиском разобрались, а как из ТХТ файла, в котором порядка 50 слов, выдергивать их по одиночке для поиска?

И можешь в крадце описать, что происходит в 1 и 2 кодах?

Последний раз редактировалось deathor, 28.03.2009 в 23:18.
Ответить с цитированием
  #4  
Старый 29.03.2009, 00:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ненадо выдергивать слова по одиночке, надо сразу загрузить в мемо содержимое текстового файла, т.к. и первый и второй варианты работают с уже загруженным списком. Загрузка реализуется методом самого компонента TMemo:
Код:
 Memo1.Lines.LoadFromFile('c:\dictionary.txt');

В первом варианте для поиска и сортировки используется компонет TStringList, собственно он и создан был для подобных операций.
Сначала список сортируется, т.к. без этого невозможен корректный поиск методом Find.
Во втором варианте делается тоже самое, что и в TStringList, только реализованы свои функции сортировки и поиска.
Сортировку расписывать особо нечего, берется первый и следующий элемент, если первый элемент больше второго, то элементы меняются местами и так до конца списка. Это не самый быстрый способ сортировки, зато наиболее простой в реализации.
С поиском тоже в принципе достаточно просто. Основное условие правильного поиска - обязательная сортировка. Берется список и сравнивается элемент из середины списка с поисковым значением. Если списочный элемент меньше, значит искомое слово находиться ближе к концу списка, если больше, то наоборот ближе к началу списка. Далее операция повторяется, только границы поисковые будут все время уменьшаться 1/2, 1/4, 1/8, 1/16 и т.д. пока не найдется нужный элемент.
Данный способ сортировки очень быстр даже для очень больших списков.
Если взять список в 100000 слов, то результат будет получен максимум за 16 проверок.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 29.03.2009, 01:11
deathor deathor вне форума
Прохожий
 
Регистрация: 25.11.2008
Сообщения: 34
Репутация: 10
По умолчанию

Что бы было понятно, что мне нужно провернуть скидываю код...

Код:
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  
Старый 29.03.2009, 12:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Понятно, замените в своем коде строчки:
Код:
 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  
Старый 29.03.2009, 12:19
deathor deathor вне форума
Прохожий
 
Регистрация: 25.11.2008
Сообщения: 34
Репутация: 10
По умолчанию

Спасибо. Конечно не совсем так, как я хотел, но всеже работает ) И как вместо chrome.exe вставить мои билиотечку из ТХТ?
Ответить с цитированием
  #8  
Старый 29.03.2009, 12:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Т.е есть список имен программ имена которых надо предать анафеме и есть список запущеных процессов. Надо получить третий список в котором содержаться процессы преданные анафеме.
Ну тогда можно так:
Код:
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  
Старый 29.03.2009, 12:59
deathor deathor вне форума
Прохожий
 
Регистрация: 25.11.2008
Сообщения: 34
Репутация: 10
По умолчанию

Спасибо! Все работает!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025