Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Консольное приложение + события + процедурные типы : бррррррррррр [D6, Win95/98]


Kergma ©   (2004-08-05 10:45:00) 

Слава Вам о Великие Мастера!!!!
набросал на форму неболшую програмку:
NMUDP + MEMO + бутон.
По бутону отсылались несколько байт. В NMUDP по OnDataReceived эти байты ловились и выбрасывались на MEMO. Все класс!!!
Захотел сделать тоже, но без формы, идея была следующая:

program UDP;
{$APPTYPE CONSOLE}
uses
 SysUtils, NMUDP, Classes;
var
 u:TNMUDP;
 procedure r(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
  begin
   write(#07);
  end;
begin
 u.Create(nil);
.....skip...................
 u.OnDataReceived := r; //!!!!!!!!!!!!!!!!!!!!!!!!!
.....skip...................
 u.Destroy;
end.

В указаном месте происходит ошибка : несовместимый тип. (не тот тип сидит перед монитором)
Ткните носом что принцмпиально не так!!!!
Или может неверна сама идея?
Заранее благодарен!!!


Digitman   (2004-08-05 15:01:00) [1]


> Kergma   (05.08.04 14:48) [18]


и все же прислушайся к совету [15]

Инди или не Инди, но NNUDP - выбор, оставляющий желать лучшего


Kergma   (2004-08-05 14:48:00) [2]

2Digitman: Ты ШАМАН!!!!!!!
после замены моего репета на твой вайл все заработало!!!!!!
СЕРДЕЧНО БЛАГОДАРЮ!!!!!!!!!!!


Kergma   (2004-08-05 14:44:00) [3]

С назначением процедур на события разобрался. Спасибо!!!!!!!!
Но ОНО все равно не работает !!!! :)))
и токо что выяснил причину:
стал отлавливать UDP пакеты которые с моей машины уходят.......
А они никуда не уходят :)))))
То есть прога добросовестно отчитывается о том что пакет ушел....
А сетка об этом не знает...

program UDP;
{$APPTYPE CONSOLE}
uses
 SysUtils, NMUDP, Classes;

type
 Tmy = class
  ud : TNMUDP;
  f  : boolean;
  procedure stat(Sender: TComponent; status: String);
  procedure datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
  procedure DS(Sender: TObject);

  constructor Create(var PUd : TNMUDP);
 end;

var
 u : TNMUDP;
 k : Tmy;
 C : Array [1..3] of Char;
 i : integer;
 constructor Tmy.Create(var PUd : TNMUDP);
 begin
  UD := PUd;
  f := false;
 end;
  procedure Tmy.DS(Sender: TObject);
  begin
   writeln('Data Send...');
  end;

 procedure Tmy.stat(Sender: TComponent; status: String);
 begin
  writeln('status - ',status);
 end;

 procedure Tmy.datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
 var
 c : array[1..3] of char;
 i : integer;
 begin
   write('test   ');
   f := true;
   ud.ReadBuffer(C,i);
   Write(c);
   f:= false;
  end;

begin
 u := TNMUDP.Create(nil);
 k := Tmy.Create(u);
 u.OnDataReceived := k.datarec;
 u.OnDataSend := k.DS;
 u.OnStatus := k.stat;

 C := 'cat';
 u.RemoteHost := '127.0.0.1';
 u.ReportLevel := Status_Debug;
 u.LocalPort := 1030;
 u.RemotePort := 1030;
 writeln('send: ',C);

 repeat
 u.SendBuffer(C, 3);
 c:= '   ';
 u.ReadBuffer(c,i);
 writeln(c,i);

 c:= 'cat';
 until i>0;

 u.Free;
 k.Free;
end.

вот такие вот пироги с котятами...


TUser   (2004-08-05 13:37:00) [4]

procedure of object.
Можно и обычную процедуру назначить. Вот так
var ni:TNotifyEvent;
begin
ni:=YourProc;
.OnEvent:=@ni;
end;


Erik1   (2004-08-05 13:26:00) [5]

И зачем так извращатся? Может лучше взять Indy?


Digitman   (2004-08-05 13:01:00) [6]

Windows


Kergma   (2004-08-05 12:53:00) [7]

ммммммммм.....
Я очень извиняюсь за настойчивость,
Msg: TMsg;
в каком это юните?


Digitman   (2004-08-05 12:17:00) [8]

program UDP;
{$APPTYPE CONSOLE}
uses
SysUtils, NMUDP, Classes;

type
Tmy = class
 procedure datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
end;

var
Msg: TMsg;
u : TNMUDP;
k : Tmy;
C : Array [1..3] of Char;

procedure Tmy.datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
 begin
  write('test');
 end;

begin
u := TNMUDP.Create(nil);
k := Tmy.Create;
u.OnDataReceived := k.datarec;

C := 'cat';
u.RemoteHost := '127.0.0.1';
u.LocalPort := 6668;
u.RemotePort := 6668;
u.SendBuffer(C, 3);

while GetMessage(Msg, 0, 0, 0) do
 DispatchMessage(Msg);


u.Free;
k.Free;
end.


  (2004-08-05 12:11:00) [9]

Удалено модератором


Kergma   (2004-08-05 11:38:00) [10]

2Digitman:
"r должна быть не просто процедурой , а методом класса"
помогло. получилось след. :

program UDP;
{$APPTYPE CONSOLE}
uses
 SysUtils, NMUDP, Classes;

type
 Tmy = class
  procedure datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
 end;

var
 u : TNMUDP;
 k : Tmy;
 C : Array [1..3] of Char;

 procedure Tmy.datarec(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
  begin
   write('test');
  end;

begin
 u := TNMUDP.Create(nil);
 k := Tmy.Create;
 u.OnDataReceived := k.datarec;

 C := 'cat';
 u.RemoteHost := '127.0.0.1';
//  u.ReportLevel := Status_Basic;
 u.LocalPort := 6668;
 u.RemotePort := 6668;
 writeln('send: ',C);
 u.SendBuffer(C, 3);

 u.Free;
 k.Free;
end.

Но помогло только с присваиванием :  
u.OnDataReceived := k.datarec;
а на k.datarecуправление не попадает


Digitman   (2004-08-05 10:58:00) [11]

program UDP;
{$APPTYPE CONSOLE}
uses
SysUtils, NMUDP, Classes;

type
 TMyClass = class
 procedure r(Sender: TComponent; NumberBytes: Integer; FromIP: string; Port: integer);
 end;

var
u:TNMUDP;
myobj: TMyClass;

begin
u := TNMUDP.Create(nil);
myobj := TMyClass.Create;

.....skip...................

u.OnDataReceived := myobj.r;

.....skip...................

u.Free;
myobj.Free;
end.


Digitman   (2004-08-05 10:54:00) [12]

определи свой класс (любой)
в этом классе определи метод r с прототипом процедуры обработки события OnDataReceived()

создай экз-р этого класса


begin...end   (2004-08-05 10:53:00) [13]

Ой, извиняюсь, бред написал.


begin...end   (2004-08-05 10:52:00) [14]

of object

procedural types + F1


Kergma   (2004-08-05 10:52:00) [15]

С созданием понятно. Спасибо!
А что неправильно с собитием?
Как на событие повесить процедуру?


Digitman   (2004-08-05 10:51:00) [16]

r должна быть не просто процедурой , а методом класса


Kergma   (2004-08-05 10:50:00) [17]

Что спросил то и получил :)
А как правильно создать объект?


Ega23   (2004-08-05 10:48:00) [18]

u:=TNMUDP.Create(nil);


Sandman25   (2004-08-05 10:46:00) [19]

var
u:TNMUDP;
u.Create(nil);

Все не так. Объекты обычно создаются иначе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо