Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> События компонента в безоконном приложении 
:(
    Опции темы
AXS
Дата 7.8.2010, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Код

var
  irc: TIdIRC;
  Finish: Boolean;
  Cnnctd: Boolean;
  Closer: Boolean;

procedure Connected(Sender:TObject);
begin
  Cnnctd:= True;
end;

procedure Disconnected(Sender:TObject);
begin
  Finish:= True;
end;

procedure Messager(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
begin
  MessageBox(0,PChar(AUser.Nick+' '+AChannel.DisplayName+' '+Content),'123',0);
  Closer:=True;
end;

var
  ircConnected : TMethod;
  ircDisconnected : TMethod;
  ircMessage : TMethod;
  Msg:TMsg;
begin
  Cnnctd:= False;
  Finish:= False;
  Closer:= False;
  irc:=TIdIRC.Create(nil);
  irc.Nick:='birca';
  irc.AltNick:='b1rca';
  irc.RealName:='bIRCa';
  irc.Username:='opBirca';
  irc.Host:='irc.dion.ru';
  irc.Port:=6667;

  ircDisconnected.Code := @Disconnected;
  ircDisconnected.Data := irc;
  irc.OnDisconnected:= TNotifyEvent(ircDisconnected);

  ircConnected.Code := @Connected;
  ircConnected.Data := irc;
  irc.OnConnected:= TNotifyEvent(ircConnected);

  ircMessage.Code := @Messager;
  ircMessage.Data := irc;
  irc.OnMessage:= TIdIRCOnMessage(ircMessage);

  irc.Connect(2000);
  if Cnnctd then
    begin
      irc.Join('#birca_channel');
      while not Closer do
        begin
          irc.Say('#birca_channel','birca online');
          Sleep(5000);
          if PeekMessage(Msg, 0, 0, 0, 1) then
            begin
              if Msg.Message <> $0012 then
                begin
                  TranslateMessage(Msg);
                  DispatchMessage(Msg);
                end
              else
                Closer := True;
            end;
        end;
      irc.Quit('===');
      Sleep(2000);
    end;
  //=TODO: ========
  irc.Disconnect;
  while not Finish do
    Sleep(32);
  irc.Free;
  //==============
end.


Программа работает следующим образом: подключается по протоколу IRC на канал #birca_channel и каждые пять секунд посылает туда сообщение 'birca online' пока не получит любое ответное сообщение.

У компонента irc определены три события  OnConnected, OnDisconnected и OnMessage

Первые два события без параметров (не считая Sender) и прекрасно выполняются...  А вот с OnMessage проблема - не выполняется ни в какую... Что я делаю не так?
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
AXS
Дата 8.8.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Никто не скажет в чём ошибка? :(
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
CodeMonkey
Дата 8.8.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Скажет.

Метод <> процедура. А ваши попытки обмануть компилятор приведением типов ни к чему хорошему не приведут.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
AXS
Дата 8.8.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Как тогда делать правильно?... Вот в чём вопрос... )
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
AXS
Дата 8.8.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Переписал так:
Код

program birca;

uses
  Windows,
  IdIRC,
  Classes,
  Messages;

type
  TmIRC = class
  private
    FWnd: HWnd;
  public
    constructor Create;
    destructor Destroy;
    procedure WndProc(var Msg:TMessage);
  protected
    procedure Messager(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
    procedure Connected(Sender: TObject);
    procedure Disconnected(Sender: TObject);
  end;

var
  rn: Integer;
  irc: TIdIRC;
  mirc: TmIRC;
  Finish: Boolean;
  Cnnctd: Boolean;
  Closer: Boolean;

procedure TmIRC.Connected(Sender:TObject);
begin
  Cnnctd:= True;
end;

procedure TmIRC.Disconnected(Sender:TObject);
begin
  Finish:= True;
end;

procedure TmIRC.Messager(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
begin
  MessageBox(0,PChar(AUser.Nick+' '+AChannel.DisplayName+' '+Content),'123',0);
  Closer:=True;
end;

constructor TmIRC.Create;
begin
  inherited Create;
  FWnd:= AllocateHWnd(WndProc
  irc:=TIdIRC.Create(nil);
  irc.OnDisconnected:= Disconnected;
  irc.OnConnected:= Connected;
  irc.OnMessage:= Messager;   
  irc.Nick:='birca23';
  irc.AltNick:='b1rca23';
  irc.RealName:='bIRCa23';
  irc.Username:='opBirca23';
  irc.Host:='irc.dion.ru';
  irc.Port:=6667;
  irc.Connect(2000););
end;

destructor TmIRC.Destroy;
begin
 inherited Destroy;
 deAllocateHWnd(fWnd);
end;

procedure TmIRC.WndProc(var Msg:TMessage);
begin
  if Cnnctd then
    begin
      rn:= rn+1;
      if rn = 70 then
        begin
          irc.Say('#birca_channel', 'birca online');
          rn:=0;
        end;
    end;
  Sleep(32);
end;

var
  Msg:TMsg;
begin

  Cnnctd:= False;
  Finish:= False;
  Closer:= False;

  mirc:=TmIRC.Create;

  if Cnnctd then
    irc.Join('#birca_channel');

  try
    while GetMessage(Msg, 0, 0, 0) AND (not Closer) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg)
      end
  finally
    irc.Quit('===');
    Sleep(2000);
    irc.Disconnect;
    while not Finish do
      Sleep(32);
    irc.Free;
    mirc.Destroy;
  end;
end.

Результат тот же... ( OnConnected работает, OnMessage не дышит...
Я в замешательстве....
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
RomanEEP
Дата 10.8.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



может TIdIRC не работает без Parent?

Это сообщение отредактировал(а) RomanEEP - 10.8.2010, 20:10
PM MAIL   Вверх
AXS
Дата 10.8.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Скорее всего так и есть.. Думаю события передаются окну....
Если не окно, то что ещё может являться родителем для TidIRC?
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
AXS
Дата 11.8.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Бросил... :( 
Решил сам через WinSock сделать...
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 11.8.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Indy не требует окон. Вообще.
Никакой Parent не влияет.
Для Indy нет никакой разницы, в каком приложении оно работает.
Оконное, консольное, или вообще сервис.
Везде работает одинаково.
PM MAIL   Вверх
AXS
Дата 11.8.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Ув. модератор... Может вы тогда приоткроете эту завесу над тайной неработоспособности моего кода?
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
Snowy
Дата 12.8.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вероятно потому, что в Indy 9 это событие ловит приватные сообщения.
А ты вероятно пишешь не в приват.
Вот и не срабатывает.
PM MAIL   Вверх
AXS
Дата 12.8.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



Цитата(Snowy @ 12.8.2010,  11:15)
Вероятно потому, что в Indy 9 это событие ловит приватные сообщения.
А ты вероятно пишешь не в приват.
Вот и не срабатывает.

Нет. Проверил в оконном приложении - OnMessage ловит ВСЕ сообщения включая служебные.

И при проверке в безоконном, я КОНЕЧНО ЖЕ пробовал и приватные и обычные сообщения отсылать...

==============================

Кстати, НА WinSock неплохо получается... Протокол не сложный... Пишу класс с необходимыми методами... Допишу, оформлю, выложу - может кому пригодится..

--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.