PDA

View Full Version : سوال: چاپ کل فرم



hosein3000
شنبه 21 آبان 1390, 21:51 عصر
سلام دوستان

می خواستم بدونم با چه روشی می تونم کل یک فرم رو با تمام اطلاعاتش چاپ کنم.چون از دیتابیس استفاده نکردم به همین علت هم نمیشه از دیتا ریپورت و اینا استفاده کرد.اطلاعات فرم هم زیاده یعنی حدود 50 تا تکست باکس داره
ایا امکان داره همینطوری این فرم رو به پرینتر فرستاد؟؟
وقتی ازکد form1.printform استفاده می کنم فقط نصف فرم رو چاپ می کنه چون فرم یکم بزرگه

Mr'Jamshidy
شنبه 21 آبان 1390, 22:43 عصر
اطلاعاتی که میفرستی به پرینتر اگر تکست باکسه از کد زیر استفاده کن اگر نیست بصورت دلخوه تغییرش بده استفاده کن

Dim Obj As Object

For Each Obj In Me.Controls
If TypeOf Obj Is TextBox Then
Printer.CurrentX = Obj.Left
Printer.CurrentY = Obj.Top
Printer.Font = Obj.Font
Printer.Print Obj.Text
End If
Next

Printer.EndDoc

این کد نوشته های داخل تکست باکس رو نسبت به مقتصاد اون تکست باکس و با استفاده از همون فونتی که تکست باکس استفاده میکنه توی پرینتر پیشفرض چاپ میکنه

بهتره که از پرینتر مجازی استفاده کنی که با روش کد نویسیش آشنا بشی

hosein3000
دوشنبه 23 آبان 1390, 14:35 عصر
با سلام
مرسی که جواب منو دادین
من کد رو تست کردم فقط محتویات داخل تکست باکس رو چاپ کرد اونم بصورت درهم برهم .کد رو تغییر دادم تا لیبل ها رو هم چاپ کنه باز قاطی تر شد.
من میخوام کل یک فرم رو بصورت کامل با لیبیل ها و تکست باکس ها چاپ کنم اگه ر اهنماییم کنین ممنون میشم
مرسی

Mr'Jamshidy
دوشنبه 23 آبان 1390, 15:05 عصر
منظورت چیه؟

یعنی عکس تکست باکس هم بیوفته؟

درهم و برهم بودن نوشته ها هم شاید به علت عدم پشتیبانی چاپگر شما از UTF-8 باشه

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

یک فایل PDF هم هست داخلش که برات گزاشتم (از پرینتر مجازی برای ساخت این استفاده کردم) نمونه کار همین سورس هست

عکس زیر رو ببین

77840

اگر VB شما از UTF-8 پشتیبانی میکنه (یعنی اگر میتونی فارسی بنویسی) میتونی بجای استفاده از شیئ Printer از یک PictureBox استفاده کنی و بعد اون عکس رو با Printer.PaintPicture به پرینتر بفرستی

M.T.P
دوشنبه 23 آبان 1390, 15:15 عصر
سلام ، برای چاپ فرم هایی با ابعاد بزرگتر از کاغذ چاپ باید اندازه فرم رو طوری قرار دهید که برای چاپ به مشکل بر نخورید.
مثلا اگر کاغذ شما A4 هست باید یا عرض فرم رو برابر با عرض کاغذ آچار کنید ، یا اینکه عرض فرم رو با ارتفاع کاغذ A4 ست کنید که بصورت Landscape عملیات چاپ رو انجام بدید.
این کد با توجه به عرض 21 و ارتفاع 29.7 سانتی کاغذ آچار ، اندازه فرم رو به اندازه کاغذ آچار درمیاره منتها بصورت Landscape ، چون در حالت عمودی ممکنه ارتفاع فرم از صفحه نمایش بیشتر شه.


Private Sub Form_Load()
Dim IntW As Long
Dim IntH As Long
IntW = ScaleX(21, vbCentimeters, vbTwips)
IntH = ScaleY(29.7, vbCentimeters, vbTwips)
Me.Move 0, 0, IntH, IntW
End Sub

hosein3000
دوشنبه 23 آبان 1390, 19:51 عصر
دوباره ممنون به خاطر توجه تون
اما مشکل من حل نشد
برای اینکه اندازه فرم ها رو تغییر بدم یکم دیر شده چون کلا تمام کاراشو انجام دادم
در مورد کد بالام منظورم از درهم برهم فونتش نبود منظور من مکانهای تکست باکس ها بود
مثل عکس زیر77846
همینطور که در عکس می بینین تمام تکست باکس ها رو که چاپ کرده اورده بالای صفحه در حالی که اکثرا پایین صفحه هستند.یعنی جاهاشون به هم خورده بعضی ها هم روی هم چاپ شده
حالا مشکل این حل بشه من لیبیل ها رو چیکار کنم متن های تکست باکس ها بدون لیبل ها که مفهومی نداره

Mr'Jamshidy
سه شنبه 24 آبان 1390, 20:22 عصر
اگر سورس برنامهت رو بزاری (صفحه چاپ) میتونم مشکلت رو حل کنم

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

حتی براش جدول هم گزاشته بودم
----------------
اما اگر نخواستی سورس بزاری شاید یکی از مشکلاتت Alignment تکست باکس باشه (روی این موضوع خیلی دقت کن)
بهتره که همه نوشته هایی که قراره به چاپگر ارسال بشه اول به Label ارسال بشه، بعد از Label به چاپگر

برای این که این موضوع رو بهتر بفهمی یک سورس برای میزارم سعی میکنم کامل توضیح بدم (تا حدود 30 دقیقه دیگه)

Mr'Jamshidy
سه شنبه 24 آبان 1390, 21:02 عصر
این هم سورس

اینم یک نمونه عکس از صفحه ای که برنامه چاپ میکنه

77905

موفق باشی

hosein3000
سه شنبه 24 آبان 1390, 22:54 عصر
با سلام
من فایل رو گذاشتم با اینکه می دونم براتون زحمت میشه اما اگه لطف کنین و مشکل پرینتشو برام حل کنین مثل همون کدی که برام گذاشته بودین ممنون میشم
و یه سوال دیگه
من برا اینکه اطلاعات تکست باکس ها تو کل پروژه حفظ بشه و با خروج از فرم و باز کردن دوباره فرم همون اطلاعاتی که قبلا تو تکست باکس ها بود حفظ بشه مجبور شدم از متغییر ها استفاده کنم اما چون تعدادشون زیاده و فرم ها هم زیاده تعداد متغییر ها زیاد شده و کارکردن باهاشون خیلی سخت شده اگه برا این مشکلم هم یه راه حلی
پیشنهاد کنین خیلی خیلی ممنون میشم

Mr'Jamshidy
چهارشنبه 25 آبان 1390, 08:32 صبح
برای حل این مشکل میتونی از Form1.Hide استفاده کنی تا تمام مقادیر حفظ بشه (وقتی دوباره Form1.Show بزنی مثل همون موقعی که Hide شده دوباره نمایش داده میشه)

به روی چشم همین الان روی پروژه شما کار میکنم

Mr'Jamshidy
چهارشنبه 25 آبان 1390, 08:58 صبح
آقا مشکل شما رو یافتم
خرچنگ قورباقه نوشتن برنامه شما بخاطر اینه که شما از Frame استفاده کردی
چون مقتصاد اشیاء داخل Frame نسبت به خود Frame هست نه فرم شما

برای حل این مشکل شما باید مقتصاد شیئ مورد نظر رو با مقتصاد Container که در اینجا همون Frame هست جمع بزنی مثلا

Dim Left, Top As Integer
Left = Frame.Left + Text1.Left
Top = Frame.Top + Text1.Top

ولی در کل من دارم رو این فرمی که شما گزاشتی کار میکنم
باید یک سری تغییرات روش بدم

Mr'Jamshidy
چهارشنبه 25 آبان 1390, 10:44 صبح
اینم سورس شما

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

hosein3000
چهارشنبه 25 آبان 1390, 12:55 عصر
اقا دستت درد نکنه
خیلی خوب شده
و برای اینکه تو تمام فرم ها بتونم مثل همین فرم چاپ کنم باید اسم اشیا رو کلا عوض کنم؟؟ این یکم سخت میشه
یه سوال دیگه به نظر شما برای حفظ اطلاعات از متغییر ها استفاده نکنم؟یعنی همین مخفی کردن فرم کافیه؟ اگه از دیتابیس استفاده کنم چطور؟ مثلا برای کل پروژه ام یه دیتابیس بذارم .فقط نمی خوام از ado و اینجور چیزا بذارم چون اونوقت باید کامپوننت های مربوط به اونم به برنامه اضافه کنم که حجم برنامه میره بالا و کلا تو بعضی از سیستم ها هم بدرستی کار نمیکنه
با این اوصاف به نظر شما چطور از دیتابیس تو این فرمم استفاده کنم؟

Mr'Jamshidy
چهارشنبه 25 آبان 1390, 13:24 عصر
اقا دستت درد نکنه
خیلی خوب شده
یه سوال دیگه به نظر شما برای حفظ اطلاعات از متغییر ها استفاده نکنم؟یعنی همین مخفی کردن فرم کافیه؟ اگه از دیتابیس استفاده کنم چطور؟ مثلا برای کل پروژه ام یه دیتابیس بذارم .فقط نمی خوام از ado و اینجور چیزا بذارم چون اونوقت باید کامپوننت های مربوط به اونم به برنامه اضافه کنم که حجم برنامه میره بالا و کلا تو بعضی از سیستم ها هم بدرستی کار نمیکنه
با این اوصاف به نظر شما چطور از دیتابیس تو این فرمم استفاده کنم

خواهش میکنم قابلی نداشت

منظور شما از حفظ اطلاعات چیه؟ میخواید در زمان ران تایم (Run-Time) اطلاعاتی که وارد میکنید تو تکست باکس ها بمونه و با بستن و باز کردن مجدد از بین بره؟ همین کاری که گفتم بهترین کاره
اما نه اگر میخواید اطلاعتی که وارد میکنید با بستن و باز کردن هم همچنان بمونه بهتره که از فایل ها استفاده کنید

چون دیتا بیس ها برای جمع آوری اطلاعات زیاد بکار میرن که 40-50 تا تکست باکس

در مورد فایل ها هم راحت ترین روش استفاده از توابه برای فایل های INI هستن که کد اون رو اگر بلدید که هیچ اگر نه از پایین بردارید

کد زیر رو داخل یک ماژول بنویسید و برای استفاده از این کد از توضیحات پایین همین پست استفاده کنید

Option Explicit

'declares for ini controlling
Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

'// INI CONTROLLING PROCEDURES

'reads ini string
Public Function ReadIni(Filename As String, Section As String, Key As String) As String
Dim RetVal As String * 255, v As Long
v = GetPrivateProfileString(Section, Key, "", RetVal, 255, Filename)
ReadIni = Trim(Left(RetVal, v))
End Function

'writes ini
Public Sub WriteIni(Filename As String, Section As String, Key As String, Value As String)
WritePrivateProfileString Section, Key, Value, Filename
End Sub

فایل های آی.ان.آی ساختاری به شکل زیر دارن


[Section Name]
Key Name=Value
[Section Name]
Key Name=Value
[Section Name]
Key Name=Value

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

در جایی که نیاز دارید توابع رو به این شکل استفاده کنید:

نوشتن در فایل:
WriteIni "C:\Test.ini", "Settings", "FormTop", Me.Top

اگر این تابع رو به این شکل فراخوانی کنید و فرض میکنیم Form.Top ما 154 هست در داخل درایو C فایلی بنام Test.ini میسازه که محتویات اون به این شکل هستن


[Settings]
FormTop=154

اگر این تابع رو هزاران بار هم فراخوانی کنید به همین شکل گزینه ای به فایل مورد نظر اضافه نمیشه فقط مقدار FormTop تغییر میکنه (اگر فرم جا به جا بشه) اما اگر Section Name یا Key Name یا هر دو تغییر کنه گزینه جدید اضافه میشه
-----------
برای خوندن از فایل آی.ان.آی از این روش استفاده کنید


Dim Data as String
Data = ReadIni("C:\Test.ini", "Settings", "FormTop")

خوب دیگه اینم مشخصه چیکار میکنه اگر فایل مورد نظرمون همون فایل مثال بالا باشه مقدار 154 بصورت String در متغیر Data ذخیره میشه
---------------------------------------

این روش یک جورایی مثل Registry ویندوز عمل میکنه اما امکاناتش از Registry کمتره اما خیلی کار راه اندازه مخصوصا زمانی که به هر دلیلی نمیخواید از ADO و ... استفاده کنید
میتونید هم از هر روش دیگه ای استفاده کنید ولی بنظر من اسن ساده ترین روش هست کد نویسیش هم خیلی کمتره کاراییش هم خیلی بیشتره

hosein3000
چهارشنبه 25 آبان 1390, 14:10 عصر
مهندس جان خیلی خیلی ممنون
اما به اون یکی سوالم جواب ندادین با این روشی که برای چاپ برام معرفی کردین من مجبورم برای کلیه فرم هام اسم اشیا رو عوض کنم منظورم تکست باکس ها و لیبیل هاست
الان داشتم همین کاراو انجام می دادم اما فرم ها و تکست باکس ها خیلی زیاده و هم اینکه نتونستم انجام بدم
راهی نداره با همون اسم اشیای خودم بتونم از همین روش چاپ استفاده کنم؟؟
ممنون میشم اینم راهنماییم کنین

Mr'Jamshidy
چهارشنبه 25 آبان 1390, 15:39 عصر
مهندس جان خیلی خیلی ممنون
اما به اون یکی سوالم جواب ندادین با این روشی که برای چاپ برام معرفی کردین من مجبورم برای کلیه فرم هام اسم اشیا رو عوض کنم منظورم تکست باکس ها و لیبیل هاست
الان داشتم همین کاراو انجام می دادم اما فرم ها و تکست باکس ها خیلی زیاده و هم اینکه نتونستم انجام بدم
راهی نداره با همون اسم اشیای خودم بتونم از همین روش چاپ استفاده کنم؟؟
ممنون میشم اینم راهنماییم کنین

چرا نشه؟
اما اگر شما اسم اشیا رو عوض کنی و برای همه آرایه تعریف کنی با 3 خط میتونی صفحه Print Preview رو بطور کامل مقدار دهی کنی اما در غیر این صورت باید برای هر گزینه در صفحه Print Preview یک خط بنویسی

بنظر خودت هر کدوم راحت تره همون کار رو انجام بده

hosein3000
دوشنبه 30 آبان 1390, 16:47 عصر
مشکل چاپ من حل شد .با تشکر مجدد از اقای جمشیدی
یه سوال دیگه داشتم چطور می تونم کل این فرم رو تو یک فایل متنی با فرمت تکست ذخیره کنم ؟فقط نمی خوام از توابعی استفاده کنم که در موقع کامپایل کردن مجبور بشم فایل هایی رو به برنامه اضافه کنم تا در هر سیستم کار کنه؟؟