home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 January / VPR9701A.ISO / PROJ95 / EXAMPLES / BATCH / MAIN.FRM < prev    next >
Text File  |  1996-08-21  |  36KB  |  866 lines

  1. VERSION 2.00
  2. Begin Form frmMain 
  3.    BackColor       =   &H00C0C0C0&
  4.    BorderStyle     =   1  'Fixed Single
  5.    Caption         =   "バッチ印刷"
  6.    ClientHeight    =   2940
  7.    ClientLeft      =   1965
  8.    ClientTop       =   2940
  9.    ClientWidth     =   6030
  10.    FontBold        =   -1  'True
  11.    FontItalic      =   0   'False
  12.    FontName        =   "MS Pゴシック"
  13.    FontSize        =   9
  14.    FontStrikethru  =   0   'False
  15.    FontUnderline   =   0   'False
  16.    ForeColor       =   &H00000000&
  17.    Height          =   3345
  18.    Left            =   1905
  19.    LinkTopic       =   "Form1"
  20.    MaxButton       =   0   'False
  21.    ScaleHeight     =   2940
  22.    ScaleWidth      =   6030
  23.    Top             =   2595
  24.    Width           =   6150
  25.    Begin CommonDialog dlgCommon 
  26.       Left            =   3615
  27.       Top             =   240
  28.    End
  29.    Begin PictureBox picSeparator 
  30.       FontBold        =   -1  'True
  31.       FontItalic      =   0   'False
  32.       FontName        =   "MS Pゴシック"
  33.       FontSize        =   9
  34.       FontStrikethru  =   0   'False
  35.       FontUnderline   =   0   'False
  36.       Height          =   30
  37.       Left            =   3375
  38.       ScaleHeight     =   0
  39.       ScaleWidth      =   2505
  40.       TabIndex        =   14
  41.       TabStop         =   0   'False
  42.       Top             =   2250
  43.       Width           =   2535
  44.    End
  45.    Begin CommandButton cmdSave 
  46.       Caption         =   "保存(&S)..."
  47.       Enabled         =   0   'False
  48.       FontBold        =   0   'False
  49.       FontItalic      =   0   'False
  50.       FontName        =   "MS Pゴシック"
  51.       FontSize        =   9
  52.       FontStrikethru  =   0   'False
  53.       FontUnderline   =   0   'False
  54.       Height          =   330
  55.       Left            =   4665
  56.       TabIndex        =   5
  57.       Top             =   2430
  58.       Width           =   1205
  59.    End
  60.    Begin CommandButton cmdOpen 
  61.       Caption         =   "開く(&O)..."
  62.       FontBold        =   0   'False
  63.       FontItalic      =   0   'False
  64.       FontName        =   "MS Pゴシック"
  65.       FontSize        =   9
  66.       FontStrikethru  =   0   'False
  67.       FontUnderline   =   0   'False
  68.       Height          =   330
  69.       Left            =   3405
  70.       TabIndex        =   4
  71.       Top             =   2430
  72.       Width           =   1205
  73.    End
  74.    Begin SSPanel pnlBatches 
  75.       BevelOuter      =   1  'Inset
  76.       Caption         =   "Panel3D1"
  77.       FontBold        =   -1  'True
  78.       FontItalic      =   0   'False
  79.       FontName        =   "MS Pゴシック"
  80.       FontSize        =   9
  81.       FontStrikethru  =   0   'False
  82.       FontUnderline   =   0   'False
  83.       Height          =   1440
  84.       Left            =   135
  85.       TabIndex        =   7
  86.       Top             =   360
  87.       Width           =   3135
  88.       Begin ListBox lstBatches 
  89.          FontBold        =   0   'False
  90.          FontItalic      =   0   'False
  91.          FontName        =   "MS Pゴシック"
  92.          FontSize        =   9
  93.          FontStrikethru  =   0   'False
  94.          FontUnderline   =   0   'False
  95.          Height          =   1110
  96.          Left            =   20
  97.          Sorted          =   -1  'True
  98.          TabIndex        =   8
  99.          Top             =   15
  100.          Width           =   3105
  101.       End
  102.    End
  103.    Begin CommandButton cmdEdit 
  104.       Caption         =   "編集(&E)..."
  105.       Enabled         =   0   'False
  106.       FontBold        =   0   'False
  107.       FontItalic      =   0   'False
  108.       FontName        =   "MS Pゴシック"
  109.       FontSize        =   9
  110.       FontStrikethru  =   0   'False
  111.       FontUnderline   =   0   'False
  112.       Height          =   330
  113.       Left            =   3405
  114.       TabIndex        =   2
  115.       Top             =   1770
  116.       Width           =   1205
  117.    End
  118.    Begin CommandButton cmdDelete 
  119.       Caption         =   "削除(&D)..."
  120.       Enabled         =   0   'False
  121.       FontBold        =   0   'False
  122.       FontItalic      =   0   'False
  123.       FontName        =   "MS Pゴシック"
  124.       FontSize        =   9
  125.       FontStrikethru  =   0   'False
  126.       FontUnderline   =   0   'False
  127.       Height          =   330
  128.       Left            =   4665
  129.       TabIndex        =   3
  130.       Top             =   1755
  131.       Width           =   1205
  132.    End
  133.    Begin CommandButton cmdNew 
  134.       Caption         =   "作成(&N)..."
  135.       FontBold        =   0   'False
  136.       FontItalic      =   0   'False
  137.       FontName        =   "MS Pゴシック"
  138.       FontSize        =   9
  139.       FontStrikethru  =   0   'False
  140.       FontUnderline   =   0   'False
  141.       Height          =   330
  142.       Left            =   3405
  143.       TabIndex        =   0
  144.       Top             =   1350
  145.       Width           =   1205
  146.    End
  147.    Begin CommandButton cmdCopy 
  148.       Caption         =   "コピー(&C)..."
  149.       Enabled         =   0   'False
  150.       FontBold        =   0   'False
  151.       FontItalic      =   0   'False
  152.       FontName        =   "MS Pゴシック"
  153.       FontSize        =   9
  154.       FontStrikethru  =   0   'False
  155.       FontUnderline   =   0   'False
  156.       Height          =   330
  157.       Left            =   4665
  158.       TabIndex        =   1
  159.       Top             =   1320
  160.       Width           =   1205
  161.    End
  162.    Begin CommandButton cmdClose 
  163.       Cancel          =   -1  'True
  164.       Caption         =   "閉じる(&L)"
  165.       FontBold        =   0   'False
  166.       FontItalic      =   0   'False
  167.       FontName        =   "MS Pゴシック"
  168.       FontSize        =   9
  169.       FontStrikethru  =   0   'False
  170.       FontUnderline   =   0   'False
  171.       Height          =   330
  172.       Left            =   4665
  173.       TabIndex        =   13
  174.       Top             =   690
  175.       Width           =   1205
  176.    End
  177.    Begin CommandButton cmdPrint 
  178.       Caption         =   "印刷(&P)"
  179.       Default         =   -1  'True
  180.       Enabled         =   0   'False
  181.       FontBold        =   0   'False
  182.       FontItalic      =   0   'False
  183.       FontName        =   "MS Pゴシック"
  184.       FontSize        =   9
  185.       FontStrikethru  =   0   'False
  186.       FontUnderline   =   0   'False
  187.       Height          =   330
  188.       Left            =   4665
  189.       TabIndex        =   12
  190.       Top             =   255
  191.       Width           =   1205
  192.    End
  193.    Begin SSFrame fraProjectOpt 
  194.       Caption         =   "印刷対象"
  195.       FontBold        =   0   'False
  196.       FontItalic      =   0   'False
  197.       FontName        =   "MS Pゴシック"
  198.       FontSize        =   9
  199.       FontStrikethru  =   0   'False
  200.       FontUnderline   =   0   'False
  201.       Height          =   885
  202.       Left            =   135
  203.       TabIndex        =   9
  204.       Top             =   1920
  205.       Width           =   3150
  206.       Begin SSOption optWhichProjects 
  207.          Caption         =   "作業中のプロジェクトのみ(&V)"
  208.          FontBold        =   0   'False
  209.          FontItalic      =   0   'False
  210.          FontName        =   "MS Pゴシック"
  211.          FontSize        =   9
  212.          FontStrikethru  =   0   'False
  213.          FontUnderline   =   0   'False
  214.          Height          =   285
  215.          Index           =   0
  216.          Left            =   180
  217.          TabIndex        =   10
  218.          Top             =   225
  219.          Value           =   -1  'True
  220.          Width           =   2835
  221.       End
  222.       Begin SSOption optWhichProjects 
  223.          Caption         =   "すべての開いたプロジェクト(&A)"
  224.          FontBold        =   0   'False
  225.          FontItalic      =   0   'False
  226.          FontName        =   "MS Pゴシック"
  227.          FontSize        =   9
  228.          FontStrikethru  =   0   'False
  229.          FontUnderline   =   0   'False
  230.          Height          =   285
  231.          Index           =   1
  232.          Left            =   180
  233.          TabIndex        =   11
  234.          TabStop         =   0   'False
  235.          Top             =   510
  236.          Width           =   2835
  237.       End
  238.    End
  239.    Begin Label lblBatches 
  240.       BackColor       =   &H00C0C0C0&
  241.       Caption         =   "印刷バッチ(&B):"
  242.       FontBold        =   0   'False
  243.       FontItalic      =   0   'False
  244.       FontName        =   "MS Pゴシック"
  245.       FontSize        =   9
  246.       FontStrikethru  =   0   'False
  247.       FontUnderline   =   0   'False
  248.       Height          =   240
  249.       Left            =   165
  250.       TabIndex        =   6
  251.       Top             =   120
  252.       Width           =   1275
  253.    End
  254. End
  255. Option Explicit
  256. Option Base 1
  257.  
  258. Dim mbCancelSave As Integer     '保存のダイアログがキャンセルされたかどうかを示すフラグ
  259.  
  260. Sub cmdClose_Click ()
  261. 'このプロシージャは、バッチ ファイルを保存するかどうかをユーザーに
  262. '確認し、アプリケーションを閉じます。
  263.  
  264. Dim nReply As Integer       'メッセージ ボックスでクリックされたボタンの値
  265.  
  266.     If gbNeedSave Then
  267.         nReply = MsgBox(MB_QUERYSAVE, MB_YESNOCANCEL + MB_ICONQUESTION, MB_QUERYSAVE_TITLE)
  268.         Select Case nReply
  269.             Case IDCANCEL                   'ユーザーが [キャンセル] をクリックした場合
  270.                 Exit Sub
  271.             Case IDYES                      'ユーザーが [はい] (変更を保存) をクリックした場合
  272.                 cmdSave_Click               '保存のプロシージャを呼び出します。
  273.                 If mbCancelSave Then        'ユーザーが保存のプロシージャをキャンセルした場合
  274.                     mbCancelSave = False    'フラグをリセットします。
  275.                     Exit Sub                'プログラムを閉じずにサブルーチンを終了します。
  276.                 Else
  277.                     End                     'プログラムを閉じます。
  278.                 End If
  279.             Case IDNO                       'ユーザーが [いいえ] (変更を保存せずに終了) をクリックした場合
  280.                 End                         'プログラムを閉じます。
  281.         End Select
  282.     Else
  283.         End                                 'アプリケーションを閉じます。
  284.     End If
  285.  
  286. End Sub
  287.  
  288. Sub cmdCopy_Click ()
  289. 'このプロシージャは、コピーしたバッチの値を [バッチの定義] フォームに
  290. '入力し、さらにフォームを表示します。
  291.  
  292. Dim iSearchVal As Integer   'バッチ名の検索で返された値
  293. Dim iSelBatch As Integer    'gabtBatches() で現在選択されているバッチのインデックス
  294.  
  295.     MousePointer = HOURGLASS
  296.  
  297.     If bSetActiveProjObj() = False Then     '作業中のプロジェクトのオブジェクトを取得できない場合
  298.         MsgBox MB_NO_ACTIVEPROJECT, MB_ICONEXCLAMATION, MB_NO_ACTIVEPROJECT_TITLE
  299.         frmBatchDef.Hide    '[バッチの定義] フォームを非表示にします。
  300.         MousePointer = DEFAULT
  301.         Exit Sub
  302.     End If
  303.     
  304.     If lstBatches.ListCount = MAX_BATCHES Then  'これ以上バッチを追加できません。
  305.         MsgBox MB_MAX_BATCHES, MB_ICONEXCLAMATION, MB_MAX_BATCHES_TITLE
  306.         MousePointer = DEFAULT
  307.         Exit Sub
  308.     End If
  309.  
  310.     gbNeedSave = True       '保存が必要であることを示します。
  311.  
  312.     '[バッチの定義] フォームのフィールドを、選択されているバッチに設定します。
  313.     iSelBatch = lstBatches.ItemData(lstBatches.ListIndex)
  314.     SetBatchDef iSelBatch, BATCH_COPY
  315.  
  316.     Do
  317.         MousePointer = DEFAULT
  318.  
  319.         '[バッチの定義] フォームを表示します。
  320.         frmBatchDef.Show MODAL
  321.  
  322.         iSearchVal = iSearchBatchName(gbtBatchBfr.Name)
  323.         If iSearchVal <> -1 Then    '同じ名前のバッチが既に存在する場合
  324.             MsgBox MB_DUPLICATE_NAME, MB_ICONEXCLAMATION, MB_DUPLICATE_NAME_TITLE
  325.         End If
  326.  
  327.     Loop Until iSearchVal = -1
  328.  
  329.     If gbtBatchBfr.Name <> "キャンセル" Then            'バッファには新しいバッチ情報が含まれます。
  330.         gnNumOfBatches = gnNumOfBatches + 1         'バッチのカウントを 1 つインクリメントします。
  331.         gabtBatches(gnNumOfBatches) = gbtBatchBfr   '新しいバッチを配列に格納します。
  332.         lstBatches.AddItem gbtBatchBfr.Name         '一覧に名前を追加します。
  333.         'gabtBatches の位置を保存します。
  334.         lstBatches.ItemData(lstBatches.NewIndex) = gnNumOfBatches
  335.         lstBatches.ListIndex = lstBatches.NewIndex  '一覧から新しいバッチを選択します。
  336.     End If
  337.     
  338. End Sub
  339.  
  340. Sub cmdDelete_Click ()
  341. 'このプロシージャは、選択されているバッチを gabtBatches() から削除し、
  342. 'その名前を [印刷バッチ] ボックスから削除します。
  343. 'バッチを削除すると、gabtBatches() 配列の末尾のバッチが
  344. '削除したバッチの位置へ移動し、配列の空所が埋められます。
  345.  
  346. Dim iDelPos As Integer      '削除するバッチの gabtBatches() での位置
  347. Dim iListPos As Integer     'gabtBatches() の末尾にあるバッチの lstBatches の位置
  348.  
  349.     '削除を確認します。
  350.     If MsgBox(lstBatches.Text + MB_DELETE, MB_YESNO + MB_ICONQUESTION, MB_DELETE_TITLE) = IDNO Then
  351.         Exit Sub    '削除をキャンセルします。
  352.     End If
  353.  
  354.     gbNeedSave = True       '保存が必要であることを示します。
  355.  
  356.     '削除したバッチの gabtBatches() での位置を保存します。
  357.     iDelPos = lstBatches.ItemData(lstBatches.ListIndex)
  358.  
  359.     '配列の末尾のバッチを、削除したバッチの位置へ移動します。
  360.     gabtBatches(iDelPos) = gabtBatches(gnNumOfBatches)
  361.  
  362.     'バッチ数を 1 つ減らします。
  363.     gnNumOfBatches = gnNumOfBatches - 1
  364.  
  365.     'lstBatches で移動したバッチの位置を検索します。
  366.     iListPos = iSearchBatchName(gabtBatches(iDelPos).Name)
  367.  
  368.     'ItemData を更新して、バッチの新しい位置を参照させます。
  369.     lstBatches.ItemData(iListPos) = iDelPos
  370.  
  371.     '削除したバッチの名前を一覧から削除します。
  372.     lstBatches.RemoveItem lstBatches.ListIndex
  373.     
  374.     '現在の選択対象を一覧から削除すると、一覧の項目は何も
  375.     '選択されていない状態になります。これを避けるために、
  376.     '削除の後で一覧の先頭にある項目を選択します。
  377.     If gnNumOfBatches > 0 Then lstBatches.ListIndex = 0
  378.  
  379.     If gnNumOfBatches = 0 Then              '一覧から末尾のバッチを削除します。
  380.         cmdEdit.Enabled = False             '[編集] ボタンを無効にします。
  381.         cmdCopy.Enabled = False             '[コピー] ボタンを無効にします。
  382.         cmdDelete.Enabled = False           '[削除] ボタンを無効にします。
  383.         cmdSave.Enabled = False             '[保存] ボタンを無効にします。
  384.         cmdPrint.Enabled = False            '[印刷] ボタンを無効にします。
  385.     End If
  386.  
  387. End Sub
  388.  
  389. Sub cmdEdit_Click ()
  390. 'このプロシージャは、選択されているバッチの情報を [バッチの定義] フォームの
  391. 'フィールドに読み込んで、フォームを実行します。
  392.  
  393. Dim iSelBatch As Integer    'gabtBatches() で現在選択されているバッチのインデックス
  394. Dim iSearchVal As Integer   'バッチ名の検索で返される値
  395. Dim sOrigName As String     '(編集の前に) 元のバッチ名を保存します。
  396.  
  397.     MousePointer = HOURGLASS
  398.  
  399.     If bSetActiveProjObj() = False Then     '作業中のプロジェクトのオブジェクトを取得できない場合
  400.         MsgBox MB_NO_ACTIVEPROJECT, MB_ICONEXCLAMATION, MB_NO_ACTIVEPROJECT_TITLE
  401.         frmBatchDef.Hide    '[バッチの定義] フォームを非表示にします。
  402.         MousePointer = DEFAULT
  403.         Exit Sub
  404.     End If
  405.     
  406.     gbNeedSave = True       '保存が必要であることを示します。
  407.  
  408.     iSelBatch = lstBatches.ItemData(lstBatches.ListIndex)   'gabtBatches() で選択されているバッチのインデックス
  409.     SetBatchDef iSelBatch, BATCH_EDIT               '[バッチの定義] フォームのフィールドを設定します。
  410.     sOrigName = gabtBatches(iSelBatch).Name         '元のバッチ名を保存します。
  411.     
  412.     Do
  413.         MousePointer = DEFAULT
  414.  
  415.         '[バッチの定義] フォームを表示します。
  416.         frmBatchDef.Show MODAL
  417.  
  418.         If gbtBatchBfr.Name = sOrigName Then        '編集中にバッチ名は変更されませんでした。
  419.             iSearchVal = -1
  420.         Else
  421.             iSearchVal = iSearchBatchName(gbtBatchBfr.Name)
  422.             If iSearchVal <> -1 Then                '同じ名前のバッチが既に存在する場合
  423.                 MsgBox MB_DUPLICATE_NAME, MB_ICONEXCLAMATION, MB_DUPLICATE_NAME_TITLE
  424.             End If
  425.         End If
  426.  
  427.     Loop Until iSearchVal = -1      '有効な名前が入力されるまでループ実行します。
  428.  
  429.     If gbtBatchBfr.Name <> "キャンセル" Then            'バッファには編集されたバッチ情報が含まれます。
  430.         gabtBatches(iSelBatch) = gbtBatchBfr        '編集されたバッチ情報を配列に格納します。
  431.  
  432.         '編集中にバッチ名が変更された場合、[印刷バッチ] ボックスから
  433.         'いったん名前を削除して、再び追加します。
  434.         lstBatches.RemoveItem lstBatches.ListIndex  '一覧からバッチ名を削除します。
  435.         lstBatches.AddItem gbtBatchBfr.Name         'バッチ名を一覧に追加します。
  436.         lstBatches.ItemData(lstBatches.NewIndex) = iSelBatch    'gabtBatches の位置を保存します。
  437.         lstBatches.ListIndex = lstBatches.NewIndex  '一覧からバッチを選択します。
  438.     End If
  439.  
  440.  
  441. End Sub
  442.  
  443. Sub cmdNew_Click ()
  444. 'このプロシージャは、gnNumOfBatches をインクリメントし、
  445. '[バッチの定義] フォームを呼び出します。
  446.  
  447. Dim iSearchVal As Integer   'バッチ名の検索で返される値
  448.  
  449.     MousePointer = HOURGLASS
  450.  
  451.     If bSetActiveProjObj() = False Then     '作業中のプロジェクトのオブジェクトを取得できない場合
  452.         MsgBox MB_NO_ACTIVEPROJECT, MB_ICONEXCLAMATION, MB_NO_ACTIVEPROJECT_TITLE
  453.         frmBatchDef.Hide    '[バッチの定義] フォームを非表示にします。
  454.         MousePointer = DEFAULT
  455.         Exit Sub
  456.     End If
  457.  
  458.     If lstBatches.ListCount = MAX_BATCHES Then  'バッチはこれ以上追加できません。
  459.         MsgBox MB_MAX_BATCHES, MB_ICONEXCLAMATION, MB_MAX_BATCHES_TITLE
  460.         MousePointer = DEFAULT
  461.         Exit Sub
  462.     End If
  463.  
  464.     gbNeedSave = True       '保存が必要であることを示します。
  465.  
  466.     '[バッチの定義] フォームの値を新しいバッチに合わせて設定します。
  467.     SetBatchDef 0, BATCH_NEW
  468.         
  469.     Do
  470.         MousePointer = DEFAULT
  471.  
  472.         '[バッチの定義] フォームを表示します。
  473.         frmBatchDef.Show MODAL
  474.  
  475.         iSearchVal = iSearchBatchName(gbtBatchBfr.Name)
  476.         If iSearchVal <> -1 Then    '同じ名前のバッチが既に存在する場合
  477.             MsgBox MB_DUPLICATE_NAME, MB_ICONEXCLAMATION, MB_DUPLICATE_NAME_TITLE
  478.         End If
  479.  
  480.     Loop Until iSearchVal = -1
  481.  
  482.     If gbtBatchBfr.Name <> "キャンセル" Then            'バッファには新しいバッチ情報が含まれます。
  483.         gnNumOfBatches = gnNumOfBatches + 1         'バッチのカウントを 1 つインクリメントします。
  484.         gabtBatches(gnNumOfBatches) = gbtBatchBfr   '新しいバッチを配列に格納します。
  485.         lstBatches.AddItem gbtBatchBfr.Name         '一覧に名前を追加します。
  486.         'gabtBatches の位置を保存します。
  487.         lstBatches.ItemData(lstBatches.NewIndex) = gnNumOfBatches
  488.         lstBatches.ListIndex = lstBatches.NewIndex  '一覧から新しいバッチを選択します。
  489.     End If
  490.     
  491.     If gnNumOfBatches = 1 Then                      '最初のバッチを一覧に追加します。
  492.         cmdEdit.Enabled = True                      '[編集] ボタンを有効にします。
  493.         cmdDelete.Enabled = True                    '[削除] ボタンを有効にします。
  494.         cmdCopy.Enabled = True                      '[コピー] ボタンを有効にします。
  495.         cmdSave.Enabled = True                      '[保存] ボタンを有効にします。
  496.         cmdPrint.Enabled = True                     '[印刷] ボタンを有効にします。
  497.     End If
  498.  
  499. End Sub
  500.  
  501. Sub cmdOpen_Click ()
  502. 'このプロシージャは、ユーザーの指定したバッチ ファイルを開き、
  503. 'バッチ情報をメモリにロードします。
  504.  
  505. Dim nFilenum As Integer                     '開くためのファイル番号
  506. Dim nSize As Integer                        '入力用の文字列のサイズ
  507. Dim nPos As Integer                         'ファイルのポインタの位置
  508. Dim nBat As Integer                         'バッチのループ カウンタ
  509. Dim nItem As Integer                        '項目のループ カウンタ
  510. Dim sItemName As String                         '入力用の文字列に使用する変数
  511.     
  512.     '保存が必要な場合は、保存のダイアログを呼び出します。
  513.     If gbNeedSave Then
  514.         If MsgBox(MB_QUERYSAVE, MB_YESNO + MB_ICONQUESTION, MB_QUERYSAVE_TITLE) = IDYES Then
  515.             cmdSave_Click
  516.             If mbCancelSave Then        'ユーザーが保存のダイアログをキャンセルした場合
  517.                 mbCancelSave = False    'フラグをリセットします。
  518.                 Exit Sub                'プログラムを閉じずにサブルーチンを終了します。
  519.             End If
  520.         End If
  521.     End If
  522.     
  523.     On Error GoTo OpenError
  524.  
  525.     nFilenum = FreeFile                     '有効なファイル番号を取得します。
  526.  
  527.     dlgCommon.CancelError = True            '[キャンセル] がクリックされた場合、エラーを生成します。
  528.     dlgCommon.DialogTitle = DLG_OPEN_TITLE
  529.     dlgCommon.DefaultExt = DLG_EXTENSION    'バッチ ファイルの既定の拡張子
  530.     dlgCommon.Filter = DLG_OPENFILTER
  531.     dlgCommon.Flags = OFN_HIDEREADONLY + OFN_PATHMUSTEXIST
  532.     dlgCommon.Action = DLG_FILE_OPEN
  533.  
  534.     Open dlgCommon.Filename For Binary As nFilenum  '入力用のファイルを開きます。
  535.     sItemName = FILE_HEADER                     '入力用の文字列のサイズを設定します。
  536.     Get #nFilenum, 1, sItemName                 'ファイルのヘッダー情報を取得します。
  537.     If sItemName <> FILE_HEADER Then            '正しい印刷バッチ ファイルではありません。
  538.         MsgBox MB_INVALID_FILE, MB_ICONEXCLAMATION, MB_INVALID_FILE_TITLE
  539.         Close #nFilenum
  540.         Exit Sub
  541.     End If
  542.  
  543.     Get #nFilenum, , gnNumOfBatches                     'ファイル内のバッチ数を取得します。
  544.     nBat = 0
  545.     Do While (Not EOF(nFilenum)) And (nBat < gnNumOfBatches)
  546.         
  547.         nBat = nBat + 1                                 'バッチの数をインクリメントします。
  548.         
  549.         Get #nFilenum, , nSize                          'バッチ名のサイズを取得します。
  550.         gabtBatches(nBat).Name = String$(nSize, " ")    'フィールドのサイズを正確に計算します。
  551.         Get #nFilenum, , gabtBatches(nBat).Name         'バッチ名を取得します。
  552.  
  553.         Get #nFilenum, , gabtBatches(nBat).NumItems     'バッチ内の項目数を取得します。
  554.         For nItem = 1 To gabtBatches(nBat).NumItems          '一覧のすべての項目に対してループを実行します。
  555.  
  556.             Get #nFilenum, , nSize                      '項目名のサイズを取得します。
  557.             sItemName = String$(nSize, " ")             '入力用の文字列のサイズを設定します。
  558.             Get #nFilenum, , sItemName                  '項目名を取得します。
  559.             gabtBatches(nBat).Items(nItem).ItemName = sItemName     '項目名を設定します。
  560.             
  561.             Get #nFilenum, , nSize                      'テーブル名のサイズを取得します。
  562.             If nSize > 0 Then                           'テーブル名が存在する場合、
  563.                 sItemName = String$(nSize, " ")         '入力用の文字列のサイズを設定します。
  564.                 Get #nFilenum, , sItemName              'テーブル名を取得します。
  565.                 gabtBatches(nBat).Items(nItem).Table = sItemName    'テーブル名を設定します。
  566.             Else
  567.                 gabtBatches(nBat).Items(nItem).Table = ""           'テーブル名をクリアします。
  568.             End If
  569.  
  570.             Get #nFilenum, , nSize                      'フィルタ名のサイズを取得します。
  571.             If nSize > 0 Then                           'フィルタ名が存在する場合、
  572.                 sItemName = String$(nSize, " ")             '入力用の文字列のサイズを設定します。
  573.                 Get #nFilenum, , sItemName                  'フィルタ名を取得します。
  574.                 gabtBatches(nBat).Items(nItem).Filter = sItemName    'フィルタ名を設定します。
  575.             Else
  576.                 gabtBatches(nBat).Items(nItem).Filter = ""           'フィルタ名をクリアします。
  577.             End If
  578.  
  579.         Next
  580.  
  581.     Loop
  582.  
  583.     gnNumOfBatches = nBat                           'バッチの総数を保存します。
  584.     If gnNumOfBatches > 0 Then
  585.         cmdEdit.Enabled = True                      '[編集] ボタンを有効にします。
  586.         cmdCopy.Enabled = True                      '[コピー] ボタンを有効にします。
  587.         cmdDelete.Enabled = True                    '[削除] ボタンを有効にします。
  588.         cmdSave.Enabled = True                      '[保存] ボタンを有効にします。
  589.         cmdPrint.Enabled = True                     '[印刷] ボタンを有効にします。
  590.     Else
  591.         cmdEdit.Enabled = False                     '[編集] ボタンを無効にします。
  592.         cmdCopy.Enabled = False                     '[コピー] ボタンを無効にします。
  593.         cmdDelete.Enabled = False                   '[削除] ボタンを無効にします。
  594.         cmdSave.Enabled = False                     '[保存] ボタンを無効にします。
  595.         cmdPrint.Enabled = False                    '[印刷] ボタンを無効にします。
  596.     End If
  597.  
  598.     lstBatches.Clear                                '[バッチ名] ボックスの一覧をクリアします。
  599.     For nBat = 1 To gnNumOfBatches                  'すべてのバッチ項目に対してループを実行します。
  600.         lstBatches.AddItem gabtBatches(nBat).Name   'バッチ名を一覧に追加します。
  601.         lstBatches.ItemData(lstBatches.NewIndex) = nBat 'gabtBatches 配列での位置を保存します。
  602.     Next
  603.     lstBatches.ListIndex = 0
  604.  
  605.     gbNeedSave = False       '保存が必要でないことを示します。
  606.  
  607.     Close #nFilenum                                 'ファイルを閉じます。
  608.  
  609. Exit Sub
  610.  
  611. OpenError:
  612.     Select Case Err
  613.         Case CDERR_CANCEL   'ユーザーが保存のダイアログをキャンセルした場合
  614.             Exit Sub        'これ以降の処理を行わずにサブルーチンを終了します。
  615.         Case Else
  616.             Close #nFilenum  'ファイルを閉じます。
  617.             Error Err
  618.     End Select
  619.  
  620. End Sub
  621.  
  622. Sub cmdPrint_Click ()
  623. 'このプロシージャは、OLE オートメーションを使用して、
  624. '作業中のプロジェクト、または開いているすべてのプロジェクトで
  625. '指定されたバッチ項目を印刷します。ビュー、テーブル、フィルタ、
  626. 'またはレポートをプロジェクトに適用するときに発生したエラーは
  627. 'すべて無視して、残りのバッチ項目が続けて印刷されるようにします。
  628.  
  629. Dim nNumProjects As Integer                 '印刷するプロジェクトの数
  630. Dim iPrtBatch As Integer                    '選択されている印刷バッチの gabtBatches() でのインデックス
  631. Dim nProj As Integer                        '印刷するすべてのプロジェクトに対してループを実行するときに使用します。
  632. Dim nItems As Integer                       'すべてのバッチ項目に対してループを実行するときに使用します。
  633. Dim sItemName As String                     '項目の名前
  634. Dim sTableName As String                    'テーブルの名前
  635. Dim sFilterName As String                   'フィルタの名前
  636.  
  637.  
  638.     If bSetActiveProjObj() = False Then     '作業中のプロジェクトのオブジェクトを取得できない場合
  639.         MsgBox MB_NO_ACTIVEPROJECT, MB_ICONEXCLAMATION, MB_NO_ACTIVEPROJECT_TITLE
  640.         Exit Sub
  641.     End If
  642.     
  643.     On Error GoTo PrintError
  644.  
  645.     goProjApp.Alerts False                  'Microsoft Project のエラー メッセージを無効にします。
  646.  
  647.     frmMain.Hide                            '印刷中にフォームを非表示にします。
  648.  
  649.     iPrtBatch = lstBatches.ItemData(lstBatches.ListIndex)   '印刷するバッチ番号
  650.     
  651.     If optWhichProjects(0).Value = True Then    '作業中のプロジェクトだけを印刷します。
  652.         nNumProjects = 1
  653.     Else                                        'すべてのプロジェクトを印刷します。
  654.         nNumProjects = goProjApp.Projects.Count '開いているプロジェクトの数
  655.     End If
  656.  
  657.     For nProj = 1 To nNumProjects               'すべてのプロジェクトに対してループを実行します。
  658.         If nNumProjects > 1 Then
  659.             goProjApp.Projects(nProj).Activate  'プロジェクトをアクティブにします。
  660.         Else
  661.             goActiveProj.Activate               '作業中のプロジェクトをアクティブにします。
  662.         End If
  663.  
  664.         For nItems = 1 To gabtBatches(iPrtBatch).NumItems   'すべての項目に対してループを実行します。
  665.             sItemName = gabtBatches(iPrtBatch).Items(nItems).ItemName   'バッチ項目の名前
  666.             sTableName = gabtBatches(iPrtBatch).Items(nItems).Table     'テーブルの名前
  667.             sFilterName = gabtBatches(iPrtBatch).Items(nItems).Filter   'フィルタの名前
  668.  
  669.             If Left$(sItemName, Len(VIEWTXT)) = VIEWTXT Then            '項目がビューの場合
  670.                 goProjApp.ViewApply Right$(sItemName, Len(sItemName) - Len(VIEWTXT))           'ビューをプロジェクトに適用します。
  671.  
  672.                 If sTableName <> "" Then                                '指定されたテーブルがある場合
  673.                     goProjApp.TableApply Right$(sTableName, Len(sTableName) - Len(TABLETXT))   'テーブルをプロジェクトに適用します。
  674.                 End If
  675.  
  676.                 If sFilterName <> "" Then                               '指定されたフィルタがある場合
  677.                     goProjApp.FilterApply Right$(sFilterName, Len(sFilterName) - Len(FILTERTXT)) 'フィルタをプロジェクトに適用します。
  678.                 End If
  679.  
  680.                 goProjApp.FilePrint 1                                   'ビューを印刷します。
  681.  
  682.             ElseIf Left$(sItemName, Len(REPORTTXT)) = REPORTTXT Then    '項目がレポートの場合
  683.                 goProjApp.ReportPrint Right$(sItemName, Len(sItemName) - Len(REPORTTXT))   'レポートを印刷します。
  684.             End If
  685.             
  686.         Next
  687.     Next
  688.  
  689.     goProjApp.Alerts True                   'Microsoft Project のエラー メッセージを有効にします。
  690.  
  691.     frmMain.Show                            'フォームを再び表示します。
  692.  
  693. Exit Sub
  694.  
  695. PrintError:
  696.     Select Case Err
  697.  
  698.         Case 440        '"この状況では OLE メソッドは使用できません。"
  699.             Resume Next 'このエラーは、テーブルやフィルタに対応して
  700.                         'いないビューに、そのいずれかを適用しようとしたか、
  701.                         'または印刷できないビューを印刷しようとした場合に
  702.                         '生成されます。エラーの原因となるテーブル、フィルタ、
  703.                         'またはビューを適用せずに継続します。
  704.         Case Else
  705.             Error Err
  706.  
  707.     End Select
  708.  
  709. End Sub
  710.  
  711. Sub cmdSave_Click ()
  712. 'このプロシージャは、バッチの現在の一覧を、ユーザーが指定した
  713. 'ファイルに保存します。
  714.  
  715. Dim nFilenum As Integer                     '保存用のファイル番号
  716. Dim nSize As Integer                        '出力用の文字列のサイズ
  717. Dim nBat As Integer                         'バッチのループ カウンタ
  718. Dim nItem As Integer                        '項目のループ カウンタ
  719. Dim sHeader As String                       'ファイルのヘッダー情報
  720.  
  721.     mbCancelSave = False                    'フラグを False に初期化します。
  722.  
  723.     On Error GoTo SaveError
  724.  
  725.     nFilenum = FreeFile                     '未使用ファイルの番号を取得します。
  726.  
  727.     dlgCommon.CancelError = True            '[キャンセル] がクリックされた場合、エラーを生成します。
  728.     dlgCommon.DialogTitle = DLG_SAVE_TITLE
  729.     dlgCommon.DefaultExt = DLG_EXTENSION    'バッチ ファイルの既定の拡張子
  730.     dlgCommon.Filter = DLG_SAVEFILTER
  731.     dlgCommon.Flags = OFN_HIDEREADONLY + OFN_PATHMUSTEXIST + OFN_OVERWRITEPROMPT
  732.     dlgCommon.Action = DLG_FILE_SAVE        '[ファイル名を付けて保存] のダイアログを表示します。
  733.  
  734.     Open dlgCommon.Filename For Binary As nFilenum
  735.  
  736.     sHeader = FILE_HEADER                           'ファイルのヘッダー情報
  737.     Put #nFilenum, 1, sHeader                       'ヘッダー情報をファイルに書き込みます。
  738.     Put #nFilenum, , gnNumOfBatches                 'ファイルに含まれるバッチの数を書き込みます。
  739.     For nBat = 1 To gnNumOfBatches                  'すべてのバッチに対してループを実行します。
  740.         
  741.         nSize = Len(gabtBatches(nBat).Name)         'バッチ名のサイズを保存します。
  742.         Put #nFilenum, , nSize                      'バッチ名のサイズを書き込みます。
  743.         Put #nFilenum, , gabtBatches(nBat).Name     '最初のバッチの名前を書き込みます。
  744.         Put #nFilenum, , gabtBatches(nBat).NumItems 'バッチ項目の番号を書き込みます。
  745.         For nItem = 1 To gabtBatches(nBat).NumItems '項目内のすべての項目に対してループを実行します。
  746.             
  747.             '項目名のサイズを保存します。
  748.             nSize = Len(gabtBatches(nBat).Items(nItem).ItemName)
  749.             Put #nFilenum, , nSize                  '項目名のサイズを書き込みます。
  750.             '項目名をファイルに書き込みます。
  751.             Put #nFilenum, , gabtBatches(nBat).Items(nItem).ItemName
  752.             
  753.             'テーブル名のサイズを保存します。
  754.             nSize = Len(gabtBatches(nBat).Items(nItem).Table)
  755.             Put #nFilenum, , nSize                  'テーブル名のサイズを書き込みます。
  756.  
  757.             'テーブル名が存在する場合は、それをファイルに書き込みます。
  758.             If nSize > 0 Then
  759.                 Put #nFilenum, , gabtBatches(nBat).Items(nItem).Table
  760.             End If
  761.  
  762.             'フィルタ名のサイズを保存します。
  763.             nSize = Len(gabtBatches(nBat).Items(nItem).Filter)
  764.             Put #nFilenum, , nSize                  'テーブル名のサイズを書き込みます。
  765.  
  766.             'フィルタ名が存在する場合は、それをファイルに書き込みます。
  767.             If nSize > 0 Then
  768.                 Put #nFilenum, , gabtBatches(nBat).Items(nItem).Filter
  769.             End If
  770.  
  771.         Next
  772.             
  773.     Next
  774.     
  775.     gbNeedSave = False       '保存が必要でないことを示します。
  776.  
  777.     Close #nFilenum                                 'ファイルを閉じます。
  778.  
  779. Exit Sub
  780.  
  781. SaveError:
  782.     Select Case Err
  783.         Case CDERR_CANCEL       'ユーザーが保存のダイアログをキャンセルした場合
  784.             mbCancelSave = True 'ユーザーがキャンセルしたことを示すフラグを設定します。
  785.             Exit Sub            'これ以降の処理を行わずにサブルーチンを終了します。
  786.         Case Else
  787.             Close #nFilenum  'ファイルを閉じます。
  788.             Error Err
  789.     End Select
  790.  
  791. End Sub
  792.  
  793. Sub Form_Load ()
  794. 'このプロシージャは、アプリケーションを最初に起動したときに
  795. '呼び出されます。このプロシージャは、メインのフォームを画面の
  796. '中央に配置し、Microsoft Project のアプリケーション オブジェクトを取得し、
  797. '[バッチの定義] フォームをメモリにロードします。
  798.  
  799.     MousePointer = HOURGLASS
  800.  
  801.     mbCancelSave = False        'フラグを False に初期化します。
  802.  
  803.     'バッチ印刷プログラムが既に実行されているかどうかを調べ、
  804.     '実行されている場合は、別のインスタンスが起動されないようにします。
  805.     If App.PrevInstance Then
  806.         MsgBox MB_PREV_INSTANCE, MB_ICONEXCLAMATION, MB_PREV_INSTANCE_TITLE
  807.         End
  808.     End If
  809.  
  810.     gbNeedSave = False          '保存のフラグを False に設定します。
  811.  
  812.     gnNumOfBatches = 0          'バッチの数を 0 に初期化します。
  813.     Set goActiveProj = Nothing  'オブジェクトを Nothing に初期化します。
  814.     Set goProjApp = Nothing     'オブジェクトを Nothing に初期化します。
  815.  
  816.     frmMain.Top = (Screen.Height - frmMain.Height) / 2  'フォームを上下中央に配置します。
  817.     frmMain.Left = (Screen.Width - frmMain.Width) / 2   'フォームを左右中央に配置します。
  818.  
  819.     If bSetProjAppObj() = False Then  'Microsoft Project のアプリケーション オブジェクトを取得できない場合
  820.         MsgBox MB_NO_APP_OBJECT, MB_ICONSTOP, MB_NO_APP_OBJECT_TITLE
  821.         MousePointer = DEFAULT
  822.         End                         'プログラムを終了します。
  823.     End If
  824.  
  825.     If bSetActiveProjObj() = False Then     '作業中のプロジェクトのオブジェクトを取得できない場合
  826.         MsgBox MB_NO_ACTIVEPROJECT, MB_ICONEXCLAMATION, MB_NO_ACTIVEPROJECT_TITLE
  827.     End If
  828.  
  829.     Load frmBatchDef                '[バッチの定義] フォームをメモリにロードします。
  830.  
  831.     MousePointer = DEFAULT
  832.  
  833. End Sub
  834.  
  835. Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)
  836. 'このプロシージャは、バッチ ファイルを保存するかどうかをユーザーに
  837. '確認し、プログラムを閉じます。
  838.  
  839. Dim nReply As Integer       'メッセージ ボックスでクリックされたボタンの値
  840.  
  841.     If gbNeedSave Then
  842.         nReply = MsgBox(MB_QUERYSAVE, MB_YESNOCANCEL + MB_ICONQUESTION, MB_QUERYSAVE_TITLE)
  843.         Select Case nReply
  844.             Case IDCANCEL                   'ユーザーが [キャンセル] をクリックした場合
  845.                 Cancel = True
  846.                 Exit Sub
  847.             Case IDYES                      'ユーザーが [はい] (変更を保存) をクリックした場合
  848.                 cmdSave_Click               '保存のプロシージャを呼び出します。
  849.                 If mbCancelSave Then        'ユーザーが保存のプロシージャをキャンセルした場合
  850.                     mbCancelSave = False    'フラグをリセットします。
  851.                     Cancel = True
  852.                     Exit Sub                'プログラムを閉じずにサブルーチンを終了します。
  853.                 Else
  854.                     End                     'プログラムを閉じます。
  855.                 End If
  856.             Case IDNO                       'ユーザーが [いいえ] (変更を保存せずに終了) をクリックした場合
  857.                 End                         'プログラムを閉じます。
  858.         End Select
  859.     Else
  860.         End                                 'プログラムを閉じます。
  861.     End If
  862.  
  863.  
  864. End Sub
  865.  
  866.