C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Задачка???
SASH
  Отправлено: 21.12.2004, 12:31


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Доброго дня всем!!!
Возник такой итересный вопрос:
Есть форма. На форме лежит компонент Label или, например, Image. Берем этот компонент и перемещаем его мышкой по форме. Как эти компоненты перемещать я знаю. Что необходимо: на соседнем компьюторе, например, тоже запущена примерная программа с Label'oм. После моего перемещения этого компонента на моем ПК, как отобразить перемещение этого — же компонента на соседнем ПК? Кто знает подскажиет пожалуйста!!!
Gedeon
Отправлено: 21.12.2004, 12:59


Ветеран

Группа: Модератор
Сообщений: 1742



ну что сделать, связь между этими прогами установить и передавать др. другу координаты этих самых компонент.
AVC
Отправлено: 21.12.2004, 13:03


Ветеран

Группа: Модератор
Сообщений: 1583



Соединить программы по типу клиент — сервер
или
"положить" новые координаты в общедоступном месте и считывать их переодически

Вариант сильно зависит от решаемой задачи. Если это типа удаленного управления то 1. А для одинкового вида у всех пользователей больше подойдет 2
SASH
Отправлено: 21.12.2004, 13:09


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Двигать объект должен только один пользователь, а второй должен только наблюдать.
Это можно какнибудь сделать с помощью файла, который бы хранился, например, на сервере или это можно сделать с помощью сокетов?
Если кто знает подскажите пожалуйста!!!
Shura
Отправлено: 21.12.2004, 13:43


Дежурный стрелочник

Группа: Участник
Сообщений: 45



ИМХО меньше геморроя если через сокеты делать. Не надо будет париться с доступом для папок. (особенно если стоит ntfs)
SASH
Отправлено: 21.12.2004, 13:44


Дежурный стрелочник

Группа: Участник
Сообщений: 58



А как это сделать через сокеты не подскажите?!!
xTrim
Отправлено: 21.12.2004, 14:27


Машинист паровоза

Группа: Участник
Сообщений: 208



Вот, слегка модифицировал ($BCB)\Examples\Internet\Chat\chat.bpr


User Attached Image Скачать файл
Chat_xTrim__041221_172320_.zip


AVC
Отправлено: 21.12.2004, 14:35


Ветеран

Группа: Модератор
Сообщений: 1583



Мне кажется, что с помощью socket'ов выгоднее.
Я бы поступил примерно так
Добавить DataModule
На нем ClientSocket и ServerSocket
Определяемся с адресами и портами (можно после старта адреса или и то и другое)
У сервера определяем события ClientWrite и, по желанию, GetTread, StartTread...
У клиента Read Write Error
Послать команду клиенту:
CODE

CS1->Address = pRemote_IP;
CS1->Port  = pRemote_Port;

FRemote_Command = ......;

try
{ CS1->Active  = true;
FClientDoCancel = false;

while (...)
 { Application->ProcessMessages();
 if (FClientDoCancel  ) break;
 if (FClientAllReading) break;
                               ...
 }

if(FClientDoCancel)
 { FClientDoCancel = false;
 rec->UpdAdd("HHCSock_CommandIsOk", false);
 rec->UpdAdd("HHCSock_AnswerText", "Запрос прерван пользователем");
 }
else if (!FClientAllReading)
 { rec->UpdAdd("HHCSock_CommandIsOk", false);
 rec->UpdAdd("HHCSock_AnswerText", "Истекло время ожидания ответа");
 }
else;
}
catch(Exception &xcp)
{ rec->UpdAdd("HHCSock_CommandIsOk", false);
rec->UpdAdd("HHCSock_AnswerText",  xcp.Message);
}

if (CS1->Active) CS1->Active = false;

//---------------------------------------------------------------------------
//  Клиент отправляет запрос
//---------------------------------------------------------------------------

void __fastcall TDM_HHCSock::CS1Write(TObject *Sender, TCustomWinSocket *ws)
{
............
ws->SendText(FRemote_Command);
}

//---------------------------------------------------------------------------
//   Клиент получил ответ
//---------------------------------------------------------------------------

void __fastcall TDM_HHCSock::CS1Read(TObject *Sender, TCustomWinSocket *ws)
{
AnsiString text = ws->ReceiveText();
.........
FClientAllReading = true;
}

//---------------------------------------------------------------------------
//  Клиент получил сообщение об ощибке
//---------------------------------------------------------------------------

void __fastcall TDM_HHCSock::CS1Error(TObject *Sender,
     TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
int err = ErrorCode;
ErrorCode = 0;

AnsiString  text = "HHCSock_Error";

TAxRecord *rec  = FRecordFromServer;

rec->UpdAdd("HHCSock_CommandIsOk", false);

if  (ErrorEvent == eeGeneral ) text += " eeGeneral";
else if (ErrorEvent == eeSend  ) text += " eeSend";
else if (ErrorEvent == eeReceive ) text += " eeReceive";
else if (ErrorEvent == eeConnect ) text += " eeConnect";
else if (ErrorEvent == eeDisconnect ) text += " eeDisconnect";
else if (ErrorEvent == eeAccept  ) text += " eeAccept";
else         text += "";

if (err != 0)
{ text += "\r\n" + AnsiString(err) + ": ";

AnsiString str = AnsiString::StringOfChar(' ', 250);
FormatMessage(
//     FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
 FORMAT_MESSAGE_FROM_SYSTEM,
 NULL,
 err,
 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
 str.c_str(),
 str.Length(),
 NULL
);
text += str.Trim();
}

rec->UpdAdd("HHCSock_AnswerText", text);

FClientAllReading = true;
}

// Сервер
//---------------------------------------------------------------------------
// Сервер получил сообщение — ответить (ServerType = stNonBlocking)
//---------------------------------------------------------------------------

void __fastcall TDM_HHCSock::SS1ClientWrite(TObject *Sender, TCustomWinSocket *ws)
{
ServerExecute(ws);
}

//---------------------------------------------------------------------------
// Сервер получил сообщение — ответить
// формат сообщения: Команда <пробел> параметры
// Возврат — флаги "что сделать после выплнения"
//---------------------------------------------------------------------------
int __fastcall TDM_HHCSock::ServerExecute (TCustomWinSocket *ws)
{
bool fromself = ws->RemoteAddress == ws->LocalAddress; // && ws->RemotePort == ws->LocalPort;

AnsiString text;
AnsiString cmd;
AnsiString prms;

int   retval = 0;

TAxRecord *srec = NULL;
srec = new TAxRecord();

bool  islock = false;
//ws->Lock(); islock = true;
try {
for (int i=0; i < 20000; i++) ws->ReceiveLength();

// Получить и расшифровать вопрос
text = ws->ReceiveText();

vint = text.Pos(' ');
if (vint > 1)
{ cmd  = text.SubString(1, vint-1).Trim().UpperCase();
prms = text.SubString(vint,text.Length()).Trim();
}
else
{ cmd  = text.Trim().UpperCase();
prms = "";
}

...........
// Зашифровать и отправить ответ
text = ......
ws->SendText(text);

} // try ws->Lock();
catch (...)  {; }

if (islock)  ws->Unlock();
ws->Close();

if (srec) delete srec;
return retval;
}


Это просто куски рабочего кода. Без обработки компилироваться не будут
AVC
Отправлено: 21.12.2004, 14:36


Ветеран

Группа: Модератор
Сообщений: 1583



Извиняюсь. Пока дергал куски из кода проустил пару постов. smile.gif
SASH
Отправлено: 21.12.2004, 14:47


Дежурный стрелочник

Группа: Участник
Сообщений: 58



А если этоже самое, но через файл, то как это будет?
AVC
Отправлено: 21.12.2004, 15:37


Ветеран

Группа: Модератор
Сообщений: 1583



Ведущая программа "кладет" новые координаты в общедоступном месте, а ведомая периодически считывает их оттуда.
Konstantine
Отправлено: 21.12.2004, 17:00


Мастер участка

Группа: Модератор
Сообщений: 545



через сокет — лучше, а через доступ криво будет....
токо ИМХО проще сделать через TServerSocket и TClientSocket
SASH
Отправлено: 22.12.2004, 06:17


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Спасибо за помощь в решении этой задачки — буду разбираться!!!
SASH
Отправлено: 22.12.2004, 06:32


Дежурный стрелочник

Группа: Участник
Сообщений: 58



TServerSocket и TClientSocket — это компоненты?
xTrim
Отправлено: 22.12.2004, 07:18


Машинист паровоза

Группа: Участник
Сообщений: 208



QUOTE
TServerSocket и TClientSocket — это компоненты?

Блин для кого я пример выложил? Посмотрели бы сперва, а потом спрашивали что конкретно не понятно. Или там не видно как это сделано?
SASH
Отправлено: 22.12.2004, 07:55


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Билдер на работе не установлен!

Вернуться в Вопросы программирования в C++Builder