2009年11月13日金曜日

MSAccess使いからVB.NETへの道 TextBox中の文字を他のTextBoxにドラッグアンドドロップその2

続きはそんなに大したことではないが、明細行の行コピーの手順としてはまず前提が大事になってくる。

TextBoxをひたすら配置するときに、Webでよく使われている手法として行カウントのNoを含めるという名前付けを行う。

これをVBでも行いloop処理で書くプログラム数を減らすというものだ。
例えば 1行目の商品CDのTextBoxには

SYOHIN01

という具合。もちろん2行目はSYOHIN02 ・・・
そこでドラッグアンドドロップをするときに使う文字としてSYOHIN02を使用するわけだ。

Right関数で右2列を使用すれば現在の行数がわかるのでその同じ行のすべての情報を取得すればよい。

そこで1行がまた大量の場合SYOHINなどの名前をつけてしまうと各名称をタイプしなければならないのでお勧めする名称は

Column0101

とすると良いだろう。
1行の全項目を取得する場合にもLoopが使えるのでソースが激減する。

また名称で判別したい場合は、関数にしてしまうのも手だ。

Public Function SYOHIN()
SYOHIN = "01"
End Sub

個別に処理をしたい場合に書いたソースの項目名がすべて数字だと何が何だか解らなくなってしまうのを防ぐためだ。

これでコントロール名称を動的に取得すればよい。
使い分けとしてまとめると

●項目を単体で制御する場合は関数名を使い動的にコントロール名で行う。

●項目全体を一度に行う場合はコントロール名称をそそまま使用しLoop制御で一気にたたみかける。

次回はその使用例を覚書としてまとめようと思う。

2009年11月12日木曜日

MSAccess使いからVB.NETへの道 TextBox中の文字を他のTextBoxにドラッグアンドドロップその1

邪道な方法
Accessの様な行明細で同じ内容の行をコピーして増やしていきたい・・・
そういう要望は多々ある。
作る方はあまりお勧めしない運用であるが、見積の画面となるとそうはいかなくなってくる。
この方法は明細行を1つ1つTextBoxで作成した場合である。
(明細形式のコントロールでは想像着かない為)
そこで少し奮闘してみた。
まずは受ける方のTextBoxプロパティでAllowDropをTrueに必ず変更する。
これをしなければうんともすんとも言わない。

TextBoxのあるフォームに以下のコードを書き込む。

'受ける方のCD TextBox2
Private Sub TextBox2_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles _ TextBox2.DragEnter
'ドラッグされている内容が文字列型に変換可能な場合
If e.Data.GetDataPresent(GetType(String)) Then
'コピーを許可するようにドラッグ元に通知する
e.Effect = DragDropEffects.Copy
End If

End Sub

Private Sub TextBox2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles _ TextBox2.DragDrop

If Me.ActiveControl.Name <> "TextBox1" Then
Me.TextBox2.Text = e.Data.GetData(GetType(String))
End If
End Sub

'ドラッグする方
Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles _ TextBox1.MouseDown

Me.ActiveControl.DoDragDrop(Me.ActiveControl.Name.ToString, DragDropEffects.Copy)

End Sub

ちなみにこの例はTextBox2の値に"TextBox1"という文字が入る。Me.ActiveControl.Name.ToString を文字として指定しているからである。
Me.ActiveControl.Text.ToStringとすればそのTextBoxの文字をドラッグアンドドロップすることが可能であるが、それでは1つだけがコピーされるだけである。

なのでまずは方法が解ったところで次回その取り回しをリファレンスしたいと思う。

2009年11月10日火曜日

MSAccess使いからVB.NETへの道 Handles後のコマンド登録

同じイベントの発生する項目が大量にあった場合に昔ではひたすらイベントに書き込んでいた記憶がある。

しかしHandles後に指示するコマンドは複数登録が出来1箇所のソースで完了できる仕様になっている。

が、なかなか便利かとおもいきや大量にある場合はやはり大変なのでなんとかいい方法はないかと思ったとき、エクセルと秀丸のようなテキストエディタを使ってみた。

エクセルで元ネタを作成し、値の貼り付けでテキストにしてあげてから、デキストエディタに一度貼り付け必要であれば編集、その後VBのソースに貼り付ける。

一度エクセルで項目名を作成しておけば、同じようなことがあった場合次からはかなり早い。

この場面はAccessのようなアプリを作成していると特に遭遇する事態であった

2009年11月7日土曜日

MSAccess使いからVB.NETへの道

VBでMSAccessの様に動かす・・・

これに至るまでに長かったこと。。。

この問題の最大はなんと言っても表形式フォームの表現だろう。


なんだかんだ言われたい放題のMSaccessだがこの表形式フォームの機能はよく考えられていると思う。


ただの表示だけならVBでもなんとかなる…何度もそう思った

問題は入力する表形式フォームで複雑に制御をしなければらなない場合だ。

特に入力の値に応じてEnterによるTab移動を駆使するといったことを実現出来るものはVBで用意されたコントロールにはないということだ。

この制御はMSAccessにとってたやすい表現であった為、VBにもあるのでは?という甘い期待を抱いていたのだが実現が難しいというのが分かるまでに長かった。

そうするとTextBoxをひたすら配置するしかないという結論である。


MSAccessの様にVBを使う条件
●一覧で表示する場合行数が未定の場合に使い分けるコントロール
 A) DataGridview
  これは1行で表示出来るものに限られる。
  EnterでのTab移動は単純な動きだけは可能なので編集する場所が少ない場合に有効である

 B)DataRepeater
  表示だけなら1行の中に自由にテキストボックスを配置が出来てAccessの表形式フォームの見栄えが簡単に出来る
  しかしVisualBasicPowerPack3.0をインストールしてから使用するものなので配布時に注意する必要がある
  すごく期待したがこれもEnterのTab移動が困難

 C)ListView
  これはAccessで言うリストボックス。そう思って使おう
  なれればかなり便利。それほど難しくないし

 D)TextBoxを力技で配置
  入力インターフェイスを自在に行うのならやはりこの方法
  入力行数を固定して使う
  それよりデータが多い場合はページング処理を施す

それでもう一つ重要な条件で、クエリは手書きです。AccessのGUIみたいなものはありません。あるにはありますが実現できることはかなり制限されます。クエリのGUIからの脱却は考えることです。(あれに変わるわかりやすいものはないと思いますが・・・)


という具合の住み分け方法に落ち着いた。


後にそのTextBoxの力技で配置の大まかな方法をレビューしようと思う。

MSAccess使いからVB.NETへの道

ようやくVB.NETの使い方がなんとなく分かってきた。
MSAccessからの脱却方法を自分なりに今後まとめておこうと思う。

その前にちょっとこまった現象

VB2008ExpressEditionでContextMenuStripコントロールを使用していたところ強制終了が突然発生する。

なかなか油断しているところでやられてしまうので、何度か頓挫してしまった。

どうにかならないものか・・・

2009年9月28日月曜日

充電式電池の完全放電確認方法

今の時代、充電式の乾電池を使うというのがごく普通になってきた。

以前では、ニカド式でラジコンなどに使用する用途くらいであまり普及はしていなかった。

なのでニカド電池はほとんど放置状態だったのだが、放置して置いた為か再び充電すると使用できるようになるではないか。

以前使用しているときは、メモリ効果が最大に達した為か、充電してもすぐ電池がなくなるという状態でいかにもお買い得感がなくて見向きもしなくなった経緯があった。

しかし最近の充電式はパワーから、持続性までまるで違うので驚いた。特に継ぎ足し充電が可能と放電がほとんどないというところがニカド電池を使用していた人間には信じがたかった。


だが、そんななかにも充電方法によっては、メモリ効果と疑いたくなるような状態にもなる場合に遭遇した。

たいがい電池を2本以上を同時に使用する場面が穂ほとんどと思われるが、そのどちらかの電池が途中まで充電が残っている場合と、もう一つの電池がほとんどない場合などは、充電器で充電している途中で点滅を繰り返す(充電されない電池)とご認識する場合がある。

残量チェックメーターなどがあればよいがなかなか高価なのである。

そうすると他の手を考えなければならないが、手ごろなものがなかなか見つからない。

すると最近の子供のおもちゃ箱から、ラジコンのプロポが出てきた。それは500円の一応フルアクションの車のラジコンであった。

そのプロポの動力源は単4乾電池2本。そこで工夫をしてみた。

ボタンを押しっぱなしにするように結束バンドでボタンとの間に電話線のクリップを間に挟みこんだ。

これで放電機の完成だが、赤外線は目には見えない。
そこで赤外線の確認方法として、携帯電話のカメラ越しで確認するという方法で解決。

1日放電させれば十分だと思うが、これはやってみないとわからない。

それで、放電してみてから充電すると、エラー点滅していた電池が復活。


ニカドもあとで試してみよう。

昔は無線ラジコンを500円でなんてとても買えなかったが時代の流れか。ラジコンはこわれてもプロポだけが残るのことが多いと思うが、こういう使い方もどうだろう?

2009年9月14日月曜日

リモートしている時の便利なキー アプリを閉じる

リモートをしている時に最大化になったアプリを閉じようとした場合場合によってはスクロールしなければ右上のXを押せない場合あると思う。

その場合Alt + F4でアプリを終了出来る。

初めはなかなか出来なかったが、慣れてくるとかえってこの方法で閉じるようになった。マウスで閉じたいアプリの適当な場所をクリックしてアクティブにし Alt + F4 を左手で実行。

最近のPCは大量に画面を開いていても気にせず動いてくれるので
画面を沢山開いて閉じたいアプリが全部でない場合、なんとも気持ちよく閉じたいアプリを指定して終了出来る。
指のフォームポジションが出来てしまえばこっちのもの。楽器を弾くような感じかな。
リモートでなくても推奨したいキーだね。