Tek tek yazdırma ama nasıl?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Tek tek yazdırma ama nasıl?

Mesaj gönderen warder »

Selamlar,
QuickReport ile çalışıyorum.
Bir veritabanından kayıtları tek tek yazdırmak istiyorum.
Tek tekten kastettiğim şu:
kayıt gönderiliyor, yazma işlemi tamamlandıktan (yazıcıdan kağıt çıktıktan) sonra ikinci kayıt gönderilecek.
Böylece her kayıdın yazıldığından emin olabileceğim ve o kayıt üzerinde bazı editler yapıp sıradakine geçeceğim.
AfterPrint olayında boolean bir değişkeni kullanarak olmuyor. Sırayla tüm kayıtları yazıcı kuyruğuna gönderiyor. Ben yazıldığından emin olmalıyım. Malum elektrik kesilir ve yazılmaz ise kayıtlarda yazıldığına dair düzenlemeler yapıldığından yazıcı kuyruğu da silinirse bir daha o kayıtlara erişip yazdırmak mümkün olmayacak. Denize karışan dere hesabı. Karıştı iş bitti.
QuickReport topu sisteme atıp yazdırdım diye geliyor. bu çözüm değil.
Umarım anlatabilmişimdir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

İki yöntem önerebilirim,

1. Yöntem, Windows'un Printer Settinglerinde (Spool'u kaldırıp, Print Directly To The Printer) seçeneğine çevirmen, Böylelikle Windows Spool etmeden doğrudan printer'a yönlendirecektir. Ancak Printer alır kağıt sıkışır veya tam basım anında elektrik giderse ne olur denemek lazım.

2. Yöntem ise, Her gönderilen dokumana bir Unique ID verilip daha sonra printer API'lerinden yararlanılarak Spool'dan yazıcıya gidip gitmediğine dair sorgulama ile izlenip ona göre printe devam edilebilir.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Farklı bir yöntem olarak şöle bişi yapılabilirmi (why not?)

çıktısını alacağın kayıtlar için bir döngü kurarsın.
1.kayıt için quickrepi hazırlarsın. preview yerine print dersin.
daha sonra çıktı alındımı gibisinden kullanıcıya birsoru.
eğer çıktı tamamsa 1.kaydın çıktısı tamam diye işaret koyarsın.
bir sonraki kayda geç.
döngünün başına git.
işlem tamam.

bu yöntemin tek bir dezavantajı varç oda kullanıcıya her kayıt için soru sorması.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

ilginiz için teşekkürler.
QuickReport un derinlerinde bir yerlerde böyle bir şey varmıdır diye düşünmüştüm ama yok galiba.
Kullanıcıya tek tek onaylatmak binlerce kayıt için pek kullanışlı olmaz kanaatindeyim.
tekrar teşekkürler ama bu aşılması gereken ve her programcıya gerekli bir problemdi.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

hocam yazdırma işlemini hangi işletim sisteminde yapacaksınız?
nt , win98 ?
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

aşağıdaki vb kodu işinize yarayabilir.
eğer program win98 de çalışacaksa http://www.swissdelphicenter.ch/torry/s ... php?id=263 burda örnek delphi kodu var.

kolay gelsin.

Deleting,Error,Offline,Out of paper,Paused,Printed,Printing,Spooling

Kod: Tümünü seç

detect printer status "out of paper"
hello everyone, 

attached you can find coding from my project. from this coding, how do i detect the status "out of paper" and programmed it to call the number that i've choosen.hope someone can help me as this is very urgent to me. i really need a help. 

Option Explicit 

Const FORM_TITLE = "Printer Queue" 

Private strPrinterName As String 

Private Sub LoadPrintersList() 
Dim prn As Printer 
    
   cboPrinters.Clear 
    
   For Each prn In Printers 
     cboPrinters.AddItem prn.DeviceName 
   Next 
    
End Sub 

Private Sub ShowStatus(strText As String) 
  StatusBar.SimpleText = " " & strText 
End Sub 

Private Function CheckStatus(ByVal strStatus As String, intStatus As Long, _ 
                             intStatusFlag As Long, strStatusString As String) As String 
  If intStatus And intStatusFlag Then 
    If Trim$(strStatus) <> "" Then strStatus = strStatus & " - " 
    strStatus = strStatus & strStatusString 
  End If 
  CheckStatus = strStatus 
End Function 

Private Sub RefreshPrinterQueue() 
  Dim hPrinter As Long 
  Dim lngJobsFirstJob As Long, lngJobsEnumJob As Long, lngJobsLevel As Long 
  Dim lngJobsNeeded As Long, lngJobsReturned As Long 
  Dim byteJobsBuffer() As Byte, udtJobInfo1() As JOB_INFO_1 
  Dim lngJobsCount As Long 
  Dim lngResult As Long 
   
  Dim byteBuffer(64) As Byte 
  Dim strDocument As String, strStatus As String, strOwnerName As String 

  Dim itmX As ListItem 

  ShowStatus "Refreshing ..." 

  lvPrintQueue.ListItems.Clear 

  Me.Caption = FORM_TITLE & " - " & strPrinterName 

  ' Disable timer 
  Timer.Enabled = False 

  lngResult = OpenPrinter(strPrinterName, hPrinter, ByVal vbNullString) 

  lngJobsFirstJob = 0 ' zero-based position within the print queue of the first print job to enumerate 
   
  lngJobsEnumJob = 99 ' total number of print jobs to enumerate 
   
  lngJobsLevel = 1 ' Specifies whether the function should use JOB_INFO_1 
                      ' or JOB_INFO_2 structures to store data for the enumerated jobs 

  lngResult = EnumJobs(hPrinter, lngJobsFirstJob, lngJobsEnumJob, _ 
                       lngJobsLevel, ByVal vbNullString, 0, _ 
                       lngJobsNeeded, lngJobsReturned) 

  ' Check out the number of jobs hypothetically will be returned 
  If lngJobsNeeded > 0 Then 

    ReDim byteJobsBuffer(lngJobsNeeded - 1) 
    ReDim udtJobInfo1(lngJobsNeeded - 1) 

    lngResult = EnumJobs(hPrinter, lngJobsFirstJob, lngJobsEnumJob, _ 
                         lngJobsLevel, byteJobsBuffer(0), lngJobsNeeded, _ 
                         lngJobsNeeded, lngJobsReturned) 

    ' Check out the number of jobs returned 
    If lngJobsReturned > 0 Then 

      MoveMemory udtJobInfo1(0), byteJobsBuffer(0), Len(udtJobInfo1(0)) * lngJobsReturned 

      For lngJobsCount = 0 To lngJobsReturned - 1 
        With udtJobInfo1(lngJobsCount) 
           
        ' Get the document name 
          lngResult = lstrcpy(byteBuffer(0), ByVal .pDocument) 
           
          strDocument = StrConv(byteBuffer(), vbUnicode) 
          ' Document name has been returned as null terminated-string 
          strDocument = Left$(strDocument, InStr(strDocument, vbNullChar) - 1) 
           
        ' Get the document's owner name 
          lngResult = lstrcpy(byteBuffer(0), ByVal .pUserName) 
           
          strOwnerName = StrConv(byteBuffer(), vbUnicode) 
          ' Document's owner name has been returned as null-terminated string 
          strOwnerName = Left$(strOwnerName, InStr(strOwnerName, vbNullChar) - 1) 
           
        ' Translate status 
          strStatus = "" 
           
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_DELETING, "Deleting") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_ERROR, "Error") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_OFFLINE, "Offline") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_PAPEROUT, "Out of paper") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_PAUSED, "Paused") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_PRINTED, "Printed") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_PRINTING, "Printing") 
          strStatus = CheckStatus(strStatus, .Status, JOB_STATUS_SPOOLING, "Spooling") 
               
        ' Show it in listview 
          Set itmX = lvPrintQueue.ListItems.Add(, "JOB_ID_" & .JobId, strDocument) 
          itmX.SubItems(1) = strStatus 
          itmX.SubItems(2) = strOwnerName 
          itmX.SubItems(3) = .PagesPrinted & " of " & (.TotalPages + .PagesPrinted) 
          itmX.SubItems(4) = "" 
        End With 
      Next lngJobsCount 
    Else 
      ' number of jobs returned = 0 (no jobs) 
      lngJobsCount = 0 
    End If 
  Else 
    ' number of jobs = 0 (no jobs) 
    lngJobsCount = 0 
  End If 
  lngResult = ClosePrinter(hPrinter) 
   
  ' Enable timer 
  Timer.Enabled = True 

  ShowStatus lngJobsCount & " documents" 

End Sub 

Private Sub cboPrinters_Click() 
  strPrinterName = cboPrinters.Text 
End Sub 

Private Sub cmdRefresh_Click() 
  RefreshPrinterQueue 
End Sub 

Private Sub Form_Load() 
   
  ' Initialize timer 
  Call txtInterval_Change 

  LoadPrintersList 
   
Dim Index As Long 
   
  ' Try to select default printer in the combobox 
  Index = GetComboTextIndex(cboPrinters, Printer.DeviceName) 
   
  If Index >= 0 Then SetComboIndex cboPrinters, Index 

End Sub 

Private Sub Form_Resize() 
On Error Resume Next 
  If Me.WindowState <> vbMinimized Then 
    lvPrintQueue.Width = Me.ScaleWidth - lvPrintQueue.Left * 2 
    lvPrintQueue.Height = Me.ScaleHeight - lvPrintQueue.Top _ 
                          - lvPrintQueue.Left - StatusBar.Height 
  End If 
End Sub 

Private Sub Timer_Timer() 
  RefreshPrinterQueue 
End Sub 

Private Sub txtInterval_Change() 
Dim lngInterval As Long 
   
  lngInterval = Val(txtInterval.Text) 
  If lngInterval > 50 Then 
    ' Set timer interval value 
    Timer.Interval = lngInterval 
    Timer.Enabled = True 
  Else 
    ' Disable timer 
    Timer.Interval = 0 
    Timer.Enabled = False 
  End If 

End sub 
http://www.devcity.net/forums/topic.asp?tid=63826
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

Delphi kadar VB ile de ilgilenmişliğim vardı geçmişte.
Zaten kullanılan API ler ilgilendiriyor beni. Tabi kullanım şekilleri, giden gelen değişkenler vs.
MSDN yi karıştırmıştım. tanıdık API isimleri var kodun içerisinde.
Çok teşekkür ederim. Düşündüğünden fazla işime yarayacak.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

rica ederim

http://www.devcity.net/forums/topic.asp?tid=68285

sitede dolaşırken gözüme çarptı
işinize yarayabilir.
Cevapla