1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124:
| procedure Print(Caption: String; DataRecord: TDataRecord); var di : DOCINFO; pd : TPrintDlg; dm : TDEVMODE; iTotalLines, yChar, iLinesPerPage, iTotalPages, iPage, iLine, iLineNum, iColCopy : Integer; tm : TTEXTMETRIC; s : String; i, j : Integer; rec : TRect; OldFont : HFONT; sArray : TLVitemArray; sTemp : TDataRecord; cntDR : Integer; begin OldFont := 0; cntDR := length(DataRecord); sTemp := DataRecord; ZeroMemory(@pd, sizeof(TPrintDlg)); Zeromemory(@dm, sizeof(TDevMode)); dm.dmSize := sizeof(TDEVMODE); dm.dmOrientation := DMORIENT_LANDSCAPE; pd.lStructSize := sizeof(TPrintDlg); pd.hWndOwner := hApp; pd.Flags := PD_ALLPAGES or PD_COLLATE or PD_RETURNDC or PD_NOSELECTION; Move(pd.hDevMode,dm,sizeof(TDevMode)); pd.nCopies := 1; if PrintDlg(pd) = TRUE then begin MyFont := CreateFont(FontSize, 0, 0, 0, 500, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, FontName); if MyFont <> 0 then OldFont := SelectObject(pd.hDC, MyFont); iTotalLines := SendDlgItemMessage(hApp, IDC_LV, LVM_GETITEMCOUNT, 0, 0); GetTextMetrics(pd.hDC, tm); yChar := tm.tmHeight + tm.tmExternalLeading; iLinesPerPage := (GetDeviceCaps(pd.hDC, VERTRES) div yChar) - 1; iTotalPages := (iTotalLines + iLinesPerPage - 1) div iLinesPerPage; rec.Left := 25; rec.Right := GetDeviceCaps(pd.hDC, HORZRES); ZeroMemory(@di, sizeof(DOCINFO)); di.cbSize := sizeof(DOCINFO); di.lpszDocName := 'Test'; if StartDoc(pd.hDC, di) > 0 then begin for iColCopy := 0 to pd.nCopies-1 do begin s := Caption; rec.Top := yChar-5; rec.Bottom := rec.Top+yChar; DrawText(pd.hDC, pointer(s), length(s), rec, DT_CENTER); for iPage := 0 to iTotalPages-1 do begin rec.Top := yChar*3; rec.Bottom := yChar*4; for i := 0 to 7 do begin case i of 0: rec.Left := 25; 1: rec.Left := rec.Left+500; 2: rec.Left := rec.Left+500; 3: rec.Left := rec.Left+175; 4: rec.Left := rec.Left+375; 5: rec.Left := rec.Left+375; 6: rec.Left := rec.Left+375; 7: rec.Left := rec.Left+660; end; s := PrnColumns[i]; DrawText(pd.hDC, pointer(s), length(s), rec, 0); end;
for iLine := 0 to iLinesPerPage-1 do begin ProcessMessages(hApp); if iPage = 0 then iLineNum := iLinesPerpage*iPage+iLine else iLineNum := iLinesPerpage*iPage+iLine-4; if iLineNum < cntDR then sArray := sTemp[iLineNum] else break;
rec.Left := 25; rec.Top := (yChar*iLine)+(5*yChar); rec.Bottom := rec.Top+yChar; for j := 0 to length(sArray)-1 do begin case j of 0: rec.Left := 25; 1: rec.Left := rec.Left+500; 2: rec.Left := rec.Left+500; 3: rec.Left := rec.Left+175; 4: rec.Left := rec.Left+375; 5: rec.Left := rec.Left+375; 6: rec.Left := rec.Left+375; 7: rec.Left := rec.Left+660; end; s := sArray[j]; DrawText(pd.hDC, pointer(s), length(s), rec, DT_TABSTOP); end; end; if EndPage(pd.hDC) < 0 then exit; end; end; end; EndDoc(pd.hDC); SelectObject(pd.hDC, OldFont); DeleteObject(pd.hDC); end; end; |