ラベル vb2005 の投稿を表示しています。 すべての投稿を表示
ラベル vb2005 の投稿を表示しています。 すべての投稿を表示

2012年10月22日月曜日

vb2010 Application.Restart()とStopWatchクラスを使ってみた


職場でApplication.Restart()を使ったら重複起動チェックに引っかかって2回目以降が起動してくれないのでメモ

初回の再起動では別プロセスで開いてくれるようだが、2回目以降は別プロセスにならない?(詳しい人教えてください)ようで、重複起動チェックに引っかかって再起動してくれなくなった。

そこで重複起動チェックの処理を修正することにしました。


最初はただのif文だったのを以下のように修正。
while UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0
thread.sleep(100)
i+=100
if i >3000 then
  exit while
end if
これで前プロセスの終了を3秒だけ待って起動できるようになった。
後でYさんからStopWatch使おうといわれ以下に修正。
Dim _stopWatch As New Stopwatch
_stopWatch.Start()
While  UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0
  Thread.Sleep(100)
  If _stopWatch.ElapsedMilliseconds > 3000 Then Exit While
End While
_stopWatch.Stop()

処理の実行時間を計るときは便利そうです。

2012年8月14日火曜日

vb2008で開かれているフォームを取得する

vb2008にてアクティブでないフォームの属性やプロシージャを使いたいことがあるかもしれません。
そんな時My.Application.OpenFormsを使うと開いているフォームを参照できます。
詳しくはこちら


 For Each frm As Form In My.Application.OpenForms
            If Not frm.name = "KWGTYPE" Then
                frm.close()
            End If
 Next

上記のようにすればアクティブでないフォームから条件で選別して閉じることもできます。
間違ってたらおしえてくだしぁ^^

2012年5月17日木曜日

VBでHashTableが入ったArrayListをSortする

結構探し回ったんだけど全然わかんなかったが最終的にここを参考に作業を進めた。
以下のような頭の悪いサンプルデータをComparerを使ってソートしたい。
Dim itemList As new ArrayList 
Dim item1 As new HashTable
item1.add("key1", 10)
item1.add("key2", 20)
item1.add("key3", 30)
Dim item2 As new HashTable
item2.add("key1", 20)
item2.add("key2", 20)
item2.add("key3", 20)
Dim item3 As new HashTable
item3.add("key1", 30)
item3.add("key2", 20)
item3.add("key3", 90)
Dim item4 As new HashTable
item4.add("key1", 110)
item4.add("key2", 220)
item4.add("key3", 330) 
itemList.add(item1)
itemList.add(item2)
itemList.add(item3)
itemList.add(item4)

Comparerでソートするのはjavaで(compareterか?)使ったことがあったので知っていたが、VBではどうやって型を指定するのかさっぱりで結構つまった。
    Public Class ItemSort
        Implements System.Collections.Generic.IComparer(Of Hashtable)
        Public Function Compare(ByVal candidate1 As System.Collections.Hashtable, ByVal candidate2 As System.Collections.Hashtable) As Integer Implements System.Collections.Generic.IComparer(Of System.Collections.Hashtable).Compare

            Dim resultKey1 As Integer = candidate1("key1") - candidate2("key1") '昇順
            'key1が同じときはkey2の降順で返す
            If resultKey1 = 0 Then
                Dim resultKey2 As Integer = candidate2("key2") - candidate1("key2")  '降順
                If resultKey2 = 0 Then
                    'key2が同じときはkey3の昇順で返す
                    Return Comparer.Default.Compare(candidate1("key3"), candidate2("key3")) '昇順
                Else
                    Return resultKey2
                End If
            End If
            'それ以外のときは区分の昇順で返す
            Return resultKey1
        End Function
    End Class
上記のように書いて以下のようにして以下のように呼び出す。
itemList.Sort(New ItemSort)
これでHashTableのfieldでソートかけれる。
超便利^^

2012年5月10日木曜日

windowsのbeep音を黙らせる

vb.netやSQL Serverを使っているとbeep音がうるさくてsan値が危ういので黙らせる方法



上記を参考に

デバイスマネージャ>ツールバーの表示>非表示のデバイスの表示>プラグアンドプレイではないドライバー>Beepのプロパティ>ドライバータブ

ここから停止や無効に設定すれば静かなものである。

2012年5月9日水曜日

VBでオブジェクトのデータ型を確認する

VB.net 2005でSQL serverとやりとりしてて空の値(null)が返されたんだけど、vb的にはnullではなくSystem.DBNull型なのだそうです。

if Not (TypeOf source("CometGarradd").rows(0)("IonTail") Is System.DBNull) Then
End If

上記のようにすると条件として使えました。

TypeOf 変数名 Is データ型

とすると変数の方を確認できた。

ギャラッドさんにイオンテイルがあるかどうかは知りませんw

TRUNCATEとRTRIM

文字数が違うchar型フィールドを比較するときにつまったのでメモ
DBはSQL Serverです

SELECT
   darlin
FROM
    DB1,DB2
WHERE
    DB1.name = RTRIM(DB2.name)

DB1.nameがchar(5)、DB2.nameがchar(10)であるときDB2.nameの右側から5文字分の空白をトリミングしてくれます。
ちなみに左からトリミングしたい場合はLTRIM、左右の空白を削る場合はTRIMでよいそうです。


ついでにこれを覚えた。
TRUNCATE TABLE DBNAMEテーブルの中身を確認せずに削除するのでDELETEより早いらしいです。

2012年5月2日水曜日

DateTime型への変換とDBでの比較

vb2005からSQLserver使っててDateTimeの比較で詰まったのでメモ



まずはDateTime型にするところから。

vb2005で日時の文字列をDataTime型に変換するときは以下のように行う。
Dim dt As DateTimedt = DateTime.ParseExact("2012/05/02 19:04:30", "yyyy/MM/dd HH/mm/ss", Nothing)    'DateTime.ParseExact(変換したい日時, フォーマット, フォーマットと日時の対応表?)
この時、文字列の書式とフォーマットの書式が一致していないと怒られる。

SQLで比較するときはすでにDateTime型なので

Dim query As String = ""query = query  + " SELECT COUNT(*) " + vbCrLfquery = query  + " FROM ZIEX  " + vbCrLf query = query  + " WHERE YMDT >= " + dt + " " + vbCrLf


などとする。
dtがString型のままの場合は以下のようにシングルクォーテーションで囲まなければならない。


Dim query As String = ""query = query  + " SELECT COUNT(*) " + vbCrLfquery = query  + " FROM  EAGLE " + vbCrLf query = query  + " WHERE YMDT >= '" + dt + "' " + vbCrLf