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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2013, 18:23   #1
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
Вопрос Как в чате организовать изменение цвета и крнтура шрифта?

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

Последний раз редактировалось Harapuchyk; 30.01.2013 в 02:31. Причина: Уточнение
Harapuchyk вне форума Ответить с цитированием
Старый 30.01.2013, 11:13   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Где отображается чат? Можно использовать TRichEdit, например
FataLL вне форума Ответить с цитированием
Старый 30.01.2013, 13:07   #3
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
По умолчанию

Текст сообщения набирается в Edit, а сам чат отобрадается в Memo. Получается надо изменить цвет и шрифт всех сразу пользователей, которые седят в чате с одной машины. Значит надо Memo менять.
Harapuchyk вне форума Ответить с цитированием
Старый 30.01.2013, 13:22   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Цитата:
Сообщение от Harapuchyk Посмотреть сообщение
Значит надо Memo менять.
Именно. Рекомендую TRichEdit. Пройдёт безболезненно, ибо методы и свойства те же. Останется реализовать выделение текста, что тоже достаточно несложно...
FataLL вне форума Ответить с цитированием
Старый 30.01.2013, 17:38   #5
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
По умолчанию

Спасибо. Буду пробовать. А вот как эти настройки(шрифта) применить ко всем пользователям, которые в данный момент в чате, а не одному себе?
Harapuchyk вне форума Ответить с цитированием
Старый 30.01.2013, 18:30   #6
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Конечно, взмахнуть волшебной палочкой не получится. Я не знаю, как у тебя функционирует чат, поэтому конкретики не получится. К примеру, сообщения пользователей, отправляемые серверу в текстовом виде, сервером обрабатываются, обвешиваются какими-то служебными флагами и отправляются всем участникам. Т.е., клиенту идёт уже не просто текстовое сообщение, а некая структура, содержащая помимо самого текста какие-то данные о группе, комнате, приватности, игнор иил нет, IP-адресе, версии - всё, что угодно. Клиент, приняв такое мессидж, обрабатывает служебные поля и принимает решение, каким образом отобразить данное сообщение, например, выделить цветом, если одна группа, курсив, если приват, не отображать вообще, если игнор и т.д.
FataLL вне форума Ответить с цитированием
Старый 30.01.2013, 23:49   #7
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
По умолчанию

Благодарю ещё раз. Буду работать над этим.Вот код программы. Может поможет.
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) // Ñîáûòèå ïðè íàæàòèè êíîïêè "Îòïðàâèòü"
{

if(Edit1->Text == "")
{
ShowMessage("Âû íå ââåëè òåêñò ñîîáùåíèÿ!"); // Åñëè ïîëå ââîäà ïóñòîå
return;
}
Memo1->Lines->Add(Edit2->Text+"::"+Edit1->Text); // Äëÿ ñåáÿ
int i=0;
if (ServerSocket1->Active == true)
{
for (i=0; i<=(ServerSocket1->Socket->ActiveConnections-1); i++)
{
ServerSocket1->Socket->Connections[i]->SendText(Edit2->Text+"::"+Edit1->Text);
}
}
else
{ ClientSocket1->Socket->SendText(Edit2->Text+"::"+Edit1->Text);}// Îòïðàâëåíèå ñîîáùåíèÿ ñåðâåðó
Edit1->Text = "" ;// Î÷èñòêà Ýäèòà äëÿ ââîäà íîâîãî òåêñòà
}
//--------------

void __fastcall TForm1::ClientSocket1Connect(TObjec t *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Âû ïîäêëþ÷èëèñü ê ÷àòó"); //Ñîîáùåíèå äëÿ êëèåíòà î ïîêëþ÷åíèè ê ñåðâåòó
}
//--------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket) //Ïðèåì ñîîáùåíèÿ êëèåíòîì
{
Memo1->Lines->Add(Socket->ReceiveText());

}
//-----
void __fastcall TForm1::ServerSocket1ClientConnect( TObject *Sender,
TCustomWinSocket *Socket) //Ñîáûòèå ïðè ïîäêëþ÷åíèè êëèåíòà
{
Memo1->Lines->Add("Êëèåíò ïðèñîåäèíèëñÿ");
}
//---------
void __fastcall TForm1::ServerSocket1ClientDisconne ct(TObject *Sender,
TCustomWinSocket *Socket) //Ñîáûòèå ïðè îòêëþ÷åíèè êëèåíòà
{
Memo1->Lines->Add("Êëèåíò ïîêèíóë ÷àò");
for (int i=0; i<=(ServerSocket1->Socket->ActiveConnections-1); i++)
ServerSocket1->Socket->Connections[i]->SendText("Êëèåíò ïîêèíóë ÷àò");
}
//---------
void __fastcall TForm1::ServerSocket1ClientRead(TOb ject *Sender,
TCustomWinSocket *Socket) //Ïðèåì ñîîáùåíèÿ ñåðâåðîì
{
AnsiString msg = Socket->ReceiveText();
Memo1->Lines->Add(msg);
for (int i=0; i<ServerSocket1->Socket->ActiveConnections-1; i++)//Êëèåíò1-ñåðâåð-äðóãèå êëèíòû
{
ServerSocket1->Socket->Connections[i]->SendText(msg);

}
}
//----------
void __fastcall TForm1::Button3Click(TObject *Sender) // Ñîáûòèå äëÿ íàæàòèÿ íà êíîïêó "Ñîçäàòü ñåðâåð"
{
ServerSocket1->Active = true;
Memo1->Lines->Add("Ñåðâåð ñîçäàí");
}
//------------
void __fastcall TForm1::Button4Click(TObject *Sender) //Ñîáûòèå ïðè íàæàòèè êíîïêè "Ïîäêëþ÷èòüñÿ"
{
ClientSocket1->Host = Edit3->Text; // Ïðèñâàèâàåì êëèåíòó Àé-Ïè èç íàøåãî Ýäèòà
ClientSocket1->Address = Edit3->Text;
ClientSocket1->Active = true;
Button3->Enabled = false; // Äåëàåì íåäîñòóïíûì "Ñîçäàòü ñåðâåð"
Button6->Enabled = true; // Äåëàåì äîñòóïíûì "Îòêëþ÷èòüñÿ"
}
//----------
void __fastcall TForm1::Button6Click(TObject *Sender) // Ñîáûòèå ïðè íàæàòèè êíîïêè "Îòêëþ÷èòüñÿ"
{
ClientSocket1->Active = false;
Button3->Enabled = true; // Äåëàåì äîñòóïíûì "Ñîçäàòü ñåðâåð"
Button6->Enabled = false; // Äåëàåì íåäîñòóïíûì "Îòêëþ÷èòüñÿ"
Memo1->Lines->Add("Âû âûøëè èç ÷àòà"); //Ñîîáùåíèå îá îòêëþ÷åíèè
}
//--------

void __fastcall TForm1::Image5Click(TObject *Sender) // Ñîáûòèå ïðè íàæàòèè ðèñóíêà "Âûéòè"
{
exit(1);
}
//-----

void __fastcall TForm1::cbeColorSelect(TObject *Sender)
{
int color_number = cbeColor->ItemIndex + 1;
switch (color_number)
{ case 1:Memo1->Font->Color=clRed; break;
case 2: Memo1->Font->Color=clGreen; break;
case 3: Memo1->Font->Color=clYellow; break;
case 4: Memo1->Font->Color=clBlue; break;
case 5: Memo1->Font->Color=clAqua; break;
case 6: Memo1->Font->Color=clFuchsia; break;
case 7: Memo1->Font->Color=clWhite; break;
case 8: Memo1->Font->Color=clDefault; break;
case 9: Memo1->Font->Color=clGray; break;
default: break;
}
/* так я реализовал изменение цвета, но он меняет только у себя, а у других нет, в это и загвоздка*/
}::Font-
Harapuchyk вне форума Ответить с цитированием
Старый 31.01.2013, 10:05   #8
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Ну, надо же сообщить другим клиентам, что надо отобразить сообщение каким-то цветом. Ты рассылаешь только текст сообщения и ник [если я правильно понял]. Таким же незатейливым способом принятое сообщение добавляется в Мемо. Например, можно добавлять к сообщению несколько служебных полей, чтобы имелась возможность как-то его правильно отображать. Например, вместо "Коля::Всем привет!" отправлять что-то вроде "@код_цвета@код_шрифта@ещё_что_то@К оля::Всем привет!". Приняв такую строку, надо вырезать само сообщение, добавить его в TRichEdit, а потом установить TextAttributes согласно служебной информации. Тогда у каждого пользователя будет свой выбранный шрифт и цвет. Осталось только как следует продумать, что ещё надо будет передавать служебного, чтобы реализовать, например, рассылку группе, приват, свойства шрифта [подчёркивание, жирный, курсив] и т.д. Такое решение не претендует на идеал, но всё же...
FataLL вне форума Ответить с цитированием
Старый 31.01.2013, 12:42   #9
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
По умолчанию

Понятно. буду пробвать делать. Спасибо!
Harapuchyk вне форума Ответить с цитированием
Старый 01.02.2013, 15:14   #10
Harapuchyk
 
Регистрация: 29.01.2013
Сообщений: 7
По умолчанию

FataLL, Благодарю за помощ и за потраченное время. Всё получилось. Я отправлял сообщение с кодом цаета. Затам его считывал, и при наличии кода выполнят определенное изменение в цвете и шрифте. Спасибо!!!
Harapuchyk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтоб распознавались 3 образа vicvic90 Помощь студентам 5 11.09.2012 22:51
Как сделать чтоб ListBox1 обновлялся в VB? Gyfmod Общие вопросы .NET 4 16.08.2012 15:33
Как сделать чтоб заокруглить число??? yura_zb Общие вопросы C/C++ 3 13.04.2011 16:40
Как сделать, чтоб в ячейке ВЫБИРАЛОСЬ? kristinafadeewa Microsoft Office Excel 12 27.10.2008 06:05
Как в ячейке Excel сделать надстрочный шрифт? Sony Общие вопросы Delphi 2 26.07.2007 01:59