MW211 EXIT

devlog
VB.net/自前でエントリポイントを掌握する
2015年04月30日
エントリポイントに何かを仕込みたくて、自前でエントリポイントを作る場合。

まず、「My Project/アプリケーション」にて
既定では有効になっている「アプリケーションフレームワーク」を無効にする。

この時点で、自動生成されるソース(My Project/Application.Designer.vb)の記述が
放棄され、エントリポイント(Main())を自前で定義できるようになる。
#上記に直接何かを書き込んでもよいが、自動生成されるソースなので
  いつ何時上書されて破棄されるか保証がないようなものだ

そして、自前で以下のようなモジュール処理を追加してあげればよい。
┌──────────────────────────────────────┐
│Module Program                                                              │
│    <STAThread()> _                                                         │
│    Sub Main()                                                              │
│        Application.Run(New Formスタートアップ())                           │
│    End Sub                                                                 │
│End Module                                                                  │
└──────────────────────────────────────┘
最低限、「スタートアップフォーム」は自前で起動するようにしてあげた形。

それ以外にも初期処理が必要なのであろが(終了処理も)、
「アプリケーションフレームワーク」でいろいろやってくれているので
これを補完するとなると中々難しい(というかこれ以上は把握できていない)。

結論からいうと、「アプリケーションフレームワーク」は無効にしない方が無難だ。
分類:VB.net
VB.net/デバッグDB環境
2015年04月29日
デバッグ時だけDBの接続先を評価環境にしたい場合。

まず、以下のような部分クラスを用意し、接続文字列を書き換えられるようにする。
┌──────────────────────────────────────┐
│Namespace My                                                                │
│    Partial Friend NotInheritable Class MySettings                          │
│        Friend Sub SetConnectionString(ByVal 接続文字列 As String)          │
│            Me("■■DBConnectionString") = 接続文字列                       │
│        End Sub                                                             │
│    End Class                                                               │
│End Namespace                                                               │
└──────────────────────────────────────┘

そして、適宜それを呼ぶ。
┌──────────────────────────────────────┐
│#If DEBUG Then                                                              │
│    My.Settings.SetConnectionString("Data Source=…(略)")                   │
│#End If                                                                     │
└──────────────────────────────────────┘
設定する内容については、「SetConnectionString」あたりでソースをgrepしてみて
既定の設定方法を探しそれを参考にし、一部を書き換えてあげる感じとなる。

さて、上記をどこに置けばよいかが問題となる。
開始処理に置くのが望ましいので、エントリポイント(Main())が最適だ。
ただ、「アプリケーションフレームワーク」が有効な場合(*1)、
そこは自動生成されるソース(My Project/Application.Designer.vb)の
中となってしまう。

さすがにそこに記述できない(記述はできるが上書される恐れあり)ということで代替案。

この場合、「スタートアップフォーム」に設定されたフォーム(*1)が
まず最初に起動される訳なので、
そこのコンストラクタ(New())に記述してしまえば間違いないだろう。
┌──────────────────────────────────────┐
│Public Class Formスタートアップ                                             │
│    Sub New()                                                               │
│        ' この呼び出しはデザイナーで必要です。                              │
│        InitializeComponent()                                               │
│        ' InitializeComponent() 呼び出しの後で初期化を追加します。          │
│#If DEBUG Then                                                              │
│        My.Settings.SetConnectionString("Data Source=…(略)")               │
│#End If                                                                     │
└──────────────────────────────────────┘

起動からの処理の流れ。
┌──────────────────────────────────────┐
│エントリポイント(Main())  ←★ここに置くか                                  │
│↓                                                                          │
│スタートアップフォーム                                                      │
││コンストラクタ          ←★ここに置く                                    │
││↓                                                                        │
└──────────────────────────────────────┘

*1:いずれも「My Project/アプリケーション」にて設定
分類:VB.net
VB.net/画像ボタン
2015年04月28日
通常のボタンを画像ボタンに変更する方法。

  まず、画像ファイルをインポートする。
  ┌───────────────┬────────────────────┐
  │Image                         │(画像ファイルを選択)                    │
  └───────────────┴────────────────────┘
  →インポートされたファイルは別途記録されるようだ(インポート元はお役御免)

  次に元のボタンを目立たなくする。
  ┌───────────────┬────────────────────┐
  │FlatStyle                     │Flat                                    │
  ├───────────────┼────────────────────┤
  │FlatAppearance                │                                        │
  │┌───────────────┬───────────────────┤
  ││BorderColor                   │Control(背景と同色)                   │
  │├───────────────┼───────────────────┤
  ││BorderSize                    │0(なし)                               │
  └┴───────────────┴───────────────────┘

  それとボタンをクリックした時に線が出てくるのを防止する。
  ┌───────────────┬────────────────────┐
  │FlatAppearance                │                                        │
  │┌───────────────┬───────────────────┤
  ││MouseDownBackColor            │Control(背景と同色)                   │
  │├───────────────┼───────────────────┤
  ││MouseOverBackColor            │Control(背景と同色)                   │
  └┴───────────────┴───────────────────┘

  おまけに、カーソルを指にしてあげればWeb画面のボタンっぽくなるだろう。
  ┌───────────────┬────────────────────┐
  │Cursor                        │Hand                                    │
  └───────────────┴────────────────────┘
分類:VB.net
VB.net/生成物のバージョン
2015年04月27日
「My.Application.Info.Version.ToString」で取得できる。

設定の方法は以下の通り。

「MyProject/アプリケーション」で「アセンブリ情報」ボタンを押下し
(「アセンブリバージョン」と)「ファイルバージョン」を変更し、「OK」ボタン押下。
後はリビルドすればOK。
分類:VB.net
VB.net/接続文字列の設定
2015年04月26日
ソリューションエクスプローラで「すべてのファイルを表示」で
「Settings.settings」を表示させダブルクリック。
型は「(接続文字列)」型ということになる。
分類:VB.net
VB.net/データソース(DataSet)の定義変更
2015年04月25日
接続先DBを変更したかったのだが、
VisualStudioから変更ができなさそうなので
該当箇所(接続先情報)をgrepして置換したらうまく変更できた。
分類:VB.net
VB.net/アイコンの設定
2015年04月23日
アイコンがまず必要だが、Windows上のアイコン(*1)とは違い、
専用のアイコンデータが必要だ。
  *1:サイズ32×32のBMP画像を拡張子「.ico」にしたもの

ということで、変換ツール等を使ってアイコンファイルを作成する。(拡張子は「.ico」)

そうしたら、「My Project/アプリケーション」にて
「アイコン」にそれを設定すれば完了。exeファイルのアイコンがそれになる。

また、各フォームのアイコンを設定するには、フォームのプロパティにて
「Icon」にそれを設定すればよい。
分類:VB.net
MSSQL/対等外部結合
2015年04月22日
外部結合をつかって、二つの表を対等外部結合してみた。
┌──────────────────────────────────────┐
│SELECT ISNULL([表A].[キー],[表B].[キー]) AS [キー],                       │
│       [表A].[項目A],                                                     │
│       [表B].[項目B]                                                      │
│    FROM [表A]                                                             │
│        FULL JOIN [表B]                                                    │
│          ON [表B].[キー] = [表A].[キー]                                  │
└──────────────────────────────────────┘
結果は上々で、以下三パターンのレコードとなった(もちろんキーの重複はなし)。
┌──┬───┬───┐
│キー│項目A│項目B│
├──┼───┼───┤
│キー│項目A│  -  │
├──┼───┼───┤
│キー│  -  │項目B│
└──┴───┴───┘

これに気を良くして、三つの表でこれを試みた。
┌──────────────────────────────────────┐
│SELECT ISNULL([表A].[キー],ISNULL([表B].[キー],[表C].[キー])) AS [キー], │
│       [表A].[項目A],                                                     │
│       [表B].[項目B],                                                     │
│       [表C].[項目C]                                                      │
│    FROM [表A]                                                             │
│        FULL JOIN [表B]                                                    │
│          ON [表B].[キー] = [表A].[キー]                                  │
│        FULL JOIN [表C]                                                    │
│          ON [表C].[キー] = [表A].[キー]                                  │
└──────────────────────────────────────┘
すると基幹となる表がない場合、二つに分裂してしまった。
┌──┬───┬───┬───┐
│キー│項目A│項目B│項目C│
├──┼───┼───┼───┤
│キー│項目A│項目B│  -  │
├──┼───┼───┼───┤
│キー│項目A│  -  │項目C│
├──┼───┼───┼───┤
│キー│項目A│  -  │  -  │
├──┼───┼───┼───┤
│キー│  -  │項目B│項目C│
├──┼───┼───┼───┤
│キー│  -  │項目B│  -  │←二件レコードができてしまう
│キー│  -  │  -  │項目C│
└──┴───┴───┴───┘

なので、トーナメントの二段階選抜的な形にしなければならない。
┌──────────────────────────────────────┐
│SELECT ISNULL([連合D].[キー],[表C].[キー]) AS [キー],                     │
│       [連合D].[項目A],                                                   │
│       [連合D].[項目B],                                                   │
│       [表C].[項目C]                                                      │
│    FROM (                                                                  │
│        SELECT ISNULL([表A].[キー],[表B].[キー]) AS [キー],               │
│               [表A].[項目A],                                             │
│               [表B].[項目B]                                              │
│            FROM [表A]                                                     │
│                FULL JOIN [表B]                                            │
│                  ON [表B].[キー] = [表A].[キー]                          │
│    )AS [連合D]                                                            │
│        FULL JOIN [表C]                                                    │
│          ON [表C].[キー] = [連合D].[キー]                                │
└──────────────────────────────────────┘

でも、これだと四つ以上になった時に複雑度が増していきそうなので
(でもそれこそトーナメント式(B木)で書けたりして(でもいずれにせよ煩雑になりそう))
以下の様に、基準データをあらかじめ決めてから、
そこに左外部結合していくのがいいかも。
┌──────────────────────────────────────┐
│SELECT [基準D].[キー],                                                     │
│       [表A].[項目A],                                                     │
│       [表B].[項目B],                                                     │
│       [表C].[項目C]                                                      │
│    FROM (                                                                  │
│        SELECT [キー] FROM [表A]                                           │
│        UNION                                                               │
│        SELECT [キー] FROM [表B]                                           │
│        UNION                                                               │
│        SELECT [キー] FROM [表C]                                           │
│    ) AS [基準D]                                                           │
│        LEFT JOIN [表A]                                                    │
│          ON [表A].[キー] = [基準D].[キー]                                │
│        LEFT JOIN [表B]                                                    │
│          ON [表B].[キー] = [基準D].[キー]                                │
│        LEFT JOIN [表C]                                                    │
│          ON [表C].[キー] = [基準D].[キー]                                │
└──────────────────────────────────────┘
分類:MSSQL
ExcelVBA/CopyFromRecordsetは便利だが
2015年04月21日
「.CopyFromRecordset」だとあらかじめ設定していた書式が効かない。

仕方がないので、別途以下みたいな感じで値の貼り付けを行う必要がある。
┌──────────────────────────────────────┐
│With .Columns(1)                                                            │
│    .Value = .Value                                                         │
│    .AutoFit                                                                │
│End With                                                                    │
└──────────────────────────────────────┘

ただ、根本的に解決するには、以下の様に一件ずつ読み込む方式に
変更してしまうのがいいだろう。
┌──────────────────────────────────────┐
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│Cells(2, 1).CopyFromRecordset テーブル                                      │
└──────────────────────────────────────┘
  ↓
┌──────────────────────────────────────┐
│Dim テーブル As New ADODB.Recordset                                         │
├──────────────────────────────────────┤
│y = 2                                                                       │
│Do Until テーブル.EOF                                                       │
│    For x = 1 To テーブル.Fields.Count                                      │
│        Cells(y, x).Value = テーブル.Fields(x - 1).Value                    │
│    Next x                                                                  │
│    y = y + 1                                                               │
│    テーブル.MoveNext                                                       │
│Loop                                                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ファイル(ブック)の保存
2015年04月20日
作業中のブックを保存するのは以下のような感じ。
┌──────────────────────────────────────┐
│ActiveWorkbook.SaveAs fileName:="出力ファイル.xls", _                       │
│                      FileFormat:=XlFileFormat.xlExcel8                     │
├──────────────────────────────────────┤
│ActiveWorkbook.SaveAs fileName:="出力ファイル.xlsx", _                      │
│                      FileFormat:=XlFileFormat.xlOpenXMLWorkbook            │
└──────────────────────────────────────┘
#上段が「.xls」形式、下段が「.xlsx」形式

保存ダイアログを出してブックを保存するのは以下のような感じ。
┌──────────────────────────────────────┐
│Application.Dialogs(xlDialogSaveAs).Show arg1:="出力ファイル.xls", _        │
│                                         arg2:=XlFileFormat.xlExcel8        │
├──────────────────────────────────────┤
│Application.Dialogs(xlDialogSaveAs).Show arg1:="出力ファイル.xlsx", _       │
│                                         arg2:=XlFileFormat.xlOpenXMLWorkbook
└──────────────────────────────────────┘
#上段が「.xls」形式、下段が「.xlsx」形式

いずれも、最後に保存しないで閉じるとかを組み合わせるだろう。
┌──────────────────────────────────────┐
│ActiveWorkbook.Close SaveChanges:=False                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 2 3 次へ