28-04-13, 01:39 PM
بسم الله الرحمن الرحيم
الحمد لله رب العالمين والصلاة والسلام على سيدنا محمد وعلى آله وصحبه أجمعين
وبعد
السلام عليكم ورحمة الله وبركاته
قد يحتاج المبرمج في بعض الأحيان إلى وضع أداة نص (TextBox) في مشروعه تكون ذات تحجيم تلقائي (AutoSize) بمعنى أنها تتمدد وتتقلص بحسب النص الذي قام المستخدم بكتابته فيها ...
فكيف السبيل إلى عمل ذلك ؟
في البداية هناك ثلاث حالات:
الحالة الأولى/ عندما تكون خاصية تعدد الأسطر غير مفعلة (Multiline=False)
في هذه الحالة الأمر سهل فكل ما عليك هو وضع هذا الكود فقط
كود :
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
TextBox1.Width = TextBox1.PreferredSize.Width + [color=#FF0000]5[/color]
End Sub
الحالة الثانية/ عندما تكون خاصية تعدد الأسطر مفعلة (Multiline=True) ولكن خاصية الالتفاف غير مفعلة (WordWrap=False)
ستختلف هذه الحالة عن سابقتها بأن ارتفاع الأداة أيضا سيختلف عندما يتم الضغط على زر الرجوع (Enter) وبالتالي سيتم تعديل الكود ليصبح بالشكل التالي
كود :
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
TextBox1.Width = TextBox1.PreferredSize.Width + 5
TextBox1.Height = TextBox1.PreferredSize.Height
End Sub
الحالة الثالثة/ عندما تكون خاصية تعدد الأسطر مفعلة (Multiline=True) وخاصية الالتفاف أيضا مفعلة (WordWrap=True)
هنا سنواجه مشكلة أنه لا يتم احتساب ارتفاع النص الملتف تلقائيا وعلينا احتسابه بأنفسنا ثم إضافة القيمة النهائية إلى الارتفاع
ومن خلال البحث وجدت عدة طرق منها على سبيل المثال (MeasureString, MeasureText)
ولكني سلكت طريقا آخر وجدته - من وجهة نظري - أنه الأسهل
هذه الطريقة هي بالاعتماد على خاصية التحجيم التلقائي لأداة التسمية (Label)
وهذا الكود يبين الطريقة
كود :
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
TextBoxResizer(TextBox1)
End Sub
Public Sub TextBoxResizer(ByVal TextControl As System.Windows.Forms.TextBox)
Dim Label1 As New System.Windows.Forms.Label
Label1.Text = "Label1"
Label1.MaximumSize = New System.Drawing.Size(TextControl.Width - 5, 0)
Label1.MinimumSize = New System.Drawing.Size(TextControl.Width - 5, 0)
Label1.Font = TextControl.Font
Label1.Size = Label1.PreferredSize
Dim DefaultHeight As Integer = Label1.Height
Label1.Text = TextControl.Text
Label1.Size = Label1.PreferredSize
TextControl.Height = TextControl.PreferredHeight + (Label1.Height / DefaultHeight - 1) * DefaultHeight
If TextControl.Text.EndsWith(vbNewLine) Then TextControl.Height += DefaultHeight
End Sub
وأخيرا في المرفقات مثال لتوضيح الحالات الثلاث
والسلام عليكم ورحمة الله وبركاته