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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2010, 18:35   #331
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию

это я добавил в клинтсокетреад
pos:=j+1;
// обнулим счетчик символов
x:=0;
end;
end;
end;
end;
// восстанавливаем заголовок формы
Form1.Caption:='Test';
end;
4: begin
// клиент принимает и показывает в ChatMemo
ChatMemo.Lines.Add(Copy(text, 3, Length(text)-2)+' | '+Copy(text, 2, 1)); // тест nick | status
For j:=0 to UserListView.Items.Count-1 do
Begin
If UserListView.Items.Item[j].Caption = Copy(text, 3, Length(text)-2) then
UserListView.Items.Item[j].Caption := Copy(text, 3, Length(text)-2)+' ['+Copy(text, 2, 1)+']';
end;
end;


procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// добавим в ChatMemo сообщение о соединении с сервером
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключение к серверу.');
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Добро пожаловать.');
end;


и формкреате
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
StatusComboBox.Text := 'Статус';
StatusComboBox.Items.Add('Status 1');
StatusComboBox.Items.Add('Status 2');
StatusComboBox.Items.Add('Status 3');
StatusComboBox.Items.Add('Status 4');
StatusComboBox.Items.Add('Status 5');


// заголовок формы
Caption:='Test';
Application.Title:=Caption;
// предложенное значения порта
PortEdit.Text:='7777';
// адрес при проверке программы на одном ПК ("сам на себя")
HostEdit.Text:='bin-soft.sytes.net';
// остальные поля просто очистим
NikEdit.Text:='test';
TextEdit.Clear;
ChatMemo.Lines.Clear;
// сообщение для всех
PrivateEdit.Text:='Приват';
end;
errorrr вне форума Ответить с цитированием
Старый 05.03.2010, 18:50   #332
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от mishqa35 Посмотреть сообщение
Beermonza, при компиляции вот на этом месте выдает ошибку
Код:
Inc(Autores);
Я скопировал код, не глянув функцию, перепешите IntToStr на StrToInt:

Код:
UserMas[i].Image:=StrToInt(Copy(text,2,1));
errorrr, спешите с обвинениями, грубо нарушая синтаксис Delphi, ...начните с учебника, прочитайте раздел "Общие вопросы Delphi". Сие творение (чат) для разбирающихся, ...и я как-бы не обязан обучать азам программирования на Delphi, посему, можете даже обижаться, но только на себя.

С уважением.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 05.03.2010, 19:02   #333
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию ***

Ну для вас это пустяки ,для этого и форумы делают и тему вы свою хорошо
продвинули, я выложил все, помогите только поставить куски статуса на свои места в алгоритм от чата походу я все перепутал и не туда поставил
errorrr вне форума Ответить с цитированием
Старый 05.03.2010, 20:12   #334
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от errorrr Посмотреть сообщение
Ну для вас это пустяки ,для этого и форумы делают и тему вы свою хорошо
продвинули, я выложил все, помогите только поставить куски статуса на свои места в алгоритм от чата походу я все перепутал и не туда поставил
Читайте еще раз внимательно с поста #306, все подробным образом описано, ...mishqa35 выполняет то же самое, с нуля как и вы, но у него все получается. Удачи!
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 05.03.2010, 20:44   #335
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию

мдя принцип рулет напишите хотябы что читать что бы зделать чат если вам влом объяснить как зделать статусы

Последний раз редактировалось errorrr; 05.03.2010 в 20:46.
errorrr вне форума Ответить с цитированием
Старый 05.03.2010, 23:34   #336
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Хотя бы прочитайте первую статью "Создание клиент-сервера": http://pblog.ru/?p=91, следом вторую "Создание многопользовательского чата": http://pblog.ru/?p=100, комментарии почитайте к обоим статьям, ...затем весь материал этой темы, которая силами увлеченных людей, направлена дополнить исходный вариант необходимыми каждому функциями.
Все задающие здесь вопросы должны в обязательном порядке владеть азами программирования в Delphi. Статьи написаны абсолютно доступным языком, весь материал по апгрейду разложен "по полочкам". Если вы не понимаете, то это лично ваши проблемы, придется учиться понимать. Мне не было в лом написать две статьи и помогать задающим вопросы до сих пор, ...но готовый код я никогда выкладывать не буду, тем более делать за кого-то, поскольку у меня цель научить думать, показать куда двигаться, помочь советом, но не более того.
Программирование не игрушка, это серьезная работа и подходить к ней нужно со всей ответственностью, быть готовым самостоятельно решать задачи, ...а форум существует не для готового материала, а для обсуждения волнующих проблем, и методов их решения, ...склад ресурсов в другом месте всемирной паутины. Надеюсь, вы меня понимаете, ...перестанете кляньчить готовый код и начнете впитывать упомянутый выше материал.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 06.03.2010, 02:53   #337
errorrr
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 12
По умолчанию ;)

Спасибо! я все прочитаю и начну учиться, извените меня я был не прав ,
я надеюсь вы не куда не пропадете если что вместе решим код!
errorrr вне форума Ответить с цитированием
Старый 06.03.2010, 07:38   #338
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Beermonza, у мня так и было написано, тока вот не знаю откуда взялась строка Inc(Autores);, мб в новой версии чата что то добавлено еще, у мня просто первая версия уже довольно много изменено, и не хочется все переделывать в версии 2.
Код:
                      // смена картинки
                     UserMas[i].Image := StrToInt(Copy(text, 2, 1));
                      // отменить авторизацию счетчиком
                     Inc(Autores); // ошибка тут
mishqa35 вне форума Ответить с цитированием
Старый 06.03.2010, 17:03   #339
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

mishqa35, переменная Autores ползет с самого первого варианта. Это счетчик числа ответов на запрос сервера об авторизации. В самом конце процедуры ServerTimerTimer есть такой код:

Код:
// разрешение выполнения процедуры обновления списка
  If UpdList = True then
    Begin
// если все пользователи авторизованы
      If Autores = ServerSocket.Socket.ActiveConnections then
        Begin
// обновляем список пользователей
          UpdateUserList;
// блокируем разрешение
          UpdList := False;
        end;
    end;
В Case 1: числится Inc(Autores); - это прибавление переменной единицы, фактически Inc(Autores, 1), но Delphi понимает единицу и без ее указания, иначе нужно писать следом сколько прибавить.

Обнуление счетчика прописано в самом конце в UpdateUserMas:

Код:
// сброс авторизации
  Autores := 0;
Работает все следующим образом. Вначале переменная Autores равна нулю, ...на каком-то шаге у нас есть несколько клиентов, и подключается еще один. Флаг UpdMas в ServerSocketClientConnect или ServerSocketClientDisconnect сигнализирует, что можно обновить массив пользователей:

Код:
// разрешение выполнения процедуры обновления массива
  If UpdMas = True then
    Begin
// обновляем массив пользователей
      UpdateUserMas;
// блокируем разрешение
      UpdMas := False;
// разрешаем обновление списка
      UpdList := True;
    end;
В процедуре UpdateUserMas обновляется массив и сервер опрашивает подключившегося клиента "кто он такой" по коду 1. Счетчик Autores обнуляется, ...т.е. число пользователей известно, но подключившийся неизвестен, нужно начать считать. Далее в коде выше идет запрет на обновление UpdMas := False и разрешается обновление списка и создание пакета списка пользователей в процедуре UpdateUserList, которая ждет записи UserMas[i].Rec. Эта запись станет истинной только тогда, когда пользователь ответит по коду 1, счетчик Autores посчитает ответ и тут снова в самом конце ServerTimerTimer условие проверяет, все ли клиенты ответили, если все, то запускается обновление списка пользователей в процедуре UpdateUserList и подготовка и отправка списка пользователей. Программа переходит в ожидающий режим, готовая определить и добавить/удалить пользователей.

Если каким-то образом переменная удалена, то нужно добавить:
Код:
Var
  Autores: Byte;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 09.03.2010, 08:55   #340
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Beermonza, не знаю откуда появилась переменная Autores, но во всех скачанных версиях из этой темы, её там нет.
По статусам осталось разобраться тока с серверной частью, ошибка вот в чем.
У мня в чате общается тока 2 человека, Сервер(1) и Клиент(2), в клиенте со статусами проблем нету, у Сервера проблема в том что, когда Клиент(2) отключается статус сбрасывается на дефолтный, дефолтный у мня загружается в процедуре FormCreate. При смене статуса он записывается в ini файл, с этим(чтение\запись ini) ни каких проблем нету, дам кусочки кода для наглядности.
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ReadIni; // читаем ini файл
..
  StatusBox.Items.Add('первый');
  StatusBox.Items.Add('второй');
  StatusBox.Items.Add('третий');
..
StatusBox.ItemIndex := StrToInt(Istatus); // Istatus - это число подгружается из ini
end;
Код:
procedure TForm1.StatusBoxChange(Sender: TObject);
var
  st: string;
begin
// если я сервер
If ServerSocket.Active <> false then
  begin
    For j := 0 to ServerSocket.Socket.ActiveConnections -1 do
      Begin
        If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText('3'+IntToStr(StatusBox.ItemIndex)+Setting.NickEdit.Text);
        If UserListView.Items.Item[j].Caption = Setting.NickEdit.Text then
          UserListView.Items.Item[j].ImageIndex := StrToInt(IntToStr(StatusBox.ItemIndex));
      end;
  end
else // если клиент
  begin
    // отправляем всем статус+ник
    ClientSocket.Socket.SendText('3'+IntToStr(StatusBox.ItemIndex)+UserMas[i].Name);
    // меняем картинку у себя
    Uitems.ImageIndex := StrToInt(IntToStr(StatusBox.ItemIndex));
  end;

  IniFile := TIniFile.Create(extractfilepath(paramstr(0))+'setting.ini'); // читаем ini
  st := IntToStr(StatusBox.ItemIndex); // то что мы меняем
  IniFile.WriteString('Settings', 'status', st); // пишем в ini изменение
  IniFile.Free;
end;
Код:
procedure TForm1.UpdateUserList;
begin
..
          // составляем строку пользователей
          StrUserList := StrUserList+IntToStr(UserMas[i].Image)+UserMas[i].Name+Chr(152);
..
end;
Код:
procedure TForm1.UpdateUserMas;
begin
  // очищаем массив с информацией
      For i:=1 to 255 do
        Begin
          UserMas[i].Status := 0;
        end;
  // заполняем данные пользователя
  If ServerSocket.Socket.ActiveConnections <> 0 then
    Begin
      For i := 1 to ServerSocket.Socket.ActiveConnections do
        Begin
          UserMas[i].Status := 2;
          UserMas[i].Name := 'Неизвестный';
          UserMas[i].Image := 0;
          // запрашиваем имя (ник) пользователя по его каналу (код команды - 1)
          ServerSocket.Socket.Connections[i-1].SendText('1');
        end;
    end;
end;
Код:
procedure TForm1.ServerBtnClick(Sender: TObject);
begin
  If ServerBtn.Tag = 0 then
..
      UserMas[0].Name := Setting.NickEdit.Text; // ник
      UserMas[0].Image := StrToInt(IntToStr(StatusBox.ItemIndex)); // статус
..
  else
..
end;
в процедуре ClientSocketRead
Код:
       3: begin
		    // клиент принимает от сервера и показывает в ChatRzRichEdit
		    ChatRzRichEdit.Lines.Add(Copy(text, 3, Length(text)-2)+' |к| '+Copy(text, 2, 1)); // тест nick | status
		    For j:=0 to UserListView.Items.Count-1 do
		      Begin
			      If UserListView.Items.Item[j].Caption = Copy(text, 3, Length(text)-2) then
              UserListView.Items.Item[j].ImageIndex := StrToInt(Copy(text, 2, 1));
          end;
       end;
в процедуре ServerTimerTimer
изменил
Код:
                1: Begin
                     // записываем в массив полученный ник
                     UserMas[i].Name := Copy(text, 3, len-1);
                     // отметим, что пользователь записан в список
                     UserMas[i].Rec := True;
                     // смена картинки
                     UserMas[i].Image := StrToInt(Copy(text, 2, 1));
                     // отменить авторизацию счетчиком
                     UpdateUserList;
                   end;
и добавил
Код:
                 3: Begin
                     // добавим себе(тест)
                     ChatRzRichEdit.Lines.Add(Copy(text, 2, 1)+' |c| '+UserMas[i].Name); // статус | ник
                      // разошлем всем (кроме того, кто прислал)
                      For j := 0 to ServerSocket.Socket.ActiveConnections -1 do
                        Begin
                          If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText('3'+Copy(text, 2, 1)+UserMas[i].Name);
                        end;
                      // меняем статус
                      If UserListView.Items.Item[j].Caption = UserMas[i].Name then
                        UserListView.Items.Item[j].ImageIndex := StrToInt(Copy(text, 2, 1));
                 end;
mishqa35 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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