Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2009, 20:11   #211
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вот так:
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
// проверка, программа в режиме клиента
  If ClientSocket.Active=True then
    Begin
      ClientSocket.Socket.SendText('0['+TimeToStr(Time)+': '+NikEdit.Text+' отключился');
    end;
end;
Пока код внутри не завершит свою работу, форма не выгрузится. Можно быть уверенным, сообщение дойдет до сервера.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 19.06.2009, 15:50   #212
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Вот так:
Код:
procedure TForm1.FormDestroy(Sender: TObject);
begin
// проверка, программа в режиме клиента
  If ClientSocket.Active=True then
    Begin
      ClientSocket.Socket.SendText('0['+TimeToStr(Time)+': '+NikEdit.Text+' отключился');
    end;
end;
Пока код внутри не завершит свою работу, форма не выгрузится. Можно быть уверенным, сообщение дойдет до сервера.
Не работает...форма закрывается, а сообщения нету...

Еще вопрос:
как ПРАВИЛЬНО организовать регистрацию пользователей, накидайте алгоритм (если не трудно и код), заранее благодарю!
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 19.06.2009 в 15:58.
spirit-ua вне форума Ответить с цитированием
Старый 19.06.2009, 17:25   #213
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от spirit-ua Посмотреть сообщение
Не работает...форма закрывается, а сообщения нету...

Еще вопрос:
как ПРАВИЛЬНО организовать регистрацию пользователей, накидайте алгоритм (если не трудно и код), заранее благодарю!
Тоже не рабит, я зделал так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
// проверка, программа в режиме клиента
  If ClientSocket.Active=True then
    Begin
      ClientSocket.Socket.SendText('0['+TimeToStr(Time)+': '+NikEdit.Text+' отключился');
    end;

Application.Terminate;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 19.06.2009, 17:35   #214
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Тоже не рабит, я зделал так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
// проверка, программа в режиме клиента
  If ClientSocket.Active=True then
    Begin
      ClientSocket.Socket.SendText('0['+TimeToStr(Time)+': '+NikEdit.Text+' отключился');
    end;

Application.Terminate;
end;
По кнопке я тоже могу сделать, нада чтоб работало в процедуре закрытия или уничтоженя формы...
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 19.06.2009, 19:49   #215
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

По поводу готовых алгоритмов, ...теоретические сведения о системе регистрации я давал, нужно только подумать. Жизнь штука сложная, нужно все стараться делать самому, иначе в один не хороший момент помощников по близости не окажется ) ...так что начинаем самостоятельно, выкладываем, я помогаю, если тупик.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 20.06.2009, 20:26   #216
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Нужно ознакомиться с процедурой обработки списка пользователей на стороне клиента, а именно с ClientSocketRead:
Код:
...
// примем строку списка пользователей
    2: Begin
// очищаем список клиентов
         UserListView.Items.Clear;
// добавим ключ конца строки (т.к. вырезка символов с задержкой)
         text:=text+Chr(152);
// укажем начальный символ
         pos:=2;
// обнулим счетчик символов
         x:=0;
// пробегаем по длине строки списка
         For j:=2 to len+1 do
           Begin
// записываем в счетчик сдвиг
             x:=x+1;
// если найден ключ (отделение ников в строке)
             If Copy(text,j,1)=Chr(152) then
               Begin
// добавим в UserListView строку
                 UItems:=UserListView.Items.Add;
                 UItems.Caption:=Copy(text,pos,x-1);
// укажем соответствующую иконку пользователя
                 If pos>2 then UItems.ImageIndex:=0 else UItems.ImageIndex:=1;
// изменим текущую позицию в строке списка
                 pos:=j+1;
// обнулим счетчик символов
                 x:=0;
               end;
           end;
       end;
...
Немножко подумаем. Логика данного кода такова: ставим указатель в начало принятой строки и сканируем каждый символ, сверяем его с ключом конца, если ключ еще не найден, переносим позицию на 1, т.е. на следующий символ, и так, пока не найдется ключ.
Для этого нужен цикл по-j от 2 до len, в нем условие с вырезкой символа Copy(text,j,1), или text[j] (что равноценно, если вырезается один символ) и сравнением с ключом. В теле условия нужна текстовая переменная, которая наполняется проверенными символами, допустим TempName := TempName + text[j]; ...эта переменная до цикла должна быть обнулена. Как условие найдет ключ, нужно сбросить цикл, использовать break. Ник пользователя, приславшего пакет будет в переменной TempName.
Итак, цикл сброшен, j хранит позицию на которой находится ключ. Достаточно прибавить к j единицу, и это - позиция с которой нужно начинать вырезать содержимое пакета до его конца len. Возможно потребуется коррекция, нужно смотреть не обрезает ли код конец, соответственно, добавлять к len константу (все зависит от ключа команды в начале пакета).

Послесловие: ...я бы рекомендовал использовать в качестве ключа определения ника символ, который нельзя ввести с клавиатуры, это Chr(128), Chr(129), Chr(131) - Chr(138), Chr(140) - Chr(144), Chr(152) - Chr(154), Chr(156) - Chr(165), Chr(174) - Chr(182) и пр.
Решил попробовать зделать.
Код:
var
  Form1: TForm1;
  zzz, TempName: string;
  len, pos, x: Word;
  com, j: Byte;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
zzz:='0Name'+Chr(128)+': Привет!';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TempName:='';
// получим текст, код комманды, длину строки
  text:=zzz;
  com:=StrToInt(Copy(text,1,1));
  len:=Length(text)-1;
// определение комманд
  Case com of
  0: begin
// укажем начальный символ
         pos:=2;
// обнулим счетчик символов
         x:=0;
// пробегаем по длине строки списка
         For j:=2 to len+1 do
           Begin
// записываем в счетчик сдвиг
             x:=x+1;
// если найден ключ (отделение ников в строке)
             If Copy(text,j,1)=Chr(128) then
               Begin
               TempName:=TempName+text[j];

//---\\\
Memo1.Lines.Add();
end;
end;
end;
end;
end;
только не пойму в каком именно месте нужно сбросить цикл, использовать break. И дальнейшие действия непонятны.
Shouldercannon вне форума Ответить с цитированием
Старый 20.06.2009, 21:56   #217
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Почти верно, но за исключением условия. "Сравнение" не означает знак равенства в обязательном порядке, ...нужно "копить" символы если еще не ключ, значит знак "<>", иначе (условие утвердительно проверяет равенство) сброс цикла. Вот так:
Код:
// определение комманд
  Case com of
  0: begin
       // укажем начальный символ
       pos := 2;
       // обнулим счетчик символов
       x := 0;
       // пробегаем по длине строки списка
       For j := 2 to len+1 do
         Begin
           // записываем в счетчик сдвиг
           x := x + 1;
           // если это не ключ (отделение ников в строке)
           If Copy(text,j,1) <> Chr(128) then TempName := TempName + text[j]
           // если ключ, то сброс цикла в котором условие.
           else Break;
         end;
       // остальное - сообщение, длина сообщения = вся длина - счетчик имени
       TempText := Copy(text,j+1,len-x);
     end;
  end;
Ник будет в переменной TempName, а сообщение в TempText.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.06.2009, 09:48   #218
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

С простым сообщением разобрались. С личкой сложнее.
так я отправляю приватное сообщение
Код:
ClientSocket.Socket.SendText('3'+addressee+Chr(152)+Form2.ENick.Text+Chr(128)+': '+MMessage.Text);
так обрабатываю
Код:
// добавим в RVChat приватное сообщение с сервера
    3: begin
    // укажем начальный символ
    pos:=2;
    // обнулим счетчик символов
    x:=0;
    // пробегаем по длине строки списка
    For j:=2 to len+1 do
    Begin
    // записываем в счетчик сдвиг
    x:=x+1;
    // если это не ключ (отделение ников в строке)
    If Copy(text,j,1) <> Chr(128) then TempName:=TempName + text[j]
    // если ключ, то сброс цикла в котором условие.
    else Break;
    end;
    // остальное - сообщение, длина сообщения = вся длина - счетчик имени
    TempText:=Copy(text,j+1,len-x);
//
Memo1.Lines.Add(Copy(text,3+Length(Form2.ENick.Text),len-Length(Form2.ENick.Text)-1)); //Здесь штопор
Код:
Memo1.Lines.Add(Copy(text,3+Length(Form2.ENick.Text),len-Length(Form2.ENick.Text)-1));
где именно здесь разместить TempName с TempText?

Последний раз редактировалось Shouldercannon; 21.06.2009 в 13:55.
Shouldercannon вне форума Ответить с цитированием
Старый 22.06.2009, 12:28   #219
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
С простым сообщением разобрались. С личкой сложнее.
так я отправляю приватное сообщение
Код:
ClientSocket.Socket.SendText('3'+addressee+Chr(152)+Form2.ENick.Text+Chr(128)+': '+MMessage.Text);
так обрабатываю
Код:
// добавим в RVChat приватное сообщение с сервера
    3: begin
    // укажем начальный символ
    pos:=2;
    // обнулим счетчик символов
    x:=0;
    // пробегаем по длине строки списка
    For j:=2 to len+1 do
    Begin
    // записываем в счетчик сдвиг
    x:=x+1;
    // если это не ключ (отделение ников в строке)
    If Copy(text,j,1) <> Chr(128) then TempName:=TempName + text[j]
    // если ключ, то сброс цикла в котором условие.
    else Break;
    end;
    // остальное - сообщение, длина сообщения = вся длина - счетчик имени
    TempText:=Copy(text,j+1,len-x);
//
Memo1.Lines.Add(Copy(text,3+Length(Form2.ENick.Text),len-Length(Form2.ENick.Text)-1)); //Здесь штопор
Код:
Memo1.Lines.Add(Copy(text,3+Length(Form2.ENick.Text),len-Length(Form2.ENick.Text)-1));
где именно здесь разместить TempName с TempText?
и код приёма приватного сообщения заканчивается где -----------------------------------------------------------------------------
?
Код:
// отсылаем сообщение в канал приватного пользователя
                                 ServerSocket.Socket.Connections[i].SendText('0'+Copy(text,3+Length(PrivateUser),len-Length(PrivateUser)-1));
// сбрасываем цикл
                                 break;
                               end;
                           end;
                       end;
                   end;
// -----------------------------------------------------------------------------
спрашиваю, чтобы знать где точно ставить обработку других команд
Код:
7: begin
...
8: begin
...
и т.д.
Shouldercannon вне форума Ответить с цитированием
Старый 22.06.2009, 19:08   #220
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
Код:
Memo1.Lines.Add(Copy(text,3+Length(Form2.ENick.Text),len-Length(Form2.ENick.Text)-1));
где именно здесь разместить TempName с TempText?
Ну, здрасте... ))) Если нужно отобразить строчку, а ее части это TempName и TempText, то как угодно, паровозом их через знак сложения:
Код:
Memo1.Lines.Add(TempName+TempText);
Можно еще что-то вставить, если нужно.

Цитата:
Сообщение от Shouldercannon
и код приёма приватного сообщения заканчивается где --------------------------?

Код:
// отсылаем сообщение в канал приватного пользователя
                                 ServerSocket.Socket.Connections[i].SendText('0'+Copy(text,3+Length(PrivateUser),len-Length(PrivateUser)-1));
// сбрасываем цикл
                                 break;
                               end;
                           end;
                       end;
                   end;
// -----------------------------------------------------------------------------
спрашиваю, чтобы знать где точно ставить обработку других команд

Код:
7: begin
...
8: begin
...
и т.д.
Код на секцию Case заканчивается на end, тот что по уровню слева находится на одной позиции с Begin этой секции. Чтобы не пурхаться всегда ставьте все операторы начала и конца, и в строгом соответствии с позицией слева, ...помогает.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17