-
ラベルプリンタメーカ「SATO」のラベル発行コンポーネント(MLComponent.dll)を使ったラベル印刷の 紹介ですが、まず最初にラベルプリンタの接続確認を行います。今回仕事で使ったプリンタがUSB接続でしたので 例としてUSBのみとなります。
■MLComponent.dllのインストール
以下のURLのページの真ん中あたりに「Multi LABELIST Component」のダウンロードファイルが在りますので、 必要なものをダウンロードし、インストールします。
・Multi LABELIST Component / Component Plus
デフォルトでインストールすると「MLComponent.dll」が「C:\Program Files\SATO\ML Component」に在るはずです。
VB.NETの参照設定で「MLComponent.dll」を追加します。
このコンポーネントですが、.NET Framework 4.0または4.5または4.6に対応している開発環境でしか使えないので Visual Studio 2010以降限定です。Visual Studio 2005/2008では使用できません。
■プリンタ状態チェック関数
関数内ではまず「MLComponent」のインスタンスを生成します。
その後「Setting」プロパティによって通信パラメータを設定します。 プリンタとの接続方法が、LAN、USB、RS232C、Bluetooth、プリンタドライバなどがありますが 今回はUSBですので、"USB:"の設定値となります。その他の設定はマニアルを見てください。
「Protocol」プロパティはUSBですので、「Protocols.Status4」となります。
その後、「OpenPort」メソッドにより接続を開始しますが、 結果が0ではない場合は、電源が入っていないかケーブルが抜けているかの原因になります。
接続後は、プリンタの状態を「GetStatus」メソッドにより行います。 返されるStatus文字列の3文字目にエラー判別文字がありますので、それによってメッセージを付けています。 尚、このメソッドが0以外を返す場合は、メソッドエラーになります。
Module Module1 'SATOプリンタの接続テスト Public Sub Main() Dim str As String = "" Dim fChk As Boolean = CheckPrinter(str) MsgBox(str) End Sub ''' <summary>プリンタ状態チェック</summary> ''' <param name="strErr">エラーメッセージ</param> ''' <returns>状態結果(True:OK, False:NG)</returns> Private Function CheckPrinter(ByRef strErr As String) As Boolean '戻り値初期化 CheckPrinter = False 'MLComponentの宣言 Dim MLComponent As SATO.MLComponent.MLComponent = New SATO.MLComponent.MLComponent Try '出⼒先の設定(USBを指定します。) MLComponent.Setting = "USB:" MLComponent.Protocol = SATO.MLComponent.Protocols.Status4 '接続 Dim Result As Integer = MLComponent.OpenPort(1) If Result <> 0 Then strErr = "プリンタの電源等(ケーブル)を確認してください。(" & Result.ToString & ")" Exit Function End If 'プリンタの状態確認 Dim Status As String = "" Result = MLComponent.GetStatus(Status) ' ステータス取得 If Result <> 0 Then strErr = "プリンタ状態取得エラー No." & Result.ToString Exit Function End If 'エラーコードの確認 Dim strCode As String = Mid$(Status, 3, 1) Select Case strCode Case "0", "1", "2", "3" strErr = "オフライン状態" Case "A", "B", "G", "H", "M", "N", "S", "T" 'オンライン状態・送信可 strErr = "" Case "C", "D" strErr = "オンライン状態・受信待ち" Case "I", "J" strErr = "オンライン状態・印字中" Case "O", "P" strErr = "オンライン状態・待機中" Case "U", "V" strErr = "オンライン状態・解析・編集中" Case "a" strErr = "エラー検出・受信バッファフル" Case "b" strErr = "エラー検出・ヘッドオープン" Case "c" strErr = "エラー検出・ペーパーエンド" Case "d" strErr = "エラー検出・リボンエンド" Case "e" strErr = "エラー検出・メディアエラー" Case "f" strErr = "エラー検出・センサーエラー" Case "g" strErr = "エラー検出・ヘッドエラー" Case "h" strErr = "エラー検出・カバーオープン" Case "i" strErr = "エラー検出・カードエラー" Case "j" strErr = "エラー検出・カッタエラー" Case "k" strErr = "エラー検出・その他のエラー" Case "l" strErr = "エラー検出・カッタセンサーエラー" Case "m" strErr = "エラー検出・スタッカフル&リファインダフル" Case "o" strErr = "エラー検出・IC タグエラー" Case Else strErr = "その他" End Select If strErr = "" Then strErr = "接続正常" CheckPrinter = True Else 'エラー strErr = "プリンタエラー:(" & strCode & ") " & strErr End If '切断 Result = MLComponent.ClosePort If Result <> 0 Then strErr = "切断エラー No." & Result.ToString CheckPrinter = False End If Catch ex As Exception strErr = "PGエラー:" & ex.ToString Finally MLComponent = Nothing End Try End Function End Module
=====
2016/03/08:の時の情報
PR -
缶コーヒーBOSのCMで最近までは北海道新幹線にちなんだものでしたが、ここ1週間ぐらいは兵庫県朝来市の「竹田城」が舞台で、霧にかすんだ城址からジョーンズさん、タモリさん、満嶋さんが空に歩き出すユニークな感じです。
「竹田城」の入場が3月1日からの公開の再開に併せてCMを仕掛けたようです。大野市の「大野城」関係者にしてみれば、最近「天空の城」で売り出しているだけに、やられた感じがすのではないでしょうか。やはりこれぐらいのインパクトがあるとちょっと興味がわきます。大野市も何か仕掛けていかないと、観光での振興はままならないのでは。
「天空の城」もジブリのアニメ映画のラピュタからとったものですが、アニメ?漫画つながりということで、福井県のあわら市も「ちはやふる」で結構集客があったようです。
大野市も幕末の名君「土井利忠」やその家臣「内山良休・隆佐」兄弟を題材にした漫画を描いてもらったらどうでしょうか。「ちはやふる」の様に週刊誌の連載物で掲載後、人気が出れば映画や大河ドラマなどを目指して。
大河ドラマは福井県も「由利公正」を推していますが、幕末大野藩の歴史も福井藩に負けず劣らず、面白いものになると思います。
幕末の大野藩では、藩政改革を行い、直営の面谷鉱山を発展させ銅の産出でのもうけをもとに藩校明倫館・洋学館を建て大坂の適塾塾頭の伊藤慎蔵を招いた講義を行ったり、オランダ語の翻訳本を出していたそうです。また、軍制改革を行い洋式軍隊への転換や、大砲の鋳造をなどを行っています。さらに、「大野丸」という2本マストの帆船を建造し北海道との交易を行い、今のサハリン(北蝦夷地)開拓にも乗り出し、サハリンの一部を大野藩準領地としていました。
このあたりの史実を繋げていけば長編になりそうですが、漫画家のかた如何でしょうか?福井に北陸新幹線ができるころまでに盛り上がっていればいいとは思います。■天空の城・越前大野城
■結の故郷・越前大野
■大野市
=====2016/03/08:の時の情報
-
SPREADには、シートのそのままをPDFに出力する機能が備わっています。 「SheetView」クラスの「PrintInfo」のPDF出力の指示を行えば、「SheetView」の印刷メソッドでPDF出力ができます。
以下のソースですが、「Button1_Click」の前までは以前のソースを踏襲していまして、 単に単一行選択表示で1000行3カラムのテストデータを表示しています。
「Button1_Click」の中で、PDFファイルへの出力処理を行っています。 「ActiveSheet.PrintInfo」の「PrintToPdf」をTrueに設定し、「PdfFileName」にPDF出力ファイル名を設定しています。 その後、SPREADコントロールの「PrintSheet」メソッドで「ActiveSheet」の印刷処理を行います。
ここで注意点があります。「PrintSheet」メソッドの直後でのPDFファイルの表示処理がコメントになっていますが、 コメント部分を実行に戻して処理すると、「AcrobatReader」は起動するのですがPDFファイルが見つからないとエラーになります。 「PrintSheet」メソッドの直後ではタイミング的に、まだPDFファイルの出力が終了していないので、エラーになる様です。
そこで解決方法として、「PrintSheet」メソッドの終了時点で「AcrobatReader」を起動することになります。 ちょうど「PrintMessageBox」イベントがそれに当たります。引数の「e」の「BeginPrinting」が「False」になった時が 「PrintSheet」が終わったことを通知してくれますので、そのタイミングで「AcrobatReader」起動の関数をコールします。
Imports FarPoint.Win.Spread Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADの初期化 Call InitilayzeSpread(Me.FpSpread1) '一覧データ表示 Call Me.DisplayData() End Sub 'SPREADの初期化 Private Sub InitilayzeSpread(ByVal spd As FpSpread) 'SPREADの設定 With spd 'スクロールバーの設定 .HorizontalScrollBarPolicy = ScrollBarPolicy.AsNeeded .VerticalScrollBarPolicy = ScrollBarPolicy.AsNeeded '分割ボックスの設定 .ColumnSplitBoxPolicy = SplitBoxPolicy.Never .RowSplitBoxPolicy = SplitBoxPolicy.Never 'カーソル設定 .SetCursor(CursorType.Normal, Windows.Forms.Cursors.Arrow) .SetCursor(CursorType.LockedCell, Windows.Forms.Cursors.Arrow) 'セルがアクティブ時に編集モードにしない .EditModePermanent = False 'セルがアクティブ時に既存の内容を選択しない .EditModeReplace = False End With 'アクティブシートの設定 With spd.ActiveSheet '選択状態 .SelectionStyle = SelectionStyles.SelectionRenderer '編集モードの設定 .OperationMode = OperationMode.SingleSelect '列のサイズ変更可、行のサイズ変更不可に設定する。 .Columns.Default.Resizable = True .Rows.Default.Resizable = False 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub '一覧データ表示 Private Sub DisplayData() 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 .SetText(i, 0, "A" & i.ToString("000")) .SetText(i, 1, "B" & (i Mod 100).ToString("000")) '100で割った余り .SetText(i, 2, "C" & (i Mod 10).ToString("000")) '10で割った余り Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '先頭行を選択設定(1行目が選択色になる) Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1) End Sub 'PDF出力ボタン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'アクティブシートをPDFとして出力 Me.FpSpread1.ActiveSheet.PrintInfo.PrintToPdf = True 'PDFファイル名 Me.FpSpread1.ActiveSheet.PrintInfo.PdfFileName = "test.pdf" 'アクティブシートをPDFとして印刷 Me.FpSpread1.PrintSheet(Me.FpSpread1.ActiveSheet) ''PDF表示 'Call DispPdf("test.pdf") End Sub Private Sub FpSpread1_PrintMessageBox(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.PrintMessageBoxEventArgs) Handles FpSpread1.PrintMessageBox '印刷終了タイミングか?? If e.BeginPrinting = False Then 'PDF表示 Call DispPdf("test.pdf") End If End Sub '拡張子PDFに関連付けられているAcrobatReader起動 Private Sub DispPdf(ByVal strFileName As String) Dim pStartInfo As New ProcessStartInfo Dim p As New Process With pStartInfo .FileName = strFileName .CreateNoWindow = False .WindowStyle = ProcessWindowStyle.Normal End With 'プロセスのStartInfoプロパティに設定 p.StartInfo = pStartInfo If p.Start() = True Then 'AcrobatReaderの終了を待つ p.WaitForExit() Else MsgBox("起動に失敗しました。") End If End Sub End Class
下図は、プログラムが起動しした時の表示です。
下図は、「Button1」をクリックした時の表示です。
=====
2016/03/07:の時の情報
-
前回は、異なるSPREADのシート間でのコピーを、クリップボードを使う方法と、XML文字列を使う方法で行いましたが、 今回はCSVファイルへの出力と入力を使って行います。
ソースのほとんどは「異なるSPREADのシート間でのコピー」のものと同じなので、「Button1」クリックでの処理が異なる部分のみ以下に示します。
コピー元のActiveSheetの「SaveTextFile」メソッドを使うことで”test.csv”にCSV出力します。 その後、コピー先のActiveSheetの「LoadTextFile」メソッドで”test.csv”をCSV入力します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'SPREAD1の全部を[test.csv]ファイルに出力 Me.FpSpread1.ActiveSheet.SaveTextFile("test.csv", _ TextFileFlags.ForceCellDelimiter, _ Model.IncludeHeaders.None, _ Chr(13) & Chr(10), _ ",", "") 'SPREAD2に[test.csv]ファイルから入力 Me.FpSpread2.ActiveSheet.LoadTextFile("test.csv", _ TextFileFlags.ForceCellDelimiter, _ Model.IncludeHeaders.None, _ Chr(13) & Chr(10), _ ",", "") End Sub
下図は、「Button1」クリック後の表示です。
=====
2016/03/05:の時の情報
-
異なるSPREADのシート間でのコピーを行う方法が2種類あります。 一つはクリップボードを使う方法と、XML文字列を使う方法です。
■クリップボードを使う方法
コピー元のActiveSheetの「ClipboardCopy」メソッドを使うことで、指定された範囲のセルをクリップボードにコピーします。 その後、コピー先のActiveSheetの行・列の数を合わせておいて、「ClipboardPaste」メソッドで貼付を行います。 以下のソースでは、「Button1_Click」の処理です。
■XML文字列を使う方法
コピー元のシートを「GetObjectXml」メソッドにてシリアライズ化しXML文字列化します。 その後、コピー先のシートに「SetObjectXml」メソッドにてXML文字列を逆シリアライズ化してやります。 以下のソースでは、「Button2_Click」の処理です。
尚、ここではやっていませんが、数式を含むシートの場合には、シートの追加後にLoadFormulasメソッドを呼び出すことで数式が有効になるそうです。
Imports FarPoint.Win.Spread Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADの初期化 Call InitilayzeSpread(Me.FpSpread1) Call InitilayzeSpread(Me.FpSpread2) '一覧データ表示 Call Me.DisplayData() End Sub 'SPREADの初期化 Private Sub InitilayzeSpread(ByVal spd As FpSpread) 'SPREADの設定 With spd 'スクロールバーの設定 .HorizontalScrollBarPolicy = ScrollBarPolicy.AsNeeded .VerticalScrollBarPolicy = ScrollBarPolicy.AsNeeded '分割ボックスの設定 .ColumnSplitBoxPolicy = SplitBoxPolicy.Never .RowSplitBoxPolicy = SplitBoxPolicy.Never 'カーソル設定 .SetCursor(CursorType.Normal, Windows.Forms.Cursors.Arrow) .SetCursor(CursorType.LockedCell, Windows.Forms.Cursors.Arrow) 'セルがアクティブ時に編集モードにしない .EditModePermanent = False 'セルがアクティブ時に既存の内容を選択しない .EditModeReplace = False End With 'アクティブシートの設定 With spd.ActiveSheet '選択状態 .SelectionStyle = SelectionStyles.SelectionRenderer '編集モードの設定 .OperationMode = OperationMode.SingleSelect '列のサイズ変更可、行のサイズ変更不可に設定する。 .Columns.Default.Resizable = True .Rows.Default.Resizable = False 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub '一覧データ表示 Private Sub DisplayData() 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 .SetText(i, 0, "A" & i.ToString("000")) .SetText(i, 1, "B" & (i Mod 100).ToString("000")) '100で割った余り .SetText(i, 2, "C" & (i Mod 10).ToString("000")) '10で割った余り Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '先頭行を選択設定(1行目が選択色になる) Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'SPREAD1の全部をクリップボードにコピー With Me.FpSpread1.ActiveSheet .ClipboardCopy(New Model.CellRange(0, 0, .RowCount, .ColumnCount)) End With 'SPREAD2 With Me.FpSpread2.ActiveSheet 'SPREAD2の行列数を設定 .RowCount = Me.FpSpread1.ActiveSheet.RowCount .ColumnCount = Me.FpSpread1.ActiveSheet.ColumnCount 'SPREAD2にペースト .SetActiveCell(0, 0) .ClipboardPaste(FarPoint.Win.Spread.ClipboardPasteOptions.All) 'SPREAD2の選択状態を解除 .ClearSelection() End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim pstrXML As String 'Sheet情報をxml形式で取得 pstrXML = FarPoint.Win.Serializer.GetObjectXml (CType(Me.FpSpread1.ActiveSheet, FarPoint.Win.ISerializeSupport), "Sheet") '取得した情報を設定 FarPoint.Win.Serializer.SetObjectXml (CType(Me.FpSpread2.ActiveSheet, FarPoint.Win.ISerializeSupport), pstrXML, "Sheet") End Sub End Class
下図は、プログラムが起動した時の表示です。
下図は、「Button2」をクリック後の表示です。「Button1」と「Button2」では若干結果が異なります。 「Button1」では行選択状態はコピーされず、左上のセルがアクティブになります。 「Button2」は行選択状態もコピーされる様です。
=====
2016/03/05:の時の情報