PDA

View Full Version : سوال: تغییر سایز فونت richedit



omid_rozbeh
یک شنبه 25 مهر 1389, 19:19 عصر
سلام به استادان گرامی
:لبخندساده:
ما با خوندن مطلب http://www.barnamenevis.org/forum/showthread.php?t=142026 این صفحه یاد گرفتم که چطور می شه یه متن رو تو richedit رنگی کرد ولی الان وقتی می خوام با همون حالت رنگی سایز فونت رو تغییر بدم نمی شه ، از دوستان خواهش می کنم مشکلم رو حل کنند.:متفکر:
با تشکر:چشمک:

Felony
یک شنبه 25 مهر 1389, 19:33 عصر
این تابع رو قبلا نوشته بودم و تو سایت بیشتر از 5 بار قرار دادم ، کافی بود یه جست و جو میکردین :

Procedure SetColor(Const Richedit: TRichEdit; Const Text: string; Const Color: TColor; Const Style: TFontStyles; Const FonstSize: Byte);
var
FromPos,Siz: Integer;
begin
Siz := Length(Richedit.Text);
FromPos := 0;
while (FromPos>=0) do
begin
FromPos:= Richedit.FindText(Text, FromPos, Siz, []);
if FromPos>=0 then
begin
Richedit.SelStart:= FromPos;
Richedit.SelLength:= Length(Text);
Richedit.SelAttributes.Size:= FonstSize;
Richedit.SelAttributes.Color := Color;
Richedit.SelAttributes.Style:= Style;
Richedit.SelLength:= 0;
Inc(FromPos);
end;
end;
// Normalize rich edit style & set cursor pos to current pos
Richedit.SelStart:= Length(Richedit.Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
end;

استفاده :

SetColor(RichEdit1, 'Text', CLRed, [fsBold], 20);

omid_rozbeh
یک شنبه 25 مهر 1389, 20:58 عصر
خوب دوست عزیز من که گفتم رنگی کردن متن رو پیدا کردم ولی نمی دونم چرا وقتی متن رو رنگی می کنم نمی شه سایز متن richedit رو تغییر داد ظمنا کدی که شما نوشتید هم این مشکل رو داره ، تو حالت رنگی نمی شه تغییر سایز داد.
باز هم تشکر

tdkhakpur
یک شنبه 25 مهر 1389, 21:22 عصر
دونم چرا وقتی متن رو رنگی می کنم نمی شه سایز متن richedit رو تغییر داد

چرا نمیشه
مثال


Richedit1.Text := 'demo text';
Richedit1.SelStart := 1;
Richedit1.SelLength := 4;
Richedit1.SelAttributes.Color := clBlue;
Richedit1.SelAttributes.Size := 12;
Richedit1.SelAttributes.Style := [fsBold, fsItalic];
Richedit1.SelLength:= 0;

omid_rozbeh
یک شنبه 25 مهر 1389, 21:44 عصر
:متفکر::عصبانی++::گریه:
دوست عزیز فکر کنم متوجه منظور من نشدید
تو مثال شما یه متن رو select مکنید و attrib اون رو تغییر می دید
این مثال درستی نیست :اشتباه:
من می خوام متن من بعد از جستجو قابل تغییر سایز با فرمان richedit1.font.size باشه البته بدون تغییر انتخاب ها !!!

به هر حال تشکر

Felony
یک شنبه 25 مهر 1389, 21:51 عصر
خوب دوست عزیز من که گفتم رنگی کردن متن رو پیدا کردم ولی نمی دونم چرا وقتی متن رو رنگی می کنم نمی شه سایز متن richedit رو تغییر داد ظمنا کدی که شما نوشتید هم این مشکل رو داره ، تو حالت رنگی نمی شه تغییر سایز داد.
باز هم تشکر

کد زیر رو تست کنید :

SetColor(RichEdit1, 'test', clRed, [fsBold], 20);
SetColor(RichEdit1, 'test', clBlue, [fsBold], 40);

کار نمیکنه ؟!!!

omid_rozbeh
یک شنبه 25 مهر 1389, 22:07 عصر
کد زیر رو تست کنید :

SetColor(RichEdit1, 'test', clRed, [fsBold], 20);
SetColor(RichEdit1, 'test', clBlue, [fsBold], 40);

کار نمیکنه ؟!!!

خوب استاد بزگوار این کدی که شما نوشتید فقط متن test رو select و تغییر رنگ و تغییر فونت میده
اما تکلیف متن هایی که انتخاب نمی شند چی می شه
باز هم به سوال من توجه کنید
من کد شما رو تست کردم ، خوب کار می کنه ولی وقتی می خوام متنم همراه متن های رنگی تغییر سایز پیدا کنه کاری انجام نمی ده
فرمان شما وقتی کار می کنه که متنی انتخاب بشه
باز هم تشکر

Felony
یک شنبه 25 مهر 1389, 22:16 عصر
خوب استاد بزگوار این کدی که شما نوشتید فقط متن test رو select و تغییر رنگ و تغییر فونت میده
اما تکلیف متن هایی که انتخاب نمی شند چی می شه
باز هم به سوال من توجه کنید
من کد شما رو تست کردم ، خوب کار می کنه ولی وقتی می خوام متنم همراه متن های رنگی تغییر سایز پیدا کنه کاری انجام نمی ده
فرمان شما وقتی کار می کنه که متنی انتخاب بشه
باز هم تشکر

کافی بود خودتون یکم کد رو تغییر بدید :
Procedure SetColor(Const Richedit: TRichEdit; Const Color: TColor; Const Style: TFontStyles; Const FonstSize: Byte);
begin
Richedit.SelStart:= 0;
Richedit.SelLength:= Length(Richedit.Text);
Richedit.SelAttributes.Size:= FonstSize;
Richedit.SelAttributes.Color := Color;
Richedit.SelAttributes.Style:= Style;
Richedit.SelLength:= 0;
// Normalize rich edit style & set cursor pos to current pos
Richedit.SelStart:= Length(Richedit.Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
end;

moein+
سه شنبه 27 مهر 1389, 10:41 صبح
سلام،
آیا می شه با همین روش روی یک قطعه کد شیوه Syntax دلفی رو پیاده کرد؟ چطور؟

Felony
سه شنبه 27 مهر 1389, 10:58 صبح
سلام،
آیا می شه با همین روش روی یک قطعه کد شیوه Syntax دلفی رو پیاده کرد؟ چطور؟

این کد رو دقیقا برای همین کار نوشته بودم ، میتونید در رویداد OnChange مربوط به شئ Richedit به صورت زیر ازش استفاده کنید :

تابع :
Procedure SetColor(Const Richedit: TRichEdit; Const Text: string; Const Color: TColor; Const Style: TFontStyles);
var
FromPos,Siz: Integer;
begin
Siz := Length(Richedit.Text);
FromPos := 0;
while (FromPos>=0) do
begin
FromPos:= Richedit.FindText(Text, FromPos, Siz, []);
if FromPos>=0 then
begin
Richedit.SelStart:= FromPos;
Richedit.SelLength:= Length(Text);
Richedit.SelAttributes.Color := Color;
Richedit.SelAttributes.Style:= Style;
Richedit.SelLength:= 0;
Inc(FromPos);
end;
end;
// Normalize rich edit style & set cursor pos to current pos
Richedit.SelStart:= Length(Richedit.Text);
Richedit.SelAttributes.Color := clBlack;
Richedit.SelAttributes.Style:= [];
end;

استفاده در رویداد OnChange :
SetColor(RichEdit1, 'var', clBlue, []);
SetColor(RichEdit1, 'Procedure', clAqua, []);

البته این کد رو کامل نکردم ، مثلا وقتی کلمه var رو بنویسید و بعد یه Backspace بزنید و کلمه var به va تبدیل بشه رنگش به حالت اول بر نمیگیرده که اضافه کردنش به تابع کار سختی نیست ، البته کامپوننت های آماده ای هم برای این کار وجود داره ( TMS و Syntax Highlighter و ... ) ولی من از GUI هیچ کدوم خوشم نیومد و ترجیح دادم خودم یه تابع براش بنویسم .

moein+
سه شنبه 27 مهر 1389, 11:21 صبح
خب البته این روش شما برای برای حتی کلمات کلیدی (یه چیزایی مثل دنیاله اعداد، دایرکتیوها و عبارات متنی بماند) با بهینگی فاصله زیادی دارد و البته جای کار زیادی! اینجوری برای هر کلمه کلیدیی دارید یه دور کل کد رو پیمایش می کنید، فکر می کنم باید مثل کامپایلرها برخورد کنیم یعنی یه ساختار پشته مانند و...
اما در مورد مشکل ویرایشی فکر می کنم با محدود کردن هوشمندانه حوزه چک کردن متن می شه یه کارایی کرد، مثلا به طور خیلی ابتدایی تصور کنید وقتی در حال ویرایش یک خط از کد هستیم تابع قالب بندی صرفا اون خط رو ابتدا، از هر قالبی خارج و دوباره قالب بندی کنه ...(حالا خط نه یه محدوده).
اجالتا اون کامپوننت هایی که معرفی کردید به مذاق ما خوشتر می آید، ممنون...:لبخند:

Felony
سه شنبه 27 مهر 1389, 11:58 صبح
خب البته این روش شما برای برای حتی کلمات کلیدی (یه چیزایی مثل دنیاله اعداد، دایرکتیوها و عبارات متنی بماند) با بهینگی فاصله زیادی دارد و البته جای کار زیادی! اینجوری برای هر کلمه کلیدیی دارید یه دور کل کد رو پیمایش می کنید، فکر می کنم باید مثل کامپایلرها برخورد کنیم یعنی یه ساختار پشته مانند و...
اما در مورد مشکل ویرایشی فکر می کنم با محدود کردن هوشمندانه حوزه چک کردن متن می شه یه کارایی کرد، مثلا به طور خیلی ابتدایی تصور کنید وقتی در حال ویرایش یک خط از کد هستیم تابع قالب بندی صرفا اون خط رو ابتدا، از هر قالبی خارج و دوباره قالب بندی کنه ...(حالا خط نه یه محدوده).
اجالتا اون کامپوننت هایی که معرفی کردید به مذاق ما خوشتر می آید، ممنون...:لبخند:


البته این کد رو کامل نکردم ، مثلا وقتی کلمه var رو بنویسید و بعد یه Backspace بزنید و کلمه var به va تبدیل بشه رنگش به حالت اول بر نمیگیرده که اضافه کردنش به تابع کار سختی نیست ، البته کامپوننت های آماده ای هم برای این کار وجود داره ( TMS و Syntax Highlighter و ... ) ولی من از GUI هیچ کدوم خوشم نیومد و ترجیح دادم خودم یه تابع براش بنویسم .

در پست قبلیم ذکر کردم که کد رو کامل نکردم ، البته پیاده سازی تمام این کارهایی که شما گفتید کار پیچیده ای نیست فقط 1 ، 2 ساعت وقت میخواد .


فکر می کنم باید مثل کامپایلرها برخورد کنیم یعنی یه ساختار پشته مانند و...
در ضمن کامپایلر چه ربطی به محیط برنامه نویسی داره ، کار کامپایلر بررسی صحت ورود کدها در زمان کامپایل ( Parse کردن و تحلیل نحوی و لغوی و ... و در آخر تولید کد ماشین هست ) ، نه تعیین Style برای کد وارد شده ) ، Style دادن به متن کد وارد شده و این قبیل کارها بر عهده IDE مورد نظر هست نه کامپایلر اون زبان برنامه نویسی !

moein+
سه شنبه 27 مهر 1389, 12:24 عصر
اینجا چرا همه اینقده خشنن و گفته های پیشینشون رو هی یاد آدم میارن؟
نمی دونم چرا یاد قطعنامه های سازمان ملل افتادم!!
اگه این تگ های نقل قول اختراع نشده بود فکر کنم کلا کار این فروم لنگ بود!
بگذریم :لبخند:

البته یقین دارم یکی،دوساعت شما هم خوشبینانه هست و هم غلو آمیز...
(اگر نگی من برای خودم گفتم، شاید برای شما اصلا نشدنی باشه!!! :لبخند:)
اما در مورد کامپایلر؛ بنده در تشریح شیوه خودم گفتم فکر می کنم الگوریتم قالب بندی متن هم باید به شیوه ای که کامپایرها کد رو تجزیه تحلیل می کنند، عمل کنه...همین (اگرنه که فکر می کنم اکثر کسایی که امروز دارند با دلفی کار می کنند وایجا تاپیک می زنند می دونند تفاوت دقیق اینارو - حداقل به زور هم که شده کامپایرو پاس کردن!)