[.Net]DateTimePickerでエラー

久しぶりに、プログラミングネタです。
【VisualBasic .Net 2012】

2017-02-01-01.jpg


DateTimePickerを使っている時、以下の様なエラーになる場合があります。

Year、Month および Day パラメーターが表現できない DateTime を示しています。

2017-02-01-02.jpg


多分ですが、CustomFormatで、"yyyy/MM"の様な日付を表示しない場合に起こります。
具体的には、月を変更した際、変更前の月の月末日が、変更後の月の月末日に存在しない時に起こります。
例えば、2016年3月(内部では31日) ⇒ 2016年2月(内部では31日のまま!?) といった場合です。

私の場合、Changeイベントをハンドリングできなかったので、DateTimePickerの派生クラスを作り、その中のChangeイベントで対応しました。

2017-02-01-03.jpg
①DateTimePickerのユーザコントロールを作って、、、


2017-02-01-05.jpg
②Changeイベントで、日付を明示的にプラスマイナス1するだけです。

Public Class NewDateTimePicker
Public Sub New()
AddHandler ValueChanged, AddressOf DateTimePickerEx_ValueChanged
Value = DateTime.Now
CustomFormat = "yyyy年MM月"
Format = System.Windows.Forms.DateTimePickerFormat.Custom
End Sub

Private Sub DateTimePickerEx_ValueChanged(sender As Object, e As EventArgs)
Value = Value.AddDays(Value.Day * -1 + 1)
End Sub
End Class



2017-02-01-04.jpg
③後は、既存のコントロールを置換えるだけでOKです。



2017-02-01-06.jpg
全然関係ないですが、.Net2012と2016、併用するのが細かいところで少し面倒、、、ショートカットとか違ったりするし、、、(´・ω・`)



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : パソコンサポート
ジャンル : コンピュータ

.Net CompackFrameWork で PDA(PocketPC) を再起動

.Net CF(CompackFrameWork) で PDA(PocketPC) を再起動

今やっている開発で、どうしても定期的なPDAの再起動が必要になりました。
フリーソフトも探したければ、インストールやら設定やらと、、、
インストーラにすべて組み込めないため、数十台に配布するのはムり、、、
とても運用に耐えられない(-_-;)

というわけで、.Net(VB)CFアプリに組み込みました。
サンプルが"C"ばっかりだったので、VB板を残しておきます。
誰かの参考になれば、、、(-。-)y-゜゜゜

ちなみに、"<",">"は半角にしてね。

・開発環境).WinXP(VirtualPC)
      .NetCF(VB)2008
      .PDA(WindowsMobile5.0)
      .SQLServerCE2008


#Region "■■■ DllImport宣言 ■■■"

  '--------------------------------------------------
  ' 再起動関連
  '--------------------------------------------------

  <DllImport("CoreDll.Dll")> _
  Private Shared Function KernelIoControl( _
    ByVal dwIoControlCode As Integer, _
    ByVal lpInBuf As IntPtr, _
    ByVal nInBufSize As Integer, _
    ByVal lpOutBuf As IntPtr, _
    ByVal nOutBufSize As Integer, _
    ByRef lpBytesReturned As Integer) As Integer
  End Function

  Private Shared Sub SetCleanRebootFlag()
  End Sub

#End Region

#Region "■■■ 関数(再起動関連) ■■■"
  ''' <summary>
  ''' PDA再起動
  ''' </summary>
  ''' <remarks></remarks>
  Public Shared Sub gsHardReset()

    Dim IOCTL_HAL_REBOOT As Integer = &H101003C
    Dim bytesReturned As Integer = 0

    '起動時にハードリセットを行うフラグを立てる
    Call SetCleanRebootFlag()

    '再起動
    Call KernelIoControl(IOCTL_HAL_REBOOT, _
            IntPtr.Zero, 0, _
            IntPtr.Zero, 0, bytesReturned)

  End Sub
#End Region



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

メール送信(Windows標準のCDOオブジェクトを利用)について

メール送信(Windows標準のCDOオブジェクトを利用)

CDO(Microsoft Collaboration Data Objects)を利用したメールの送信方法についてです。
CDOの参照設定を行ったほうが,より使い易くなりますが,あえて環境に依存しない方法で
作成しました。この方法だとVB以外にも,Excel(VBA)やWSH(VBScript)でも使用できます。

下記の説明でうまくいかない場合は、サンプルをお試しください。
⇒ って、これもブログにサンプルを移植できませんでした。m(__)m

#Region "■■■ 定数宣言 ■■■"

  '--------------------------------------------------
  ' CDO関連の定数
  '--------------------------------------------------

  Private Const cdoSendUsingMethod = "http://schemas.microsoft.com/cdo/configuration/sendusing"
  Private Const cdoSMTPServer = "http://schemas.microsoft.com/cdo/configuration/smtpserver"
  Private Const cdoSMTPServerPort = "http://schemas.microsoft.com/cdo/configuration/smtpserverport"
  Private Const cdoSMTPConnectionTimeout = "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"
  Private Const cdoSMTPAuthenticate = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
  Private Const cdoSendUsingPort = 2
  Private Const cdoAnonymous = 0
  Private Const cdoBasic = 1
  Private Const cdoNTLM = 2
  Private Const cdoShift_JIS = "shift-jis"
  Private Const cdoSendUserName = "http://schemas.microsoft.com/cdo/configuration/sendusername"
  Private Const cdoSendPassword = "http://schemas.microsoft.com/cdo/configuration/sendpassword"

#End Region


#Region "■■■ 変数宣言 ■■■"

  '--------------------------------------------------
  ' Mail関連
  '--------------------------------------------------

  Public Structure objMail
    Public objFrom As String       '差出人
    Public objSMTPServer As String    'SMTPサーバ
    Public objSMTP_FLG As Boolean    'SMTPサーバ認証
    Public objUserName As String     'SMTPサーバ認証:ユーザ名
    Public objPassWord As String     'SMTPサーバ認証:パスワード
    Public objTo As String        '宛先(複数指定はセミコロン(;)区切りで指定可)
    Public objCC As String        'CC(複数指定はセミコロン(;)区切りで指定可)
    Public objBCC As String       'BCC(複数指定はセミコロン(;)区切りで指定可)
    Public objSubject As String     '件名
    Public objBody As String       '本文
    Public objAttachment() As String   '添付ファイル
  End Structure

#End Region


#Region "■■■ 関数 ■■■"
  '==============================================================================
  '
  ' メール送信
  '
  ' ------------------------------------------------------------------------
  ' 説明 : メールオブジェクトの内容にしたがってメールを送信する
  '
  ' ------------------------------------------------------------------------
  ' 引数 : objMailSet     メールオブジェクトセット
  '    strErrMsg      エラーメッセージ
  ' 戻値 : True:成功、False:失敗
  '
  '==============================================================================

  Public Function fncMailSend(ByVal objMailSet As objMail, _
                Optional ByRef strErrMsg As String = "") As Boolean

    Dim oMsg As Object
    Dim intCnt As Integer

    Try

      '--------------------------------------------------
      ' メール送信
      '--------------------------------------------------

      'CDOオブジェクト作成
      oMsg = CreateObject("CDO.Message")

      'CDOオブジェクト設定&送信
      With oMsg
        '差出人
        .From = objMailSet.objFrom

        '宛先,件名,本文設定
        .To = objMailSet.objTo
        .CC = objMailSet.objCC
        .BCC = objMailSet.objBCC
        .Subject = objMailSet.objSubject
        .TextBody = objMailSet.objBody

        '添付ファイル設定
        For intCnt = 0 To objMailSet.objAttachment.GetUpperBound(0)
          If objMailSet.objAttachment(intCnt).ToString <> "" Then
            .AddAttachment(objMailSet.objAttachment(intCnt).ToString)
          End If
        Next

        'SMTPサーバ設定
        If objMailSet.objSMTPServer <> "" Then
          With .Configuration.Fields

            'SMTPサーバ
            .Item(cdoSendUsingMethod) = cdoSendUsingPort
            .Item(cdoSMTPServer) = objMailSet.objSMTPServer
            .Item(cdoSMTPServerPort) = 25

            'SMTP認証
            If objMailSet.objSMTP_FLG Then
              .Item(cdoSMTPAuthenticate) = cdoAnonymous
              .Item(cdoSendUserName) = objMailSet.objUserName
              .Item(cdoSendPassword) = objMailSet.objPassWord
            End If

            '設定更新
            .Update()
          End With
        End If

        'メール送信
        .Send()

      End With

      'CDOオブジェクト解放
      oMsg = Nothing


      '--------------------------------------------------
      ' 戻り値設定
      '--------------------------------------------------

      Return True

    Catch ex As Exception

      '--------------------------------------------------
      ' エラーメッセージ設定
      '--------------------------------------------------

      strErrMsg = "メール送信中にエラーが発生しました。" & vbCrLf & _
            "ネットワーク管理者(プロバイダ)にお問い合わせください。" & vbCrLf & _
            "詳細は以下のとおり" & vbCrLf & _
            ex.Message


      '--------------------------------------------------
      ' 戻り値設定
      '--------------------------------------------------

      Return False

    End Try

  End Function
#End Region



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

ファイル圧縮(コマンドプロンプト実行)について

ファイル圧縮(コマンドプロンプト実行)

指定したファイルを圧縮(Windows標準のCAB形式)します。
実際には、fncProcRunという関数がプロセスを実行しています。
(この関数については、プロセス実行(アプリケーションの実行)を参照して下さい。)

Windows標準のCab形式で圧縮するため、特にアーカイバなど外部DLLなどは不要でできるので、フリーソフトを利用できない環境(サーバとか)でもファイル圧縮が可能です。ただ、あまり高級な設定はできませんが、、、
またこのやり方は、コマンドプロンプトを実行しているので、コマンド作成部分を引数にすれば、圧縮("MakeCab"コマンド)に限らず、様々なコマンドを実行したい場合に利用できます。

'==============================================================================
'
' ファイル圧縮
'
' ------------------------------------------------------------------------
' 説明 : 指定したファイルを圧縮(CAB形式)する
'
' ------------------------------------------------------------------------
' 引数 : strSourceFile   圧縮元ファイル名(フルパス)
'    strCabFile    圧縮先ファイル名(フルパス)
'    blnCreateNoWindow ウィンドウ表示
'    strErrMsg     エラーメッセージ
' 戻値 : True:成功、False:失敗
'
'==============================================================================

Public Function fncCabMake(ByVal strSourceFile As String, ByVal strSourceFile As String, _
                ByVal blnCreateNoWindow As Boolean, ByRef strErrMsg As String) As Boolean
  Dim strMakeCabCmd As String
  Dim intRet As Integer
  Dim strRet As String = ""
  Dim strOldCabPath As String = ""
  Dim strNewCabPath As String = ""

  Try

    '--------------------------------------------------
    ' コマンド作成
    '--------------------------------------------------

    strMakeCabCmd = "makecab """ & strSourceFile & """ """ & strCabFile & """"


    '--------------------------------------------------
    ' コマンド実行
    '--------------------------------------------------

    'コマンド実行
    intRet = fncProcRun(System.Environment.GetEnvironmentVariable("ComSpec"), _
         "/c " & strMakeCabCmd, blnCreateNoWindow, _
         True, "", "", "", strErrMsg)


    '--------------------------------------------------
    ' 戻り値設定
    '--------------------------------------------------

    If intRet = 0 Then
      '正常終了
      Return True

    Else
      'エラーメッセージ設定
      strErrMsg = "ファイルの圧縮処理に失敗しました。" & vbCrLf & _
            "ファイル:" & strSourceFile & _
            "詳細は以下のとおり" & vbCrLf & _
            "--------------------------------------------------" & vbCrLf & _
            strErrMsg

       '異常終了
       Return False
    End If

  Catch ex As Exception

    '--------------------------------------------------
    ' エラーメッセージ設定
    '--------------------------------------------------

    strErrMsg = "ファイルの圧縮中にエラーが発生しました。" & vbCrLf & _
          "詳細は以下のとおり" & vbCrLf & _
          "--------------------------------------------------" & vbCrLf & _
          ex.Message


    '--------------------------------------------------
    ' 戻り値設定
    '--------------------------------------------------

    Return False

  End Try

End Function



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

プロセス削除について

プロセス削除

指定したプロセスを削除します。
このやり方は、プロセス名をキーに、該当するプロセスを削除します。
同じプロセス名が複数存在する場合、すべて削除します。

なお、プロセス名やその他詳細は、"System.Diagnostics.Process.GetProcesses()"で取得できます。やり方は、Sampleを見てくださいね。
⇒って、サンプルはブログに移植できませんでした。m(__)m

'==============================================================================
'
' プロセス削除
'
' ------------------------------------------------------------------------
' 説明 : 指定したプロセスを削除する
'
' ------------------------------------------------------------------------
' 引数 : strProcessName   プロセス名
'    strErrMsg      エラーメッセージ
' 戻値 : True:成功、False:失敗
'
'==============================================================================

Public Function fncProcRun(ByVal strProcessName As String, _
                Optional ByRef strErrMsg As String = "") As Boolean
  Dim proKillProcess As System.Diagnostics.Process = Nothing
  Dim proSerchProcess() As Process = Nothing
  Dim proFindProcess As Process = Nothing


  Try

    '--------------------------------------------------
    ' 対象プロセスをセット
    '--------------------------------------------------

    proSerchProcess = System.Diagnostics.Process.GetProcessesByName(strProcessName)


    '--------------------------------------------------
    ' 対象プロセスを削除
    '--------------------------------------------------

    '対象プロセスのプロセスを検索
    For Each proFindProcess In proSerchProcess
      '対象プロセスのプロセスIDを取得
      proKillProcess = System.Diagnostics.Process.GetProcessById(proFindProcess.Id)

      '対象プロセスを強制終了
      proKillProcess.Kill()
      proKillProcess.Dispose()
    Next


    '--------------------------------------------------
    ' プロセス解放
    '--------------------------------------------------

    proSerchProcess = Nothing
    proFindProcess = Nothing


    '--------------------------------------------------
    ' 戻り値設定
    '--------------------------------------------------

    Return True

  Catch ex As Exception

    '--------------------------------------------------
    ' エラーメッセージ設定
    '--------------------------------------------------

    strErrMsg = "プロセス削除中にエラーが発生しました。" & vbCrLf & _
          "詳細は以下のとおり" & vbCrLf & _
          "--------------------------------------------------" & vbCrLf & _
          ex.Message


    '--------------------------------------------------
    ' 戻り値設定
    '--------------------------------------------------

    Return False

  End Try

End Function



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。

テーマ : プログラミング
ジャンル : コンピュータ

検索フォーム
最新記事
カテゴリ
全記事表示リンク

全ての記事を表示する

最新コメント
プロフィール

ITLife

Author:ITLife
システム葵新井聡太です。
東京都東村山市に生まれ、ここで育ち、ここで結婚し、システムエンジニア一筋で十数年やってきました。
ここでは主に、パソコンを中心にITに関わることを備忘録として残していきたいと思います。
少しでも来ていただいた方のお役に立てたら幸いです。
m(_ _)m

p.s
ここで紹介している内容は一例です。すべては、自己責任でお願いします。

カレンダー
04 | 2018/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
訪問数
月別アーカイブ
リンク