PDA

View Full Version : چاپ با چاپگرهای تحویلداری بانک (generic)



bashir_nashi
دوشنبه 16 بهمن 1385, 18:20 عصر
سلام.
فکر کنم سوالم یه کم سخت باشه ولی اگه ممکنه هر کس هر قدر اطلاعات داره همونا رو در اختیار من بزاره ! ممنون.
من بنا به ضرورت مجبورم برنامه ای بنویسم که چاپ اون توسط چاپگرهای تحویلداری در بانکها (Generic Text only) باشه.
می دونم که طریقه چاپ با این چاپگرها کاملا متفاوت است و تو msdn هم خیلی گشتم و generic class رو پیدا کردم که باید همون راه چاپ با این چاپگرها باشه ولی اصلا ازش سر در نیاوردم.
به هر حال از دوستان تقاضا دارم هر گونه تجربه ای دارند مرحمت کنند.

programmermp
دوشنبه 16 بهمن 1385, 19:13 عصر
سلام

مگه این چاپگر ها مثل چاپگر های عادی نصب نمی شن توی ویندوز

خوب اگه می شن خیلی عادی میشه انتخابشون کرد مثل پرینترهای دیگه و اطلاعات رو

براشون فرستاد دیگه

اصلا چه فرقی می کنه با چاپگرهای دیگه

linux
سه شنبه 17 بهمن 1385, 00:24 صبح
سلام.
فکر کنم سوالم یه کم سخت باشه ولی اگه ممکنه هر کس هر قدر اطلاعات داره همونا رو در اختیار من بزاره ! ممنون.
من بنا به ضرورت مجبورم برنامه ای بنویسم که چاپ اون توسط چاپگرهای تحویلداری در بانکها (Generic Text only) باشه.
می دونم که طریقه چاپ با این چاپگرها کاملا متفاوت است و تو msdn هم خیلی گشتم و generic class رو پیدا کردم که باید همون راه چاپ با این چاپگرها باشه ولی اصلا ازش سر در نیاوردم.
به هر حال از دوستان تقاضا دارم هر گونه تجربه ای دارند مرحمت کنند.
چیزی که پیدا کردی متنش یا لینکش را اینجا بگذارید.

bashir_nashi
سه شنبه 17 بهمن 1385, 18:21 عصر
سلام.
در این که این چاپگرها یا در واقع دستگاههای پرفراژ با چاپگرهای معمولی فرق میکنند شکی نیست . چون این چاپگر روی کامپیوتر بانک نصب است و با نرم افزار بانک کار میکند ولی روی همین کامپیوتر مثلا در word یه کلمه رو تایپ و دستور چاپ توسط این چاپگر را میدهیم . ولی انگار نه انگار . حتی در properties چاپگر های نصب شده روی یک کامپیوتر کلید print test page هست که در مورد این چاپگرها کاری انجام نمی دهد .
این رو هم بگم که این چاپگرها به پورت COM متصل میشوند.
من تو msdn کلاس generic رو پیدا کردم که نمی دونم اصلا به Generic Text Only Printer مربوط است یا نه (از بس که اینگلیسیم خوبه!!!)

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbalr/html/89f771d9-ecbb-4737-88b8-116b63c6cf4d.htm

اینم چند خط اولش اگه اینجوری نشد پیداش کرد:


A generic type is a single programming element that adapts to perform the same functionality for a variety of data types. When you define a generic class or procedure, you do not have to define a separate version for each data type for which you might want to perform that functionality.

An analogy is a screwdriver set with removable heads. You inspect the screw you need to turn and select the correct head for that screw (slotted, crossed, starred). Once you insert the correct head in the screwdriver handle, you perform the exact same function with the screwdriver, namely turning the screw.

Screwdriver set as a generic tool



When you define a generic type, you parameterize it with one or more data types. This allows the using code to tailor the data types to its requirements. Your code can declare several different programming elements from the generic element, each one acting on a different set of data types. But the declared elements all perform the identical logic, no matter what data types they are using.
For example, you might want to create and use a queue class that operates on a specific data type such as String. You can declare such a class from System.Collections.Generic.Queue, as the following example shows.


بازم ممنون از توجهتون.

iman_s52
سه شنبه 17 بهمن 1385, 19:16 عصر
تا جایی که من دیدم اکثر دستگاههای پرفراژ Driver دارند و نصب میشه و مثل بقیه چاپگر ها کار میکنن.
مثلا Beiyang 8 cm .
مدل چاپگرتون چیه ؟

bashir_nashi
سه شنبه 17 بهمن 1385, 19:54 عصر
اسم چاپگر : olivity مدلشو باید فردا برم ببینم تو ذهنم نیست.
ولی میدونم که درایور نداره .

iman_s52
سه شنبه 17 بهمن 1385, 20:00 عصر
چه مدلی Olivetti اینجور که من اطلاع دارم جدیدا درایور براشون نوشتن و هیچ اطلاع دیگه ای ندارم.
حالا اصلا چیکار میخوای بکنی؟
چون اینا معمولا باید مستقیم روی پورت COM بفرستی.
نیازی به درایور هم ندارن.

linux
سه شنبه 17 بهمن 1385, 21:18 عصر
سلام.
در این که این چاپگرها یا در واقع دستگاههای پرفراژ با چاپگرهای معمولی فرق میکنند شکی نیست . چون این چاپگر روی کامپیوتر بانک نصب است و با نرم افزار بانک کار میکند ولی روی همین کامپیوتر مثلا در word یه کلمه رو تایپ و دستور چاپ توسط این چاپگر را میدهیم . ولی انگار نه انگار . حتی در properties چاپگر های نصب شده روی یک کامپیوتر کلید print test page هست که در مورد این چاپگرها کاری انجام نمی دهد .
این رو هم بگم که این چاپگرها به پورت COM متصل میشوند.
من تو msdn کلاس generic رو پیدا کردم که نمی دونم اصلا به Generic Text Only Printer مربوط است یا نه (از بس که اینگلیسیم خوبه!!!)

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbalr/html/89f771d9-ecbb-4737-88b8-116b63c6cf4d.htm

اینم چند خط اولش اگه اینجوری نشد پیداش کرد:


A generic type is a single programming element that adapts to perform the same functionality for a variety of data types. When you define a generic class or procedure, you do not have to define a separate version for each data type for which you might want to perform that functionality.

An analogy is a screwdriver set with removable heads. You inspect the screw you need to turn and select the correct head for that screw (slotted, crossed, starred). Once you insert the correct head in the screwdriver handle, you perform the exact same function with the screwdriver, namely turning the screw.

Screwdriver set as a generic tool



When you define a generic type, you parameterize it with one or more data types. This allows the using code to tailor the data types to its requirements. Your code can declare several different programming elements from the generic element, each one acting on a different set of data types. But the declared elements all perform the identical logic, no matter what data types they are using.
For example, you might want to create and use a queue class that operates on a specific data type such as String. You can declare such a class from System.Collections.Generic.Queue, as the following example shows.


بازم ممنون از توجهتون.
این جنریک اصلا ربطی به چیزی که شما می خواهی نداره.

bashir_nashi
سه شنبه 17 بهمن 1385, 21:30 عصر
این جنریک اصلا ربطی به چیزی که شما می خواهی نداره.

جدا !!! . فکر کنم بزرگترین کمک رو شما به من کردید که از شر سروکله زدن با این کلاس راحتم کردین.




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

من میخوام بتونم باهاش یه چیزی چاپ کنم مثلا یه کلمه یا عدد. چون چاپ برنامه من اجبارا باید با این چاپگر کار کنه.
در مورد ارسال به پورت COM هم اگه می شه بیشت توضیح بدین .

iman_s52
چهارشنبه 18 بهمن 1385, 08:24 صبح
این نوع چاپگر ها EPROM شون طوری برنامه ریزی شده که فونتها بصورت سخت افزاری روشون تعریف شده . و همشون عمدتا فارسی رو پشتیبانی میکنن.
حالا شما بایستی Command های لازم برای چاپ اطلاعات مثل فرمان Cut رو پیدا کنین و بفرستین روی پورتی که چاپگر متصل شده . به نوع کار میگن چاپ Dos
البته خاصیت دیگه که دارن اکثرا درایور ویندوزی هم دارن که مثل بقیه چاپگر ها نصب میشن و شما می توننین کاراتونو به ویندوز بسپارین.

MM_Mofidi
چهارشنبه 18 بهمن 1385, 10:38 صبح
یه چندتا لینکه شاید به دردت بخوره
احتمالا درایور ویندوزی داره
http://support.microsoft.com/kb/81626
http://support.microsoft.com/kb/81626

linux
چهارشنبه 18 بهمن 1385, 12:19 عصر
جدا !!! . فکر کنم بزرگترین کمک رو شما به من کردید که از شر سروکله زدن با این کلاس راحتم کردین.



من میخوام بتونم باهاش یه چیزی چاپ کنم مثلا یه کلمه یا عدد. چون چاپ برنامه من اجبارا باید با این چاپگر کار کنه.
در مورد ارسال به پورت COM هم اگه می شه بیشت توضیح بدین .
این کلاس جنریک در 2005 اضافه شده و یک چیزی شبیه به آرایه ها را در اختیار می گذاره.

bashir_nashi
چهارشنبه 18 بهمن 1385, 19:38 عصر
این نوع چاپگر ها EPROM شون طوری برنامه ریزی شده که فونتها بصورت سخت افزاری روشون تعریف شده . و همشون عمدتا فارسی رو پشتیبانی میکنن.
حالا شما بایستی Command های لازم برای چاپ اطلاعات مثل فرمان Cut رو پیدا کنین و بفرستین روی پورتی که چاپگر متصل شده . به نوع کار میگن چاپ Dos
البته خاصیت دیگه که دارن اکثرا درایور ویندوزی هم دارن که مثل بقیه چاپگر ها نصب میشن و شما می توننین کاراتونو به ویندوز بسپارین.

من حتما فردا چاپگر بانک رو میارم خونه و سعی میکنم این کار رو بکنم ولی اگه ممکنه یه کم واضح تر بگید . چه دستوری برای ارسال اطلاعات به پورتهای سریال استفاده میشه ؟
ممنون.

ali_kolahdoozan
چهارشنبه 18 بهمن 1385, 22:17 عصر
من توی داس همچین چیزی نوشتم خیلی وقت پیشها . اما اون برای خودش یک پرینتر بود و درایور داشت . نیازی به هیچ کاری اضافی نداشت

netspc
چهارشنبه 18 بهمن 1385, 22:40 عصر
سلام اون کلاس generic که شما میبینید برای کار برروی چاپگرهایی هست که مدل درایور اونها را نمیدونید و اینکه یک کلاس کلی برای کار با چاپگرهای استاندار هست .
برای کار با پرفراژها اولین کاری که شما باید بکنی اینکه لیست فونتهای داخل دستگاه رو بدست بیاری
دومین کار اینه که شما تمام 255 کاراکتر ascii رو باهاش چاپ کن (بهتر برای اینکار از داس استفاده کنی چون همونطور که دوستان گفتند اینگونه چاپگرها با پورت com وصل میشوند راحت تر میتونی تحت داس اینکار رو بکنی)
درضمن برنامه هایی که معمولاً توی بانک ها هست جایی برای تنظیم چاپگر باید داشته باشه از اونجا فکر کنم بتونی نوع چاپگر رو پیدا کنی
یادم هست یه بانک اطلاعاتی که دوستان با اون کار میکردند به نام dataease قابلیت کار کردن با این نوع چاپگرها رو داشت توی خود برنامه از طریق تنظیمات داخلی برنامه میشد به این نوع چاپگرها وصل شد.

bashir_nashi
پنج شنبه 19 بهمن 1385, 23:27 عصر
من الارغم تلاشی که کردم نتونستم حتی صدای چاپگر رو دربیارم چه برسد به چاپ دادن ...
درایورش رو هم تو اینترنت گیر آوردم ولی هیچ کمکی نکرد.



دومین کار اینه که شما تمام 255 کاراکتر ascii رو باهاش چاپ کن (بهتر برای اینکار از داس استفاده کنی چون همونطور که دوستان گفتند اینگونه چاپگرها با پورت com وصل میشوند راحت تر میتونی تحت داس اینکار رو بکنی)

ممنون ولی من این کارو بلد نیستم.چه جوری از توی داس کارکتر ها رو چاپ بدم ؟
-------------------------
روی ارسال دیتا به پورت های سریال هم خیلی کار کردم . msdn میگه کد زیر رو بکار ببرید:


WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)

البته قبلش باید ارتباط برقرار بشه و تنظیماتی انجام بگیره که چون موقعی که میخوام اجرا کنم قبل از رسیدن به این دستور کار یه جایی می لنگه اصلا اجازه اجرا به writefile داده نمی شه.
کد کاملش اینه :


Option Strict On

Class CommException
Inherits ApplicationException
Sub New(ByVal Reason As String)
MyBase.New(Reason)
End Sub
End Class

Module Module1

Public Structure DCB
Public DCBlength As Int32
Public BaudRate As Int32
Public fBitFields As Int32
Public wReserved As Int16
Public XonLim As Int16
Public XoffLim As Int16
Public ByteSize As Byte
Public Parity As Byte
Public StopBits As Byte
Public XonChar As Byte
Public XoffChar As Byte
Public ErrorChar As Byte
Public EofChar As Byte
Public EvtChar As Byte
Public wReserved1 As Int16 'Reserved; Do Not Use
End Structure

Public Structure COMMTIMEOUTS
Public ReadIntervalTimeout As Int32
Public ReadTotalTimeoutMultiplier As Int32
Public ReadTotalTimeoutConstant As Int32
Public WriteTotalTimeoutMultiplier As Int32
Public WriteTotalTimeoutConstant As Int32
End Structure

Public Const GENERIC_READ As Int32 = &H80000000
Public Const GENERIC_WRITE As Int32 = &H40000000
Public Const OPEN_EXISTING As Int32 = 3
Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
Public Const NOPARITY As Int32 = 0
Public Const ONESTOPBIT As Int32 = 0

Public Declare Auto Function CreateFile Lib "kernel32.dll" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
ByVal hTemplateFile As IntPtr) As IntPtr

Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean

Sub Main()

Dim hSerialPort As IntPtr
Dim Success As Boolean
Dim MyDCB As DCB
Dim MyCommTimeouts As COMMTIMEOUTS
Dim BytesWritten, BytesRead As Int32
Dim Buffer() As Byte

' Declare variables to use for encoding.
Dim oEncoder As New System.Text.ASCIIEncoding
Dim oEnc As System.Text.Encoding = Text.Encoding.GetEncoding(1252)

' Convert String to Byte().
Buffer = oEnc.GetBytes("Test")

Try
' Serial port.
Console.WriteLine("Accessing the COM1 serial port")
' Obtain a handle to the COM1 serial port.
hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
' Verify that the obtained handle is valid.
If hSerialPort.ToInt32 = -1 Then
Throw New CommException("Unable to obtain a handle to the COM1 port")
End If

Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)

' Retrieve the current control settings.
Success = GetCommState(hSerialPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to retrieve the current control settings")
End If
' Modify the properties of MyDCB as appropriate.
' WARNING: Make sure to modify the properties in accordance with their supported values.
MyDCB.BaudRate = 9600
MyDCB.ByteSize = 8
MyDCB.Parity = NOPARITY
MyDCB.StopBits = ONESTOPBIT
' Reconfigure COM1 based on the properties of MyDCB.

Success = SetCommState(hSerialPort, MyDCB)
If Success = False Then
Throw New CommException("Unable to reconfigure COM1")
End If
' Retrieve the current time-out settings.
Success = GetCommTimeouts(hSerialPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to retrieve current time-out settings")
End If
' Modify the properties of MyCommTimeouts as appropriate.
' WARNING: Make sure to modify the properties in accordance with their supported values.
MyCommTimeouts.ReadIntervalTimeout = 0
MyCommTimeouts.ReadTotalTimeoutConstant = 0
MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
MyCommTimeouts.WriteTotalTimeoutConstant = 0
MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
' Reconfigure the time-out settings, based on the properties of MyCommTimeouts.
Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
If Success = False Then
Throw New CommException("Unable to reconfigure the time-out settings")
End If
' Write data to COM1.
MsgBox("fghfgh")

Console.WriteLine("Writing the following data to COM1: Test")
Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
If Success = False Then
Throw New CommException("Unable to write to COM1")
End If
' Read data from COM1.
Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero)
If Success = False Then
Throw New CommException("Unable to read from COM1")
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
' Release the handle to COM1.
Success = CloseHandle(hSerialPort)
If Success = False Then
Console.WriteLine("Unable to release handle to COM1")
End If
End Try

Console.WriteLine("Press ENTER to quit")
Console.ReadLine()
End Sub

End Module



اگه کسی بتونه کمک کنه خیلی ممنون می شم.

netspc
جمعه 20 بهمن 1385, 05:23 صبح
آسون ترین راه توی داس برای چاپ ،زدن دکمه print screen هست :لبخند:

Behrouz_Rad
جمعه 20 بهمن 1385, 09:48 صبح
در چنین مواقعی، عقل سلیم حکم می کنه که سوالت رو در فوروم های مایکروسافت مطرح کنی.

forexwork
سه شنبه 21 خرداد 1387, 16:32 عصر
سلام

برای پرفراژ قبض رسید فروشگاهی احتیاج به چاپ با پرینتر پرفراژی(Pass Book)دارم
مدل پرینتر مهم نیست (چون هنوز سفارش ندادند )آیا کسی نمونه کدی داره؟

با تشکر