Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 23:33   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
Вопрос Автоответчик

По определённому условию моя программа отсылает автоматическое сообщение. Отсылает его каждый раз, когда мне приходит новое сообщение. Из-за такой мнгновенной отправки можно получить бан.

Реализация:
Во что-то записывать ник пользователя, отправившего мне сообщения и получить время (GetTickCount), когда было принято сообщение. Далее пробегаемся по этому чему-то в поисках ника пользователя, который отправил сообщение, если такой найден, то получаем время последней отправки, которое находится в чём-то и получаем новое время (GetTickCount). Далее из новополученного времени вычитаем время, которое находится в чём-то и если полученное время >= 5000, то отправляем автоответ этому пользователю снова.

Возможно, объяснил реализацию криво.
Shouldercannon вне форума Ответить с цитированием
Старый 14.02.2012, 00:32   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как вариант - записывать ник и время сообщений в динамический массив, таймер скажем раз в 5 секунд проверяет элементы массива и при необходимости отправляется ответ с удалением элемента. Обработку таймером массива пооптимальней сделать.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.02.2012, 13:56   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Моя реализация
Код:
type
  TUserList = object
    User_ID: string;
    User_Time: Integer;
  end;

var
  Form1: TForm1;
  UserCount: Integer;
  UserMas: array[0..255] of TUserList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  UserCount := 0;
end;

procedure TForm1.BAddUserClick(Sender: TObject);
begin
  UserMas[UserCount].User_ID := '127'; // Добавим ID юзера
  UserMas[UserCount].User_Time := GetTickCount; // Добавим время, когда был отправлен автоответ

  Inc(UserCount, 1); // Увеличим значение для добавления следующего ID юзера в новую ячейку
end;

procedure TForm1.BFindUserClick(Sender: TObject);
var
  s: string;
  i, Time: Integer;
begin
  s := '127';

  for i := 0 to UserCount do // Пробегаем по записям UserMas в поисках нужного ID юзера
  begin
    if UserMas[i].User_ID = s then // Если ID юзера найден
    begin
      Time := GetTickCount; // Получаем текущее время
      if Time - UserMas[i].User_Time >= 5000 then // Если прошло 5 или больше 5 секунд
      begin
        UserMas[i].User_Time := GetTickCount; // Перезапишем время, когда был отправлен автоответ
        ShowMessage('Отправка сообщения'); // Отправка сообщения
      end
      else ShowMessage('Игнор'); // Молчим
    end;
  end;
end;
1. Какие будут замечания и есть ли фатальные моменты?
2. Что делать с массивом при завершении работы программы или он сам безопасно уничтожится?
Shouldercannon вне форума Ответить с цитированием
Старый 14.02.2012, 14:03   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
2. Что делать с массивом при завершении работы программы или он сам безопасно уничтожится?
обычный статический массив. Можно быть абсолютно спокойным - при завершении приложения память будет очищена.
и вообще, если Вы не выделяете сами память, то и освобождать её не Вы должны. В данном случае нет поводов для беспокойства
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2012, 17:12   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Он был бы обычным, если бы TUserList = record, а не TUserList = object.
Я, конечно, понимаю, что старым объектным типом можно пользоваться как записями, но для данной реализации, думаю, резоннее использовать просто record.
Таки , Object types +F1 =
Цитата:
Object types are supported for backward compatibility only. Their use is not recommended.
Ну а называть тип для единичной записи с использованием слова List - очень пагубное занятие, сильно сказывающееся на понимании кода.

Будь моя воля , кстати, я бы всё обернул в Tlist.

Последний раз редактировалось phomm; 14.02.2012 в 17:14.
phomm вне форума Ответить с цитированием
Старый 14.02.2012, 17:27   #6
sxcine
Пользователь
 
Аватар для sxcine
 
Регистрация: 26.05.2010
Сообщений: 78
По умолчанию

не проще было бы сделать какой нибудь глобальный стринглист и в него добавлять сообщения автоответчика, и чтобы таймер каждые 5сек отправлял первое в списке сообщение и удалял его?
sxcine вне форума Ответить с цитированием
Старый 14.02.2012, 18:34   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Сообщение для всех одинаковое. Нужно было записывать ID пользователя и время, что собственно уже и сделал.
Object заменил на Record
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоответчик под WM Mclaren Помощь студентам 0 18.05.2010 02:08
автоответчик WM Mclaren Помощь студентам 2 05.05.2010 10:09