PDA

View Full Version : سوال: چاپ مولتی لاین لیبل



hosein3000
پنج شنبه 05 بهمن 1391, 21:28 عصر
سلام دوستان
من از کد زیر که توسط یکی از دوستان همین انجمن که برای من زحمتشو کشیده بودن کارهای چاپ رو انجام می دم فقط یک مشکلی برام پیش اومده و اونم اینکه تو فرمم یه لیبل هستش که مولتی لاینه یعنی متن طولانی توش هست ولی هنگام چاپ کردن با این کد متن اون لیبل رو به جای اینکه مولتی لاین چاپ کنه توی یک خط چاپ می کنه و بقیه متن خونده نمیشه
به نظرتون کجای کد رو تغییر بدم تا مثل خود لیبل چاپ کنه
Dim obj As Object
On Error GoTo Errprint
For Each obj In Me.Controls
If TypeOf obj Is Line Then 'Print Line's
Printer.Line (obj.X1, obj.Y1)-(obj.X2, obj.Y2)
End If


If TypeOf obj Is TextBox Then
Printer.CurrentX = obj.Left
Printer.CurrentY = obj.Top

Printer.Font = obj.Font
Printer.Print obj.Text

End If
If TypeOf obj Is Label Then
Printer.CurrentX = obj.Left
Printer.CurrentY = obj.Top
Printer.Font = obj.Font
Printer.Print obj.Caption
End If

Next
Unload Me
Exit Sub

SlowCode
جمعه 06 بهمن 1391, 08:27 صبح
سلام
علتش اینه که لیبل مالتی لاین نداره، Wordwarp داره که خود کنترل این کار رو میکنه(یعنی تغییری تو متن ایجاد نمیکنه).
یه کدی نوشتم، ولی ممکنه راه ساده تری هم باشه.البته اگه فونتت رو تغییر بدی این کد درست عمل نمیکنه.
کارش اینه که میاد تعداد کاراکترهای مجاز در اندازه لیبل رو چاپ میکنه بعد اگه اضافه موند سر سطر چاپ میکنه.
z = 0
s = obj.Width \ 76
For i = 1 To Len(obj) \ s + 1
Printer.Print Mid(obj, z * s + 1, s)
z = z + 1
Next
اینو به جای خط 21 بنویس.

vbhamed
جمعه 06 بهمن 1391, 08:41 صبح
سلام

بهترين راه اينه كه از گزارشگرها مثل Crystal Report, Active Report, Fast Report و ... استفاده كنيد
چاپ به اين شكل فقط در بعضي موارد خاص مي‌تونه مفيد باشه

در مورد ليبل هم يك تابع داريم به نام TextWidth كه به شكل زير استفاده ميشه
MsgBox Printer.TextWidth("Test")
MsgBox Form1.TextWidth("Test")
MsgBox Picture1.TextWidth("Test")
در بالا عرض كلمه Test در پرينتر، فرم و پيكچر باكس بر مي‌گرده البته با توجه به نوع فونت و سايزي كه براي پرينتر، فرم و پيكچر تعريف شده
حالا شما بايد ابتدا عرض لييل رو در متغيري ذخيره كنيد و بعد با تابع TextWidth عرض متن درون ليبل رو كلمه به كلمه بدست بياريد و اگر جمع عرض كلمات از اول جمله تا بحال، از عرض كل ليبل بيشتر شد متن ليبل رو بشكنيد يعني دو كاراكتر vbCrLf بين كلمات قبلي و كلمات از اين به بعد، بزاريد تا بره خط بعد و اين كار رو براي خطوط بعدي هم ادامه بدين

راه ساده تر هم استفاده از تابع PrintForm هست كه ابتدا بايد همه چيزهاي اضافي روي فرم رو مخفي كنيد و زمينه فرم رو هم سفيد كنيد، بعد دستور Me.PrintForm رو بديد، اگر اشياء، ليبل باشن كيفيت چاپشون خوبه اما TextBox نه
البته فرمتون حتما بايد ديده بشه و مخفي نباشه
يكي از بچه ها هم كدي گذاشته بود كه فرم مخفي رو هم چاپ مي‌كرد كه جستجو كنيد

البته اين روشها كلا دردسر داره و بهترين راه همونيه كه اول گفتم چون در نهايت هم بايد چنين كاري انجام بدين

m.4.r.m
جمعه 06 بهمن 1391, 13:04 عصر
می نونی از یه تکست باکس با مولتی لاین شده استفاده کنی و Locked اونو True کنی که قابل ویرایش نباشه . همین

hosein3000
جمعه 06 بهمن 1391, 13:36 عصر
با تشکر از همه دوستان
فرقی نمی کنه تو label یا textbox باشه

متاسفانه در textbox هم همون خطا رو می ده یعنی کلشو توی یک خط چاپ می کنه

m.4.r.m
جمعه 06 بهمن 1391, 17:17 عصر
یه کلک رشتی بزن موقع چاپ تو قسمت چاپت مثلا 4 تا لیبل بزار تو دستور چاپ از مقدار 0 تا 10 رو در یک لیبل نشون بده از 10 تا 20 رو توی یک لیبل دیگه و .... ببین اینطوری جواب میگیری با دستور های Len , MID$ و...

Mr'Jamshidy
جمعه 06 بهمن 1391, 20:13 عصر
یه کلک رشتی بزن موقع چاپ تو قسمت چاپت مثلا 4 تا لیبل بزار تو دستور چاپ از مقدار 0 تا 10 رو در یک لیبل نشون بده از 10 تا 20 رو توی یک لیبل دیگه و .... ببین اینطوری جواب میگیری با دستور های Len , MID$ و...

خوب با این روش یا اون روش در کل موقع چاپ باید با کد خط ها رو از هم جدا کنه

با همون Mid و Len و TextWidth و ...

فقط حواست باشه یک کلمه رو از وسط نصف نکنی
مثل س
لام

از فاصله ها برای جدا کردن استفاده کن

hosein3000
شنبه 07 بهمن 1391, 21:35 عصر
با تشکر
ولی این روش جواب نمیده چون نوع کلمات مشخص نیست که من بتونم از قبل پیش بینی کنم
بعدشم فرم من طوریه که می تونم فقط یک لیبل یا textbox بذارم
یعنی روش دیگه ای وجود نداره؟//

Mr'Jamshidy
شنبه 07 بهمن 1391, 22:09 عصر
یعنی چی نوع کلامات مشخص نیست؟

یعنی ممکنه باشه سلامداداش یا باشه سلام داداش یا باشه س ل ا م د ا د ا ش
؟

خوب مشخصه دیگه هر کلمه از کلمه دیگه با فاصله جدا میشه

شما میای کلمه کلمه جدا میکنی

با فرمان هایی که بالا مشخص شد اندازه طول نوشته رو میگیری
اگر از طول مورد نظر بیشتر شد یک کلمه حذف میکنی و چاپ میکنی و میری خط بعد
الی آخر

به همین راحتی

نمیتونی این کار رو انجام بدی، سورست رو (اگر تونستی) بزار تا من یا یکی دیگه برات کاملش کنن