過去ログ

記事一覧

【.net VB】シングルクリックとダブルクリックを使い分ける

リストボックスのアイテムをドラッグした、またはダブルクリックした時に指定の場所へ画像をコピーするという動作をする場合、

DOBON.NET プログラミング道さんの「Drag&Dropを行う」
http://dobon.net/vb/dotnet/control/draganddrop.html

この記事でリストボックスからのMouseDownイベントからドラッグを行う動作は分かったのですが、MouseDownがダブルクリックでもフックされてしまい、ダブルクリックイベントを発生させられません。
ネットで検索するとe.Clicksが1の場合はシングルクリック、2の場合はダブルクリックと判別できる旨の記事(場所は忘れた)を発見したのでe.Clicksの値に応じて分岐してみると、


'ListBox1でマウスボタンが押された時
Private Sub ListBox1_MouseDown(
 ByVal sender As Object, ByVal e As MouseEventArgs)
 ListBox1_SelectedIndexChanged(sender, e)

 'ドラッグの準備
 Dim lbx As ListBox = CType(sender, ListBox)
 'ドラッグするアイテムのインデックスを取得する
 Dim itemIndex As Integer = lbx.IndexFromPoint(e.X, e.Y)
  If itemIndex < 0 Then
   Return
  End If 'ドラッグするアイテムの内容を取得する
 Dim itembmp As Bitmap = lbx.Items(itemIndex)

 If e.Clicks = 1 Then
 'マウスの左ボタンだけが押されている時のみドラッグできるようにする
  If e.Button = MouseButtons.Left Then
  'ドラッグ&ドロップ処理を開始する
   Dim dde As DragDropEffects = lbx.DoDragDrop(itembmp, DragDropEffects.All)
  End If
 ElseIf e.Clicks = 2 Then
  If xdat(ListBox1.SelectedIndex, 9) = "ヘルム" Then
   'PictureBox2.Image = PictureBox1.Image
   'ドロップされたデータ(Bitmap型)を取得
   PictureBox2.Image = itembmp
   Dim dataid As Integer = xdat(ListBox1.SelectedIndex, 0)
   Label5.Text = CStr(dataid)
  End If
 End If
End Sub

こうする事でドラッグとダブルクリックの動作を分けつつMouseDownイベントだけで処理できます。

ファイル 3439-1.png

これでリストをダブルクリックしても、ヘルム位置にドラッグしても同じ様にアイテム画像を装備枠に移動できました。

【Lineage1】.netVBでオフライン版アイテムDB作成中

もうスマホなんて当たり前の世界で、いつ何時でもネットができるのは水道を捻ったら水が出てくるくらい当たり前の時代になりつつあります。
私もスマホをASUSのZenFoneLeaserに変えたのですが、キャリア版スマホと違い無料でテザリングができますから、ノートPCやタブレットを持って出かけても通信環境に困ることはありません。

それでもオフライン版の需要ってあるんじゃないかな、といいますか.netを覚えるにあたって自分が欲しいものをとりあえず作ってみるのがいいだろうという事でウンウンと唸りながら頭を掻き毟っております。

40超えると新しい事を覚えるのって本当に大変で、昔は暗記できたことも今ではこまめにメモを取ったりネット事例のブックマークを取ったりと衰えを感じてはいますが、「何かを作る」っていうのは本当に楽しい。

ファイル 3438-1.png

まだ全件読み込んでリスト表示し、クリックしたアイテム詳細を表示するくらいしか作っていません。これから絞り込みなどを追加しないといけないわけでまだまだ道程は長いのです。
しかしネット版ItemDBはAmigoDataBaseさんの作ったデータベース用cgiを加工しているだけなのでカスタマイズが非常に難しく、またSHIFT-JIS~UTF-8の変換が未だにうまくいかないのでデータはUTF-8なのに詳細検索のアイテム名がSHIFT-JISのまま変更できず検索に支障をきたしたりなど問題は様々。
それをイチから自分で作るのであればカスタマイズも楽だし、条件もすべて自分が設定するわけですし(自分が使う上で)細かいトコロに手が届けばいいなぁと思っております。

【.net VB】俺メモ:リソースファイル名を変数で指定したい場合

Q リソースの値を変数で取得
http://okwave.jp/qa/q7222565.html

リソースに追加したファイル名が例えば"a.png""b.png""c.png"だとして、
それぞれ

My.Resources.a
My.Resources.b
My.Resources.c

これをBitmap型に入れるのはいいとして、仮に画像が多数ある場合またファイル名をcsvなどから引いて表示したい場合にファイル名を配列iconに入れたとする。

Dim icon(2) as String
icon(0)="a"
icon(1)="b"
icon(2)="c"

for i=0 to 2
  Dim bmp as Bitmap = CType("My.Resources." + icon(i),Bitmap)
  Me.PictureBox1.Image = bmp
next

とすると文字列をBitmapに変換できないと怒られる。
いろいろ事例を探してみたけどなかなか見つからなくて3日悩んだ末に見つけた回答がこちら。


Function getImage( byVal ss as string ) as bitmap
  dim bmp as Bitmap
  bmp = my.Resources.ResourceManager.GetObject(ss)
  return bmp
end function

リソース名をなんとか型変換すればいいのかと思って検索してたんだけど、My.ResourcesのメンバーのResourceManagerを使えばいいだけの話だそうです。

for i=0 to 2
  Dim res As String = "My.Resources." + icon(i)
  Dim bmp As Bitmap = My.Resources.ResourceManager.GetObject(res)
  Me.PictureBox1.Image = bmp
next

簡潔で素敵な解決方法を見つけられてうれしい。

<追記>
"My.Resources." + icon(i)
は次の行で

My.Resources.ResourceManager.GetObject
とMy.Resourcesを指定しているので不用でした。

渡す値は

icon(i)

のみになります。

【Lineage1】実質DR計算シート

ファイルへのリンクはこちら
http://1drv.ms/1MLZQ74

「変動ダメ」に25とありますが、これは0~25ダメージという事です。
「固定ダメ」に0とありますが、これは変動ダメ0~25+固定ダメ0という事です。

0~100:「変動ダメ100」「固定ダメ0」
50~100:「変動ダメ50」「固定ダメ50」

としてください。
エクセル関数であるRANDの特性上、シートが再計算されるたびにダメージが更新されますので毎回同じダメージが表示されるわけではありません。
ただ、小数点以下の変動にしかなりませんのでそういうものだと思って使ってください。

【Lineage1】反逆者とCBが一部狩場で拮抗するのはなぜか

昨日反逆者の実質DRを仮に計算してみましたが、カタログ通りの値を発揮するのは大ダメージを受けるボス戦や対人なんだろうなという判断でした。
しかし以前の記事で「二の丸などでは幸運LS+反逆者とDIS+CBで狩り効率差ほぼ無し」という実測に基づいた結論を出したことがあります。

試しに昨日と同様の計算式で回避スキルの実質DRを計算してみると、

ファイル 3435-1.png

ご覧の様にCBの方が圧倒的に実質DRが高いという結果が出ました。
しかし運用上そこまでの差があるとは思えません。
では何故でしょうか?

ここからは仮説ですが、例えばHP吸収武器の計算式はどれも同じです。
幸運LSの場合は80変身で両手剣に比べ1.2倍速だとして総吸収値がDISよりも確実に大きくなります。まずこれが一点。
二点目はDIS+CBだと反射ダメージが発生するのでダメージを与えているのにHPを吸収できない部分があります。

ですから反逆者のDRでCBに劣る分は片手剣の攻撃速度でプラスされ、CBのDRで反逆者に勝る分は反射ダメージがHP吸収できない事でマイナスされているのではないでしょうか。

そうすると一撃の重くない狩場で反逆者とCBの狩り効率が拮抗する理由として矛盾ないかなと思うのですけれども。