Текущий архив: 2004.02.25;
Скачать: CL | DM;
ВнизTClientSocket без форм. Возможно ли это? Найти похожие ветки
← →
Anatoly Podgoretsky (2004-02-12 09:16) [40]Defunct (12.02.04 04:53) [26]
Inhеrited только косвенно относится к методам, косвенно поскольку его можно применить и к ним. На самом деле эта такая конструкция, которая позволяет опустить указание имени наследника и в случае методов еще и их аргументы если они совпадают. Аналогично использованию Self
← →
Digitman (2004-02-12 09:43) [41]
> Alex Konshin © (12.02.04 08:38) [38]
> TCustomWinSocket сам создает окно
> похоже, что проблемы не будет
ну и что ? ну да, создает ! тот кодовый поток, который создал окно, должен организовать и упомянутый цикл, иначе оконная ф-ция не будет вызвана, не смотря на то что окно существует
← →
Alex Konshin (2004-02-12 10:05) [42]Дык она же и организует этот цикл - там ведь у AllocateHwnd параметр есть - метод wndproc, а нем Dispatch вызывается и именно поэтому я думаю, что все должно работать автоматом.
Кстати, никто про кодовый поток отличный от главного (VCL) потока вроде и не заикался, хотя я и не вижу причин, почему бы этому не работать и в другой нити.
Я скажу честно - для меня самого это неожиданность, я все время считал, что в TCustomWinSocket ничего подобного нет.
Похоже, что нужно просто использовать property Handle как параметр для передачи его в асинхронные функции.
И всего-то...
← →
Verg (2004-02-12 10:26) [43]
> Alex Konshin © (12.02.04 10:05) [42]
> Дык она же и организует этот цикл - там ведь у AllocateHwnd
> параметр есть - метод wndproc, а нем Dispatch вызывается
> и именно поэтому я думаю, что все должно работать автоматом.
Нет, никто там циклов никаких не организует.
WndProc-то кто по-твоему вызывает?
← →
Alex Konshin (2004-02-12 10:56) [44]Теперь вижу, что не организует...
Ну вообще-то организовать его не проблема.
Не, с Winsock2 все-таки понятнее :)
← →
Verg (2004-02-12 10:58) [45]
> Alex Konshin © (12.02.04 10:56) [44]
> Теперь вижу, что не организует...
> Ну вообще-то организовать его не проблема.
Об чем и речь:
> Digitman © (12.02.04 08:31) [37]
← →
Digitman (2004-02-12 11:19) [46]
> Alex Konshin © (12.02.04 10:05) [42]
думаю, у тебя каша в голове
> метод wndproc, а нем Dispatch вызывается
Это совсем другой Dispatch(), не имеющий никакого отношения DispatchMessage()
> Кстати, никто про кодовый поток отличный от главного (VCL)
> потока вроде и не заикался
а при чем здесь доп.код.поток ? и при чем здесь VCL ?
объект Application не используется, соотв-но не используется и его метод Run, который в случае с GUI-приложения под управлением VCL как раз и организует цикл
а раз так, то это придется делать "ручками", вне зависимости от код.потока, иначе ни одно окно созданное в некоем конкретном код.потоке (будь то основной или любой дополнительный) не получит сообщения и его оконная ф-ция никогда не будет вызвана
← →
Digitman (2004-02-12 11:22) [47]
> Winsock2 все-таки понятнее
не менее понятно и использование той же же Winsock в модуле soktcomp.pas - совершенно прозрачный алгоритм, использующий те же Winsock-вызовы, но "упакованные" в достаточно удобную "VCL-обертку"
← →
Alex Konshin (2004-02-12 11:32) [48]думаю, у тебя каша в голове
Не, нет у меня каши.
Просто мне эти классы использовать никогда не приходилось, сегодня первый раз взглянул и увидел старого знакомого AllocateHwnd. Сразу про все и не сообразил.
Знаю я про Application.Run и про другие thread.
PS: Ты чего так накинулся-то? Не выспался что-ли?
← →
Digitman (2004-02-12 12:03) [49]
> Alex Konshin © (12.02.04 11:32) [48]
да ладно тебе ... не заводись .. все в порядке
← →
Defunct (2004-02-12 19:03) [50]> Verg © (12.02.04 07:59) [34]
Ув. Verg если вы незнакомы с изменениями секции Internet в последних версиях Delphi, то лучше вообще ничего не говорить.
Напрасно Вы так считаете, приведенный пример, компилируется и отлично работает в Delphi 5 (в котором есть модуль ScktComp.pas).
Если Вы используете Delphi 7 в котором Internet секция изменена и работа с сокетами осуществляется посредством модуля Sockets.pas, то там совсем другие классы: TTcpCLient, TTcpServer на базе TCustomIpClient.
Вопросы [1], [5] относились к классу TClientSocket (ScktComp.pas), из чего я сделал вывод, что применяется Delphi 5, и дал соответстующий проверенный пример.
> Digitman © (12.02.04 08:31) [37]
При создании экзкмпляра TCustomWinSocket сокет настроен на ctNonBlocking режим.
← →
Defunct (2004-02-12 19:19) [51]Вместо того чтобы просто взять откомпилировать, то что приведено в [17], началась куча политических дебатов.
2 Verg:
Насчет конструкции
Socket := TCustomWinSocket(Nil);
Проверь:
Form := TForm.Create(Nil);
(Так я создаю формы динамических отчетов внутри DLL, и ни разу не испутывал проблем)
Обе конструкции работоспособны, и вообще какая разница для Socket кто его владелец. Какие-то дремучие предрассудки.
← →
Verg (2004-02-13 12:29) [52]Defunct (12.02.04 19:03) [50]
Вот кусок этого модуля
TCustomWinSocket = class
private
FSocket: TSocket;
FConnected: Boolean;
FSendStream: TStream;
FDropAfterSend: Boolean;
FHandle: HWnd;
FAddr: TSockAddrIn;
FAsyncStyles: TASyncStyles;
FLookupState: TLookupState;
FLookupHandle: THandle;
FOnSocketEvent: TSocketEventEvent;
FOnErrorEvent: TSocketErrorEvent;
FSocketLock: TCriticalSection;
FGetHostData: Pointer;
FData: Pointer;
// Used during non-blocking host and service lookups
FService: string;
FPort: Word;
FClient: Boolean;
FQueueSize: Integer;
function SendStreamPiece: Boolean;
procedure WndProc(var Message: TMessage);
procedure CMLookupComplete(var Message: TCMLookupComplete); message CM_LOOKUPCOMPLETE;
procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;
procedure CMDeferFree(var Message); message CM_DEFERFREE;
procedure DeferFree;
procedure DoSetAsyncStyles;
function GetHandle: HWnd;
function GetLocalHost: string;
function GetLocalAddress: string;
function GetLocalPort: Integer;
function GetRemoteHost: string;
function GetRemoteAddress: string;
function GetRemotePort: Integer;
function GetRemoteAddr: TSockAddrIn;
protected
procedure AsyncInitSocket(const Name, Address, Service: string; Port: Word;
QueueSize: Integer; Client: Boolean);
procedure DoOpen;
procedure DoListen(QueueSize: Integer);
function InitSocket(const Name, Address, Service: string; Port: Word;
Client: Boolean): TSockAddrIn;
procedure Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); dynamic;
procedure Error(Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer); dynamic;
procedure SetAsyncStyles(Value: TASyncStyles);
public
constructor Create(ASocket: TSocket);
destructor Destroy; override;
procedure Close;
procedure DefaultHandler(var Message); override;
procedure Lock;
procedure Unlock;
procedure Listen(const Name, Address, Service: string; Port: Word;
QueueSize: Integer; Block: Boolean = True);
procedure Open(const Name, Address, Service: string; Port: Word; Block: Boolean = True);
procedure Accept(Socket: TSocket); virtual;
procedure Connect(Socket: TSocket); virtual;
procedure Disconnect(Socket: TSocket); virtual;
procedure Read(Socket: TSocket); virtual;
procedure Write(Socket: TSocket); virtual;
function LookupName(const name: string): TInAddr;
function LookupService(const service: string): Integer;
function ReceiveLength: Integer;
function ReceiveBuf(var Buf; Count: Integer): Integer;
function ReceiveText: string;
function SendBuf(var Buf; Count: Integer): Integer;
function SendStream(AStream: TStream): Boolean;
function SendStreamThenDrop(AStream: TStream): Boolean;
function SendText(const S: string): Integer;
property LocalHost: string read GetLocalHost;
property LocalAddress: string read GetLocalAddress;
property LocalPort: Integer read GetLocalPort;
property RemoteHost: string read GetRemoteHost;
property RemoteAddress: string read GetRemoteAddress;
property RemotePort: Integer read GetRemotePort;
property RemoteAddr: TSockAddrIn read GetRemoteAddr;
property Connected: Boolean read FConnected;
property Addr: TSockAddrIn read FAddr;
property ASyncStyles: TAsyncStyles read FAsyncStyles write SetAsyncStyles;
property Handle: HWnd read GetHandle;
property SocketHandle: TSocket read FSocket;
property LookupState: TLookupState read FLookupState;
property OnSocketEvent: TSocketEventEvent read FOnSocketEvent write FOnSocketEvent;
property OnErrorEvent: TSocketErrorEvent read FOnErrorEvent write FOnErrorEvent;
property Data: Pointer read FData write FData;
end;
Вым надо объяснять что такое TScoket и почему он несовместим с nil ?
> Defunct (12.02.04 03:06) [17]
> Человек спросил одно, а все пишут бог знает что... напоминает
> политическую дискуссию ;>
>
>
> var Socket : TCustomWinSocket;
> ...
> ...
> // Создание сокета
> Socket := TCustomWinSocket.Create( Nil );
>
> Socket.Address:=RemoteAddr; { IP адрес куда подрубаемся
> }
> Socket.Port:=RemotePort; { Порт куда подрубаемся }
>
> {Обработчик ошибок - обязательно должен содержать строку
> ErrorCode := 0; иначе будет выскакивать ссобщение об ошибке
> винды}
> Socket.OnError:=SocketError;
>
> Socket.OnConnect:=SocketConnect; { не обязательно }
> Socket.OnDisconnect:=SocketDisconnect; { не обязательно
> }
> Socket.OnRead:=SocketRead; { Прием данных }
> Socket.OnWrite:=SocketWrite; { завершение посылки необязательно
> обслуживать }
> Socket.Active:=True; { Соединение }
Вам надо объснять, что у TCustomWinSocket нет ни OnRead, ни OnWrite ни OnConnect... и ни свойста Active....?
← →
Verg (2004-02-13 13:37) [53]Да, и кстати, что именно "применяется" легче всего узнать по subj ветки.
> TClientSocket без форм. Возможно ли это? [ D6, Win2k]
← →
Digitman (2004-02-13 14:13) [54]
> Defunct (12.02.04 19:03) [50]
> При создании экзкмпляра TCustomWinSocket сокет настроен
> на ctNonBlocking режим
правильно, по дифолту.
> Человеку надо работать с сокетом, возможно в консольном
> приложении
именно "возможно", но вовсе не обязательно
а если уж и заикнулся о "возможно", почему вместе со своим (весьма и весьма проюлемным) кодом не упоминаешь о цикле выборки/диспетчеризации ? или неведомо тебе сие в принципе ?
← →
Digitman (2004-02-13 14:19) [55]
> Defunct (12.02.04 19:03) [50]
> если вы незнакомы с изменениями секции Internet
> в последних версиях Delphi
.......
> приведенный пример, компилируется
> и отлично работает в Delphi 5 (в котором есть модуль ScktComp.pas).
>
при чем здесь изменение секции палитры ?
мало ли чего Борланду в голову стукнуло в тот момент !
но свою паству он не кинул, если тебе сие не известно, и разместил соотв.пакет в ($DELPHI)\lib, откуда его мгожно в любой момент достать и установить в палитру ... а DCUs соответствующие и без оных действий доступны
← →
Defunct (2004-02-13 17:56) [56]Verg © (13.02.04 12:29) [52]
Бах.. признаю свою ошибку.
На месте
Socket := TCustomWinSocket(Nil);
[17]
должно быть
Socket := TClientSocket(Nil);
Digitman © (13.02.04 14:19) [55]
Это было писать не к чему, я просто изначально подумал что Verg
> пример неработоспособен, мало того, так еще и не компилируем. [34]
имел ввиду "некомпилируемость" из-за отсутствия ScktComp.pas.
← →
Verg (2004-02-13 18:17) [57]Defunct (13.02.04 17:56) [56]
Ну и.....
> Defunct (12.02.04 05:24) [28]
> Напоследок скажу, что TClientSocket на самом деле хуже чем
> TCustomWinSocket, объясню почему. Дело в том, что TClientSocket,
> мало того что является наследником TCustomSocket, так он
> еще и содержит дополнительно экземпляр TCustomWinSocket.
> Лишняя избыточность. Отличается он визуальной секцией Published,
> для отображения настроек в Object Inspector. Прн динамическом
> создании сокета, эта часть абслолютно не нужна.
> Да и при работе с TClientSocket надо работать так:
> TClientSocket.Socket.ReadString();
> А при работе с TCustomWinSocket так:
> TCustomWinSocket.ReadString();
> Как видно, отпадает лишнее слово "Socket" ;>
> Defunct (12.02.04 19:03) [50]
> > Verg © (12.02.04 07:59) [34]
> Ув. Verg если вы незнакомы с изменениями секции Internet
> в последних версиях Delphi, то лучше вообще ничего не говорить.
>
> Напрасно Вы так считаете, приведенный пример, компилируется
> и отлично работает в Delphi 5 (в котором есть модуль ScktComp.pas).
>
Продолжать?
Перед тем, как на полном серъезе давать конкретные советы "как лучше жить" да еще и с кодом, надо сто раз подумать, а еще лучше все проверить, а не обвинять в каких-то там предрассудках, политичности дебатов и проч. ДБЗ типа пурга....
← →
Defunct (2004-02-13 18:53) [58][51]
Вместо того чтобы просто взять откомпилировать, то что приведено в [17], началась куча политических дебатов.
[57]
Перед тем, как на полном серъезе давать конкретные советы "как лучше жить" да еще и с кодом, надо сто раз подумать, а еще лучше все проверить, а не обвинять в каких-то там предрассудках, политичности дебатов и проч. ДБЗ типа пурга....
шутку понял, смешно.
Мораль всей байки такова: от долгой работы с чем-то создается стереотип, стереотип переходит в веру. ;>
Ну забыл, что создается TClintSocket, а потом TCustomWinSocket, потому что в основном используется TCustomWinSocket.
PS: Могли бы пример подправить, и не было б всей этой каши.
Там всего-то один штрих и все было б как надо.
Страницы: 1 2 вся ветка
Текущий архив: 2004.02.25;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.048 c