Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
47 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 146
1

Найти в Memo определенное слово и выполнить зарезервированное действие.

18.05.2014, 17:18. Показов 1574. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Memo заполняется различными словами:
Слово 1
Слово 2
Слово 3
Нужно найти слово, на которое есть какое-то зарезервированное действие.
Вопрос в том, как именно запрограммировать псевдокод такого вида:
if ("Слово Х" in Memo1) then do begin Действие
При этом после каждого клика на Button список слов в Memo обновляется.
По сути, это чат-бот, который отвечает шаблонными фразами на различные найденные маски-слов.

Добавлено через 20 часов 19 минут
Нужны любые подсказки и примеры, братцы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2014, 17:18
Ответы с готовыми решениями:

Как выполнить определенное действие по истечению таймера
Прочитал форум, однако не смог понять, как выполнить определенное действие по истечению таймера....

Выполнить определенное действие в зависимости от знчения переменной
Добрый день. Подскажите как реализовать как я понимаю с помощью циклов. Скажем есть числа от 1 до...

MessageBox, в зависимости от результата (YesNo) выполнить определенное действие
DialogResult result = MessageBox::Show(.......); if(result==::DialogResult::No) { ...

Как в цикле выполнить определенное действие один раз?
for (int i = 0; i < Notes.Count; i++) { if...

6
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
19.05.2014, 01:22 2
Цитата Сообщение от Rantip Посмотреть сообщение
Нужно найти слово, на которое есть какое-то зарезервированное действие.
У тебя довольно простенький вариант, лови:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  i, j, k: Integer;
begin
  for i := 0 to Memo1.Lines.Count - 1 do
    for j := 0 to Memo2.Lines.Count - 1 do
    begin
      k := Pos(Memo1.Lines[i], Memo2.Lines[j]);
      if k <> 0 then
      begin
        ListBox1.Items.Add(FormatDatetime('[hh.mm.ss]: ', Time)+ Memo2.Lines.ValueFromIndex[j]);
        break;
      end;
    end;
end;
У меня был гораздо сложнее в переменную из интернета из чата я грузил исходный код страницы по таймеру раз в 30 секунд, затем код искал фразу из моего списка фраз около нескольких сотен, сортировал еще чтобы два раза неответить одинаковым ответом и отвечал потом соответствующим шаблоном (грузил в переменную и снова таймер отправлял ответ в чат), ну а если ненаходил такой, то отвечал фразой "пустышкой" из другого списка. Правда списки у меня не в мемо были, а прямо из файла читал.

Ну тебе думаю и этот код неплохо будет! Просто я незнаю твоих целей что за бота ты пишеш и зачем ты его пишеш.
Если так в сети пофлудить собрался- то несоветую, а если для компьтера для себя программу пишеш, то пиши.
Миниатюры
Найти в Memo определенное слово и выполнить зарезервированное действие.  
1
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
19.05.2014, 01:32 3
В принципе тынетолько отвечать на фразы можеш, но и другие действия делать если найдена фраза !стоп! например то выключить компьтер. Так у меня тоже работало, даже через сеть в чате писал !стоп! и условие было сделать Close.
0
47 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 146
19.05.2014, 16:12  [ТС] 4
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
У тебя довольно простенький вариант
Спасибо. Это будет аналог компьютерного психиатра Элиза. Т.е чат-бот в итоге отвечает на зарезервированные слова в системе. Плюс она может перефразировать вопрос пользователя (такой у нее изначальный смысл работ). Осталось только перефразирование запилить.
0
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
19.05.2014, 16:23 5
Rantip,
В моем варианте если одно слово стоит на одной строке напрмер-
Осень
То оно тока тогда будет найдено найдено!
Но можно переписать код так чтобы его искало например и в таких случаях-
Слово1 Осень Слово2
и я уже писал когда-то в прошлых сообщениях этот код.
0
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
20.05.2014, 14:35 6
Хмм.. Ну вот на плюсах это было бы просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//---------------------------------------------------------------------------
#include <map>
#include <memory>
void Some()                          ////
  { ShowMessage( "Some" ); }           // Какие-то
void AnotherSome()                   ////     функции
  { ShowMessage( "Another Some" ); }   //
//--
std::map <String, void(*)()> Words;     // Собственно сам список со словами и
//--                                    //  соответствующими действиями
std::map<String, void(*)()> ::iterator iterWordMap;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Words["Some"] = Some;                     // Где-то в теле
Words["AnotherSome"] = AnotherSome;       //  программы заполняем
 
 
std::auto_ptr<TStringList> sl( new TStringList );
 
sl->DelimitedText = Memo1->Text;
long count = -1;
while( ++count < sl->Count )
  {
  for( iterWordMap = Words.begin(); iterWordMap != Words.end(); ++iterWordMap )
    if( sl->Strings[count] == iterWordMap->first )
      iterWordMap->second();
  }
}
//---------------------------------------------------------------------------
А вот как на делфи переписать, что-то затрудняюсь сейчас сказать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32979 / 21289 / 8176
Регистрация: 22.10.2011
Сообщений: 36,566
Записей в блоге: 8
20.05.2014, 15:24 7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А вот как на делфи переписать
Аналогично:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uses Generics.Collections;
 
// ...
 
var
  words : TDictionary<string, TProc>;
 
procedure TForm1.Button9Click(Sender: TObject);
var
  s : string;
  L : TStringList;
begin
  Words := TDictionary<string, TProc>.Create;
  Words.Add('one', procedure begin ShowMessage('haha') end);
  Words.Add('two', procedure begin ShowMessage('hihi') end);
 
  L := TStringList.Create;
  try
    L.DelimitedText := Memo1.Text;
    for s in L do
      if words.ContainsKey(s) then words.Items[s]();
  finally
    L.Free;
  end;
 
  words.Free;
end;
0
20.05.2014, 15:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2014, 15:24
Помогаю со студенческими работами здесь

MessageBox, в зависимости от результата (YesNo) выполнить определенное действие
Ребят у меня есть MessageBox и мне надо чтобы если я нажимал Yes то 1 действие а если No то 2

Действие при нажатии на определенное слово текста
Ребята, подскажите, пожалуйста! Есть текст в формате rtf, который при нажатии на кнопку на форме,...

Возможно ли выполнить определённое действие с каждым заданным файлом в текущей папке?
Возможно ли выполнить действие к файлам в текущей папке через консоль Windows? То есть я хочу...

Определённое слово в поле Memo
Здравствуйте. Мне нужно, если в поле &quot;memo&quot; есть слово, например GD:Home, то что бы выводилось...

Как можно выполнить определенное действие над всеми объектами одного типа?
Доброго времени суток. Я начинаю изучать c# и у меня появился такой вопрос: Как в c# можно...

При появлении слова,которое задано в константе ,программа должна выполнить определенное действие
При появлении слова,которое задано в константе ,программа должна выполнить определенное действие и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru