PDA

View Full Version : پیدا کردن تعداد برگهای رد شده از چاپگر



(سیدشریفی)
سه شنبه 19 اردیبهشت 1385, 08:10 صبح
با سلام

من میخواستم تعداد برگهایی را که از چاپگر رد میشوند را بدست آورم مثلا اگر از برنامه 100 برگ به چاپگر ارسال کرده باشیم میخواستم بدانم مثلا چه موقع 50 برگ آن چاپ شده و از چاپگر رد شده است .

دوستان اگر روشی دی ال الی یا کامپوننتی دارند لطفا راهنمایی کنند .

با تشکر

(سیدشریفی)
شنبه 23 اردیبهشت 1385, 08:40 صبح
از دوستان کسی در این رابطه کار نکرده است ؟

(سیدشریفی)
دوشنبه 25 اردیبهشت 1385, 08:17 صبح
سلام دوستان
من این را نوشتم تا سوال من بیاد بالا چون از تعداد مشاهدات معلوم است که کسی سوال منو نخونده لطفا درصورت امکان راهنمایی فرمائید .

با تشکر

Hossein Bazyan
دوشنبه 25 اردیبهشت 1385, 10:05 صبح
سوالت ناقصه !
از چه روشی برای پرینت گرفتن استفاده میکنی ؟
از Crystall Report یا از DataReport یا از شی Printer و یا ؟

در Dos من یادمه حالا با هر زبانی که کار میکردی (++C , Fox , Basic و غیره ) کد 12 کدی بود که به چاپگر فرمان خط بعد را میداد و ما میتوانستیم با همان شمارنده صفحات رد شده را بشماریم
حال شما روشت چاپت رابگو شاید فرجی شد و جواب را یکی از دوستان داد.

(سیدشریفی)
سه شنبه 26 اردیبهشت 1385, 16:48 عصر
جناب Hossein Bazyan (http://www.barnamenevis.org/forum/member.php?u=4029) تشکر از جوابی که دادید
مثل اینکه سوال منو متوجه نشده اید
یک مثال میزنم :
فرض کنید در برنامه از هر روشی که استفاده میکنیم به تعداد 100 برگ به چاپگر ارسال نموده ایم حال ما میدانیم که تعداد برگهای ارسالی به چاپگر چند برگ است ولی نمیدانیم در چه موقعی چند برگ آن چاپ شده است من هم میخواهم بدانم که این 100 برگی که به چاپگر فرستاده ام مثلا بعد از 20 ثانیه چند برگ آن چاپ شده است .
دیگر واضح تر از این نمیتوانم توضیح دهم ولی مثالی میزنم :
من قبلا یک پرینتر کنن داشتم که نرم افزار این پرینتر دارای جعبه ابزاری بود که موقع ارسال چاپها به این پرینتر در این جعبه ابزار نشان داده میشد که تا الآن چند برگ چاپ شده و چند برگ باقی مانده است .

امیدوارم توضیحاتم کافی بوده باشد و دوستان بتوانند مرا راهنمایی کنند .

mehdi_zangian
سه شنبه 26 اردیبهشت 1385, 20:12 عصر
می تونی همونطور که دوستمون گفت یک کنترل برای پورت پرینتر بزاری و هر وقت که bit مربوط یه صفحه جدید(به پورت پرینتر ) فرستاده شد شمارنده را اضافه کنی .
البته فکر می کنم تابع API برای این کار وجود داشته باشه

Hossein Bazyan
سه شنبه 26 اردیبهشت 1385, 21:49 عصر
سید شریفی جان
من متوجه منظور شما شدم من هم یک نرم افزار مال پرینتر Lexmark دارم همینکار را میکنه اما شما متوجه منظور من نشدی !

ببین برای گرفتن پرینت از برنامه حتما از یک برنامه استفاده میکنی مثلا با کریستال ریپورت دستور به پرینتر میفرستی یا در داخل خود برنامه ( VB یا Vc یا ++C یا Foxpro یا غیره ) به پرینتر دستور چاپ میدی .
منظور من اینه که برای چاپ از کدام برنام های فوق استفاده میکنی .
اگه هیچکدام از اینها نیست اصل کارت را بگو تا بتوانیم بیشتر راهنمایی کنیم .

(سیدشریفی)
چهارشنبه 27 اردیبهشت 1385, 08:02 صبح
دوست عزیز من از دستور Printer استفاده میکنم .
بطور مثال :

Printer.Font.Bold = False
Printer.Font.Italic = False
Printer.Font.Name = "Tahoma"
Printer.Font.Strikethrough = False
Printer.Font.Underline = False
Printer.Font.Size = 24
Printer.CurrentX = 800
Printer.CurrentY = 1500
Printer.Print My_Text
Printer.EndDoc

(سیدشریفی)
یک شنبه 31 اردیبهشت 1385, 08:10 صبح
جناب mehdi_zangian (http://www.barnamenevis.org/forum/member.php?u=14359) راه پیشنهادی شما خوب است ولی مشکل چون در پرینترهای مختلف از پورتLPT یا USB استفاده میشود که کار را مشکل میکند .
جناب Hossein Bazyan (http://www.barnamenevis.org/forum/member.php?u=4029) منتظر جوابتان هستم .

(سیدشریفی)
چهارشنبه 03 خرداد 1385, 08:36 صبح
سلام دوستان
فکر کنم برای این کار راه حلی وجود ندارد .
پس این روش را بی خیال شده و دنبال راه دیگری میروم .

MM_Mofidi
چهارشنبه 10 خرداد 1385, 14:42 عصر
یک Hook برای سرویس spoolerویندوز بزار یا با سرویس خودت جایگزینش کن.
قدرت مانور زیادی بهت میده

(سیدشریفی)
شنبه 13 خرداد 1385, 09:18 صبح
با سلام جناب MM_Mofidi (http://www.barnamenevis.org/forum/member.php?u=5582)
من با Hook کار نکردم اگر میشود ساده تر توضیح دهید
با تشکر

MM_Mofidi
شنبه 13 خرداد 1385, 21:58 عصر
کار خیلی سختیه من پیشنهاد میکنم اگر بعنوان یک برنامه تجاری قصد عرضا آن را نداری از برنامه ها مشابه برای اینکار استفاده کنی. بعضا با استفاده از swich ها اطلاعات خوبی هم در اختیار میزارن

riyahiyan
شنبه 13 خرداد 1385, 22:37 عصر
این hook چیه و چطوری شماره برگه رو پیدا میکنه.

(سیدشریفی)
یک شنبه 14 خرداد 1385, 09:00 صبح
راستش برنامم تجاریه و باید کاری کنم که در بیشتر سیستم ها جواب دهد وگرنه باید فکر دیگری بکنم
باز هم از همکاریتون کمال تشکر را دارم

Hossein Bazyan
دوشنبه 15 خرداد 1385, 15:27 عصر
من هر چه به مخم فشار میارم راهی به نظرم نمیرسه اما .....
ببین همچنانکه گفتم در داس ما برای این کار راه داریم ( من مدتها از آن استفاده کرده ام ) کد اسکی 12 به چاپگر میفهماند که باید صفحه را رد کند . پیشنهاد من این است که ( هر جند نمیدانم چقدر معقول است ) یک فایل چند صفحه ای با برنامه ای که داری به جای چاپ روی کاغذ تو فایل بفرست و فایل را با یک ویرایشگر متنی نگاه کن ببین در پایان صفحه و شروع صفحه بعد چه کد یا کاراکتری را میفرستد شاید به منظورت برسی .
من الان اصلا وقت ندارم ولی در اولین فرصت حتما نگاه میکنم چون سوال جالبیه
نتیجه را به ما هم بگو

MM_Mofidi
دوشنبه 15 خرداد 1385, 17:55 عصر
ئوستمون آقای Hossein Bazyan راه حلی که ارائه دادن به نظر معقول میاد منتها بشرطی که شما بجای spooler ویندوز پیامهای ارسالی را دریافت کنی و با یک پیمایش شمارش تعداد صفحه بکنی بعد برای spooler ویندوز ارسال کنی.
ان شاء الله جواب میده ;)

o0_Amin_0o
دوشنبه 15 خرداد 1385, 18:17 عصر
تابع EnumJobs تعدا داکیومنهای در حال چاپ که هنوز در صف چاپ قرار دارند را میشموره.این تابع تامی اطلاعات کارهای آماده چاپ را به ترتیب و به صورت خلاصه یا با جزئیات و مشروح بر میگردونه.
توجه کنید تابع به جای قرار دادن اطلاعات داخل یک استراکچر اونا رو داخل یک آرایه قرار میده.سپس باید با این آرایه به یک یا چند استراکچر منتقل گردد.
برای تصمیم در مورد فضای مورد نیاز جهت دریافت اطلاعات کار چاپگر نخست تابع را با مقدار صفر در cbbuf صدا میکنید.آنگاه این تابع مقدار pcbneeded را بر میگرداند که در آن سایز مورد نیاز بر حسب بایت جهت نگهداری اطلاعات در آرایه قرار دارد.

در صورتی که این تابع کارتون رو راه مینداره بگید تا پارمترهای این تابع رو به همراه چند نکته
جهت استفاده از تابع رو خدمتتون عرض کنم.
اینم یه سورس کد نمونه که امیدوارم به دردتون بخوره!


Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Any, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Private Sub Form_Load()
Dim hPrinter As Long, lNeeded As Long, lReturned As Long
Dim lJobCount As Long
OpenPrinter Printer.DeviceName, hPrinter, ByVal 0&
EnumJobs hPrinter, 0, 99, 1, ByVal 0&, 0, lNeeded, lReturned
If lNeeded > 0 Then
ReDim byteJobsBuffer(lNeeded - 1) As Byte
EnumJobs hPrinter, 0, 99, 1, byteJobsBuffer(0), lNeeded, lNeeded, lReturned
If lReturned > 0 Then
lJobCount = lReturned
Else
lJobCount = 0
End If
Else
lJobCount = 0
End If
ClosePrinter hPrinter
MsgBox "Jobs in printer queue: " + CStr(lJobCount), vbInformation
End Sub

MM_Mofidi
دوشنبه 15 خرداد 1385, 19:13 عصر
از AddMonitor هم میتونی استفاده کنی

(سیدشریفی)
سه شنبه 16 خرداد 1385, 09:41 صبح
از کمک دوستان و جوابهایی که میدهید واقعا ممنون
من به مشکل دیگه ای هم برخورد کرده ام و آن اینکه در بعضی از چاپگرها که حافظه کافی هم دارند تعداد قابل ملاحضه ای صفحه چاپ از جعبه پرینتر به خود دستگاه چاپگر منتقل میشود که اگر حتی کامپیوتر هم خاموش شود باز هم کار چاپ ادامه پیدا میکند پس آن تعداد که به حافظه خود چاپگر منتقل شده در حقیقت از نظر ما از پرینتر رد شده است و ما را به اشتباه خواهد انداخت (این تعداد صفحات که به حافظه چاپگر منتقل میشود تقریبا 40 صفحه میباشد)
مثال دیگری هم اینکه اگر مثلا یک صفحه به چاپگر ارسال شود و تعداد (Number Of Copies) هم مثلا 10 باشد باز هم ما نمیتوانیم بفهمیم که در حال حاضر چند برگ چاپ شده است .

MM_Mofidi
سه شنبه 16 خرداد 1385, 18:26 عصر
از کمک دوستان و جوابهایی که میدهید واقعا ممنون
من به مشکل دیگه ای هم برخورد کرده ام و آن اینکه در بعضی از چاپگرها که حافظه کافی هم دارند تعداد قابل ملاحضه ای صفحه چاپ از جعبه پرینتر به خود دستگاه چاپگر منتقل میشود که اگر حتی کامپیوتر هم خاموش شود باز هم کار چاپ ادامه پیدا میکند پس آن تعداد که به حافظه خود چاپگر منتقل شده در حقیقت از نظر ما از پرینتر رد شده است و ما را به اشتباه خواهد انداخت (این تعداد صفحات که به حافظه چاپگر منتقل میشود تقریبا 40 صفحه میباشد)
مثال دیگری هم اینکه اگر مثلا یک صفحه به چاپگر ارسال شود و تعداد (Number Of Copies) هم مثلا 10 باشد باز هم ما نمیتوانیم بفهمیم که در حال حاضر چند برگ چاپ شده است .
خیر اینگونه نیست.
ویندوز تا بازگشت جواب تایید چاپ از پرینتر منتظر میمونه در صورت عدم دریافت تایید print error میده و فقط در صورت دریافت تایید چاپ از چاپگر به چاپ ادامه داده یا اتمام موفقیت آمیز آن را اعلام میکند.

(سیدشریفی)
چهارشنبه 17 خرداد 1385, 08:54 صبح
این کار در صورتی اتفاق میافته که هنوز در جعبه پرینتر کنار ساعت ویندوز صفحه برای چاپ به پرینتر ارسال نشده باشد و در صف نوبت باشد ولی اگر صفحه های مورد نظر به حافظه خود پرینتر ارسال شود دیگر ویندوز هیچ کنترلی در این باره نخواهد داشت .
برای مثال اگر مثلا 20 برگ به حافظه پرینتر ارسال شده باشد دیگر شما نمیتوانید این 20 برگ را از ویندوز کنسل کنید و باید از خود پرینتر عملیات را متوقف کنید و یک دلیل دیگر برای این کار که قبلا هم گفتم اگر حتی کامپیوتر را خاموش کنید پرینتر به کار خود ادامه خواهد داد و این کار تا چاپ آخرین برگ ادامه میابد .