PDA

View Full Version : آموزش: کنترل پرینتر با سی شارپ



sohil_ww
چهارشنبه 06 فروردین 1393, 15:19 عصر
با سلام به همه ی دوستان عزیزم

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

با اجازه اساتید گلم

اول از همه برای کار با کلاس های مورد نیاز در این آموزش باید system.printing را به رفرنس های پروژه ی خود اضافه کنیماول از همه برای کار با کلاس های مورد نیاز در این آموزش باید system.printing را به رفرنس های پروژه ی خود اضافه کنیم

http://uplod.ir/6i3zva1lq08g/refrence.jpg.htm

متاستفانه نتونستم سایتی برای آپلود کردن عکس پیدا کنم نتم قاطی کرد

خوب ادامه آموزشمون

بعد از اضافه کردن این رفرنس حال باید namespace را به پروژه خود اضافه کنیم
using System.Printing;
در این مرحله قادر به استفاده از کلاس های موجود در printing هستیم

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

LocalPrintServer local = new LocalPrintServer();


توجه :همانطور که می دانید برای حل یک مسائله برنامه نویسی شاید بیشتر از تعداد راههای که به ذهن من و شما می رسد راه باشد
برای مثال برای بدست آوردن نام پرینتر هم تا اونجایی که مطالعات من نشون داده بیشتر از 5 راه دیدم ولی من سعی کردم ساده ترینشون رو در این آموزش استفاده کنم پس شما می توانید از api یا کلاس System.drawing.print و .... برای بدست آوردن اسم پرینتر های موجود در سیستم استفاده کنید که اگه بتوانم این آموزش ها رو هم آماده می کنم)

خوب در مرحله چهارم هم ایجادی شی از کلاس printqueue هستش
PrintQueue obj = new PrintQueue(local, local.DefaultPrintQueue.Name);


همانطور که می بینید کلاس printqueue هشت overload از سازنده خود دارد(صد در صد کسی که داره از این اموزش استفاده می کنه با مفهوم overload و سازنده ها آشنا ست دیگه ) من برای استفاده از این کلاس به سازنده که از یک شی localprintserver ویک نوع رشته ای که اسم پرینترمونو در بر داره استفاده کردم
شی ما ایجاد شد و وقت استفاده از متد ها و فیلد ها یا بطور کلی کلیه موجودیت های کلاس (تو رو خدا گیر نده به سطح دسترسی اعضای کلاس)
برای بدست آوردن تعداد پرینت های موجود در صف پرینتر ماکروسافت گلمون یه خواص قرار داده که فقط به صورت خواندنی هم هست به نام numberofjobs که به صورت زیر استفاده می شه

MessageBox.Show(obj.NumberOfJobs.ToString());


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


دوستان گلم همونطوری که می بینید کلاس prinqueue بیشتر از 70 تا متد و خاصیت داره که من وقت توضیح دادن تک تکشونو ندارم (حالا بماند که خودمم نمی دونم بعضیاشون چیه ) ولی اگه وقت کنم سعی می کنم آموزش های برای بدست آورن تعداد برگه های موجود در پرینت و تقریبا هر چیری که به پرینتر معلوم میشه رو قرار بدم


و در آخر از اساتید که این این متن رو مطالعه کردن خواهشمندم اگه در جای از آموزش این بنده حقیر خطایی و اشتباهی هست حتما متذکر شوند
با سپاس کوچیک همه شما sohil_ww

hamid_73
چهارشنبه 06 فروردین 1393, 16:11 عصر
سلام داداش خیلی ممنون از آموزش خوبتون میشه روش فهمیدن تعداد صفحات پرینت گرفته شده توسط پرینتر رو هم آموزش بدین.
اگه منظورمو متوجه نشدین تواین تاپیک کامل توضیح دادم
لینک (http://barnamenevis.org/showthread.php?446118-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%BE%D8%B1%DB%8C%D9%86%D8%AA%D8%B1)

sohil_ww
چهارشنبه 06 فروردین 1393, 18:15 عصر
بدست آوردن تعداد صفحه های هر پرینت

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

PrintJobInfoCollection job=obj.GetPrintJobInfoCollection();


شی job دارای تمام کار های موجود در صف هستش و می خوایم به صورت تک تک تو صف بگردیم و اینجاس که میام از یه حلقه استفاده می کنیم (به قول همکارم ارباب حلقه ها ( به صورت زیر


foreach (PrintSystemJobInfo page in job)
{
MessageBox.Show(page.NumberOfPages.ToString());
}


همونطور که در کد بالا مشاهده می کنید شی page مربوط به یک کار موجود در صف پرینت هستش حالا میایم با خاصیت numberofpages تعداد صفحه هر پرینت بدست میاریم بازم متذکر می شم متد ها و خواص های این کلاس بسیار زیاد هستن و من وقت توضیح تک تکشونو ندارم و بهترین منبع msdn هست

موفق باشید سهیل

bitcob589
چهارشنبه 06 فروردین 1393, 18:32 عصر
آیا می توان سایز پرینت گرفتن صفحات را مشخص کنیم مثل-A4- A5...........

sohil_ww
چهارشنبه 06 فروردین 1393, 18:43 عصر
بله دوست عزیز این کارم می شه کرد و فقط چارش ساخت یه شی از کلاس printticket هستش و نسبت دادن این تیکت به صف پرینت ان شاالله تا شب یه آموزش واسه این آماده می کنم

این اشاره رو کردم که اگه کارتون واجب یه سرچ در مورد printtiket بزنید و شاید کارتون راه بیافته
موفق باشید

systam
پنج شنبه 07 فروردین 1393, 00:33 صبح
سلام داداش سهیل واقعا دستت درد نکنه اقایی کردی
پرینت زمانی که میاد داخل صف چاپ بعد از پرینتشده کلا از صف چاپ خارج میشه چطوری میشه فهمید که چند تا پرینت انجام شده


باید از یک تایمر برای انجام این کار استفاده کرد ثانیه به ثانیه صف چا رو چک کنه درسته

sohil_ww
پنج شنبه 07 فروردین 1393, 00:49 صبح
سلام داداش سهیل واقعا دستت درد نکنه اقایی کردی
پرینت زمانی که میاد داخل صف چاپ بعد از پرینتشده کلا از صف چاپ خارج میشه چطوری میشه فهمید که چند تا پرینت انجام شده


باید از یک تایمر برای انجام این کار استفاده کرد ثانیه به ثانیه صف چا رو چک کنه درسته

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

به نظر من بهتره که از ترد ها و بکگراند ورکر استفاده کنی

اگه مشکل بود بگو نمونه بزارم
موفق باشی

bitcob589
جمعه 08 فروردین 1393, 11:06 صبح
بله دوست عزیز این کارم می شه کرد و فقط چارش ساخت یه شی از کلاس printticket هستش و نسبت دادن این تیکت به صف پرینت ان شاالله تا شب یه آموزش واسه این آماده می کنم

این اشاره رو کردم که اگه کارتون واجب یه سرچ در مورد printtiket بزنید و شاید کارتون راه بیافته
موفق باشید
آموزش چه زمانی آماده می شود

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

به نظر من بهتره که از ترد ها و بکگراند ورکر استفاده کنی

اگه مشکل بود بگو نمونه بزارم
موفق باشی

اگر امکان دارد نمونه بگذارید

sohil_ww
جمعه 08 فروردین 1393, 16:45 عصر
تغییر اندازه صفحه پرینت
اول از همه میایم به رفرنس پروژمون reachFramework اضافه می کنیم خوب به فرض این که قبلا شی از کلاس printerqueue که تو آموزش های قبلی گفتم ساختید حالا میایم یه شی از کلاس printTicket می سازیم به صورت زیر
PrintTicket info=obj.DefaultPrintTicket;

حالا میایم سایز صفحات موجود تو صف پرینتمونو عوض می کنیم

info.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA5);

حالا میایم این info ساخته شده رو به obj نسبت می دیم به این صورت
obj.DefaultPrintTicket = info;

و به این صورت برگه تغییر سایز می ده البته یه روش بدون نیاز به print ticket هم هست که
obj.DefaultPrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA5)

ولی من printicket گفتم که شما بعد برای ارسال یه دستور به پرینتر راحت باشید
موفق باشید

systam
جمعه 08 فروردین 1393, 23:22 عصر
اینم دوست عزیزمون
sohil_ww (http://barnamenevis.org/member.php?274781-sohil_ww) زحمت کشیدن برای من فرستادن برای استفاده شما دوستان ضمیمه کردم

systam
سه شنبه 12 فروردین 1393, 17:04 عصر
سلامی دوباره
داداش سهیل یه مشکل دربرنامه برخوردم چرا زمانی تعداد صفحه هایی که در صف چاپ در message box نمایش دادی رو در یک
label یا textbox میریزم خطا میگیره
عکس خطا رو ضمیمه کردم


مشکل کار کجاست ممنون میشم راهنماییم کنید


یاعلی

sohil_ww
سه شنبه 12 فروردین 1393, 17:27 عصر
شما وقتی از داخل یک ترد داری به کنترل های ایجاد شده در یک ترد دیگه دسترسی داشته باشی باید از invoker استفاده کنی

این مثال کی زدم فقط یه مثال ساده البته به سی شارپه و شما داری به وی بی کد می زنی و باید کانورت کنی
void change_textbox() {
if(this.InvokeRequired)
{
this.Invoke(new MethodInvoker(change_textbox));
}
else
{
for(int i=0;i<500;i++)
{
textBox1.Text = i.ToString();
textBox1.UseSystemPasswordChar = true;
textBox1.PasswordChar = '*';
}

}
}
private void Form1_Load(object sender, EventArgs e)
{
Thread obj = new Thread(change_textbox);
obj.Start();
}
}

systam
چهارشنبه 13 فروردین 1393, 19:16 عصر
داداش سهیل ببخشید من اینقدر سوال میکنم
اگه پرینتر اشتراکی باشه(روی سرور) آدرس صف چاب باید چطوری تنظیمش کنیم
بعد این برنامه میاد کل صف چاپ رو در نظر میگیره اگه همزمان مثلا چند تا سیستم پرینت با هم بفرستند برنامه میاد کلشو محاسبه میکنه هر چی پرینت ارسال شده رو تعداد صفحات رونمایش میده
توی سایت جستجوکردم از دوستان گفته بود بهترین راه اینه که بیای ip سیستم رو هم به سرور ارسال کنی

یا علی

mandanim
چهارشنبه 22 اردیبهشت 1395, 11:00 صبح
سلام
من چجوری می تونم یه تعدادی پرینت رو کنسل کنم از داخل یک پرینت
مثلا 100 تا یکجا پرینت گرفتم
50 تا شو کنسل کنم
50 تا بمونه