PDA

View Full Version : الگورتیم قرار دادن کلمات در کنار هم، در یک صفحه



hdv212
پنج شنبه 15 شهریور 1386, 03:23 صبح
سلام و خسته نباشید
من دارم روی یه کامپوننت برای پرینت از متن کار میکنم، الان نیاز به این دارم که متن مورد نظر رو در خروجی، کلمه به کلمه در کنار هم بچینه تا خطوط درست تشکیل بشه یعنی عرض خطوط، از عرض صفحه بیشتر نشه که در این صورت باید کلمه ی اضافی رو در اول خط بعدی قرار بده، من خودم کدی رو نوشتم، قاعدتا هم باید درست جواب بده ولی نمیدونم کجاش مشکل داره که کلمات رو کنار هم نمیتونه درست بچینه و در بعضی از خطها، عرض خط از عرض صفحه بیشتر میشه، اینم لینک تاپیکی که حاوی کد هست :
http://barnamenevis.org/forum/showthread.php?p=390511#post390511
فقط یه توضیحی بدم به جای صفحه، من یه richTextBox در نظر گرفتم.
میخوام کامپوننت رو توی سایت بذارم. فکر کنم خیلی به درد بچه ها بخوره، هم نیازی به کریستال ریپورت ندارن(البته برای کارهایی که به داده ها مربوط نمیشه) و هم یاد میگیرن.
مرسی.

ghafoori
پنج شنبه 15 شهریور 1386, 13:57 عصر
دوست عزیز چرا این قدر خودتان را زجر می دید من همیشه با خودم فکر می کردم چرا همیشه برنامه نویسان این قدر برای چاپ کردن خودشان را زجر می دن و از کریستال استفاده می کنند در حالی که کنترل webbrowser را ول کردند کنترلی با قابلیت های عالی کد html بزار توش دستور print را بده و خلاص و چون با کدهای html,css می توانی کارهای را انجام بدی که با کریستال اگر غیر ممکن نباشد بسیار سخت قابل انجام است

hdv212
پنج شنبه 15 شهریور 1386, 18:26 عصر
متشکرم ghafoori جان، ولی میخوام این کنترل رو بسازم، هم چیز به درد بخوریه و هم آموزنده، در مورد کنترل webbrowser اگه یه مثال هم بذاری ممنون میشم، یه نگاهی هم به لینک بالا بنداز، اگه بتونی تو الگوریتمش کمکم کنی عالی میشه.

choobin84
پنج شنبه 15 شهریور 1386, 22:37 عصر
من هم با یک همچین برنامه هایی و الگوریتم نویسی هایی بسیار موافقم، ضرورتی نداره مرتب از کنترل های آماده استفاده کنیم.
زد و گرفت یه وقت یه word نوشتیم. همش که نشد مایکروسافت، یکم هم خودمون.

ghafoori
جمعه 16 شهریور 1386, 15:04 عصر
من هم با یک همچین برنامه هایی و الگوریتم نویسی هایی بسیار موافقم، ضرورتی نداره مرتب از کنترل های آماده استفاده کنیم.
زد و گرفت یه وقت یه word نوشتیم. همش که نشد مایکروسافت، یکم هم خودمون.

دوست عزیز من هم با این کار موافقم اما می دانم اخر این کار چی می شود بعد از بحث و روشن شدن ابعاد کار بی خیال این کار می شوند و ولش می کنند مثلا همین مسئله اگر کاربری بخواهد یک جدول چاپ کند چیکار می خواهید بکنید حتما می گید کد ان را هم می نویسید اما مشکل که یک دوتا نیست ایم کار را بسیار بزرگی است اگر چه صورت ان بسیار ساده است من که چشمم اب نمی خوره این کار هم مانند پروژه های دیگر ول می شود مثل تمام قبلی ها من مدت بیشتر از شما داخل سایت هستم از این پروژه ها زیاد دیدم البته از این که این کار شکست بخورد خوشحال نیستم ولی سعی می کنم واقع بین باشم حالا من یک کمکی می کنم این هم الگوریتم من با زبان وی بی دات نت تا نگید همش شما باعث دلسرد شدن ما می شید و همه تقصیرها را گردن ما که نفوس بد می زنیم بیاندازید
10781

hdv212
جمعه 16 شهریور 1386, 23:25 عصر
مرسی ghafoori جان، میدونم چی میگی، ولی من سعی میکنم تمومش کنم. بازم مرسی از لطفت.

hdv212
جمعه 16 شهریور 1386, 23:31 عصر
ghafoori جان من برنامه تو تست کردم جواب نداد، یعنی مثل مال خودم میمونه، زمانی که روی دکمه ی ShowText میزنی، متن درست توی RichTextBox فیت نمیشه، و باعث میشه که RixhtextBox از اسکرول استفاده کنه، دقیقا مشکل من همینجاست و میخوام خطوط به درستی در RichtextBox فیت بشن تا نیازی به اسکرول نداشته باشه.

راستی وقتی روی دکمه ی ChangeSizeRichTextBox کلیک میکنم، اول یه خطای بزرگ کامپایلر بهم میده (همون پیغام همیشگی ویندوز Xp) با این مضمون :

Microsoft (R) Visual Basic Compiler has encountered a problem and needs to close. We are sorry for the inconvenience.
بعدشم روی این خط :

For a = 0 To mainstring.Length - 1
خطای زیر رو میده :

Object reference not set to an instance of an object

choobin84
جمعه 16 شهریور 1386, 23:52 عصر
ghafoori close. We are sorry for the inconvenience.[/code]بعدشم روی این خط :

For a = 0 To mainstring.Length - 1خطای زیر رو میده :

Object reference not set to an instance of an object

نمی دونم ، تست کردم خطا نداشت.

جالبه هر دو تا برنامه یک خط در میون خطوط رو از وسط نصف می کنن. برنامه غفوری جون هم میاد برخی کلمات رو به هم می چسبونه(بیشتر وقتی که طول rtb رو افزایش میدیم.)

برنامه هاتون رو ببینید..
مشکل احتمالا توی حلقه هاست.

ghafoori
شنبه 17 شهریور 1386, 10:20 صبح
برنامه غفوری جون هم میاد برخی کلمات رو به هم می چسبونه
این مشکل برطرف شد من الان برنامه را اجرا می کنم بدون خطاست کاربر hdv212 برنامه را خارج از vs اجرا کنید تا خطا ندهد مشکل اسکرول هم برای این بود که طول خط فعلی برابر عرض richtextbox میشد که برطرف شد
10796

hdv212
شنبه 17 شهریور 1386, 12:20 عصر
ghafoori جان باز همونجوریه، یعنی روی ChangeSizeRichtextBox که میزنم خطای :

Object reference not set to an instance of an object
رو میده و روی ShowText هم که میزنم، باز RichTextBox از اسکرول اسفاده میکنه (مثل دفعه ی قبل)

hdv212
شنبه 17 شهریور 1386, 19:25 عصر
راستی تو کد، شما متغیر h که از نوع char هست رو با این ثابت رشته ای مقایسه کردی :

Case vbCrLf
من نمیدونم معادل این ثابت توی سی شارپ چیه، و اینکه اونو نمیشه به char برد چون خطا میگیره و میگه مقدار ثابته، لطفا این رو هم راهنمایی کنید.

ghafoori
شنبه 17 شهریور 1386, 19:41 عصر
همون کاراکتر خط بعده
\n
این هم می شود microsoft.visualbasic.vbcrlf

hdv212
یک شنبه 18 شهریور 1386, 00:04 صبح
ghafoori جان ممنون از لطفت، مشکلم حل شد، یه سری تغییراتی تو کدم دادم، بعضی از مشکلات نا خونده رو هم مثل کاراکتر '\t\n' رو هم حل کردم، انگار فعلا درست کار میکنه :

private void ShowText()
{
System.IO.FileStream fsOut = new System.IO.FileStream("linesWidth.txt", System.IO.FileMode.OpenOrCreate);
System.IO.StreamWriter sw = new System.IO.StreamWriter(fsOut);

string mainText = System.IO.File.ReadAllText("test.txt");
Graphics g = this.richTextBox1.CreateGraphics();
int widthBorder = this.richTextBox1.Width - 4;
StringBuilder sb = new StringBuilder();
SizeF sizeText = new SizeF();
SizeF sizeCurrentLine = new SizeF();
ArrayList allLines = new ArrayList();
string firstWordNextLine = string.Empty;
sw.WriteLine("WidthBorder : " + widthBorder.ToString());
string text = string.Empty;

string[] textCol = mainText.Split(new char[] { ' ' });
foreach (string te in textCol)
{
if (te.Contains("\r\n"))
{
text = te.Replace("\r\n", "");
}
else
text = te;
if (firstWordNextLine != string.Empty)
{
sb.Append(firstWordNextLine);
firstWordNextLine = string.Empty;
}
int widthText = (int)g.MeasureString(text, this.richTextBox1.Font).Width;
int widthCurrentLine = (int)g.MeasureString(sb.ToString(), this.richTextBox1.Font).Width;
int totalWidthLine = widthText + widthCurrentLine;
if (totalWidthLine <= widthBorder)
{
if (sb.ToString() == "")
sb.Append(text);
else
sb.Append(" " + text);
}
else
{
sw.WriteLine("Length : " + sb.Length.ToString() + " CurrentLine : " + widthCurrentLine.ToString() + " FinalLineWidth : " + totalWidthLine.ToString());
allLines.Add(sb.ToString());
firstWordNextLine = text;
sb = new StringBuilder();
}
}
if (sb.ToString().Length > 0)
{
allLines.Add(sb.ToString());
sb = new StringBuilder();
}
for (int i = 0; i <= allLines.Count - 1; i++)
{
this.richTextBox1.Text += allLines[i].ToString() + "\n";
}
sw.Close();
}
به هر حال دستت درد نکنه، مرسی.