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
|
|
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
|
Извиняюсь. Пока дергал куски из кода проустил пару постов. |
|
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
|
Билдер на работе не установлен! |
|