プログラミング: 2015年2月アーカイブ

まあ、型宣言の必要ない Perl を使うことが多いから色々不満なだけだけど・・・(^^;

VB.NET で配列使うの、糞面倒くせえ。

Dim areaSubTotal(,) As Integer
For i = 0 To 1
    For j = 0 To 24
        areaSubTotal(i, j) = 0
    Next
Next

とかしちゃうと、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」になっちゃう。

まあ、これだと「値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。」な警告が発生するので、とりあえず Nothing をセットして、

Dim areaSubTotal(,) As Integer = Nothing

とかしても、「オブジェクト参照がオブジェクト インスタンスに設定されていません。」エラーになっちゃう。まあ、これは当然なんだけど(^^;

仕方ないので、

Dim areaSubTotal(,) As Integer = {}

と宣言してインスタンスを作ると、これだと length = 0 の配列インスタンスが作られちゃうので、いざ値をセットしようとした時に「インデックスが配列の境界外です。」なエラーになっちゃう。

じゃあ、配列の数をちゃんとセットしとこうと、

Dim areaSubTotal(1, 24) As Integer = {}

としたら「明示的な初期化は、明示的な境界で宣言された配列に対しては許可されません。」だって(^^;

結局、

Dim areaSubTotal(,) As Integer = New Integer(1, 24) {}

こうか。
これでOK。

糞面倒くせえ。
いや、「オブジェクト指向だからしょうがない。配列もクラスだから」と言いたいんだろうが、これはコードの書き方の問題や!!
内部的にどうにでもできるやろ。せめて、

Dim areaSubTotal(1, 24) As Integer = {}

この書き方くらいはOKにせえや!!・・・と思った話。
Combobox(例:Combobox1)に、例えば商品マスタに登録されているコードと商品名を

ComboBox1.SetBinding(GoodsMst.m_goods, "code", "name")

みたいにバインドしていると、一覧には

001|大人プレイ用おむつ
002|触って遊べるこけし
003|身体にやさしローション

のように表示されるわけだが、この時、ComboBox1 の DescriptionControl プロパティにラベル等のコントロール(例:Label1)を指定していれば、特に処理をコーディングしなくても、コンボボックスで例えば「002|触って遊べるこけし」を選べば、指定したコントロール(Label1)に「触って遊べるこけし」って表示されるわけやね。

コンボボックスの DropDownStyle が DropDownList ならこれで問題無いが、DropDown のように「ユーザが入力もできる」コンボボックスの場合、対応した値がない、つまりマスタに存在していないコードが入力されることもあり、その場合は Label1 に何もセットされない。
しかし、商品マスタに存在していないコードを指定した場合は「未登録商品」とか「??????」とか何がしかの文字列を Label1 に表示してやりたいケースってあるよね?
この時ってどうすればいいだろう?
何か、そういう時に表示する文字列を指定しておくプロパティがあるのかな?と思ったけど、ざっと見てみた限りよくわからなかった。

なので、DescriptionControl プロパティの指定は(なし)に戻した上で、

Private Sub ComboBox1_TextChanged(sender As Object, e As EventArgs) Handles ComboBox1.TextChanged

If ComboBox1.SelectedIndex <> -1 Then
Label.Text = CStr(CType(ComboBox1.SelectedItem, DataRowView).Row(1))
Else
Label.Text = "????????"
    End If

End Sub

みたいに入力値の変更が発生するつどに「選択されたインデックス値」を調べ、インデックスが存在していれば(一覧に含まれているコードを入力したということ)、それに対応した名前(SelectedItem を DataRowView に変換して 2カラム目の値(1カラム目にはコードが入ってる))を Label1 にセットしてやっている。
インデックスが存在していない(-1 がセットされる)場合は「????????」をセットしている。

まあ、これで、俺の考えるとおりには動いているんだが、もっとスマートな方法があるのかね?

「そんな面倒くさいことしなくてもこんな方法があるぜ!」という神がいらっしゃれば是非ご教示を。
DBから DBNull で来た日付データを、そのまま(つまり NULL のまま)別の DataSet にセットしたいんだけど、

newDr.start_date = oldDr.start_date

なんてやると、NULL を代入しようとしたってことで当然例外エラーが出ちゃう。

そこで、

If oldDr.Isstart_dateNull Then
newDr.start_date = Nothing
End If 

とかするとエラー無く処理されて「お~イエイ」とか思うんだけど、この場合、newDr.start_date には NULL ではなく 0001/01/01 12:00:00 という日付がセットされちゃう。DateTime.MinValue(日付の最小値)だね。

駄目やん(^^;

・・・と思ってたら、(普通の日付型変数には NULL はセット出来ないんだけど)DataSet のフィールドであれば Setフィールド名Null という「NULL を代入するための」メソッドが用意されているようだ。
そりゃそうだよな。DB の日付型フィールドには NULL 値がセットできるのに、DataSet のフィールドにセット出来なかったら不整合が起きるもんな。

ということで、

If oldDr.Isstart_dateNull Then
newDr.Setstart_dateNull()
End If 

とすれば出来ました。

お~イエイ
久しぶりに、ヘックスマップ上での目的地までの最短距離を算出する話。

以前、「最短経路の方向転換ポイントを算出する」で上方向に向かう場合の最短距離(最短ルート)を算出した。
具体的には、目的地方向の六角形の二辺のどちらかから直線で進み、途中で一回だけ方向転換し、また一直線に目的地に向かうという進み方である。
ある地点から斜めに最短距離で目的地に向かうルートは算出出来るので、要はどこで方向転換するかを算出すればいいという話やね。(「?」という人は、「ヘックス」とかをキーワードに過去記事をチェックしてみてちょ)

進む方向としては、↓下の写真のように開始地点から見て6つある。マスが六角形だからな。
それぞれ A~F の名前をつけてみた。

20150205_hexmap.JPG
A 方向(上方向)の計算式は前回考えたように、

<右に向かうコースの転換点の座標>
X = X(A) - (Z(A) - Z(B))
Y = Y(A)
Z = Z(B)

<左に向かうコースの転換点の座標>
X = X(A) - (Y(A) - Y(B))
Y = Y(B)
Z = Z(A)

でOK。(A) が起点、(B) が終点の座標値だ。
起点が 15-17-18 の座標、ゴール地点が 2-8-15 の座標であれば、右方向なら 11-17-14 座標のマスへ向かい、そこで方向転換して 2-8-15 に向かうのが最短距離。
左方向なら 6-8-18 が方向転換マスの座標値だ。上の計算式で試しにやってみてほしい。

で、その他の方向の方向転換ポイント(マスの座標値)の算出方法。
出発点から右に向かって行くか、左に向かっていくか、それぞれ2つのパターンがある。

B 方向(左上方向)

<右に向かうコースの転換点の座標>
X = X(B)
Y = Y(A) - (X(A) - X(B))
Z = Z(A)

<左に向かうコースの転換点の座標>
X = X(A)
Y = Y(A) - (Z(B) - Z(A))
Z = Z(B)

C 方向(左下方向)

<右に向かうコースの転換点の座標>
X = X(A)
Y = Y(B)
Z = Z(A) + (Y(A) - Y(B))

<左に向かうコースの転換点の座標>
X = X(B)
Y = Y(A)
Z = Z(A) + (X(B) - X(A))

D 方向(下方向)

<右に向かうコースの転換点の座標>
X = X(A) + (Z(B) - Z(A))
Y = Y(A)
Z = Z(B)

<左に向かうコースの転換点の座標>
X = X(A) + (Y(B) - Y(A))
Y = Y(B)
Z = Z(A)

E 方向(右下方向)

<右に向かうコースの転換点の座標>
X = X(B)
Y = Y(A) + (X(B) - X(A))
Z = Z(A)

<左に向かうコースの転換点の座標>
X = X(A)
Y = Y(A) + (Z(A) - Z(B))
Z = Z(B)

F 方向(左上方向)

<右に向かうコースの転換点の座標>
X = X(A)
Y = Y(B)
Z = Z(A) - (Y(B) - Y(A))

<左に向かうコースの転換点の座標>
X = X(B)
Y = Y(A)
Z = Z(A) - (X(A) - X(B))

こんな感じ。

あとは、起点から見て A~F のどの方面に終点があるかが判断できれば、どの計算式を使えばいいかがわかる。

次回は、「A~F のどの方面に終点があるか」をどうやって判断すればいいかを考えてみようか。

このアーカイブについて

このページには、2015年2月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2015年1月です。

次のアーカイブはプログラミング: 2015年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら