List 7-175 FormPrintPreviewフォームのDrawPreview2プロシージャ


  1: Private Function DrawPreview2(ByRef objPic As Object, _
                                   ByRef StartPage As Long, _
                                   ByRef EndPage As Long) As Long
  2:     ' プレビュー画面を描画する
  3:     '   MSHFlexGridコントロール版
  4:     ' 【引数】
  5:     '   objPic = 描画対象となるオブジェクト(ピクチャボックスかPrinterオブジェクトのいずれか)
  6:     '   StartPage = 先頭ページ番号
  7:     '   EndPage = 最終ページ番号
  8:     ' 【戻り値】
  9:     '   -1 = エラー
 10:     '   正の数 = 出力した最終ページ番号
 11:     Dim row As Long, col As Long, i As Long
 12:     Dim newPageFlag As Boolean
 13:     Dim columnNum As Long
 14:     Dim colWidth() As Long
 15:     Dim X As Long, Y As Long
 16:     Dim MLeft As Long, MRight As Long, MUp As Long, MDown As Long
 17:     Dim ColWidthTotal As Long
 18:     Dim ColHeight As Long, ColMaxHeight As Long
 19:     Dim NowPage As Long
 20:     Dim drawFlag As Boolean
 21:     Dim AlignConv As Variant
 22: 
 23:     ' 文字揃えの変換配列
 24:     AlignConv = Array(dbgLeft, dbgLeft, dbgLeft, dbgCenter, dbgCenter, _
                           dbgCenter, dbgRight, dbgRight, dbgRight, dbgGeneral)
 25: 
 26:     ' 余白情報の取得
 27:     If Not IsNumeric(TXT_UP.Text) Then
 28:         MsgBox "上余白が不正です", vbOKOnly, "印刷エラー"
 29:         DrawPreview2 = -1
 30:         Exit Function
 31:     Else
 32:         MUp = CLng(TXT_UP.Text)
 33:     End If
 34:     
 35:     If Not IsNumeric(TXT_DOWN.Text) Then
 36:         MsgBox "下余白が不正です", vbOKOnly, "印刷エラー"
 37:         DrawPreview2 = -1
 38:         Exit Function
 39:     Else
 40:         MDown = CLng(TXT_DOWN.Text)
 41:     End If
 42:     
 43:     If Not IsNumeric(TXT_LEFT.Text) Then
 44:         MsgBox "左余白が不正です", vbOKOnly, "印刷エラー"
 45:         DrawPreview2 = -1
 46:         Exit Function
 47:     Else
 48:         MLeft = CLng(TXT_LEFT.Text)
 49:     End If
 50:     
 51:     If Not IsNumeric(TXT_RIGHT.Text) Then
 52:         MsgBox "右余白が不正です", vbOKOnly, "印刷エラー"
 53:         DrawPreview2 = -1
 54:         Exit Function
 55:     Else
 56:         MRight = CLng(TXT_RIGHT.Text)
 57:     End If
 58:     
 59:     On Error GoTo ErrHandle
 60:     
 61:     ' 余白をmm単位からTwip単位に変換する
 62:     MUp = objPic.ScaleY(MUp, vbMillimeters, vbTwips)
 63:     MDown = objPic.ScaleY(MDown, vbMillimeters, vbTwips)
 64:     MLeft = objPic.ScaleX(MLeft, vbMillimeters, vbTwips)
 65:     MRight = objPic.ScaleX(MRight, vbMillimeters, vbTwips)
 66: 
 67:     newPageFlag = True
 68:     NowPage = 1
 69:     
 70:     If (NowPage >= StartPage) And (NowPage <= EndPage) Then
 71:         ' 表示する
 72:         drawFlag = True
 73:     Else
 74:         ' 表示しない
 75:         drawFlag = False
 76:     End If
 77:     
 78:     ' MSHFlexGridコントロールの列数を取得
 79:     columnNum = g_FLXGrid.Cols
 80: 
 81:     ' 列の幅を算出する
 82:     ' 用紙の横幅に合わせた形に表を引き延ばし,
 83:     ' もとのMSHFlexGridの列幅と比例する形で
 84:     ' 各列を分配する形で幅を求める
 85:     
 86:     ReDim colWidth(columnNum)
 87:     
 88:     ColWidthTotal = 0
 89:     
 90:     ' 各列の幅と,各列の幅の総和を求める
 91:     For i = 0 To columnNum - 1
 92:         colWidth(i) = g_FLXGrid.colWidth(i)
 93:         ColWidthTotal = ColWidthTotal + colWidth(i)
 94:     Next
 95:     
 96:     ' 各列の幅が合うように揃える
 97:     For i = 0 To g_FLXGrid.Cols - 1
 98:         colWidth(i) = colWidth(i) * (objPic.Width - MLeft - MRight) / ColWidthTotal
 99:     Next
100: 
101:     ' ページの印刷を開始
102:     
103:     ' カレント座標を左上の余白内位置に移動する
104:     objPic.CurrentX = MLeft
105:     objPic.CurrentY = MUp
106:     
107:     ' タイトルの印刷
108:     If NowPage = 1 Then
109:         ' 先頭ぺージであれば,タイトルを表示する
110:         DrawFrame objPic, g_TitleFrame, MUp, MLeft, MDown, MRight, drawFlag
111:     End If
112: 
113:     ' 行を次々と表示する
114:     Y = objPic.CurrentY
115: 
116:     ' レコード数だけループして各列を描画する
117:     g_FLXGrid.FillStyle = flexFillSingle
118:     
119:     For row = g_FLXGrid.FixedRows To g_FLXGrid.Rows - 1
120:         ' 各行の印刷
121:         g_FLXGrid.row = row
122: 
123:         X = MLeft
124:         objPic.CurrentX = X
125:         
126:         ' ページの頭である場合には見出し行を印刷する
127:         If newPageFlag Then
128:             ' ページの頭である場合
129:             newPageFlag = False
130:             
131:             ' 横罫の印刷
132:             X = objPic.CurrentX
133:             Y = objPic.CurrentY
134:             myLine objPic, X, Y, X + objPic.Width - MLeft - MRight, Y, drawFlag
135:             objPic.CurrentX = X
136:             objPic.CurrentY = Y
137:             
138:             If g_FLXGrid.FixedRows <> 0 Then
139:                 ' 見出し行を印刷する
140: 
141:                 ColMaxHeight = 0
142:                 X = objPic.CurrentX
143:                 ' 見出しを印刷
144:                         
145:                 ' 見出しのフォントを設定
146:                 objPic.Font.Name = g_FLXGrid.FontFixed.Name
147:                 objPic.Font.Bold = g_FLXGrid.FontFixed.Bold
148:                 objPic.Font.Charset = g_FLXGrid.FontFixed.Charset
149:                 objPic.Font.Italic = g_FLXGrid.FontFixed.Italic
150:                 objPic.Font.Size = g_FLXGrid.FontFixed.Size
151:                 objPic.Font.Strikethrough = g_FLXGrid.FontFixed.Strikethrough
152:                 objPic.Font.Underline = g_FLXGrid.FontFixed.Underline
153:                 
154:                 For i = 0 To g_FLXGrid.FixedRows - 1
155:                     For col = 0 To g_FLXGrid.Cols - 1
156:                         ' 見出しを印刷する
157:                         objPic.CurrentX = X
158:                         objPic.CurrentY = Y
159:                         ColHeight = DrawBox(objPic, g_FLXGrid.TextMatrix(i, col), _
                                                 colWidth(col), AlignConv(g_FLXGrid.ColAlignmentHeader(0, col)), drawFlag)
160:                         If ColHeight > ColMaxHeight Then
161:                             ColMaxHeight = ColHeight
162:                         End If
163:                         X = X + colWidth(col)
164:                     Next
165:                     
166:                     ' 縦線を印刷
167:                     X = MLeft
168:                     For col = 0 To g_FLXGrid.Cols - 1
169:                         myLine objPic, X, Y, X, Y + ColMaxHeight, drawFlag
170:                         X = X + colWidth(col)
171:                     Next
172:                 
173:                     myLine objPic, X, Y, X, Y + ColMaxHeight, drawFlag
174:                 
175:                     ' 次の行に移動する
176:                     objPic.CurrentX = MLeft
177:                     objPic.CurrentY = Y + ColMaxHeight
178:                 Next
179:             End If
180:         End If
181:         
182:         ' 横罫の印刷
183:         X = objPic.CurrentX
184:         Y = objPic.CurrentY
185:         myLine objPic, X, Y, X + objPic.Width - MLeft - MRight, Y, drawFlag
186:         objPic.CurrentX = X
187:         objPic.CurrentY = Y
188:         
189:         ' 1行分のセルの中身を印刷する
190:         X = objPic.CurrentX
191:         ColMaxHeight = 0
192: 
193:         For col = 0 To g_FLXGrid.Cols - 1
194:             ' 中身を印刷する
195:             g_FLXGrid.col = col
196:             
197:             ' フォントを設定
198:             objPic.Font.Name = g_FLXGrid.CellFontName
199:             objPic.Font.Bold = g_FLXGrid.CellFontBold
200:             objPic.Font.Italic = g_FLXGrid.CellFontItalic
201:             objPic.Font.Size = g_FLXGrid.CellFontSize
202:             objPic.Font.Strikethrough = g_FLXGrid.CellFontStrikeThrough
203:             objPic.Font.Underline = g_FLXGrid.CellFontUnderline
204:             
205:             objPic.CurrentX = X
206:             objPic.CurrentY = Y
207:             ColHeight = DrawBox(objPic, g_FLXGrid.Text, colWidth(col), _
                                     AlignConv(g_FLXGrid.ColAlignment(col)), drawFlag)
208:             
209:             If ColHeight > ColMaxHeight Then
210:                 ColMaxHeight = ColHeight
211:             End If
212:             X = X + colWidth(col)
213:         Next
214:         
215:         ' 縦線を印刷
216:         X = MLeft
217:         For col = 0 To g_FLXGrid.Cols - 1
218:             myLine objPic, X, Y, X, Y + ColMaxHeight, drawFlag
219:             X = X + colWidth(col)
220:         Next
221:         myLine objPic, X, Y, X, Y + ColMaxHeight, drawFlag
222:         
223:         ' 1ページをはみ出ていないかどうかを確認する
224:         If objPic.CurrentY > objPic.Height - MDown - MUp Then
225:             ' ページをはみ出しているので次のページに移動する
226:             
227:             ' このページで印刷が終わりかどうか
228:             If NowPage >= EndPage Then
229:                 ' このページで印刷が終わりなのでループを抜ける
230:                 Exit For
231:             End If
232:             
233:             ' 次のページに移動する
234:             
235:             ' 最後の横線の印刷
236:             X = MLeft
237:             objPic.CurrentX = X
238: 
239:             myLine objPic, X, objPic.CurrentY, X + objPic.Width, objPic.CurrentY, drawFlag
240:             objPic.CurrentX = X
241:             objPic.CurrentY = Y
242: 
243:             ' 次のページに移動する
244:             If objPic Is Printer And drawFlag Then
245:                 ' プリンタの場合には改ページする
246:                 objPic.NewPage
247:             End If
248:             
249:             NowPage = NowPage + 1
250:             newPageFlag = True
251: 
252:             If (NowPage >= StartPage) And (NowPage <= EndPage) Then
253:                 ' 表示する
254:                 drawFlag = True
255:             Else
256:                 ' 表示しない
257:                 drawFlag = False
258:             End If
259: 
260:             objPic.CurrentX = MLeft
261:             objPic.CurrentY = MUp
262:         End If
263:         
264:         ' 中断処理になっていないかどうかをチェック
265:         If objPic Is Printer Then
266:             DoEvents
267:             If FormPrinting.bCancelFlag Then
268:                 ' キャンセル処理
269:                 objPic.KillDoc
270:                 MsgBox "印刷が中断されました", vbOKOnly, "印刷"
271:                 Exit For
272:             End If
273:         End If
274:     Next
275:     
276:     ' ページの終わり
277:     ' 横線の印刷
278:     X = MLeft
279:     objPic.CurrentX = X
280:     
281:     myLine objPic, X, objPic.CurrentY, X + objPic.Width - MLeft - MRight, objPic.CurrentY, drawFlag
282:     objPic.CurrentX = X
283:     objPic.CurrentY = Y
284:     
285:     If objPic Is Printer Then
286:         ' プリンタの場合にはプリンタの終了処理をする
287:         objPic.EndDoc
288:     End If
289:     
290:     DrawPreview2 = NowPage
291: 
292:     Exit Function
293:     
294: ErrHandle:
295:     ' エラーハンドラ
296:     If objPic Is Printer Then
297:         ' プリンタの場合には中断処理をする
298:         objPic.KillDoc
299:         objPic.EndDoc
300:     End If
301:     
302:     DrawPreview2 = -1
303:     MsgBox Err.Description, vbOKOnly, "印刷エラー"
304: End Function