12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
1

TCPClient && TCPServer Indy Components

24.06.2010, 22:54. Показов 23938. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.

Программа пишется в C++ Builder 2010.

Написал Серверную часть чата и Клиентскую часть чата. Естественно не все, что хотелось бы ^_^


Схема идеи:
TCPClient && TCPServer Indy Components


Client 1-3 Посылают сообщения, которые попадают на сервер. После того как сервер получил сообщение, он записывает сообщение в лог и рассылает его всем Client'aм и тому кто его послал. Вот в принципе и вся идея. Помогите разобраться с этим

Проблема этих программ:
1) При отправке сообщения на сервер используя кириллические символы, сервер отображает символы кириллицы как : "?????????????".


Исходник: Client && Server.rar

Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdContext"
#pragma link "IdCustomTCPServer"
#pragma link "IdTCPServer"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    LBT->Caption = "Сервер Отключен";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int con = StrToInt(EConnect->Text);
    ChatServer->Active = false;
    ChatServer->Active = true;
    ChatServer->MaxConnections = con;
    Memo1->Lines->Add("Была нажата кнопка \"Refresh Server\"");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if (ChatServer->Active) {
    LBT->Caption = "Сервер Активен";
 }
 else {
     LBT->Caption = "Сервер Отключен";
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ChatServerExecute(TIdContext *AContext)
{
   int length = AContext->Connection->Socket->ReadLongInt();
   UnicodeString Message = AContext->Connection->Socket->ReadString(length);
   AContext->Connection->Disconnect();
   Memo1->Lines->Add(Message);
   LMessage->Items->Add(Message);
}
//---------------------------------------------------------------------------
Unit1.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "IdBaseComponent.hpp"
#include "IdComponent.hpp"
#include "IdContext.hpp"
#include "IdCustomTCPServer.hpp"
#include "IdTCPServer.hpp"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TIdTCPServer *ChatServer;
    TButton *Button1;
    TEdit *EConnect;
    TLabel *Label1;
    TLabel *LBT;
    TTimer *Timer1;
    TMemo *Memo1;
    TListBox *LMessage;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall ChatServerExecute(TIdContext *AContext);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Клиентская часть.

Unit3.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdTCPClient"
#pragma link "IdTCPConnection"
#pragma link "IdContext"
#pragma link "IdCustomTCPServer"
#pragma link "IdTCPServer"
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
 
  EHost->Enabled = false;
  EPort->Enabled = false;
  CheckBox1->Caption = "Ввести параметры";
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked) {
    EHost->Enabled = true;
    EPort->Enabled = true;
    EHost->Text = "";
    EPort->Text = "";
    CheckBox1->Caption = "Вернуть настройки";
}  else {
    EHost->Enabled = false;
    EPort->Enabled = false;
    EHost->Text = "192.168.0.102";
    EPort->Text = "6666";
    CheckBox1->Caption = "Ввести параметры";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
 
    ChatClient->Host = EHost->Text; // имя хоста
    ChatClient->Port = 6666;  // номер порта
    ChatClient->Connect();
 
    ChatClient->Socket->Write(EMessage->Text.Length());
    ChatClient->Socket->Write(EMessage->Text);
    ChatClient->Disconnect(); // прерываем соединение
}
//---------------------------------------------------------------------------
Unit3.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//---------------------------------------------------------------------------
 
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "IdBaseComponent.hpp"
#include "IdComponent.hpp"
#include "IdTCPClient.hpp"
#include "IdTCPConnection.hpp"
#include "IdContext.hpp"
#include "IdCustomTCPServer.hpp"
#include "IdTCPServer.hpp"
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published:    // IDE-managed Components
    TEdit *EHost;
    TEdit *EPort;
    TGroupBox *GroupBox1;
    TListBox *LMessage;
    TEdit *EMessage;
    TButton *Button1;
    TGroupBox *GroupBox2;
    TCheckBox *CheckBox1;
    TIdTCPClient *ChatClient;
    void __fastcall CheckBox1Click(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm3(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2010, 22:54
Ответы с готовыми решениями:

Это что за иероглифы? if(!((a-4)&~7)&&!!(a-4))
Случайно наткнулся, выражение if(a&gt;=5 &amp; a&lt;=11) &quot;проще&quot; записывается так:...

TCPServer и TCPClient
Помогите мне пожалуста разобратся с этими двумя компонентами. Я хочу сделать интернет чат.

Синхронизация TCPClient и TCPServer
Я работаю с C++Builder2006, если кто знает помогите разобраться: Клиент посылает серверу запрос и...

Снова TCPServer и TCPClient
Пытаюсь сделать программку по этой статье,...

51
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 00:12 2
Maikl Til, это проблема начальных версий, которые не дружат с юникодом.
До пересылки преобразовывайте UnicodeString в обычный однобайтовый char * (для этого у класса UnicodeString есть метод t_str() ... в зависимости от версии IDE он может называться с_str() ... вызовите все методы и сравните возвращаемый тип)
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 00:44  [ТС] 3
Цитата Сообщение от MikeSoft Посмотреть сообщение
Maikl Til, это проблема начальных версий, которые не дружат с юникодом.
До пересылки преобразовывайте UnicodeString в обычный однобайтовый char * (для этого у класса UnicodeString есть метод t_str() ... в зависимости от версии IDE он может называться с_str() ... вызовите все методы и сравните возвращаемый тип)

Я решил проблему с кириллическими символами, поменяв принцип самой отправки на

Для клиента :
C++
1
ChatClient->IOHandler->WriteLn(EMessage->Text,enUTF8);
Для сервера :
C++
1
UnicodeString Message = AContext->Connection->IOHandler->ReadLn(enUTF8);



Как теперь отправить полученное сообщения клиентам?
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 01:06 4
Maikl Til, если мне не изменяет память, у сервера должна быть структура Bindings.
В ней должны хранится сокеты подключённых пользователей.
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 01:29  [ТС] 5
Цитата Сообщение от MikeSoft Посмотреть сообщение
Maikl Til, если мне не изменяет память, у сервера должна быть структура Bindings.
В ней должны хранится сокеты подключённых пользователей.
А как сервер узнает, какому клиенту отправлять? Если при попытки отправить ему сообщение, он пишет, что "Соединение было корректно закрыто". Из этого следует, что сервер не сможет узнать его имя, до того момента, пока клиент не подключится к серверу, а подключается только тогда, когда отправляет сообщение и сразу же отрубается.

Но даже, если мы и узнаем имя клиента, за эти доли секунды, то как он сможет отправить сообщение на офф клиента ? )
0
32 / 32 / 8
Регистрация: 21.10.2009
Сообщений: 97
25.06.2010, 10:32 6
Делайте соединение не через таймер, а через speedbutton if(SpeedButton1->Down) то ...
Таким образом у вас всегда будет активное подключение.
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 14:42 7
Цитата Сообщение от Maikl Til Посмотреть сообщение
А как сервер узнает, какому клиенту отправлять?
Сервер ничего сам "узнавать не будет". Вы должны ему указать.

Цитата Сообщение от Maikl Til Посмотреть сообщение
а подключается только тогда, когда отправляет сообщение и сразу же отрубается.
Вот это ваша грубейшая ошибка. Соединение должно устанавливаться в момент открытия программы и разрываться по её завершению, либо по команде пользователя. Только в этом режиме сервер имеет право отправить сообщение "назад". Клиент в это время будет находится в режиме прослушивания.

Цитата Сообщение от Maikl Til Посмотреть сообщение
Но даже, если мы и узнаем имя клиента, за эти доли секунды, то как он сможет отправить сообщение на офф клиента ? )
Здесь нет понятия "доля секунды". Есть событие. И если оно возникло - то вы в праве им воспользоваться. Клиент отправляет сообщение и сразу отключается - событие всё-равно возникает и автоматом будет выполнен тот код, которым вы обрабатываете это событие (не важно, сколько оно длится).

Отсюда вывод: Вы в праве "запомнить" подключившегося клиента. Если же вы хотите чтобы клиент отключался моментально после отправки, то вам нужно создавать очередь сообщений. Хранить её глобально. При подключении клиента проверять, нет ли в очереди писем конкретно для него. Если есть - отослать.
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 15:08  [ТС] 8
Цитата Сообщение от voalex Посмотреть сообщение
Делайте соединение не через таймер, а через speedbutton if(SpeedButton1->Down) то ...
Таким образом у вас всегда будет активное подключение.
Ну вот причем тут мой таймер!?!? ? ! Таймер просто отображает результат соединения с интервалом проверки в 1000 и ВСЕ. Соединение же происходит через кнопку.



Еще сегодня ночью поправил код и сделал соединение между пользователем и сервером открытым до момента закрытия соединения пользователем. Но, как я прочел в книге по инди, написанная для дельфи, то там есть некие исключения. О_О короче, если сервер отключается при активном пользователе, то сервер зависает.

Закрыть соединение через обычные кнопки мне не удалось, так как соединение открывается через AContext и его можно использовать только в событие OnExecute.


У кого есть предложения???


25 июня 2010 -----> Client && Server ver 1.0.rar




MikeSoft Да, ты прав. Я сегодня ночью, после заданного мною вопроса как сделать, взял и сделал )))) Но все же... Я через Bindings не нашел ничего похожего на получения IP или Имя.
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 16:13 9
Цитата Сообщение от Maikl Til Посмотреть сообщение
Я через Bindings не нашел ничего похожего на получения IP или Имя.
Качать проект, выложенный вами я не буду, т.к. у меня другая версия Indy ...
Но с Bindings я работал и раньше. Попробуйте найти по аналогии. На Indy 10 IP-адрес можно получить так:
C++
1
IdTCPServer1->Bindings->Items[0]->PeerIP;
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 17:02  [ТС] 10
Цитата Сообщение от MikeSoft Посмотреть сообщение
Качать проект, выложенный вами я не буду, т.к. у меня другая версия Indy ...
Но с Bindings я работал и раньше. Попробуйте найти по аналогии. На Indy 10 IP-адрес можно получить так:
C++
1
IdTCPServer1->Bindings->Items[0]->PeerIP;
Куда и как вписать это? и как вывести результат ?

Добавлено через 15 минут
В Общем я разобрался и записал вот в таком виде:

C++
1
2
3
4
   Memo1->Lines->Add("К вам присоеденился пользователь");
UnicodeString ip = AContext->Binding()->PeerIP;
UnicodeString port = AContext->Binding()->PeerPort;
      LMessage->Items->Add(ip + " " + port);

Вот только теперь другая проблема! После каждого отключения и подключения, на сервере пишет что IP такой то подключился по такому-то порту. И этот порт каждый раз растет на +1 О_о. как так то ? При этом порт не меняется.

Подскажи пожалуйста, что значат эти слова в программирование "unsigned short" ?
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 17:10 11
Maikl Til, вам нужно держать список всех подключённых...
Поэтому вешайте на событие OnConnect ... В нём можно ещё воспользоваться AContext:
C++
1
UnicodeString PeerInfo = AContext->Binding()->PeerIP + ":" + IntToStr(AContext->Binding()->PeerPort);
После этого, в PeerInfo у вас будут записи в формате IP:Port. Сохраняйте их, как вам удобно для вашей программы.

Добавлено через 4 минуты
Цитата Сообщение от Maikl Til Посмотреть сообщение
После каждого отключения и подключения, на сервер пишет что IP такой то подключился по такому-то порту. И этот порт каждый раз растет на +1 . как так то ? При этом порт не меняется.
Чего-то я суть проблемы не понял...

Цитата Сообщение от Maikl Til Посмотреть сообщение
Подскажи пожалуйста, что значат эти слова в программирование "unsigned short" ?
unsigned short это тип данных, который занимает 2 байта и может хранить в себе значения в диапазоне от 0 до 65535.
Само по себе слово unsigned указывает на то, что тип данных будет иметь беззнаковый характер (то есть допускается хранение только положительных элементов)
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 17:27  [ТС] 12
Чего-то я суть проблемы не понял...

Подключение первое :

Показатели сервера:
ip: 192.168.0.102
port: 2201

Не отключая программу, НО отключаюсь от сервера, чтобы сделать переподключение.

Подключение второе :

Показатели сервера:
ip 192.168.0.102
port: 2202

Порт вырос на +1 или это просто баги?

После отключения программы показатели сервера, все равно показывают порт на +1. То есть они как бы не забывают предыдущих показателей.
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
25.06.2010, 17:40 13
Цитата Сообщение от Maikl Til Посмотреть сообщение
После отключения программы показатели сервера, все равно показывают порт на +1. То есть они как бы не забывают предыдущих показателей.
Просто выделяется другой порт. Ничего опасного в этом нет.
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
25.06.2010, 18:48  [ТС] 14
Не могу понять, как все таки сделать так, чтобы сервер мог нормально отправлять сообщения?

Получается отправить сообщение с сервера уже в готовом виде. Например так:

C++
1
2
          UnicodeString Good = "Аааааааааааааааааааааааааа";
      AContext->Connection->IOHandler->WriteLn(Good,enUTF8);
На клиенте в обработчике кнопки, стоит следующее:

C++
1
2
          UnicodeString Message = ChatClient->IOHandler->ReadLn(enUTF8);
          LMessage->Items->Add(Message);

если же в клиенте, второй раз нажимаю на кнопку "получить сообщение от сервера", то клиент виснет ))) и сообщение не приходит ((
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
29.06.2010, 14:55 15
ну во-первых огромное спасибо топикстартеру, вы мне очень помогли в создании взаимодействия клиент->сервер, и я так же не понял как сделать обратку, сервер->клиент, за подсказку или примерчик буду крайне благодарен, так как до этого имел дело только с HTTP клиентом в инди
0
32 / 32 / 8
Регистрация: 21.10.2009
Сообщений: 97
29.06.2010, 15:26 16
Вот ссылка - может кому будет интересно. Там простенький пример приема/передачи файлов
Добавлено через 46 секунд
http://devoid.com.ua/c-builder... ocket.html
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
29.06.2010, 23:02 17
Цитата Сообщение от voalex Посмотреть сообщение
Вот ссылка - может кому будет интересно. Там простенький пример приема/передачи файлов
Добавлено через 46 секунд
http://devoid.com.ua/c-builder... ocket.html
но там компоненты другие и суть не та, мне б понять как сделать так что б серв ответил клиенту по принципу (для серва): принял->обработал->ответил
в гугле почти все цука на дельфи и это бесит

Добавлено через 2 часа 35 минут
Начал чиать книгу Глубины Indy думаю это будет лучше всего

Добавлено через 23 минуты
Цитата Сообщение от Maikl Til Посмотреть сообщение
Не могу понять, как все таки сделать так, чтобы сервер мог нормально отправлять сообщения?

Получается отправить сообщение с сервера уже в готовом виде. Например так:

C++
1
2
          UnicodeString Good = "Аааааааааааааааааааааааааа";
      AContext->Connection->IOHandler->WriteLn(Good,enUTF8);
На клиенте в обработчике кнопки, стоит следующее:

C++
1
2
          UnicodeString Message = ChatClient->IOHandler->ReadLn(enUTF8);
          LMessage->Items->Add(Message);

если же в клиенте, второй раз нажимаю на кнопку "получить сообщение от сервера", то клиент виснет ))) и сообщение не приходит ((
эм, может вы уже разобрались но судя по всему вы не разрываете соединение, и пытаетесь заново его подключить

Добавлено через 4 часа 33 минуты
отзовитесь, кто нить HELP!!!
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 18:08  [ТС] 18
Цитата Сообщение от StyleT Посмотреть сообщение
ну во-первых огромное спасибо топикстартеру, вы мне очень помогли в создании взаимодействия клиент->сервер, и я так же не понял как сделать обратку, сервер->клиент, за подсказку или примерчик буду крайне благодарен, так как до этого имел дело только с HTTP клиентом в инди
Дело в том, что соединение всегда работает. Сервер может отправлять сообщение клиенту, НО, клиент после этого зависает, когда доходит до конца передачи сообщения. Типо клиент ждет еще сообщений от сервера и по этому висит. Я пока работаю над этим.

Если есть идеи, я только за чтобы кто-то помог. Будем вместе думать.

Я против прерывания соединения с сервером и на оборот, это ведь глупо!
0
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 9
30.06.2010, 18:55 19
Цитата Сообщение от Maikl Til Посмотреть сообщение
Дело в том, что соединение всегда работает. Сервер может отправлять сообщение клиенту, НО, клиент после этого зависает, когда доходит до конца передачи сообщения. Типо клиент ждет еще сообщений от сервера и по этому висит. Я пока работаю над этим.

Если есть идеи, я только за чтобы кто-то помог. Будем вместе думать.

Я против прерывания соединения с сервером и на оборот, это ведь глупо!
мне тоже вариант с обрывом соединения не подходит, так как в моем случае крайне важно быстродействие. Какую функцию вы использовали на клиенте для приема сообщения? Если он зависает это хорошо, все потому что он ждет символ конца сообщения, и если бы я смог увидеть ваш код, думаю это можно было бы решить, у меня пока схожая проблема

Добавлено через 16 минут
Нашел в чем проблема, проблема в пареметре функции ReadString(*тут*), там почему то добавляется значение... Вот что вышло при установке значения в 3 байта:

Код
Ответ: 
Ответ: He
Ответ: llo
Ответ: Ser
Ответ: ver
Ответ:  fu
Ответ: cke
Ответ: r
вместо постоянного счинывания начала фразы, оно читает кусками, и это очень странно...
0
12 / 12 / 1
Регистрация: 19.03.2010
Сообщений: 71
30.06.2010, 19:05  [ТС] 20

Код
Ответ: 
Ответ: He
Ответ: llo
Ответ: Ser
Ответ: ver
Ответ:  fu
Ответ: cke
Ответ: r
вместо постоянного счинывания начала фразы, оно читает кусками, и это очень странно...
Так ты ведь ему значение в 3 байта поставил. Поставь больше и все будет норм или же приравняй к длине значения и пусть сам выбирает сколько ему байт отправлять.

если бы я смог увидеть ваш код, думаю это можно было бы решить, у меня пока схожая проблема
Ты так официально обращаешься, что меня даже это пугает )))) Ну да ладно.

Кусочек для сервера :

C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::ChatServerExecute(TIdContext *AContext)
{
 
      //-----------------Отправка сообщения клиентам----------------------->
 
     UnicodeString Good = "if (you fuck me == true){\n     You must Die = 1 sec;\n}";
     AContext->Connection->IOHandler->WriteLn(Good,enUTF8);
 
 
}
Для клиента:

C++
1
2
3
4
5
6
void __fastcall TForm3::ChatClientConnected(TObject *Sender)
{
  //---------------принимаем сообщение от сервера--------------------------->
  UnicodeString Message = ChatClient->IOHandler->ReadLn(enUTF8);
  LMessage->Items->Add(Message);
}

при таких простых манипуляциях, все успешно проходит. Вот только как задать конец отправки?
0
30.06.2010, 19:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2010, 19:05
Помогаю со студенческими работами здесь

Передача файлов через TcpServer и TcpClient
Добрый день, уважаемые форумчане. Столкнулся я со следующей задачей. Мне необходимо передать файл с...

TcpServer и TcpClient, как переслать сообщение
Как работать с TcpServer и TcpClient в C++Builder 2010? Например, как переслать сообщение от...

Оператор && - добавить в одну строчку Memo текст с ListBox1 и ListBox2
значит нужно добавить в одну строчку Memo текст с ListBox1 и ListBox2 хотел реализовать через...

Rad studio XE3 && OpenGL
скачал отсюда библиотеки http://www.onlinedisk.ru/file/620466/ glut.dll and glut32.dll скопировал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru