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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2017, 08:13   #21
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

У вас и первый компонент создан неправильно.
Всё просто перед тем как использовать компонент его надо создать и обязательно привязать к форме.
ClientSocket1:= TClientSocket.Create(nil);
Это неправильная строчка нельзя указывать Nil. Обязательно нужна ссылка на форму. Правильно вот так вот
Код:
ClientSocket1:= TClientSocket.Create(self); // где  self указатель на класс формы
ClientSocket1.Owner:= self;
И второй компонент тоже так же прописываем

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1:= TClientSocket.Create(self); // здесь self указатель на класс формы
ClientSocket1.Owner:= self;

with  ClientSocket1 do
  begin
  OnConnecting:= ClientSocketConnecting;
  OnConnect:= ClientSocketConnect;
  OnDisconnect:= ClientSocketDisconnect;
  OnError:= ClientSocketError;
  OnRead:= ClientSocketRead;
  OnWrite:= ClientSocketWrite;
  end;

ClientSocket2:= TClientSocket.Create(self); // здесь self указатель на класс формы
ClientSocket2.Owner:= self;

with  ClientSocket2 do
  begin
  OnConnecting:= ClientSocketConnecting;
  OnConnect:= ClientSocketConnect;
  OnDisconnect:= ClientSocketDisconnect;
  OnError:= ClientSocketError;
  OnRead:= ClientSocketRead;
  OnWrite:= ClientSocketWrite;
  end;

end;
Код не проверял, писал прям тут, так как под рукой Delphi нету.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 12.04.2017 в 08:17.
Pavia вне форума Ответить с цитированием
Старый 12.04.2017, 08:13   #22
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 12.04.2017 в 08:18. Причина: Дубль
Pavia вне форума Ответить с цитированием
Старый 12.04.2017, 18:41   #23
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Во всех объявленных событиях в TClientSocket где написано ClientSocket1.... замените на
TClientSocket(Sender).... и будет вам счастье

Примерно так
Код:
procedure TForm1.ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Ждите....Идет подключение ' + TClientSocket(Sender).Address);
end;
а у вас сейчас так
Код:
procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Disconnect ' + ClientSocket1.Address);
end;
Возможно поэтому могут быть ошибки на обращение не к привязанному TClientSocket событию, это для примера

Последний раз редактировалось Aliens_wolfs; 12.04.2017 в 19:21.
Aliens_wolfs вне форума Ответить с цитированием
Старый 12.04.2017, 18:49   #24
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Сообщение от Pavia
Компоненты такие как ClientSocket2: TClientSocket; нельзя просто прописывать руками. Его надо обязательно положить на форму мышкой.
Можно создавать очень много без вложения на форму
Цитата:
Сообщение от Pavia
У вас и первый компонент создан неправильно.
Всё просто перед тем как использовать компонент его надо создать и обязательно привязать к форме.
ClientSocket1:= TClientSocket.Create(nil);
Это неправильная строчка нельзя указывать Nil. Обязательно нужна ссылка на форму. Правильно вот так вот
Необязательно привязывать к форме, если конечно вам не нужно искать этот контрол на форме созданный динамически.
Просто обращение и ClientSocket1 и ClientSocket2 идет в одних объявленных процедурах события, а там желательно обращаться каждый к своему контролу, что я и описал выше

Лично у меня и так работают оба, проверил, вот простой код

Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2Click(nil);
Button4Click(nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1:= TClientSocket.Create(nil);
ClientSocket1.OnConnecting:= ClientSocketConnecting;
ClientSocket1.OnConnect:= ClientSocketConnect;
ClientSocket1.OnDisconnect:= ClientSocketDisconnect;
ClientSocket1.OnError:= ClientSocketError;
ClientSocket1.OnRead:= ClientSocketRead;
ClientSocket1.OnWrite:= ClientSocketWrite;

ClientSocket2:= TClientSocket.Create(nil);
ClientSocket2.OnConnecting:= ClientSocketConnecting;
ClientSocket2.OnConnect:= ClientSocketConnect;
ClientSocket2.OnDisconnect:= ClientSocketDisconnect;
ClientSocket2.OnError:= ClientSocketError;
ClientSocket2.OnRead:= ClientSocketRead;
ClientSocket2.OnWrite:= ClientSocketWrite;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ClientSocket1.Destroy;
ClientSocket2.Destroy;
end;

//Подключаемся
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address:= '192.168.1.45';
ClientSocket1.Port:= 23;
ClientSocket1.ClientType:= ctNonBlocking;
ClientSocket1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket2.Address:= '192.168.1.46';
ClientSocket2.Port:= 23;
ClientSocket2.ClientType:= ctNonBlocking;
ClientSocket2.Open;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket2.Close;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Connect ' + TClientSocket(Sender).Address);
end;

procedure TForm1.ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Ждите....Идет подключение ' + TClientSocket(Sender).Address);
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Disconnect ' + TClientSocket(Sender).Address);
end;

procedure TForm1.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
Form1.Memo1.Lines.Add(Format('Error: %s  %s', [TClientSocket(Sender).Address, SysErrorMessage(ErrorCode)]));
ErrorCode:= 0; //чтобы не было ошибок в сокете
end;

procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Read ' + Socket.ReceiveText);
end;

procedure TForm1.ClientSocketWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
Form1.Memo1.Lines.Add('Write ' + Socket.ReceiveText);
end;
Если вам нужно делать например на 5 или более ClientSocket то можно код усовершенствовать что бы не писать много
повторяющихся функций

Сколько вообще у вас будет ClientSocket?

Последний раз редактировалось Aliens_wolfs; 12.04.2017 в 19:22.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.04.2017, 03:03   #25
Fox78
Пользователь
 
Регистрация: 17.03.2017
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Сколько вообще у вас будет ClientSocket?
Я пока планирую 2. Сейчас немножечко разгребусь и хочу попробовать без добавления компонента на форму =)
Fox78 вне форума Ответить с цитированием
Старый 13.04.2017, 07:46   #26
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

И без компонента все будет работать, выше рабочий код
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Терминал Помощь. everlest Общие вопросы Delphi 2 19.01.2015 09:50
терминал Microlot gugushka Компьютерное железо 0 19.10.2012 11:31
Терминал Линукс! Necare Помощь студентам 3 20.04.2011 17:22
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05