VB6の配列

Dim aaa() as String
aaa(i) = "テスト"

これはNG
最初の宣言の時点では未定義の状態らしい。
なので、Splitなどで空を入れる必要があるとか。

激しくハマった……。

VB6 文字を日付に

String→Date
CDate(Format("20071019", "@@@@/@@/@@"))
結果:2007/10/19(Date)


初め、「yyyy/MM/dd」とかやっていてちっともできなかった。まさか「@」とは。
.NETばかりで、急にVB6をやると、これはこれで苦労する……。

数値が文字列として保存されています(Excel)

[ツール]-[オプション]-エラーチェック
ルール
「文字列として保存されている数字」のチェックを外す。

MSお得意のお節介機能。

行継続文字 ( _) を使いすぎています。

久しぶりのVB6。
可読性を上げるために文字列を_(アンダーバー)でつなげていたが、どうやら25行以上はつなげられないようだ……。

以下の行で「&」を使ってくっつけるしかない。

SQLServer テーブルが存在するか判別

IF object_id(' TableName ') IS not NULL
SELECT '1'
ELSE SELECT '0'

存在すれば1、しなければ0を返す。

OpenOffice.org Portable 日本語化

使用するOSのlangpackを当てる。

出力先フォルダは、OpenOffice.org Portableフォルダの「App\openoffice」を設定する。

「Word」仕様

Microsoft Wordを使用していて、ファイルを開くと常に先頭になるのがうっとうしいなぁ、と思っていたら、Shift + F5 で最後に編集していた箇所に飛べるらしい。
ふむ、たしかに飛べる。

一太郎は確か、ファイルを開けば前回編集していたところになったと思った。
どちらがいいのかは使用者のスタイルによって異なるだろうけれど。

「行番号」との闘い

値のリストなどをプリンターから出力する際に、行番号が表示されていると便利なことがある。
この行番号というものは、普通は1からスタートする。当たり前の話だ。

しかし、行番号を0からスタートさせて出力したいこともよくある。

「秀丸」を使って編集したデータを出力しようとして、そういうことができたら便利だと思っていたが、色々と調べてみても行番号をゼロからスタートさせるような設定はないようだ。

で、そういう要望はマクロで実現させるらしい。

行連番マクロ
行番号を追加

作業の開始

気になり出すとうっとうしくてしょうがないOfficeの意味不明な機能たち。
そんな機能の一つ、アプリケーションを起動するたびに出る「作業の開始」ウィンドウを消す方法。

1.Office アプリケーションを起動します。
2.[ツール] メニューの [オプション] をクリックします。
3.[表示] タブで、[起動時作業ウィンドウ] または [起動時に作業ウィンドウを表示] チェック ボックスをオフにし、[OK] をクリックします。

[OFF2003] [作業の開始] 作業ウィンドウに関する一般情報

こういう機能は、あった方がいいっていう要望から実装されているのかね?

「日付型」の上限

日付型の上限は9999年の12月31日59分59秒だとか。
それまでは「Date.DaysInMonth」を使用してもちゃんと末尾が帰ってくる(当たりまえか)。

しかし、9999年って…。
そのころになるとまた9999年問題とか出るのかもしれないが、そもそも今あるシステムがそこまで動いていないだろうね。

ちなみに、スタートは当然「1年」から。

「Console.WriteLine」の罠

ループを回して文字列を処理していたところ、どうも処理が引っかかる箇所がある。原因を追及するためにソースと睨めっこしても、とくに問題はなさそう。

そんなおり、「Console.WriteLine(...」の一行を発見。
コメントアウトしたところ、処理がスムーズに進むようになった。

まぁ、私はあまりこれは使わないが、意外と負荷がかかるようだ。

「SQL Server Management Studio」との闘い

「SQL Server Management Studio」。
SQLコマンドで、文字列("0"など)をキャストせずに強引に日付型のテーブルにインサートしたら、アプリごと落ちた(笑)。何度やっても落ちる。

まぁ、無茶ではあるけれど、落ちることないじゃないの。

「セルの結合」との闘い

テーブルのセルをくっつけるための属性。
なお、結合する数の分、元のタグは削除しておく。

横に結合:colspan=""
縦に結合:rowspan=""

「子ウィンドウ」との闘い

親ウィンドウを閉じると子ウィンドウも連動して閉じるJavaScript。

親のBody要素にウィンドウを閉じたときの処理をかませておく。
onUnload="javascript:childWindow.close()"

子ウィンドウを開く
childWindow = window.open('child.html', '', ...

ただし、子ウィンドウのオブジェクトをグローバル変数で宣言しておかないと、閉じるウィンドウがないよ、とエラーがでる。変数のスコープに関してはブラウザごとに微妙な差があるので注意する(と思った)。
IEの場合、関数内の変数はその関数のみ有効なので注意する。

「App_Offline.htm」との闘い

ASP.NET Webアプリのルートに App_Offline.htm というファイルが置いてあると一時的にそのアプリを停止することができる。エラーが出てアプリが動かなくなったとき、なぜかこれが作成されていてアクセスできずにちょっと焦った。

本来はメンテ時に使用するらしい。

参考サイト

[.NET] "旧形式です" という警告

.NET Framework 1.1 から .NET Framework 2.0 へ移行し、古いソースを移植しようとしたときにたびたび出る「旧形式です」。これを見るたび、勝手に変えるなよな~、と思ってしまいますが、まぁそれはそれとして変更していくしかないですね。

SqlCommandのコレ
.Parameters.Add
 ↓
.Parameters.AddWithValue

Web.configから値を引っ張ってくるときにとくにハマる

ConfigurationSettings.AppSettings(" key ")
 ↓
ConfigurationManager.AppSettings(" key ")

「Splitメソッド」との闘い

StringクラスにあるSplitメソッド。
.NET Framework 2.0から追加されたのだが、これが便利すぎる。
複数検索機能拾を作るときには必需品なのだが、この第2パラメータが超絶便利。

None 空白を含める
RemoveEmptyEntries 空白を含めない

' 文字列
Dim keywords As String
Dim words() As String
' 分割
words = keywords.Split(splitKey, StringSplitOptions.RemoveEmptyEntries)

はじめは、このパラメータを知らなくて空白を除去しようと苦労した。

GridViewのセルの値を取り出す

GridViewの任意のセルから値を引き出したいとき。
たまに忘れていることがある。

GridView2.Rows( 縦番号 ).Cells( 横番号 ).Text

「.ToStrin」ではなく「.Text」。

「GridViewの選択ボタン」との闘い2

テンプレート列にボタンを設置して値を拾おうと考えたのだが、SelectedIndexが「-1」しか返ってこない。
どうも内部的には「選択」されているわけではない模様。

いろいろ調べると、「選択」させるのはあくまで「SelectedIndexChanged」であり、Indexはこのイベントが起こったときにしか取得できない(と思う)。

これを解決するために一番手っ取り早い方法は、テンプレート列に配置してあるボタンのCommandNameを「Select」にしてしまう。こうすると、Selectボタンのイベントを拾うことができ、Indexも取得できる、ということ。

ただ、これをすると今度は列が選択状態になってしまう。
これは、Indexを取得した後、SelectedIndexを「-1」にしてイベントを終えることで対処できる。
対処できるが、ほんとにこれでいいのか…!?

配列の型変換

関数から戻り値を受け取るときに、それが配列だったりすると型変換を変える必要がある。
初歩的な部分であるけれど、一瞬迷った。

NG
Dim key() As String
key = CStr( procedure)

OK
Dim key() As String
key = CType( procedure , String())


まぁ、CStr()なんて使わなきゃいいのかもしれないけど。

「テンプレート列」との闘い

テンプレート列にテキストボックスを配置し、その値を取り出すには以下のようにする。
この場合は、テキストボックスの値を拾う。戻りは文字列型。

... = CType(GridView1.FooterRow.FindControl(" ID "), TextBox).Text

「GridViewの選択ボタン」との戦い

GridViewにボタンをつけて、選択させるということもよくある。
そこで選択された行に対して、キーを拾うと思うのだが、これがDataGridとは多少変わっていた。


DataGrid
e.Item.Cells(0).Text

GridVIew
GridView1.Rows(CInt(e.CommandArgument)).Cells(0).Text


他にやり方があるのかもしれないけど、とりあえずこれで対処。

「GridViewのフッターに合計値」との闘い

かなりよくある要望。

こちらのサイトにて万事解決。
http://akiokasai.qsh.eu/samples/060713-1.aspx
合計だけではなく、平均も出せます。

GridViewの「showfooter」プロパティを"true"にしておかないと、表示されません。
……当たり前かもしれませんが。

「Officeの個人情報」との闘い

パソコン君の親友、Microsoft Office。
文章を書いたり、表計算をしたり、大忙しです。
でも、このOfficeファイルには、個人情報がたっぷりと保存される仕様になっています。ファイルを右クリックして、プロパティを見ると……。

必要な人しかありがたくない機能をカットするツールがありました。


こういう部分から、流出したときに足がついちゃったりするのよね。

「SQL Serverの予約語」との闘い

予約語一覧(SQL Server Compact Edition)
インポートしたテーブルに「user」っていうのがあってはまった。

こんなにたくさんあったのね。

Management Studioでテーブルを作る時点では、警告が出ない。
でも、取り出そうとするとエラーが出る(SQL文が間違っています、など)。

[Adobe Reader] Updater5 というフォルダは何?

マイドキュメントに Updater5 というフォルダがあることに気づく。
調べてみると、どうやら Adobe Reader 8.0 がアップデート用の一時ファイル置き場として使っているとのこと。


ファイルの保存先を変更すれば、自動的に作られる (マイドキュメントに) ことはなくなるようだ。

Cache メンバ

' キャッシュに値を入れる
Cache.Insert("1", "テスト")
Cache("1") = "テスト1"

' キャッシュの取り出し
Cache.Item("1")
Cache.Get("1")
xxxx = Cache("1")

' キャッシュの数(数値型で戻す
Cache.Count

' キャッシュの削除
Cache.Remove("1")

VB.NETで乱数を発生させる


Dim rnd As New Random(1000)
' 1から3までの乱数(4は含まれないことに注意する)
Dim iRnd As Integer = rnd.Next(1, 4)

FileUploadクラス

FileUploadクラス
「.NET Framework version 2.0」より追加されたクラス。ファイルのアップロードを行う。

ユーザーがアップロードするファイルを選択した後、自動的に送信されるわけではないので別にアップロードボタンを用意する必要がある。AJAX処理はできない

Connectionプロパティは初期化されていません

このエラーの最も可能性の高い原因として、コマンド オブジェクトに、有効なデータ接続オブジェクトへの参照が含まれていないことが考えられます。この問題は一般に、既存の接続オブジェクトを削除して再作成したときに生じます。
MSDN


接続情報が参照できなかった時に起こる。
「Web.config」に記述してたときに、参照先が間違っていたときに起こった。

ASP.NET Runtime Error

「Web.config」の文法が間違っている。
デバッグできない場合はこの場合が多い。

VB.NETのコントロール配列

VB.NETではコントロール配列が使えないので、Handlesにイベント名を追加する。
プロシージャ名は、名前でしかなく、イベントには影響しない。

WindowsフォームのDataGridで表示されているレコード数をカウントする

実際に表示されているレコード数。
0からではなく、1からカウントする。

Dim count As Integer
count = DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember).Count

文字列の連結時におけるパフォーマンス

文字列の連結に「+演算子」を使用すると手軽ではあるが、高速に処理するのには適さないので「StringBuilderクラス(System.Text.StringBuilder)」を使用する。

インスタンス作成→.append("")
.ToString()

バージョン番号の付け方

[メジャー・バージョン].[マイナー・バージョン].[ビルド番号].[リビジョン]

メジャーバージョン...必ず設定。変更する頻度は低い。
マイナーバージョン...マイナーチェンジに変更。変更する頻度は低い。
ビルド番号...ビルド回数。
リビジョン...開発時に使用する番号。

ビルド番号とリビジョンは省略できる。