PDA

View Full Version : رنگی نمودن یک کلمه در یک جمله از یک لیبل



مجتبی جوادی
شنبه 09 آبان 1388, 12:50 عصر
دوستان سلام
من از یک لیبل در برنامه ام استفاده کرده ام که در مواقع نیاز یک پیغام برایم ظاهر بشه . حال چطور میتوان یک کلمه از این لیبل قرمز و یا هر رنگ دیگری غیر از رنگ خود لیبل بشه مثلا:
برنامه درست اجرا شده است
با تشکر

Felony
شنبه 09 آبان 1388, 15:36 عصر
کامپوننت های لیبل پیشفرض دلفی این قابلیت رو ندارند .

M_Maskout
چهارشنبه 28 بهمن 1388, 12:50 عصر
جناب SilverSoft اگه کامپوننت های لیبل پیشفرض دلفی این قابلیت رو داشتند که این بنده خدا سوال نمیکرد!

پیشنهاد می‌دم از یه RichEdit استفاده کن و قسمت لازم رو توی اون رنگی کن.

Felony
چهارشنبه 28 بهمن 1388, 14:54 عصر
جناب SilverSoft اگه کامپوننت های لیبل پیشفرض دلفی این قابلیت رو داشتند که این بنده خدا سوال نمیکرد!
شما یک بار سوال ایشون رو بخون :

من از یک لیبل در برنامه ام استفاده کرده ام که در مواقع نیاز یک پیغام برایم ظاهر بشه . حال چطور میتوان یک کلمه از این لیبل قرمز و یا هر رنگ دیگری غیر از رنگ خود لیبل بشه
تا اونجا که من میبینم ایشون گفته از لیبل پیش فرض استفاده کرده و میخواد قسمتی از متن مورد نظرش رو رنگی کنه ، چیزی در مورد معرفی کامپوننت و ... نگفته !

majid2230
پنج شنبه 29 بهمن 1388, 20:18 عصر
فکر نمی کنم راهی جز استفاده از دو لیبل داشته باشه .قسمتی رو که می خواید تغییر رنگ بده رو تو یه لیبل بقیش رو تو یه لیبل دیگه بذارید و هر وقت لازم داشتید رنگ اون تیکه خاص رو عوض کنید.

حمیدرضاصادقیان
پنج شنبه 29 بهمن 1388, 22:09 عصر
سلام. لیبل های کامپوننت TMS این امکان رو داره.
میتونید از اون استفاده کنید.
ولی با استفاده از Canvas ها به راحتی میتونید اینکارو انجام بدین.
یک label روی فرم بذارید و یک button. در رویداد onclick button کد زیر رو بنویسید


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
With label1.canvas Do
Begin
i:=TextWidth('Hamid');
Font.Color := clBlue;
TextOut(0,0,'Hamid');
Font.Color := clBlack;
textOut(i*1,0,' Reza');
Font.color := clYellow;
textout(i*2,0, ' Mohammad');
end;
End;

شما حتی با استفاده از font میتوانید هر کلمه رو bold یا underline کنید و حالتهای خاصی که در ورد امکان پذیر هست بدهید.
موفق باشید.

khoshblagh
شنبه 01 اسفند 1388, 06:55 صبح
[quote=حمیدرضاصادقیان;913352]سلام. لیبل های کامپوننت TMS این امکان رو داره.
میتونید از اون استفاده کنید.
ولی با استفاده از Canvas ها به راحتی میتونید اینکارو انجام بدین.
یک label روی فرم بذارید و یک button. در رویداد onclick button کد زیر رو بنویسید


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
With label1.canvas Do
Begin
i:=TextWidth('Hamid');
Font.Color := clBlue;
TextOut(0,0,'Hamid');
Font.Color := clBlack;
textOut(i*1,0,' Reza');
Font.color := clYellow;
textout(i*2,0, ' Mohammad');
end;
End;

این که چیزی را به درستی نشان نمیدهد؟

حمیدرضاصادقیان
شنبه 01 اسفند 1388, 10:58 صبح
سلام دوست عزیز. یک label بذارید خاصیت autosize رو غیر فعال کنید. و خاصیت weight لیبل رو برابر 100 بذارید. و نتیجه رو ببینید. شما با canvas ها هرکاری میتونید انجام بدید. وقتی در کامپوننتهای tms اینکار شدنیه یعنی در کامپوننتهای معمولی دلفی هم میشه. چونکه اونها هم از کلاسهای پایه دلفی یا توابع دلفی استفاده میکنند.
موفق باشید

khoshblagh
یک شنبه 02 اسفند 1388, 06:58 صبح
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
With label1.canvas Do
Begin
i:=TextWidth('Hamid');
Font.Color := clBlue;
TextOut(0,0,'Hamid');
Font.Color := clBlack;
textOut(i*1,0,' Reza');
Font.color := clYellow;
textout(i*2,0, ' Mohammad');
end;
End;

با تشکر از شما.
میشه در مورد کارکرد کد کمی توضیح بدهید. یعنی اینکه چطور کلمات ایجادی در کنار هم قرار میگیرند و نه روی هم ؟ متشکرم

حمیدرضاصادقیان
یک شنبه 02 اسفند 1388, 07:40 صبح
سلام.ببینید در ابتدا طول کلمه Hamid بدست میاد و ابتدا از مقدار 0 این کلمه قرار میگیره کلمه بعد که میخواد قرار بگیره به تعداد کلمه ها ضرب در طول این میشه .در مرحله بعد عدد 1 است و ضرب در مقدار طول hamid میشه. برای کلمه بعدی این کلمه ضرب در 2 میشه. و موقعیت کلمه جدید به دست میاد. میتونه در یک حلقه نیز این کار انجام بشه.
بعد با استفاده از خاصیت Textout کلمه شما روی لیبل قرار میگیره مقدار 0 دوم هم مربوط به موقعیت ارتفاعی متن می باشد. میتونه یکی در خط اول و یکی در خط دوم و سومی دوباره در خط اول باشه.
موفق باشید.

پ.ن: قدرت canvas در دلفی رو دست کم نگیرید.

دلفــي
یک شنبه 02 اسفند 1388, 09:34 صبح
سلام.ببینید در ابتدا طول کلمه Hamid بدست میاد و ابتدا از مقدار 0 این کلمه قرار میگیره کلمه بعد که میخواد قرار بگیره به تعداد کلمه ها ضرب در طول این میشه .در مرحله بعد عدد 1 است و ضرب در مقدار طول hamid میشه. برای کلمه بعدی این کلمه ضرب در 2 میشه. و موقعیت کلمه جدید به دست میاد. میتونه در یک حلقه نیز این کار انجام بشه.
بعد با استفاده از خاصیت Textout کلمه شما روی لیبل قرار میگیره مقدار 0 دوم هم مربوط به موقعیت ارتفاعی متن می باشد. میتونه یکی در خط اول و یکی در خط دوم و سومی دوباره در خط اول باشه.
موفق باشید.

پ.ن: قدرت canvas در دلفی رو دست کم نگیرید.

روشي كه دوست عزيزمون آقاي حمیدرضاصادقیان ارائه كردند درسته كه نتيجه اي رو كه شما مي خواهي ميدهد ولي اصولي نيست و فقط رفع تكليف محسوب مي شود چون خاصيت Canvas به صورتي است كه در صورت قرار دادن يك فرم ديگر بر روي آن محتوياتش پاك شده و از بين ميرود و براي نمايش نوشته بايد فرم شما هميشه در Top قرار بگيرد و اين اصلا منطقي نيست .
به نظر من بهتره شما از يه RichEdit به جاي Label استفاده كرده و به هدفتون برسيد .
موفق باشيد ...

حمیدرضاصادقیان
یک شنبه 02 اسفند 1388, 11:48 صبح
روشي كه دوست عزيزمون آقاي حمیدرضاصادقیان ارائه كردند درسته كه نتيجه اي رو كه شما مي خواهي ميدهد ولي اصولي نيست و فقط رفع تكليف محسوب مي شود چون خاصيت Canvas به صورتي است كه در صورت قرار دادن يك فرم ديگر بر روي آن محتوياتش پاك شده و از بين ميرود و براي نمايش نوشته بايد فرم شما هميشه در Top قرار بگيرد و اين اصلا منطقي نيست .
به نظر من بهتره شما از يه RichEdit به جاي Label استفاده كرده و به هدفتون برسيد .
موفق باشيد ...

من هم جهت اینکه دوستان گفتند امکانش نیست و نمیشه این مطلب رو نوشتم و گرنه یا باید از richedit استفاده کنند یا باید یک کلاس از Tcustomlabel ایجاد کنند و مواردی که نیاز دارند رو به اون اضافه کنند.

M_Maskout
پنج شنبه 04 فروردین 1390, 07:59 صبح
سلام دوست عزیز. یک label بذارید خاصیت autosize رو غیر فعال کنید. و خاصیت weight لیبل رو برابر 100 بذارید. و نتیجه رو ببینید. شما با canvas ها هرکاری میتونید انجام بدید. وقتی در کامپوننتهای tms اینکار شدنیه یعنی در کامپوننتهای معمولی دلفی هم میشه. چونکه اونها هم از کلاسهای پایه دلفی یا توابع دلفی استفاده میکنند.
موفق باشید

اگه لیبل، راست به چپ (فارسی) باشه، جواب نمی‌ده!
اگه بجای Hamid بذاریم A (طول کلمه‌ی اول خیلی کوچیک تر از بقیه باشه) جواب نمی‌ده!
اگه فرم زیر فرمهای دیگه قرار بگیره، بعد دوباره بیاد رو، یا اینکه فرم رو به بیرون از صفحه حرکت بدیم و دوباره بیاریم تو صفحه، متن لیبل پاک می‌شه!
اگه متن بیشتر از یه خط باشه که اصلاً جواب نمی‌ده!
اگه ...

fire.angle
پنج شنبه 04 فروردین 1390, 11:47 صبح
سلام

من دارم برنامه چت بین Client/Server رو گسترش میدم که در بخش شبکه برنامش موجوده

حالا چطوری می تونم قسمتی از متن اون Memo یا RichEdit رو که متن ارسال شده و یا دریافت شده در اون قرار میگیره رو تغییر رنگ بدم (مثل مسنجر یاهو)
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

mbshareat
شنبه 06 فروردین 1390, 01:10 صبح
سلام و عرض ادب
به نظر بنده اگه قراره از Canvas استفاده بشه میتونین از Image استفاده کنین که ترسیم داخلش با قرار گرفتن زیر فرم دیگه پاک نمیشه.
می تونین یه حلقه داشته باشین که کل عبارت رو به علاوه فاصله در انتها به اون بدین و بعد با posEx دنبال فاصله بگردین و کلمه کلمه ترسیم کنین و اگه تنها یک کلمه باید رنگی بشه کلمه ها رو هم بررسی کنین که اگه نیاز بود تغییر رنگ بدین یا به رنگ اولیه برگردین و اگه طول کلمات که در یک متغیر X جمع زده میشه بیش از عرض مد نظرتون شد متغیر Y رو برای TextOut تغییر بدین و اگه عبارت رنگی بیش از یک کلمه باشه بهتره از RichEdit استفاده کنین .نحوه رنگی کردن متن رو هم تو همین سایت اومده.
من محتویات فایل رو با روش بالا تو یه لیست باکس رنگی نشون دادم به طوری که عدد و انگلیسی و فارسی و علائم نوشتاری هر کدوم رنگ اختصاصی دارند و بیش از یک خط بودن و ترکیبی از فارسی و انگلیسی بودن هم مشکل ساز نیست.
این هم یه نمونه برنامه که شاید به دردتون بخوره:

mehdi_moosavi
جمعه 28 آذر 1393, 16:09 عصر
سلام بدوستان
منم این مشکل رو دارم
لطفا اگر دوستان محترم کدی در این مورد دارند که با استفاده از canvas رنگ قسمتی از caption لیبل رو تغییر بده ارائه کنند ممنون میشم
لطفا راهنمایی کنید
باتشکر