PDA

View Full Version : Justify کردن متن در Memo



(امید)
پنج شنبه 11 دی 1382, 11:48 صبح
سلام

یکی از کاربرا علاقه عجیبی دارهhttp://us.i1.yimg.com/us.yimg.com/i/mesg/emoticons/07.gif که متنهایی که در memo نوشته می شه مثل Word بشه Justify کرد ( از چپ و راست منظم بشه ) :evil:
کسی پیشنهادی راه حلی کدی چیزی داره؟

ممنون :)

امید

SReza1
جمعه 12 دی 1382, 10:16 صبح
اگه نظ منو میخوای و با شناختی از این کاربرای عزیز دارم فردا هم هوس میکنند فونت و اندازه متنو تغییر بدند چون حتما word رو دیدند :D
برای همین بیخیال memo شو و برو سراغ richedit
اگه هم میخوای بیشتر حال کنی برو سراغ twebbrowser و html

(امید)
جمعه 12 دی 1382, 11:47 صبح
سلام

ممنون رضا جان.
من با richedit تا بحال کار نکردم . در خصوصیاتش هم چیزی مشابه justify کردن پیدا نکردم . همچین خاصیتی داره؟

با تشکر

houshmand
جمعه 12 دی 1382, 11:59 صبح
توی مثال های همراه دلفی یک ویرایشگر ساده هست که یک دکمه هم روی toolbar ش برای این کار دارد

SReza1
جمعه 12 دی 1382, 13:25 عصر
بله!
یک مثال خوب در دلفی هست که در مورد اون چیزایی که میخواهی

....\Borland\Delphi7\Demos\RichEdit

(امید)
جمعه 12 دی 1382, 13:54 عصر
ممنون

Mahdiseif
جمعه 12 دی 1382, 22:32 عصر
سلام

دوستان عزیز

مدتها به دنبال این کار بودم ولی با ابزار موجود این کار شدنی نیست. مثالی را هم که دوستان فرمودند فقط سه حالت دارد : راست چین و وسط چین و چپ چین.
نه memo و نه richedit چنین امکانی را ندارند. یا باید از یونیکد استفاده کنید و اطلاعات موجود را در پنجره کاملا مشخص با استفاده با فاصله و ... بصورت منظم تایپ کنید و به همان صورت نمایش بدهید و یا از twebbrowse استفاده کنید. این فقط در شرایطی متحقق میشود که اطلاعات ثابت باشد و ورودی توسط کاربر وجود نداشته باشد.
البته در نرم افزارهای موسسه تحقیقاتی کامپیوتری نور مانند نورالانوار2 این خاصیت در نمایش متون وجود دارد . که ظاهرا یک ویو درست کرده اند برای خودشان و با یونیکد مخصوص خودشان.
بنده که چیزی عمومی پیدا نکردم. :(

(امید)
یک شنبه 14 دی 1382, 10:01 صبح
خوب من با RichEdit نتونستم این کار رو انجام بدم. در واقع از کد اون مثال چیزی سر در نیاوردم تا شاید بتونم به justify تغییرش بدم.
فکر کنم بهترین کار این باشه که یه تابع برای این کار بینویسیم.یعنی همون کاری که من الان مشغولش شدم.( فکر کنم تا یه ساعت دیگه تموم شه :wink: )
omid programmer 8-)

Mahdiseif
یک شنبه 14 دی 1382, 16:44 عصر
آقا امید
اگه موفق شدی ما را هم دریاب :wink:

(امید)
یک شنبه 14 دی 1382, 16:56 عصر
ممنون آقا مهدی

بیشتر از چیزی که فکر می کردم طول کشید :oops:
الگوریتمش رو نوشتم.
تو اجراش یه سری مشکلات هست . یکی همین که باید کد تک تک کاراکتر ها رو داشته باشم و الی آخر . تو همین بخش نوشتم.
سر فرصت الگوریتم ش رو توی بخش الگوریتم می نویسم .
و برنامه که تمام شد کدش رو واست میل می کنم.

Farhad.B.S
یک شنبه 14 دی 1382, 17:57 عصر
این کد مشکل رو حل نمیکنه ؟



Procedure SetRTL(Ctrl : TWinControl);
const WS_EX_LAYOUTRTL = $400000;
begin
SetWindowLong(Ctrl.Handle , -20, WS_EX_LAYOUTRTL);
end;


مثال :


SetRTL(RichEdit1);

(امید)
یک شنبه 14 دی 1382, 19:13 عصر
ممنون فرهاد جان
این کد چپ چین می کنه.اگه همین کار از طرف راست هم مرتب کنه عالیه.
در واقع یا باید مثل ورد بین کلمات space گذاشت و یا از ـ استفاده کرد . مثل اینجـــــــــــــــــــــ وری

(امید)
دوشنبه 15 دی 1382, 19:08 عصر
سلام

خوب این کار تموم شد و تقریبا تمام وقت امروزم رو گرفت. اما یه نکته جالب .( بخاطر همین نکته مسخره کار به نتیجه نرسید :| )
بعد از پیاده سازی الگوریتم متن های من باز هم منظم نمی شد و من دو ساعتی مشغول چک کردن کدها بودم تا نهایتا متوجه این نکته شدم
به این متن اصلاح شده توجه کنید:

این برنامه یک مثــال
ساده برای مرتب کـردن
متنهای نوشته شـده در
memo می باشــــــــد

برنامه به این صورت در نظر گرفته شد که در هر سطر فقط n کاراکتر موجود باشد . ولی همانطور که می بینید برای مثال ما هر سطر با اینکه 20 کاراکتر دارد ولی باز تراز نیست.
چون فاصله ای که (ا) اشغال می کند با فاصله (ب) یکی نیست :roll:
در واقع برای کلمات فارسی یا یونیکد باید طول رشته را بر اساس کاراکتر محاسبه نکرد.
کسی نظری یا طرحی در این مورد نداره؟

SyntaxCheck
سه شنبه 16 دی 1382, 06:01 صبح
سلام
امید جان من یه چیزی به ذهنم رسید که شاید بتونه کمکت کنه. ببین اگر بخوایم طول دوتا جمله رو با هم برابر قرار بدیم بطوری که در ظاهر یکی دیده بشه اندازشون این اندازه به برابر بودن تعداد کاراکتر ها ربطی نداره. در حقیقت باید طول دو جمله از لحاظ تعداد پیکسل تشکیل دهنده یکی باشه.


Canvas.TextWidth('این برنامه یک مثــال')
Canvas.TextWidth('ساده برای مرتب کـردن')
Canvas.TextWidth('متنهای نوشته شـده در')
Canvas.TextWidth('memo می باشــــــــد')

در حقیقت فانکشن TextWith و همچنین TextHeight از کلاس Tcanvas طول و عرض جمله مورد درخواست رو (با توجه به فونت مورد استفاده در کانواس) بر حسب تعداد پیکسل برمیگردونند. برای این کار باید کاری بکنیم ک هر چهار خط نوشته شده بطور مثال یک عدد رو برگردونند.

SReza1
سه شنبه 16 دی 1382, 10:42 صبح
ُسلام
دقیقا همون کاری که آقای syntaxcheck میگه بکن
از تابع canvas خیلی کارا میتونی بکنی
فقط نکته مهم اینه که حتما باید font جناب canvas رو به اون چیزی که میخواهی نشون بدی تبدیل کنی!! وگرنه canvas دقیق بهت نمیگه!! پس canvas.font := yourfont یادت نره
برای طول رشته هم از یک حلقه استفاده کن و به اندازه مورد نظر مقایسه کن!!(canvas,textwidth)
من این کار رو قبلا برای تراز کردن در متنهای htmlt 2.0 و richerdit و memo کردم و جواب گرفتم
برای کارکترهای english هم برای تراز از space استفاده کن :D

(امید)
سه شنبه 16 دی 1382, 12:11 عصر
سلام

امید جان من یه چیزی به ذهنم رسید که شاید بتونه کمکت کنهمطمئنا که همین طوره . در واقع من فکر می کردم دستوری نیست که بتونه تعداد پیکسل رو برگردونه .ممنون علی جان . عالیه :)
ممنون رضا جان :)

(امید)
پنج شنبه 23 بهمن 1382, 19:13 عصر
سلام
امروز بالاخره عزم رو جزم و نشستم الگروریتم این بابا justify رو نوشتم. بر اساس تعداد کاراکتر و تعداد برابر پیکسل در هر سطر ( البته با اختلاف 0 تا 3 پیکسل در هر سطر که اجتناب ناپذیر بود )
اما این بابا مثل اینکه با ما بازیش گرفته
به ضمیمه توجه کنید توجه کنید:
تعداد پیکسل های هر سطر بین 197 تا 199 متغییر است . ولی اختلاف تراز سطرها بیشتر از 3 پیکسل نشون داده می شه . برای مثال سطر 4 و 5 دقیقا 197 پیکسل دارن ولی اصلا تراز نیستن :?:
من چیکار کنم :?: :roll:

SReza1
دوشنبه 27 بهمن 1382, 23:15 عصر
من قبلا از فونتهای ipt استفاده میکردم. فکر کنم برای 1256 یه کمی متفاوت باشه . اگه دوست داری برنامتو برام email کن تا مشکلتو از نزدیک ببینم

kimia1
دوشنبه 04 خرداد 1383, 11:51 صبح
بالاخره چی شد این کار امکان پذیر هست یا نه :?:

zoro21750
یک شنبه 22 شهریور 1383, 18:00 عصر
ما که نفهیدیم چی شده ولی اگه ربطی نداره بنویسین که حذفش کنم. برای اینکه طول متن رو بفهمیم. یه لیبل میسازیم که اوتوسایز باشه. بعد از او
Width میگیریم
ویزیبل اش رو هم فالس می کنیم!