PDA

View Full Version : سوال: برنامه پردازش متن (اگه عنوان از حدی بزرگتر شد متن کوتاه نشان داده نشود در یک کادر)



bftarane
دوشنبه 15 مهر 1392, 21:28 عصر
سلام.
لطفاً این سناریو رو بخونید

یک کادر با طول 350 و عرض 100 داریم

و دو فیلد عنوان و متن کوتاه هم داریم که در دیتابیس درج می شوند
حالا می خواهیم اگر عنوان از حدی بزرگتر شد، دیگه متن کوتاه دیده نشه

تا اینجا مشکلی نیست
اومدم کل تیتر رو از دیتابیس خوندم ریختم تعداد کاراکترهاش رو حساب می کنم و به طور تقریبی حساب کردم با کاراکترهای فارسی100 کاراکتر در این باکس جا میشن و می یام می گم متن کوتاه رو وقتی عنوان از 100 بزرگتر بود نشون نده.

مشکل اینجاست که کاربر ممکنه در خطوط اینتر بزنه و ما باید حالات مختلف اینتر در متن رو هم در نظر بگیریم.
کاری که خودم کردم

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

من فایل رو ضمیمه کردم. چون کدها طولانی هست و فکر کنم این طوری بهتره. در ضمن من با Asp.net این برنامه رو نوشتم و دیتابیس اکسس ولی چون تمرکز روی برنامه نویسی هست اینجا گذاشتم.
توضیح اینکه: اومدم متن رو گرفتم با کاراکتر اینتر اسپلیت کردم و ریختم در یک آرایه
مثلاً گفتم اگه
result.length

برابر با 2 باشه معلومه که 1 اینتر در متن وجود داره و اگه
result[0]<L
معلوم میشه خط اول اینتر داره
حالا اومدم گفتم

if (result[1].Length>3*L)
{
Literal3.Visible = false;
}
یعنی اگه خونه دوم آرایه متنش از سه خط طولش بیشر شد متن کوتاه رو نشون نده
اینا رو گفتم تا یه ذهنیتی پیدا کنید که چی کار کردم.


خودم احساس می کنم خیلی بد کدنویسی کردم. و شاید حتی کارم درست هم نباشه ولی خودم امتحان که کردم فعلاً که جواب داده.
ولی ممکنه من حالتی رو در نظر نگرفته باشم. و همینطور فکر می کنم حتی اگه جواب بده خیلی بهتر و با کدنویسی کمتر از این میشه به نتیجه رسید

در کل میخوام بدونم شما در مورد حل این مسئله چی به ذهنتون می رسه و چطور کدنویسی می کنید این رو؟

فایل رو قرار می دم لطفاً راهنمایی کنید.

bftarane
سه شنبه 16 مهر 1392, 10:42 صبح
نمی دونم شاید کسی حوصله دانلود کردن نداره.
کدها رو هم می زارم. منتظر راهنمایی هستم.

public void LoadData()
{
OleDbDataReader dr = DBase.ExecuteReader(System.Data.CommandType.Text, "select * from tbl", new OleDbParameter[]{
});

while (dr.Read())
{
Literal2.Text = dr["tb_title"].ToString();
Literal3.Text = dr["tb_abs"].ToString();
}

lblnumberoftotalchar.Text = CountTotalChars(Literal2.Text).ToString();
long CTotalChars = CountTotalChars(Literal2.Text);

string titr = Literal2.Text;

string[] separators = new string[] { "\r\n" };
string[] result;
int L =35;
int line = 0;

result = titr.Split(new string[] { "\r\n" }, StringSplitOptions.None);
//if (result.Length<=5)
//{

//}
if (result.Length > 0)
{
Response.Write("result 0=" + result[0]);
}
if (result.Length > 1)
{
Response.Write("result 1=" + result[1]);
}
if (result.Length > 2)
{
Response.Write("result 2=" + result[2]);
}
if (result.Length > 3)
{
Response.Write("result 3=" + result[3]);
}
if (result.Length > 4)
{
Response.Write("result 4=" + result[4]);
}
if (result.Length > 5)
{
Response.Write("result 5=" + result[5]);
}






Label1.Text = result.Length.ToString();

Literal2.Text = Literal2.Text.Replace("\r\n", "<br>");

switch (result.Length)
{
case 1:
if (CTotalChars > 100)
{
Literal3.Visible = false;
}
break;
case 2://1 enter
// enter in line one

//long s2 = CTotalChars - result[0].Length;
// طول تقریبی یک خط 40
if (result[0].Length<L)// enter in line one
{
line++;
//long s2 = CTotalChars - L;
if (result[1].Length>3*L)
{
Literal3.Visible = false;
}

}
if ((L < result[0].Length) && (result[0].Length < 2*L))//enter in line two
{
line++;
//long s2 = CTotalChars - 2*L;
if (result[1].Length > 2*L)
{
Literal3.Visible = false;
}
}

if ((2*L < result[0].Length) && (result[0].Length < 3 * L))//enter in line three
{
line++;
//long s2 = CTotalChars - 2*L;
if (result[1].Length > 1 * L)
{
Literal3.Visible = false;
}
}

if ((2 * L < result[0].Length) & (result[0].Length < 4 * L))//enter in line four
{

line++;
//long s2 = CTotalChars - 2*L;
if (result[1].Length > 0 * L)
{
Literal3.Visible = false;
}

}

if ((3 * L < result[0].Length) & (result[0].Length < 5 * L))//enter in line five
{

Literal3.Visible = false;

}

break;
case 3://2 enter
if (result[0].Length<L)
{
if (result[1].Length<L) //enter in line one and two
{
if (result[2].Length>3*L)
{
Literal3.Visible = false;
}
}

if (result[1].Length > L & result[1].Length < 2*L) //enter in line one and three
{
if (result[2].Length > 2 * L)
{
Literal3.Visible = false;
}
}
if (result[1].Length > 2*L & result[1].Length < 3 * L) //enter in line one and four
{
if (result[2].Length > 1 * L)
{
Literal3.Visible = false;
}
}

if (result[1].Length > 3 * L & result[1].Length < 4 * L) //enter in line one and five
{
Literal3.Visible = false;
}

}


if (result[0].Length < 2 * L & result[0].Length > L)//first enter in line two
{

if (result[1].Length > 2 * L & result[1].Length < 3 * L)//enter in line two and three
{
Literal3.Visible = false;
}

if (result[1].Length > 3 * L & result[1].Length < 4 * L)//enter in line two and four
{
Literal3.Visible = false;
}

if (result[1].Length > 4 * L & result[1].Length <5*L)//enter in line two and five
{
Literal3.Visible = false;
}
}
if (result[0].Length < 3 * L & result[0].Length >2* L)//first enter in line three
{

if (result[1].Length>0 & result[1].Length <2*L )//enter in line three and four
{
if (result[2].Length>L)
{
Literal3.Visible = false;
}


}
if (result[1].Length>L & result[1].Length < 3 * L)//enter in line three and five
{
Literal3.Visible = false;
}

}


if (result[0].Length>3*L & result[1].Length<2*L)//enter in line four and five
{
Literal3.Visible = false;
}


break;
case 4://3 enter
if (result[0].Length<L)
{
if (result[1].Length<L & result[2].Length<L)//enter in line one,two,three
{
if (result[3].Length > 2 * L)
{
Literal3.Visible = false;
}

}
if (result[1].Length < L)//enter in line one,two,four
{
if (result[2].Length<2*L & result[2].Length <3*L)
{
if (result[3].Length > L)
{
Literal3.Visible = false;
}

}
}
if (result[1].Length < L)//enter in line one,two,five
{
if (result[2].Length < 3 * L & result[2].Length < 4 * L)
{
Literal3.Visible = false;
}
}
//one,three,four
if (result[1].Length <3*L & result[1].Length>L)
{
if (result[2].Length < 2*L & result[2].Length>0)
{
if (result[3].Length>0)
{
Literal3.Visible = false;
}
}

}
//one,three,five
if (result[1].Length < 3 * L & result[1].Length > L)
{
if (result[2].Length < 3 * L & result[2].Length > L)
{
Literal3.Visible = false;
}

}

}

if (result[0].Length>L & result[0].Length <2*L)//enter in line two, three, four*************
{
if (result[1].Length <2*L & result[1].Length>0)
{
if (result[2].Length<2*L & result[2].Length>0 )
{
if (result[3].Length>L)
{
Literal3.Visible = false;
}
}
}

}
if (result[0].Length > L & result[0].Length < 2 * L)//enter in line two, three, five
{
if (result[1].Length < 2 * L & result[1].Length > 0)
{
if (result[2].Length < 3 * L & result[2].Length > L)
{

Literal3.Visible = false;

}
}
}
if (result[0].Length > 2*L & result[0].Length < 3 * L)//enter in line three, four, five
{
if (result[1].Length < 2 * L & result[1].Length > 0)
{
if (result[2].Length <2*L & result[2].Length >0)
{
Literal3.Visible = false;
}
}

}


break;
case 5://4 enter

if (result[0].Length < L)
{
if (result[1].Length < L & result[2].Length < L & result[3].Length<L)//enter in line one,two,three,four
{
if (result[4].Length > L)
{
Literal3.Visible = false;
}

}
}

if (result[0].Length < L)//enter in line one,two,three,five
{
if (result[1].Length < L & result[2].Length < L)
{
if (result[3].Length<3*L & result[3].Length<L)
{
Literal3.Visible = false;
}

}
}
if (true)//enter in line one,three,four,five
{
if (result[0].Length<L)
{
if (result[1].Length<3*L & result[1].Length>L)
{
if (result[2].Length < 2*L & result[2].Length >0)
{
if (result[3].Length<2*L & result[3].Length<0)
{
if (result[4].Length>0)
{
Literal3.Visible = false;
}
}
}
}

}

}
if (true)//enter in line one,two,four,five
{
if (result[0].Length<L)
{
if (result[1].Length<2*L & result[1].Length>0)
{
if (result[2].Length<3*L & result[1].Length>L)
{
if (result[3].Length <2*L & result[3].Length >0)
{
Literal3.Visible = false;
}
}
}
}
}
break;

case 6: // 5 enter
Literal3.Visible = false;
break;
default:
break;
}

}

shahryari
سه شنبه 16 مهر 1392, 12:22 عصر
اومدم کل تیتر رو از دیتابیس خوندم ریختم تعداد کاراکترهاش رو حساب می کنم و به طور تقریبی حساب کردم با کاراکترهای فارسی100 کاراکتر در این باکس جا میشن و می یام می گم متن کوتاه رو وقتی عنوان از 100 بزرگتر بود نشون ندهسلام
تشخیص کوتاه یا بلند بودن رشته براساس تعداد کاراکتر ، نمیتونه صحیح باشه به دونمونه زیر نکاه کنید
الف : اااااااااا
ب : کککککککککک
هر جفتش 10 کاراکتر و لی مورد ب بلندتر از مورد الف هست

General-Xenon
سه شنبه 16 مهر 1392, 15:36 عصر
سلام وقت بخیر . تابعی وجود داره که برای کار با Graphic اکثرا ازش استفاده میشه . تو این مورد نیاز شما رو برطرف خواهد کرد.
System.Windows.Forms یادتون نره.
System.Windows.Forms.TextRenderer.MeasureText("", new System.Drawing.Font("tahoma", 9)).Width;
موفق باشید

bftarane
سه شنبه 16 مهر 1392, 21:39 عصر
تشخیص کوتاه یا بلند بودن رشته براساس تعداد کاراکتر ، نمیتونه صحیح باشه به دونمونه زیر نکاه کنید
الف : اااااااااا
ب : کککککککککک
هر جفتش 10 کاراکتر و لی مورد ب بلندتر از مورد الف هستبله. این مورد رو می دونستم. مثلاً حرف س که زیاد باشه متن رو طولانی تر می کنه ولی ما یه مقدار می تونیم برای این خطا طول خط رو کمتر بگیریم.

سلام وقت بخیر . تابعی وجود داره که برای کار با Graphic اکثرا ازش استفاده میشه . تو این مورد نیاز شما رو برطرف خواهد کرد.من وب اپلیکیشن کار می کنم (با زبان سی شارپ) به خاطر همین در این تالار پرسیدم. ویندوز اپلیکیشن نیست این کارم. حالا می رم در مورد TextRenderer.MeasureText جستجو میکنم ببینم کارش چیه و آیا معادلی در وب اپلیکیشن هم داره یا نه ممنون.
ولی لطفاً هر کس می تونه روش کدنویسی و الگوریتمش رو راهنمایی کنه. ممنون.

mnvoh90
سه شنبه 16 مهر 1392, 21:54 عصر
من خیلی وقته سی شارپ و کلا WinForm کار نکردم ولی تا اونجا که یادمه بهترین راه واسه این کار اینه که یه TextBox جدید درست کنید و ویژگی AutoSize(یا یه همچین چیزی دقیق یادم نیست) رو برابر true بزارید و بعد اینکه width‌عنصر رو گرفتید از فرم حذفش کنید. اون تابع MeasureText هم دقیق نیست و اگر دقیق بخواید باید یک تابع Trim هم بنویسید که یه مقدار زمانبر هست

ویرایش:الان خوندم که وب اپلیکیشن کار می کنید. اگر اونم یه همچین چیزی که گفتم داشته باشه بهترین کار همینه هرچند که فکر کنم نداشته باشه

General-Xenon
سه شنبه 16 مهر 1392, 23:14 عصر
بله. این مورد رو می دونستم. مثلاً حرف س که زیاد باشه متن رو طولانی تر می کنه ولی ما یه مقدار می تونیم برای این خطا طول خط رو کمتر بگیریم.
من وب اپلیکیشن کار می کنم (با زبان سی شارپ) به خاطر همین در این تالار پرسیدم. ویندوز اپلیکیشن نیست این کارم. حالا می رم در مورد TextRenderer.MeasureText جستجو میکنم ببینم کارش چیه و آیا معادلی در وب اپلیکیشن هم داره یا نه ممنون.
ولی لطفاً هر کس می تونه روش کدنویسی و الگوریتمش رو راهنمایی کنه. ممنون.
این تابع کارش در Windows Form هست . اما در Web Application هم می تونین استفاده کنین. تا اونجایی که من از این تابع استفاده کردم کارش دقیق بوده. من اکثر کنترل های ساخته خودم رو با این تابع ادغام کردم و بدون مشکل بوده . ممنون میشم مثالی بزنید بنده رو راهنمایی کنید.