![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача типов через TClientsData [D6, Win2k, WinXP]
Calligraff © (2008-12-10 10:53:00)Добрый день.
Подскажите пожалуйста как можно реализовать следующее:
Есть тип:
type
TClientsData = class(TObject)
UIN: Integer;
Password: String;
end;
var
Data: TClientsData;
begin
Data := TClientsData.Create;
Data.Login := 450355355;
Data.Password := '';
// TClientSocket
// Как отправить?
end;
Как отправить Data через TClientSocket, а на TServerSocket принять??
Зарание благодарен
Calligraff (2008-12-16 13:42:00) [1]понял. спасибо
Сергей М. (2008-12-16 13:39:00) [2]Вопросы по работе с СУБД задавай в соотв.конференции.
Calligraff (2008-12-16 13:31:00) [3]А не подскажешь, как массив TMSGARRAY = array[0..7168] of byte; записать в поле таблицы и каким типом должно быть поле?
БД MSSQL2000
Сергей М. (2008-12-16 10:22:00) [4]
> это с компонентом
Но не на форме же)
Медвежонок Пятачок (2008-12-16 10:19:00) [5]не не не, это с компонентом
:)
Сергей М. (2008-12-16 10:11:00) [6]
function MyQuery(inSQL: String): Boolean;
var
Query: TQuery;
begin
Query := TQuery.Create(nil);
try
.....
finally
Query.Free;
end;
end;
Медвежонок Пятачок (2008-12-16 10:09:00) [7]function MyQuery(inSQL: String): Boolean;
begin
Result := True;
end;
Calligraff (2008-12-16 10:07:00) [8]Сергей, а не подскажешь, как в функции, например
function MyQuery(inSQL: String): Boolean;
begin
..........
end;
выполнить запрос к SQL так, чтобы он не зависил от компонента TQuery находящегося на форме.
Т.е. выполнить запрос без компонента
Calligraff (2008-12-16 10:04:00) [9]ЗАРАААБООООТАЛОООО!!! :)
Сергей М. (2008-12-12 13:05:00) [10]Возьми за пример для изучения любойиз известных протоколов - ftp, http, smtp, pop3
В Тырнете подробных описаний этих протоколов (кто, кому, что, в каком формате, в какой последовательности и при каких условиях передает) - как грязи..
Calligraff (2008-12-12 12:41:00) [11]Где можно почитать о прикладных протоколах и как их писать?
Сергей М. (2008-12-12 12:08:00) [12]
> не силен в протоколах
Речь идет о твоем собственном прикладномпротоколе информационного обмена !
А компоненты TServerSocket и TCkientSoket предназначены лишь для осуществления соединения и передачи данных любогосодержания между клиентами и сервером.
Префикс - это тоже данные.
Calligraff (2008-12-12 12:01:00) [13]Сергей, к сожаления я не силен в протоколах.
Я использую компоненты TServerSocket и TCkientSoket
Подскажи пожалуйста, где мне копать, чтобы разобраться с префиксом?
Сергей М. (2008-12-12 11:26:00) [14]Ввведи в спецификацию своего прикл.протокола префикс типа инф.пакета.
Любой передаваемый (неважно от кого кому) пакет предваряется передачей соотв.префикса.
Для не болоее чем 256-ти различных типов пакетов достаточно префикса размеров в 1 байт.
Медвежонок Пятачок (2008-12-12 11:23:00) [15]тогда получится клиент-программа не будет знать что за тип ей пришел
для этого люди придумали понятие "протокол"
Calligraff (2008-12-12 11:02:00) [16]согласен, но иногда сервер должен будет передавать данные без запроса например обновление информации у клинтов о текущем состоянии.
тогда получится клиент-программа не будет знать что за тип ей пришел
Как можно поступить здесь?
Сергей М. (2008-12-12 10:59:00) [17]
> Каким образом можно узнать на клиентской машине, какой именно
> тип я передал?
Ну ты же сам сказал - в зависимости от запросов клиента.
Если клиент запросил конкретно RClientLoginInfo, то совершенно очевидно, что ожидает он ответ сервера в формате именно RClientLoginInfo и ни в каком ином.
Calligraff (2008-12-12 10:52:00) [18]Согласен в запросах исправлюсь. Тип Pointer - поучу :)
Тогда другой вопрос.
вот когда я передаю
formMain.ClientSocket1.Socket.SendBuf(Data,SizeOf(RClientLoginInfo));
то Data - Это у меня какой-то тип определенный, в данном случае Data: RClientLoginInfo; и на клиенте я получаю данные и все в порядке.
НО, допустим я хочу в передавать разные типы в зависимости от запросов клиента
наример есть два типа:
Data: RClientLoginInfo;
Data: RClientContactList;
Каким образом можно узнать на клиентской машине, какой именно тип я передал?
Зарание благодарен.
Сергей М. (2008-12-11 16:06:00) [19]В коде куча грубейшихошибок, демонстрирующих полное непонимание тобой предмета.
Data.DataPointer := Contacts; // здесь ты скопировал указатель на объект
Contacts.Free; // и тут же уничтожил этот объект, теперь скопированная ссылка смотрит в никуда (в поле Data.DataPointer отныне "мусор")
..
Contacts := TList.Create; // здесь ты создан новый объект и записал ссылку на него в перем-ю Contacts
Contacts := Data.DataPointer; // а здесь ты похерил эту ссылку, затерев ее "мусором" из Data.DataPointer, появившемся там при см.выше обстоятельствах
Ну и твоя работа с объектом Query в части хотя бы навигации по нему не выдерживает никакой критики.
Calligraff (2008-12-11 15:03:00) [20]День добрый
возникли еще вопросики :)
буду рад помощи.
procedure SendContactsList(Socket: TCustomWinSocket; Data: RUsrReceiveData);
var
i: Integer;
ToSocketID: Integer;
Contact: TContactListID;
Contacts: TList;
begin
....................
Contacts := TList.Create;
Contact := TContactListID.Create;
for i := 1 to formMain.queryContactsList.RecordCount do begin
formMain.queryContactsList.First;
Contact.UIN := formMain.queryContactsList.FieldValues['uininlst_id'];
Contact.Visiblity := formMain.queryContactsList.FieldValues['visiblity'];
Contacts.Add(Contact);
formMain.queryContactsList.Next;
end;
Contact.Free;
end;
formMain.queryContactsList.Close;
Data.DataPointer := Contacts;
Contacts.Free;
// временная проверка
Contacts := TList.Create;
Contacts := Data.DataPointer;
Contacts.Free;
Хотел проверить возможно ли обратно получить данные, но на строке Contacts := Data.DataPointer;ничего в Contacts от Data.DataPointer не присваивается, хотя в Data.DataPointer данные есть.
Подскажите как быть?