■閉鎖した昔のブログの記事復活
[2025/05/12] 福井について:「天空の城・竹田城」と缶コーヒーのCMからの「大野城」 (No.423)
[2025/05/12] VB.NET:Spread(GrapeCity)シートのPDF出力と表示を行う方法 (No.422)
[2025/05/12] VB.NET:Spread(GrapeCity)CSV出力とCSV入力を使って、異なるSPREADコントロール間でシートデータのコピーを行う方法 (No.421)
[2025/05/12] VB.NET:Spread(GrapeCity)異なるSPREADコントロール間でシートデータのコピーを行う方法 (No.420)
[2025/05/12] VB.NET:Spread(GrapeCity)データ一覧表示での行選択処理(CellDoubleClickイベント , KeyDownイベント)その2 (No.419)
[2025/05/12] VB.NET:Spread(GrapeCity)シートのPDF出力と表示を行う方法 (No.422)
[2025/05/12] VB.NET:Spread(GrapeCity)CSV出力とCSV入力を使って、異なるSPREADコントロール間でシートデータのコピーを行う方法 (No.421)
[2025/05/12] VB.NET:Spread(GrapeCity)異なるSPREADコントロール間でシートデータのコピーを行う方法 (No.420)
[2025/05/12] VB.NET:Spread(GrapeCity)データ一覧表示での行選択処理(CellDoubleClickイベント , KeyDownイベント)その2 (No.419)
-
缶コーヒーBOSのCMで最近までは北海道新幹線にちなんだものでしたが、ここ1週間ぐらいは兵庫県朝来市の「竹田城」が舞台で、霧にかすんだ城址からジョーンズさん、タモリさん、満嶋さんが空に歩き出すユニークな感じです。
「竹田城」の入場が3月1日からの公開の再開に併せてCMを仕掛けたようです。大野市の「大野城」関係者にしてみれば、最近「天空の城」で売り出しているだけに、やられた感じがすのではないでしょうか。やはりこれぐらいのインパクトがあるとちょっと興味がわきます。大野市も何か仕掛けていかないと、観光での振興はままならないのでは。
「天空の城」もジブリのアニメ映画のラピュタからとったものですが、アニメ?漫画つながりということで、福井県のあわら市も「ちはやふる」で結構集客があったようです。
大野市も幕末の名君「土井利忠」やその家臣「内山良休・隆佐」兄弟を題材にした漫画を描いてもらったらどうでしょうか。「ちはやふる」の様に週刊誌の連載物で掲載後、人気が出れば映画や大河ドラマなどを目指して。
大河ドラマは福井県も「由利公正」を推していますが、幕末大野藩の歴史も福井藩に負けず劣らず、面白いものになると思います。
幕末の大野藩では、藩政改革を行い、直営の面谷鉱山を発展させ銅の産出でのもうけをもとに藩校明倫館・洋学館を建て大坂の適塾塾頭の伊藤慎蔵を招いた講義を行ったり、オランダ語の翻訳本を出していたそうです。また、軍制改革を行い洋式軍隊への転換や、大砲の鋳造をなどを行っています。さらに、「大野丸」という2本マストの帆船を建造し北海道との交易を行い、今のサハリン(北蝦夷地)開拓にも乗り出し、サハリンの一部を大野藩準領地としていました。
このあたりの史実を繋げていけば長編になりそうですが、漫画家のかた如何でしょうか?福井に北陸新幹線ができるころまでに盛り上がっていればいいとは思います。■天空の城・越前大野城
■結の故郷・越前大野
■大野市
=====2016/03/08:の時の情報
PR -
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:の時の情報
-
前回は、SPREADを使ってデータの一覧を表示し、セルダブルクリック(CellDoubleClick)もしくはキーダウン(KeyDown)イベント時に メッセージボックスを表示するという簡単な処理を行いました。
今回は少し進んで、セルダブルクリック及びキーダウンイベント時に、別フォームを作成し表示させてみます。 別フォームには3個のラベルを貼って、データ一覧の各カラムの内容を表示します。
フォームロード時にSPREADの初期化などは前回までと同様ですが、データ表示用の関数(DisplayOneData)を新規に作成し 行番号を引数で渡すことで別フォーム(Form2)を生成後、その行番号の各カラム値を3個のラベルに設定しています。 別フォームは「Show」メソッドで表示しています。
Imports FarPoint.Win Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADの設定 With Me.FpSpread1 'スクロールバーの設定 .HorizontalScrollBarPolicy = Spread.ScrollBarPolicy.AsNeeded .VerticalScrollBarPolicy = Spread.ScrollBarPolicy.AsNeeded '分割ボックスの設定 .ColumnSplitBoxPolicy = Spread.SplitBoxPolicy.Never .RowSplitBoxPolicy = Spread.SplitBoxPolicy.Never 'カーソル設定 .SetCursor(Spread.CursorType.Normal, Windows.Forms.Cursors.Arrow) .SetCursor(Spread.CursorType.LockedCell, Windows.Forms.Cursors.Arrow) 'セルがアクティブ時に編集モードにしない .EditModePermanent = False 'セルがアクティブ時に既存の内容を選択しない .EditModeReplace = False End With 'アクティブシートの設定 With Me.FpSpread1.ActiveSheet '選択状態 .SelectionStyle = Spread.SelectionStyles.SelectionRenderer '編集モードの設定 .OperationMode = Spread.OperationMode.SingleSelect '列のサイズ変更可、行のサイズ変更不可に設定する。 .Columns.Default.Resizable = True .Rows.Default.Resizable = False 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With '一覧データ表示 Call Me.DisplayData() 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.ToString("000")) .SetText(i, 2, "C" & i.ToString("000")) Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '先頭行を選択設定(1行目が選択色になる) Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1) End Sub 'Spreadダブルクリック時処理 Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object, ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick 'ヘッダーダブルクリックの場合抜ける If e.ColumnHeader = True Then Return End If 'シートにデータ行が在るか?? If FpSpread1.ActiveSheet.RowCount > 0 Then 'データ表示 Call DisplayOneData(e.Row) End If End Sub 'Spread KeyDown時処理 Private Sub FpSpread1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyDown 'Enterキー押下したとき If e.KeyCode = Windows.Forms.Keys.Enter Then 'データ表示 Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex) End If End Sub 'データ表示 Private Sub DisplayOneData(ByVal nRow As Integer) Dim form2 As New Form2 With form2 .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0) .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1) .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2) .Show() End With End Sub End Class
下図は、フォーム表示後、5行目をダブルクリックしてForm2を表示した時の表示です。
しかし、実際の動作としては、Form1でダブルクリック後、Form2が表示されるのですが、 フォーカスは依然としてForm1にあり、Form2はForm1の下に表示されます。 (キーダウン時の方は、Form2はForm1の上に表示されます)
この現象を避けるには、ダブルクリック時処理を以下の様にし、データ表示のフォーム表示メソッドを「ShowDialog」に変更することです。
'Spreadダブルクリック時処理 Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object, ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick 'ヘッダーダブルクリックの場合抜ける If e.ColumnHeader = True Then Return End If 'シートにデータ行が在るか?? If FpSpread1.ActiveSheet.RowCount > 0 Then 'デフォルト処理のキャンセル e.Cancel = True 'データ表示 Call DisplayOneData(e.Row) End If End Sub 'データ表示 Private Sub DisplayOneData(ByVal nRow As Integer) Dim form2 As New Form2 With form2 .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0) .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1) .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2) .ShowDialog() End With End Sub
もう一つ解決策がありまして、フォームの表示メソッドを「Show」のままで行う方法です。
ダブルクリック時にダブルクリックが在った証拠フラグをONし、 マウスアップ時にダブルクリックフラグがONならば、データ表示を行う様にすることです。 (マウスアップ時には、Form1からフォーカスが無くなる様です。)
一覧データ表示移行の部分を、以下のソースの様にします。
'ダブルクリックフラグ Private isSpdCellDoubleClick As Boolean = False 'Spreadダブルクリック時処理 Private Sub FpSpread1_CellDoubleClick(ByVal sender As System.Object, ByVal e As FarPoint.Win.Spread.CellClickEventArgs) Handles FpSpread1.CellDoubleClick 'ヘッダーダブルクリックの場合抜ける If e.ColumnHeader = True Then Return End If 'シートにデータ行が在るか?? If FpSpread1.ActiveSheet.RowCount > 0 Then 'デフォルト処理のキャンセル e.Cancel = True 'ダブルクリックフラグON isSpdCellDoubleClick = True End If End Sub 'Spreadマウスアップ時処理 Private Sub FpSpread1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseUp If Me.isSpdCellDoubleClick = True Then 'データ表示 Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex) End If 'ダブルクリックフラグOFF Me.isSpdCellDoubleClick = False End Sub 'Spread KeyDown時処理 Private Sub FpSpread1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles FpSpread1.KeyDown 'Enterキー押下したとき If e.KeyCode = Windows.Forms.Keys.Enter Then 'データ表示 Call DisplayOneData(Me.FpSpread1.ActiveSheet.ActiveRowIndex) End If End Sub 'データ表示 Private Sub DisplayOneData(ByVal nRow As Integer) Dim form2 As New Form2 With form2 .Label1.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 0) .Label2.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 1) .Label3.Text = Me.FpSpread1.ActiveSheet.GetValue(nRow, 2) .Show() End With End Sub
=====
2016/03/04:の時の情報