ورود

View Full Version : نوشتن متن با چند رنگ



amiin1364
پنج شنبه 01 مرداد 1388, 01:07 صبح
سلام
کسی میدونه چه جوری با چند رنگ توی memo نوشت یعنی اگه یه کلمه مشکی

هست بشه که یه کلمه با رنگ قرمز اصافه کرد مثل این ممنون

Saeed_m_Farid
پنج شنبه 01 مرداد 1388, 12:39 عصر
سلام
کسی میدونه چه جوری با چند رنگ توی memo نوشت یعنی اگه یه کلمه مشکی

هست بشه که یه کلمه با رنگ قرمز اصافه کرد مثل این ممنون
سلام، دوست عزیز :



TMemo خاصیت OnPaint و یا property برای SelAttributes نداره، به همین جهت یه مقدار مشکله برای اینکار از TMemo استفاده کرد؛ اگه اصرار به اینکار دارید باید چند تا تابع مثل WMPaint، KeyDown، Change و ... رو بنویسید یا override کنید ...
راه بهتر استفاده از TRichEdit است که باز هم اینکه بخواهید با فشردن space کلمات شما در همان لحظه تغییر حالت بدن مشکله و باید از طریق یه Thread جداگانه در اینحالت RichEdit شما بررسی بشه و اگه space زده شده باشه ...
من یه کد آزمایشی واسه حالتی که شما نوشته تون تموم شده و می خواهید کلمات رو برحسب جداکننده space از هم مجزا کنید، نوشتم. البته هم رنگ رو عوض میکنه و هم حالت کلمات Delimit شده رو؛ امیدوارم به دردتون بخوره ...



//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int idx, g_Last_index = 0;
const TColor SELECTION_COLORS[] = {clRed,
clBlue,
clYellow,
clLime,
clOlive,
clTeal,
clPurple};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

TStringList* getSplitedText(AnsiString text,
AnsiString delimiter) // برای جداسازی کلمات برحسب جداکننده
{
AnsiString s; int idx = 1;
TStringList *Result = new TStringList;
if (text != EmptyStr)
while (idx<=text.Length())
{
s = EmptyStr;
while ( (StrLComp(delimiter.c_str(),
text.SubString(idx, text.Length()).c_str(),
delimiter.Length()) != 0) &&
(idx <= text.Length()))
s = s + text[idx++];

Result->Add(s);
idx += delimiter.Length();
}
return Result;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// کلمات رو جدا کرده و در متغیرمون می ریزیم
TStringList *stl = getSplitedText(RichEdit1->Text, " ");
if (stl->Count > 0)
{
RichEdit1->Lines->Add("\r\n"); //اینتر برای جداسازی متن اصلی از متن تغییر داده شده
RichEdit1->SelStart = RichEdit1->GetTextLen();
for (int idx=0; idx<stl->Count; idx++)
{
RichEdit1->SelText = stl->Strings[idx] + ' ';
// انتساب یک رنگ از ثابت رنگهایی که تعریف کردیم
RichEdit1->SelAttributes->Color = SELECTION_COLORS[(idx<8?idx:idx%8)];
// انتساب یک حالت مثل بولد یا ایتالیک یا زیرخط دار به ترتیب
RichEdit1->SelAttributes->Style = TFontStyles() << TFontStyle(idx % 3);
}
}
}
//---------------------------------------------------------------------------
در ضمن کد ضمیمه شده هم همین برنامه است ...

موفق باشید.

amiin1364
جمعه 02 مرداد 1388, 01:11 صبح
سلام
ممنون واقعا عالی بود
با تشکر
یا حق

amiin1364
جمعه 09 مرداد 1388, 01:27 صبح
سلام
آقا کدتون عالیه وقتی از RichEdit1->SelText استفاده میکنم یا باید همه rich رو clear کنم که اگه متن زیاد باشه خیلی زمان بره یا باید همون کلمه ی آخر رو پاک کنم دوباره رنگی بنویسم که اینجور هم کلمات رنگی ماقبل دوباره مشکی می شن !!!!!!!!!

اگه ممکنه راهنمایی کنید.تشکر