bigLiBox

備忘録だったり。読書メモだったり。ところで仕事が終わりそうにないんですが。

指定されたバイト数になるよう文字列をパディングする

共通処理にパディング演算するメソッドを作る。

以下の条件を指定できるようにしたい

  1. 文字を寄せる方向(右寄せor左寄せ)
  2. パディングするバイト数
  3. 埋め込み文字

パディングといえば
String.PadRight メソッド とかString.PadLeft メソッド だけど、
これは指定された文字数になるまで埋め込み文字を追加するので、
2バイト文字を含む文字列だと、バイト数がオーバーした文字列が生成されてしまう。

そこでこんな感じ。

''' <summary>
''' パディング
''' </summary>
''' <param name="targetData">対象文字列</param>
''' <param name="yose">寄せ("右"|"左")</param>
''' <param name="keta">桁(バイト数)</param>
''' <param name="moji">埋め込み文字</param>
''' <returns>演算結果データ</returns>
Public Shared Function Padding(ByRef targetData As String,
                               ByRef yose As String,
                               ByRef keta As Integer,
                               ByRef moji As String) As String
    If targetData Is Nothing Then
        targetData = ""
    End If

    Dim value As String = String.Empty

        'パディングする文字数を演算
        '(文字数 = 桁 - (対象文字列のバイト数 - 対象文字列の文字列数))
        Dim padLength As Integer = keta - (System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(targetData) - targetData.Length)

    If yose.Equals("右") Then
        '右寄せでパディング
        value = targetData.PadLeft(padLength, moji.ToCharArray()(0))
    ElseIf yose.Equals("左") Then
        '左寄せでパディング
        value = targetData.PadRight(padLength, moji.ToCharArray()(0))
        End If
        Return value
End Function

参考:

WinMergeの比較結果を出力する

WinMergeで比較した結果を出力する方法


方法1.レポートを生成する

1. メニューバーの[ツール(T)]\[レポートの生成(R)]を選択
f:id:bigLiBox:20161108110557p:plain
2. 保存先とファイル名を指定するとHTMLファイルが出力される

方法2.印刷する
1. メニューバーの[ファイル(F)]\[印刷(P)]を選択
f:id:bigLiBox:20161108110750p:plain
2. プリンタを選択して印刷する
※プリンタにCubePDFやXPS Document Writeを選択すればPDFやXPS形式のファイルに出力できる

参考:


追記(2016/11/18)
WinMergeの出力書式について考察した記事があったので追記。
たしかにHTMLで出力しても書式としていまいちだなーと思ってた。
差分の色がちゃんと着いてるのはわかりやすいけど。
Cygwinとかは私もちょっとよくわかんないので試してないけど
それよりコメントの方が気になる。

今更ですが、WinMergeで出力されたhtmlファイルをExcelで開くと、それっぽく貼り付けられた形になりますよ。お試しあれ。

へぇー。

やってみる。
f:id:bigLiBox:20161118145637p:plain
この比較結果をHTML形式でレポート出力して
f:id:bigLiBox:20161118145722p:plain
こんな感じになって、
このファイルを
f:id:bigLiBox:20161118145741p:plain
Excelで開くと、
f:id:bigLiBox:20161118145807p:plain
こうなる。
いい感じ。かと思いきや、
Excelで開くと、行単位での差分しかわからない。
(HTMLなら2行目の3文字めは薄い黄色で出てた)
まぁ、1行分を1セルに出力してるから文字単位で背景色変えるのは無理だわな。

参考:

キーボードを日本語配列に変更する(Windows7)

VMとかいじってるとたまに
キーボードが英字配列になっている。
対応をいつまでたっても覚えないので
参考URLメモ。


参考:

SQL Server にエクセルデータをインポートする

エクセルデータでテストデータを作成し、
SQL Server Management Studioでインポートする方法。

特にデータソースの選択をした後
「次へ」ボタン押下でエラーポップアップが出た。
SQL Server Management Studioがインストールされてるのは
 テスト用に用意した環境で、そっちにはOfficeがインストールされてないせい??)

参考URLに記載の通り、「AccessDatabaseEngine.exe」をダウンロードすることで解決。

参考:
【SQL Server】エクセルをテーブルに取り込む方法

ExceptionからSQL Server の一意制約違反を検知する

システム用のExceptionクラス(hogeException)がありまして。
共通処理はExceptionすべてhogeException型にして投げてくる。

クエリを実行する共通処理があって、
Exceptionの中でも一意制約エラーが発生した場合を検知したい。

これでいけたらいいんだけど・・・。

 Private Function InsertRecord(ByVal dataRecordInfo() As String, ByVal insertColumnIchi As Dictionary(Of String, Integer)) As Integer
        Dim effectCount As Integer = 0     '影響を受けた行数

        Dim sql As String = "INSERT INTO [TMP_TABLE] ([CODE],[VALUE]) VALUES (@Code ,@Value)"

        Try
                effectCount = Me.CommonLogic.ExecDBQuery(sql, paramNames, paramValues, paramTypes, -1)
            Catch hogeEx As hogeException
                If Not IsNothing(hogeEx.InnerException) Then
                    Dim ex As Exception = GetInnerException(hogeEx.InnerException)
                    If TypeOf ex Is SqlException Then
                        If CType(ex, SqlException).Number = 2627 Then
                            'レコード登録時に、一意制約エラーが発生した場合
                            Console.WriteLine("一意制約エラー発生")
                            Exit Try
                        End If
                    End If
                End If

                Throw New hogeException("エラーID", hogeEx)
            End Try
            Return effectCount
    End Function

    Private Function GetInnerException(ex As Exception) As Exception
        If IsNothing(ex.InnerException) Then
            Return ex
        End If
        Return GetInnerException(ex.InnerException)
    End Function
  • 参考

GridViewのRowUpdatedでPRIMARY KEY違反をハンドルする方法

フォーム内のすべてのボタンを非活性にする

ボタンの2重押下防止としてボタンをすべて非活性にしてみたかった件。
全部のボタンコントロールを1個1個コード書くのは大変なので、
コントロールをすべて取得する。

 ''' <summary>
    ''' 使用可能コントロール(ボタン)切替処理
    ''' </summary>
    ''' <param name="hParent">切り替え対象コントロール</param>
    ''' <param name="enable">活性化:True、非活性化:False</param>
    Public Shared Sub ChangeButtonEnabled(ByVal hParent As Control, ByVal enable As Boolean)

        ' hParent 内のすべてのコントロールを取得する
        For Each cControl As Control In hParent.Controls
            ' 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする
            If cControl.HasChildren Then
                ChangeButtonEnabled(cControl, enable)
            End If

            ' コントロールの型が Button の場合、Enabledプロパティを切り替える
            If TypeOf cControl Is Button Then
                cControl.Enabled = enable
            End If
        Next cControl

    End Sub

これでボタンを非活性にすることはできたが、
非活性にしてても、その間に非活性されているボタンを押下すると
あとからボタン押下イベントが発生する。。。

ボタンの2重押下防止の方法はいろいろ試したけど
どうにも意図した通りに動かないので
BackgroundWorkerで時間のかかる処理を実行させることにした。

別スレッドでやるなら、ボタンを非活性じゃなくて
フォーム毎非活性にすることにしたよ。

Delegate Sub CallbackChangeEnabled(ByVal enable As Boolean)

''' <summary>
''' 使用可能コントロール切替処理
''' </summary>
''' <remarks></remarks>
Private Sub ChangeEnabled(ByVal enable As Boolean)
    If Me.InvokeRequired Then
        Dim d As New CallbackChangeEnabled(AddressOf ChangeEnabled)
        Me.Invoke(d)
    Else
        Me.Enabled = enable
    End If
End Sub

参考:

DataGridViewの行ヘッダに行番号を表示する

DataGridViewの行ヘッダを表示するようにし、

  • 項目名の文字列を表示する一覧
  • 行番号を表示する一覧

をそれぞれ作った。

詳細記載する時間がないので、とりあえず参考にしたリンクのみメモ。
参考: