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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.03.2008, 20:44   #1
-HunteR-
Форумчанин
 
Аватар для -HunteR-
 
Регистрация: 04.11.2007
Сообщений: 117
Подмигивание ЧАТЮ для клиента и сервера

Ребят, вот я по необходимости я начал делать чат на Delphi7, не используя, нестандартные компоненты.
Столкнулся с парой проблем:
1)Передачу текста осуществляю через ServerSocket и ClientSocket, подключение собственно тоже через них. Решил добавить статусы. Выбор статуса я организовал так:
Добавил ComboBox, содержащие список статусов и картинки, показывающие графически эти самые статусы. Вот собственно и есть проблема: "Как сделать так, чтобы при изменении статуса у собеседника отобразился мой выбранный статус, как ICQ?".
2)Также хочу добавить аватары, но как сделать, чтобы показывалась аватара и как её загрузить из файла?
3)Как организовать передачу файлов, чтобы одновременно не терялся отправленный текст? Слышал что можно текст вместе с файлами в бефер добавлять и извлекать при получении буфера, но не пойму, да и не знаю как.
4)Как сделать, чтобы в чате можно было использовать смайлы (хотя бы не анимированные), которым соответствовал бы свой код, например *:-)*?
5)Как сделать так, чтобы мой чат имел поддержку скинов.
Тему создал, так как очень хотелось бы получить нормальные ответы сразу на все вопросы, да и другим пригодится.
Честно говорю - поиск юзал, но не смог найти понятного.
Если что, то дайте хотя-бы ссылки.
Перед тем, как выложить код, я его всегда проверяю.
Если помог - тыкни на на весы слева, под аватарой.
-HunteR- вне форума
Старый 26.03.2008, 15:57   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
Радость

Насчёт смайлов могу помочь
По нажатию на смайл пусть в текст edit'а вставляется чтото типа :smile: или ёще чтото. Вот так:
Код:
form1.edit1.SelText:=':smile:';
form 1- твоя форма
edit1 - строка для текста
Добавь 10-ок
потом поствь таймер на 50-100 мс и в него:
Код:
l:=memo1.Lines.Count-1;
sw:=memo1.Lines[l];
if pos(':smile:',sw)<>0 then begin
      m:=pos(':smile:',sw);
      delete(sw,m,7);
      richedit1.Lines[l]:=SW;
      setline(richedit1,l,m-1);
      InsertBitmapToRE(richedit1.Handle,Image1.Picture.Bitmap.Handle);
end;
создай richedit1
это будет заменять текст ':smile:' на твой смайл. Токо не забуть создать image1, и загрузить туда твой смайл.
А вот как я реализовал "Антимат":
Код:
big:=AnsiLowerCase(memo1.Lines[l]); // это чтобы АбРаКаДаБра было абракадабра
if (n4c) and (pos('х*й',big)<>0) then begin
    q3:=pos('х*й',big);
    richedit1.Lines[l]:=copy(sw,0,q3-1)+'[Sensored]'+copy(sw,q3+3,128); //+3 это длина мата (токо там не должно быть звёздочки :))
  end;
а вот что у меня получилось(без исходников) http://www.smt-meneger.narod.ru/Install_CHAT_by_SMT.rar
ПыСы: Если смейлы будут в другой форме, не забуть добавить в вместо Image1.Picture.Bitmap.Handle поставить form2.Image1.Picture.Bitmap.Handle
Дальше.
Чтобы выделить текст жирным:
Код:
edit1.SelText:=''+edit1.SelText+'';
и обработчик:

Код:
// процедура

Procedure setline(WhichEdit:TRichedit;Linepos,charpos:integer);
Begin
  with WhichEdit do
  begin
    selstart:=perform(EM_LineIndex,Linepos,0)+charpos;
    perform(EM_ScrollCaret,0,0);
  end;
end;

// еще функция

function Tfom1.CurrText: TTextAttributes;
begin
  if Richedit1.SelLength > 0 then Result := Richedit1.SelAttributes
  else Result := Richedit1.DefAttributes;
end;

//только не забуть обьявить ее после private:

function CurrText: TTextAttributes;

// а это в обработчик таймера

if pos('[B]',sw)<>0 then begin
      m:=pos('',sw);delete(sw,m,3);
      m2:=pos('',sw);delete(sw,m2,4);
      memo1.Lines[l]:=SW;
      setline(richedit1,l,m-1);
      richedit1.SelLength:=m2-m;
      CurrText.Style := CurrText.Style + [fsBold];
end;
токо тут кводратные скобки вместо < и > на форуме непрвильно отображает.
Ася 363958929, email Mezhova_djsmart@mail.ru
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума
Старый 26.03.2008, 15:59   #3
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

И еще. Брость ты client socket и server socket и поставь себе i_net. и ip-адресов вводить не надо
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума
Старый 26.03.2008, 16:04   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Блин, а про саму функцию InsertBitmapToRE розказать забыл!
Скопируй это в папку с прогой.
и в uses добавь
Код:
uses re_bmp;
И еще: при вводе ника (логина) в моей проге набери 71889. Увидишь.
Вложения
Тип файла: rar re_BMP.rar (6.2 Кб, 75 просмотров)
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг

Последний раз редактировалось Dj_smart; 26.03.2008 в 16:10. Причина: Коечто забыл
Dj_smart вне форума
Старый 26.03.2008, 16:13   #5
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Разказать по подробнее?
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума
Старый 26.03.2008, 17:02   #6
-HunteR-
Форумчанин
 
Аватар для -HunteR-
 
Регистрация: 04.11.2007
Сообщений: 117
По умолчанию

Dj_smart
Да, давай по-подробнее, другим тоже понадобится.
И вот ещё: i_net может работать на двух компах, соединенных модемами??Есть ли к i_net учебные статьи? И где его взять?
Перед тем, как выложить код, я его всегда проверяю.
Если помог - тыкни на на весы слева, под аватарой.
-HunteR- вне форума
Старый 26.03.2008, 17:14   #7
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Нет, через модемы нет (куда вводить IP?).
Тамо всё просто.
Токо надо сначала инициализировать подключение:
Код:
if not NET_Init then begin
      MessageBox(Handle, 'Невозможно инициализировать сетевой протокол!!!', 'Ошибка', MB_ICONHAND);
       Halt;
    end;
    NET_InitSocket(21666);
Реализуешь две процедуры: передичи и приёма:
Передача:
Код:
procedure push(str:string);
begin
    NET_Clear;
    NET_Write(@str[1], Length(Str));
    NET_Send(nil, 21666, false);
end;
Приём:
Код:
Procedure reload;
var
 buf  : array [0..255] of Char;
 recv : integer;
 IP   : PChar;
 Port : integer;
 str,fig,check,str1,str2,str3:string;
 yest:boolean;
 n,m:word;
begin
  while NET_Recv(@buf, 255, IP, Port, recv) > 0 do
    begin
      str:=Copy(buf, 1, recv);
      // Тута нужные тебе опирации (str - принятая строка)
   end;
end;
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума
Старый 26.03.2008, 17:14   #8
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

И не забуть про "системные сообщения" (Для статусов, бана, входа, выхода прочее.
Посавь таймер на 1 сек и в него
Код:
push('System message on-line :<'+nick+'>');
push('System message status:<'+nick+'>`'+stat);
Я для себя принял, что строки, где есть System message отобраджатся в richedit не будут.
nick - это ник при самом подключении (edit)
stat - это статус ника. Меня при нажатии на какую-нить кнопку.
Вот:
Код:
procedure TPagesDlg.Timer1Timer(Sender: TObject);
var
 buf  : array [0..255] of Char;
 recv : integer;
 IP   : PChar;
 Port : integer;
 str,fig,check,str1,str2,str3:string;
 yest:boolean;
 n,m:word;
begin
  while NET_Recv(@buf, 255, IP, Port, recv) > 0 do
    begin
      str:=Copy(buf, 1, recv);
      if pos('System message',str)=0 then begin
        Memo1.Lines.Add(str);
        with pagesdlg.memo1 do 
        begin
          SelStart := Length(Text);
          Perform(EM_SCROLLCARET, 0, 0);
        end;
        if (pos('<'+nick+'>',str)=0) then begin
          if n2r then CoolTrayIcon1.ShowBalloonHint( 'Новое сообщение', str, bitInfo, 10 );
          if n3d then sound(2000,100);
        end;
      end else begin
        if pos('on-line',str)<>0 then begin
          fig:=copy(str,pos(':',str)+1,128);
          yest:=false;
          for n:=0 to list.count-1 do
          begin
            check:=list.Items.Strings[n];
            if pos(fig,check)<>0 then yest:=true;
          end;
          if not yest then begin
            list.Items.Add(fig);
            if (pos(nick,fig)=0) and (n1q) then CoolTrayIcon1.ShowBalloonHint('Контакт в сети', fig+ ' в сети.', bitInfo, 10 );
          end;
        end;
        if pos('exit',str)<>0 then begin
          fig:=copy(str,pos(':',str)+1,128);
          yest:=false;
          for n:=0 to list.count-1 do if fig=list.Items[n] then
          begin
            yest:=true;
            m:=n;
          end;
          if yest then list.Items.Delete(m);
          if (pos('<'+nick+'>',fig)=0) and (n1q) then CoolTrayIcon1.ShowBalloonHint('Контакт ушёл', fig+ ' ушёл из чата', bitInfo, 10 );
        end;
        if pos('dialog box',str)<>0 then begin
          fig:=copy(str,pos(':',str)+1,128);
          if pos('iii',str)<>0 then
            MessageBox(Handle, PAnsiChar(fig), 'Информация', MB_ICONASTERISK);
          if pos('!!!',str)<>0 then
            MessageBox(Handle, PAnsiChar(fig), 'Предупреждение', MB_ICONEXCLAMATION);
          if pos('???',str)<>0 then
            MessageBox(Handle, PAnsiChar(fig), 'Вопрос', MB_ICONQUESTION);
          if pos('!X!',str)<>0 then
            MessageBox(Handle, PAnsiChar(fig), 'ОШИБКА', MB_ICONHAND);
        end;
        if pos('private',str)<>0 then begin
          fig:=copy(str,pos('private:',str)+8,pos(' from',str)-pos('private:',str)-8);
          str1:=copy(str,pos(' from:',str)+6,pos(' to:',str)-pos(' from',str)-6);
          str2:=copy(str,pos('to:',str)+3,128);
          if pos('<'+nick+'>',str)<>0 then begin
            str2:='Лично для '+str2+' от '+str1+': '+fig;
            memo1.Lines.Add(str2);
            if (pos('<'+nick+'>',str)=0) and (n2r) then CoolTrayIcon1.ShowBalloonHint( 'Новое сообщение', str2, bitInfo, 10 );
          end;
        end;
        if pos('status',str)<>0 then begin
          fig:=copy(str,pos(':',str)+1,pos('`',str)-pos(':',str)-1);
          check:=copy(str,pos('`',str)+1,128);
          for n:=0 to list.Items.count-1 do if fig=list.Items[n] then
          begin
            yest:=true;
            m:=n;
          end;
          list.Items[m]:=fig+' '+check;
        end;
        if pos('close all',str)<>0 then begin
          clos:=true;
          pagesdlg.Close;
        end;
        if pos('beep',str)<>0 then begin
          sound(2000,100);
        end;
        if pos('ban',str)<>0 then begin
          if pos(nick,str)<>0 then begin
            push('<'+nick+'> забанен на 5 мин. за нарушение правил чата');
            nner:=180;
            if pos('1',str)<>0 then nner:=60;
            if pos('2',str)<>0 then nner:=120;
            if pos('3',str)<>0 then nner:=180;
            if pos('4',str)<>0 then nner:=240;
            if pos('5',str)<>0 then nner:=300;
            if pos('10',str)<>0 then nner:=600;
            form2.show;
          end;
        end;
      end;
    end;
end;
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума
Старый 26.03.2008, 17:15   #9
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Это полный код обработчика системных сообщений^
И еще - memo1 - это richedit1 , просто имя такое
'on-line' - ктото вошёл
'exit' - тот, кто вошёл, вышел.
'dialog box' - показать всем сообщение (напр. System message dialog box !!!:Всем привет! , '!!!' означает, что сообщение будет со знаком !, ??? - со знаком ? , !Х! , со знаком Х(ошибка))
'private' - В приват (напр. 'System message private:'+текст+' from:<'+от кого+'> to:'+<кому>; можно в приват нескольким:
'System message private:'+текст+' from:<'+от кого+'> to:'+<Чуваку1>,<Чуваку2>,<Чуваку3>;
'status' - Статус
'close all' - Все выходят
'beep' - Пикает динамик у всех
'ban' - когото банят (напр. System message ban #:<Кого банить> , вместо # если 1, то 60 сек, 2-120, 3 - 180, 4-240, 5-300, 10-600)
Понятно?
А насчет где найти, то он по мойму стандартный, надо прописать после {$R *.dfm}
Код:
Uses i_net;
Извени, исхоников не дам, и так всё росжевал
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг

Последний раз редактировалось Dj_smart; 26.03.2008 в 17:42.
Dj_smart вне форума
Старый 26.03.2008, 17:21   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Честно говорю - поиск юзал, но не смог найти понятного.
Если что, то дайте хотя-бы ссылки.
Кроме поиска, есть еще много "сбоку" от форума.
Например, блоги наших же форумчан, где они постарались осветить некоторые из вопросов, которые могут интересовать многих.
В частности, как будто специально для вас есть статья, где расписан по шагам процесс создания так называемого "чата".
http://www.pblog.ru/
Прямо на первой странице, третья статья сверху.
mihali4 вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить номер клиента leontv Работа с сетью в Delphi 11 28.03.2010 23:19
IP клиента JoanM Работа с сетью в Delphi 13 01.05.2008 16:30
код proxy для клиента. AS3 crazy horse Общие вопросы Web 0 03.03.2008 11:44
Определение IP адреса клиента RoamingFire Работа с сетью в Delphi 2 28.02.2008 14:08