View Full Version : رابطه بین طول کارکتر و تعداد Pixel
JavanSoft
چهارشنبه 02 آذر 1384, 17:30 عصر
فرض کنید رشته ای بطول 10 کارکتر دارید و برای این 10 کارکتر 30 پیکسل را در Editخود معرفی می کنید
وقتی این طول به 20 کارکتر می رسد الزاما شما 60 پیکسل را نخواهید داشت
چگونه می توان بین این دو رابطه برقرار کرد؟ ایا ضریبی وجود دارد ؟
اَرژنگ
چهارشنبه 02 آذر 1384, 17:58 عصر
فقط اگر که Mono Font استفاده کنید. وگرنه میتونید عرضه پهناترین کاراکتر را به عنوان ضریب استفاده کنید. در انگلیسی "M" در فارسی 'ک' یا 'گ'(درسته؟)
seyedof
چهارشنبه 02 آذر 1384, 19:53 عصر
سلام
با تابع API GetTextExtent32 که در دلفی و بیلدر فکر کنم معادلش یک متد در TCanvas است به اسم TextExtent که میتونه طول یک رشته رو با فونت جاری برحسب پیکسل برگردونه. اینجوری میشه یه محاسباتی کرد.
ممنون علی
MiRHaDi
پنج شنبه 03 آذر 1384, 02:30 صبح
سلام
برای این کار تابع داریم ! میگه طول رشته چقدره ! نه به کاراکتر ! به پیکسل
بای
اَرژنگ
پنج شنبه 03 آذر 1384, 02:46 صبح
فرض کنید رشته ای بطول 10 کارکتر دارید و برای این 10 کارکتر 30 پیکسل را در Editخود معرفی می کنید
وقتی این طول به 20 کارکتر می رسد الزاما شما 60 پیکسل را نخواهید داشت
چگونه می توان بین این دو رابطه برقرار کرد؟ ایا ضریبی وجود دارد ؟
نه ضریب وجود ندارد. بستگی به نوع فونتتون داره، مثلاً عرضه "i" را با عرضه "M" مقایسه کنید. فقط اگر از خطه mono استفادده بشه عرضشون یکیه و از یک ضریب میشه استفاده کرد.
mzjahromi
پنج شنبه 03 آذر 1384, 08:07 صبح
سلام
با تابع API GetTextExtent32 که در دلفی و بیلدر فکر کنم معادلش یک متد در TCanvas است به اسم TextExtent که میتونه طول یک رشته رو با فونت جاری برحسب پیکسل برگردونه.
Canvas.TextWidth
JavanSoft
پنج شنبه 03 آذر 1384, 13:08 عصر
ممنون از همه
برای این کار تابع داریم ! میگه طول رشته چقدره ! نه به کاراکتر ! به پیکسل
این تابع چیه
mzjahromi
پنج شنبه 03 آذر 1384, 16:52 عصر
ممنون از همه
این تابع چیه
Canvas.TextWidth
vcldeveloper
جمعه 04 آذر 1384, 08:25 صبح
var
H : THandle;
DC : HDC;
Size : TSize;
begin
H := FindWindowEx(Form1.Handle,0,'TEdit','Edit1');
if H <= 0 then
Exit;
DC := GetDC(H);
if GetTextExtentPoint32(DC,PAnsiChar(Edit1.Text),Leng th(Edit1.Text),Size) then
ShowMessage(IntToStr(Size.cx));
end;
JavanSoft
شنبه 05 آذر 1384, 19:56 عصر
برنامه کوچکی برای انجام هر دو دستور نوشتم که نتیجه حاصل نشان می دهد Canvas.TextWidth بهتر عمل می کند اما دقیق نه
برای اینکه بیشتر متوجه شوید در هر دوEdit تایپ کنید و یا دکمه های تست را فشار دهید
اما در همان قسمت مشکل اصلی اینست که باید فونت صفحه نمایش عوض شود (Edit.Canvas وجود ندارد )
خواهش می کنم با نگاهی به برنامه اگر مشکلی وجود دارد اعلام فرمایید
vcldeveloper
دوشنبه 07 آذر 1384, 00:20 صبح
متد TextWidth مربوط به TCanvas هم از تابع GetTextExtentPoint32 استفاده میکنه، اما ظاهرا رفتار شی Canvas در کنترلهای خانواده Edit با رفتار Canvas در سایر کنترل ها فرق میکنه؛ مثلا عددی که در Canvas مربوط به فرم فقط 6 پیکسل عرض داره، در Canvas مربوط به Edit عرضش 8 پیکسل محاسبه میشه (!!) همین تفاوت باعث میشه که نتیجه ایی که از تابع GetTextExtentPoint32 و هندل DC مربوط TEdit میگیرید، چندان درست نباشه.
مشکل اصلی اینست که باید فونت صفحه نمایش عوض شود (Edit.Canvas وجود ندارد )
بنظرم شما می تونید از دو راه استفاده کنید:
1- از همون GetTextExtentPoint32 استفاده کنید، ولی با تغییراتی در کد، نتیجه بدست اومده از اون رو اصلاح کنید:
DC := GetDC(Edit2.Handle);
if GetTextExtentPoint32(DC,PAnsiChar(Edit2.Text),Leng th(Edit2.Text),Size) then
Result:=Size.cx - (2*Length(Edit2.Text));
2- از یک شی که شی Canvas اون در دسترس هست بر روی فرم استفاده کنید؛ مثلا یه TPaintBox روی فرم قرار بدید و خصوصیت Visible اون رو هم False کنید. هرگاه فونت Edit تغییر کرد، فونت PaintBox رو هم تغییر بدید. برای محاسبه عرض متن از Canvas شی PaintBox بجای Canvas شی Edit یا فرم استفاده کنید.
MiRHaDi
دوشنبه 07 آذر 1384, 15:46 عصر
سلام
از خواب که پا شدم ناگهان یه جوابی برای این سوال به ذهنم رسید
یک Lable به صورت Visible = false در فورم بگذارید
بعد lable.font = edit.font و lable.caption := edit.text
و Lable.autosize := true;
حالا lable.width جواب شماست !
بای
JavanSoft
دوشنبه 07 آذر 1384, 16:44 عصر
این هم روش جالبی است ... اما بنظر می رسد با استفاده از یک Panel بصورت یک Parent راههای بالاهم جواب می دهند ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.