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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 20:23   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Лампочка Работа с динамическим TClientSocket

Вот, динамически создаю ClientSocket..
Код:
ClientSocket:=TClientSocket.Create(Form3);
ClientSocket.Active:=False;
ClientSocket.Port:=1025;
Теперь встала проблема обработки событий....Вот так не конает...
Код:
Procedure OnCanRead(Socket:TCustomWinSocket);
Begin
      Form3.ListBox1.Items.Add(Socket.ReceiveText);
End;

procedure TForm3.FormCreate(Sender: TObject);
begin
      ClientSocket:=TClientSocket.Create(Form3);
      ClientSocket.Active:=False;
      ClientSocket.Port:=1025;
      ClientSocket.OnRead:=OnCanRead(ClientSocket.Socket);
end;
Как нужно правильно делать?
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.12.2010, 20:28   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нужен метод.

то есть ту самую процедуру припиши к форме

Код:
TForm3=class(TForm)
 Procedure OnCanRead(Socket:TCustomWinSocket);

/////////////////////////////////////////////////////////////////////

Procedure TForm3.OnCanRead(Socket:TCustomWinSocket);
Begin
      Form3.ListBox1.Items.Add(Socket.ReceiveText);
End;

procedure TForm3.FormCreate(Sender: TObject);
begin
      ClientSocket:=TClientSocket.Create(Form3);
      ClientSocket.Active:=False;
      ClientSocket.Port:=1025;
      ClientSocket.OnRead:=OnCanRead(ClientSocket.Socket);
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.12.2010, 20:37   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вот код по вашему примеру, однако всё равно не катит.
Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, XPMan;

type
  TForm3 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    ListBox2: TListBox;
    Label2: TLabel;
    Memo1: TMemo;
    Label3: TLabel;
    XPManifest1: TXPManifest;
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure OnCanRead(Socket:TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  ClientSocket:TClientSocket;

implementation

{$R *.dfm}

uses Unit1,Unit2;

Procedure TForm3.OnCanRead(Socket:TCustomWinSocket);
Begin
      Form3.ListBox1.Items.Add(Socket.ReceiveText);
End;

procedure TForm3.FormCreate(Sender: TObject);
begin
      ClientSocket:=TClientSocket.Create(Form3);
      ClientSocket.Active:=False;
      ClientSocket.Port:=1025;
      ClientSocket.OnRead:=OnCanRead(ClientSocket.Socket);
end;

end.
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.12.2010, 20:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вместо
Код:
ClientSocket.OnRead:=OnCanRead(ClientSocket.Socket);
сделать
Код:
ClientSocket.OnRead:=OnCanRead;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.12.2010, 20:46   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Тем более не катит.
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.12.2010, 20:55   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В вашем примере вместо адреса обработчику события задается не понятно что (даже не результат функции), я предлагаю нормально задать адрес процедуры, а уж не катит почему понятия не имею, по крайней мере компилятор не будет ошибку давать. Посмотрите какие параметры должны біть у этого обработчика, может ваши не соответствуют
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.12.2010 в 21:00.
Аватар вне форума Ответить с цитированием
Старый 09.12.2010, 21:26   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, XPMan;

type
  TForm3 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    ListBox2: TListBox;
    Label2: TLabel;
    Memo1: TMemo;
    Label3: TLabel;
    XPManifest1: TXPManifest;
    ServerSocket1: TServerSocket;
    procedure FormCreate(Sender: TObject);
    procedure OnCanRead(Socket:TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  ClientSocket:TClientSocket;

implementation

{$R *.dfm}

uses Unit1,Unit2;

Procedure TForm3.OnCanRead(Socket:TCustomWinSocket);
Begin
      Form3.ListBox1.Items.Add(Socket.ReceiveText);
End;

procedure TForm3.FormCreate(Sender: TObject);
begin
      ClientSocket:=TClientSocket.Create(Form3);
      ClientSocket.Active:=False;
      ClientSocket.Port:=1025;
      ClientSocket.OnRead:=OnCanRead;//можно попробывать поставить @ перед OnCanRead но вообще должно итак.
end;

end.
если не пашет то ошибки в студию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.12.2010, 14:56   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Опять же не пашет.
Выдаёт ошибку Incompatible types 'TObject' and 'TCustomWinSocket'.
В случае если поставить собаку, то происходит ошибка Variable required.
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.12.2010, 15:17   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Проверьте соответствует ли тип обрабочика ClientSocket.OnRead тому типу, который вы пытаетесь ему присвоить. Неужели необходимость глянуть в Help вызывает такие большие проблемы?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.12.2010 в 15:23.
Аватар вне форума Ответить с цитированием
Старый 10.12.2010, 15:50   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Неужели необходимость глянуть в Help вызывает такие большие проблемы?
1.Как мне надоела фраза, которой орудуют новички: "ну неужели трудно в хелп залезть?".
2.Раз такой умный, так что-нибудь по делу сказал бы.
3.Проблему выявил, тему можно закрыть.
Отдельное спасибо to Пепел Феникса.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с динамическим подключением DLL Assemblerru C++ Builder 8 08.03.2010 09:40
Работа с динамическим таймером S@fer Общие вопросы Delphi 1 06.05.2009 09:00
Работа с динамическим массивом sand Общие вопросы C/C++ 3 22.08.2008 12:48
Работа с динамическим массивом и его елементами Padovan Паскаль, Turbo Pascal, PascalABC.NET 2 21.05.2008 20:55