Вопрос № 100606: Доброго времени суток ув. эксперты.
У меня такая проблема.
Как передавать данные через сокет?
С созданием клиента и сервера я уже разобрался. Подключение и передача текстовых сообщений проходят нормально. Например мне нужно передать содер...Вопрос № 100644: Добрый день.
Как отловить подключениеотключение USB-флэши.
Спасибо....Вопрос № 100681: Всем привет!!!
У меня такой вопрос: как определить вставлен ли чистый диск в дисковод.
DiskSize, DiskFree, GetVolumeInformation пробовал - не получилось.
Может кто сталкивался с проблемой такого рода, за каждый ответ буду благодарен....
Вопрос № 100.606
Доброго времени суток ув. эксперты.
У меня такая проблема.
Как передавать данные через сокет?
С созданием клиента и сервера я уже разобрался. Подключение и передача текстовых сообщений проходят нормально. Например мне нужно передать содержимое массива
var a: array[1..100] of string; от сервера клиенту в аналогичный массив и обратно от клиента к серверу.
Как это сделать? Если можно пример приложения клиента и сервера.
Заранее всем благодарен.
Передача структур сложнее чем строка осуществляется с использованием SendBuf вместо SendText. Однако, если структура содержит элементы с переменной длиной (а именно так реализованы строки в общем случае), то надо вручную заполнять буфер. Исходя из этого у вас есть 2 пути
1. Использовать "старые" Паскаль строки: определить массив как a : array[1..100] of String[255]; и передавать Socket.SendBuf(a, Sizeof(a));
2. Вычислить суммарную длину всех строк (не забывая про завершающий #0), выделить буфер такой длины, скопировать туда строки и передать буфер, а на сервере его "разобрать" обратно. Как вариант, сформировать единую строку вставляя разделитель строк (например, sTotal := sTotal + a[i] + #10;), и передавать уже этот текст.
Ответ отправил: PGM (статус: 9-ый класс)
Ответ отправлен: 03.09.2007, 09:02 Оценка за ответ: 5 Комментарий оценки: Sendbuf почему-то никак не идет, выдает ошибку. Собрать строку можно (как вариант), но долго разбирать потом.
Но все равно спасибо за помощь.
Отвечает: Gladiator
Здравствуйте, Алексей Акишин!
К примеру, можно использовать две посылки:
1-я: Тип данных 2-й посылки
2-я: Данные
Первой посылкой отправляешь текстовую строку:
Socket.SendText ('sd_massive').
Второй посылкой отправляешь данные типа TMas (см. приложение):
Socket.SendBuf(a, SizeOf(a));
Принимаем первую посылку и анализируем строку:
var
buff_mas: TMas;
if s= '' then
begin
s := Socket.ReceiveText;
Exit;
end;
if s = 'sd_massive' then
begin
Socket.ReceiveBuf(buff_mas, SizeOf(TMas));
s := '';
end;
Приложение:
Ответ отправил: Gladiator (статус: Студент)
Ответ отправлен: 03.09.2007, 09:22 Оценка за ответ: 4 Комментарий оценки: Я и сам понимаю, что должно быть так, но не работает.
Вопрос № 100.644
Добрый день.
Как отловить подключениеотключение USB-флэши.
Спасибо.
Добавить обработчик WM_DEVICECHANGE c wparam = DBT_DEVNODES_CHANGED и проверить список дисков.
Ответ отправил: PGM (статус: 9-ый класс)
Ответ отправлен: 03.09.2007, 19:24 Оценка за ответ: 5 Комментарий оценки: Спасибо
Вопрос № 100.681
Всем привет!!!
У меня такой вопрос: как определить вставлен ли чистый диск в дисковод.
DiskSize, DiskFree, GetVolumeInformation пробовал - не получилось.
Может кто сталкивался с проблемой такого рода, за каждый ответ буду благодарен.
Отвечает: Mishell
Здравствуйте, Бакалов Артем Маркович!
если Вы имеете под "чистый диск" имеете ввиду диск на котором нет файлов и директорий - то можно попробовать найти их - например см. приложение
Приложение:
Ответ отправил: Mishell (статус: 5-ый класс)
Ответ отправлен: 03.09.2007, 16:27
Отвечает: Проходящий Мимо
Здравствуйте, Бакалов Артем Маркович!
Чистый диск или запорченный - для стандартного приложения всего-лишь ошибка файловой системы. Можно или нет записать что-то на диск без помощи специализированных программ не обойтись, написать же свою - непростая задача. Могу предложить функцию, корорая опредиляет готовность дискового устройства. В качестве параметра передаем букву устройства.
function IsDriveReady(DriveLetter: char): boolean;
var
OldErrorMode: Word;
OldDirectory: string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
GetDir(0, OldDirectory);
{$I-}
ChDir(DriveLetter + ':');
{$I+}
if IoResult <> 0 then
Result := False
else
Result := True;
ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;
Удачи.
--------- Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 9-ый класс)
Ответ отправлен: 03.09.2007, 16:44
Отвечает: Shurka
Здравствуйте, Бакалов Артем Маркович!
Может быть поможет
GetDiskFreeSpace
Ответ отправил: Shurka (статус: 3-ий класс)
Ответ отправлен: 04.09.2007, 15:06 Оценка за ответ: 3 Комментарий оценки: К сожалению этот вариант я тоже пробовал...