![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Консольное приложение + события + процедурные типы : бррррррррррр [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);
Все не так. Объекты обычно создаются иначе.