コントロールのサイズ変更が出来ない(VB 継承フォーム)

環境
OS:Windows7 SP1
開発環境:VisualBasic2010 ExpressEdition SP1

ベースとなるフォームを作成し、そのフォームを継承して別フォームを作成するスタイルはよく行われることだと思います。ところが、このようにフォームを継承した時に継承した先に貼り付けたコントロールのサイズが変更できなくなる、という事があります。

原因:
ベースとなる継承元フォームのWindowStateプロパティを変更したため。

WindowStateプロパティはフォームの最初の表示状態を決めるものです。
ここを「Maximized」や「Minimized」というように初期状態の「Normal」から変更すると、継承先のフォームに貼り付けたコントロールのサイズ変更が何故かできなくなります。

対策:
画面デザインでWindowStateプロパティを変更している場合は「Normal」に戻します。
継承元フォームのLoadイベントやコンストラクタ内でプロパティの変更をコードで記述している場合、まずコメントアウトか削除します。その後リビルドするか一度実行するなりしてください。これで継承先フォームに貼り付けたコントロールのサイズ変更が出来るようになると思います。

WindowStateを変更する場合は、継承先フォームのコンストラクタ内などで実行時に変更するようにしましょう。

MyBase.WindowState = FormWindowState.Maximized

SQLServerCEのImage型における画像データの取扱い

環境
・SQLServer CompactEdition 3.5
・VisualStudio2010 SP1 (VB)

SQLServerのImage型は廃止予定らしいので、あまり一生懸命追いかけなくてもいいと思うのですが、
Image型を使用して画像の出し入れをする必要に迫られたので、描いておきます。

○テーブル構造 (テーブル名:PilotData)
UserID     nvarchar(50)
UserName   nvarchar(100)
Photo1      image


1.Image型に画像データを格納する

'画像データをバイト配列にする。
Dim stream As New System.IO.FileStream("C:\asuka.jpg", IO.FileMode.Open, IO.FileAccess.Read)
Dim reader As New System.IO.BinaryReader(stream)
Dim photo As Byte() = reader.ReadBytes(stream.Length)
reader.Close()
stream.Close()

'SQLCeConnectionオブジェクトの用意
Dim conn as New SqlCeConnection("Data Source=|DataDirectory|\NERV.sdf")
conn.Open()

’SQLCeCommandオブジェクトの用意
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
'SQL文の設定
cmd.CommandText = "INSERT INTO PilotData(UserID, UserName, Photo1) VALUES (@UserID, @UserName, @Photo1)
’パラメータの格納
cmd.Parameters.Add("@UserID", SqlDbType.NVarChar).Value = "Asuka"
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = "アスカ・ラングレー"
cmd.Parameters.Add("@Photo1", SqlDbType.Image, photo.Length).Value = photo
’コネクションオブジェクトとの紐付け
cmd.Connection = conn

'実行
cmd.ExecuteNonQuery()
;


2.Image型から画像データを取り出しPictureBoxに表示する。

'SQLCeConnectionオブジェクトの用意
Dim conn as New SqlCeConnection("Data Source=|DataDirectory|\NERV.sdf")
conn.Open()

’SQLCeCommandオブジェクトの用意
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
'SQL文の設定
cmd.CommandText = "SELECT * FROM PilotData WHERE UserID = @UserID "
’パラメータの格納
cmd.Parameters.Add("@UserID", SqlDbType.NVarChar).Value = "Asuka"
’コネクションオブジェクトとの紐付け
cmd.Connection = conn

'実行
Dim ds As New DataSet
Using adapter As New SqlCeDataAdapter(cmd)
   adapter.Fill(ds)
End Using

'データをPictureBoxに表示する。
Dim b As Byte() = DirectCast(ds.Tables(0).Rows(0)("Photo1"), Byte())
Dim stm As New MemoryStream(b)
PictureBox1.Image = System.Drawing.Image.FromStream(stm)
stm .Dispose()
;

Log4Net設定 MAXファイルサイズ及び日単位で切替え

Log4Netは便利なログライブラリです。
最近は設定のやり方もネット上に増えて来ましたが、自分も残しておきたいと思います。

1 .Log4Netのダウンロード

ダウンロードサイトから取得します。zipファイルになっているのでダウンロード後に解凍します。

2 .参照の追加でLog4Net.dllをプロジェクトに読み込む

ダウンロードしたファイルを解凍すると.NETFlameWorkのバージョン毎にフォルダ分けされているので、環境に合ったdllを読み込みます。

3. AssemblyInfo.vbに設定情報ファイルの扱い方を記述する。

AssemblyInfo.vbは、VisualStudio2010のVBではMy Project内にあります。
ファイルの一番最後に以下のように記述します。

<Assembly: log4net.Config.XmlConfigurator(ConfigFile:="log4net.config", Watch:=True)>

設定の意味は・・・
ConfigFile : 設定ファイルを「log4net.config」として、カレントフォルダ直下に配置
Watch:設定ファイルの変更監視の有無

4. log4net.configファイルに振る舞いを記述する。

log4net.configを作成します。

以下では、日単位または1MBを超えた場合も新規にログファイルを用意します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <File value=".\Log\SystemLog" />
  <appendToFile value="true" />
  <rollingStyle value="composite" />
  <staticLogFileName value="false" />
  <datePattern value='"."yyyy-MM-dd".log"' />
  <MaxSizeRollBackups value="20" />
  <MaximumFileSize value="1MB" />
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
  </appender>
  <root>
   <level value="INFO" />
   <appender-ref ref="RollingLogFileAppender" />
  </root>
 </log4net>
</configuration>

各パラメタの意味は・・・
File = ログを出力するパスを指定
appendToFile = 追記モードの設定
   True:追記
   False:上書き
rollingStyle = ログを新規ファイルに切替える条件を指定します。
   Once :プログラム実行毎に切換
   Size:MaximumFileSize で指定したサイズに達した場合に切換
   Date:日が変わる毎に切換
   Composite:SizeとDateを合わせた条件で切換
staticLogFileName = ログファイル名を固定にするかを指定
   True:ファイル名固定
   false:rollingStyle とdatePatternに基づいたファイル名
datePattern =rollingStyleがdateまたはCompositeの際にファイル名に付与される文字列。
MaxSizeRollBackups = ファイルを切替えるマックス数。無限にする場合はマイナスを指定
MaximumFileSize  = rollingStyle がSizeまたはCompositeの時の最大ファイルサイズ。
   ファイルサイズを超えると、以下の様なファイル名で作成されていきます。
   SystemLog.2013-05-27.log   ←1ファイル目
   SystemLog.2013-05-27.log.1  ←2ファイル目

5.プログラム内から書いてみる。

Public Enum LogLevel
   INFO
   WARNING
   ERR
   FATAL
End Enum

Public Class LogUtil
   ‘Log4netオブジェクトの宣言
   Private Shared _log As log4net.ILog _
      = log4net.LogManager.GetLogger( _
      System.Reflection.MethodBase.GetCurrentMethod.DeclaringType)

‘書込
Public Shared Sub Write( _
   ByVal msg As String, _
   ByVal level As LogLevel, Byval ex As Exception)

   Select Case level
      Case LogLevel.INFO
         _log.Info(msg)

      Case LogLevel.WARNING
         _log.Warn(msg, ex)

      Case LogLevel.ERR
         _log.Error(msg, ex)

      Case LogLevel.FATAL
         _log.Fatal(msg, ex)

   End Select

   End Sub

End Class

.NET FlameWork 対応OS

あれ? このOSには .NET FlameWorkはいくつまで対応してるの?
といった事がたま~にありますね。というわけでサーバー系OS以外の簡易一覧です。

Windows 8 Windows 7 Windows Vista Windows XP Windows 2000
4.5 ◎ (標準) ◎ (SP2)
4.0 ◎ (※1) ◎ (※1) ◎ (※1)(SP1) ◎(SP3)
3.5 ◎ (標準) ◎ (SP3)
3.0 ◎ (標準) ◎ (SP3)
2.0 ◎ (SP4)
1.1 ◎ (SP4)
1.0 ◎ (SP4)

※1: 4.5との共存は不可

VBのWithEventで、DLLのイベントを発生を受け取る。

VisualBasicには幸せになれる機能がいくつもありますが、WithEvent、RiseEventもその一つでしょうか。
WithEventはイベントの発生をお手軽に捕捉できるので便利ですね。

なんらかの外部DLLでの使用例:


Public Class SamplClass

  Private WithEvents _evaSystem As EvaSystemLib '定義

  Sub New()
    _evaSystem = New EvaSystemLib() ’インスタンス化
  End Sub

  'イベント
  Private Sub ModeChange_Event(ByVal sender As Object, _
                 ByVal e As EvaSystemLib.EventArgs) _
                 Handles _evaSystem.ModeChanges

     If (e.Mode = 666) Then
        Start_Beast() 
     End If

  End Sub
End Class

VisualStudio2010で、アイコンリソースがらみのコンパイルエラー

Windows7や、WindowsServer2008R2を使って構築したVisualStudio2010のソリューションを
WindowsServer2003上のVisualStudio2010で読み込ませビルドすると、
アイコンのリソースがらみのエラーとなってしまう・・・

何だろうと思って、思考錯誤してみるとアイコンのサイズでした。

アイコンサイズが256pixは駄目なんですね・・・XPやWindowsServer2003は・・・
Windows7とかは大丈夫だけど・・・
それとも自分の環境だけ?

とりあえず128pixサイズのアイコンに急きょ変更して試してみたら問題なくビルドできました。
めでたし。めでたし。

.NETでFormのStartPositionを手動で設定する。

.NETのForm作成では、FormのStartPositionプロパティを使用すれば、Formの開始位置を指定できます。

・CenterScreen = 画面中央に表示
・CenterParent =親フォームの中央
・WindowsDefaultLocation = Windowsの規定位置
・WindowsDefaultBounds = Windowsの規定位置 + 既定の境界
・Manual = Locationプロパティによって決定

・・・と、言った具合に指定しますが、常に右下に出したいとか、画面上の中央とかにしたい場合は、
StartPositionをManualの設定にして、コンストラクタやLoadイベントで以下のように指定します。

Me.StartPosition = FormStartPosition.Manual
'画面左上
Me.Location = New Point(0, 0)
'画面上中央
Dim screenW As Integer = Screen.GetWorkingArea(Me).Width / 2
Dim formW As Integer = Me.Size.Width / 2
Me.Location = New Point(screenW - formW, 0)
’画面右上
Dim screenW As Integer = Screen.GetWorkingArea(Me).Width
Dim formW As Integer = Me.Size.Width
Me.Location = New Point(screenW - formW, 0)
’画面左下
Dim screenH As Integer = Screen.GetWorkingArea(Me).Height
Dim formH As Integer = Me.Size.Height
Me.Location = New Point(0, screenH - formH)
’画面下中央
Dim screenH As Integer = Screen.GetWorkingArea(Me).Height
Dim screenW As Integer = Screen.GetWorkingArea(Me).Width / 2
Dim formH As Integer = Me.Size.Height
Dim formW As Integer = Me.Size.Width / 2
Me.Location = New Point(screenW - formW, screenH - formH)
’画面右下
Dim screenH As Integer = Screen.GetWorkingArea(Me).Height
Dim screenW As Integer = Screen.GetWorkingArea(Me).Width
Dim formH As Integer = Me.Size.Height
Dim formW As Integer = Me.Size.Width
Me.Location = New Point(screenW - formW, screenH - formH)

といった感じで、狙った場所に表示可能です。