WebBrowserのテキストボックス、テキストエリアの現在の文字列を取得する

WebBrowserのテキストボックス、テキストエリアに文字列を入力するには、

Element.SetAttribute("value", "入力したい文字列")

入力する方法は検索するとたくさんヒットするけど、取得する方法がわからなかったので…

WebBrowserのテキストボックス、テキストエリアの現在の文字列を取得するには、

Element.GetAttribute("value")

です。

が、これをDocumentCompletedイベントで取得しようとすると、Javascriptなどで入力された文字列は取得できないようです。

その場合は、別途ボタンを用意してクリックイベントで

Element.GetAttribute("value")

とするか、自動でおこないたい場合は、DocumentCompletedイベント内で、タイマーをスタートさせて、タイマーのTickイベントで

Element.GetAttribute("value")

とすれば取得できます。
posted by VB.NET+MSDE+ActiveReports at 13:39 | Comment(2) | TrackBack(0) | VB.NET

WebBrowserのURLを取得すると、ブラウザのアドレスバーの内容と違う

WebBrowserのURLを取得すると、ブラウザのアドレスバーの内容と違うときの対処法

こうやって取得すると化けます。

WebBrowser1.Url.ToString


こうやって取得すればよいです。

WebBrowser1.Url.AbsoluteUri

たぶん、これでもよいです。

WebBrowser1.Url.OriginalString
posted by VB.NET+MSDE+ActiveReports at 18:45 | Comment(1) | TrackBack(0) | VB.NET

マイクロソフトのSAPI 5.1をインストールしました。

VB.NETで音声認識・合成プログラムを作ろうと思って、
マイクロソフトのSAPI 5.1をインストールしました。
http://support.microsoft.com/kb/320207/ja
↑↑↑
ここを見て、「SpeechSDK51.exe」と「SpeechSDK51LangPack.exe」をダウンロードしてインストールしました。
SAPI 5.1では、音声認識はできるけど、日本語の音声合成はできないようです。

http://www.createsystem.co.jp/
↑↑↑
ここのドキュメントトーカ 日本語音声合成エンジン for Windowsを購入すれば、VB.NETで開発できるようです。

SAPI 4.0の頃は、「Text To Speech Engine」があったのに、今ではダウンロードすらできないです。

AquesTalkも使えそうです。
↓↓↓
http://www.a-quest.com/demo/index.html
posted by VB.NET+MSDE+ActiveReports at 13:29 | Comment(0) | TrackBack(0) | VB.NET

モジュールはアセンブリマニフェストを含んでいなければなりませんというエラー

VS.NET 2008でデバッグするときに
…またはその依存関係の 1 つが読み込めませんでした。
モジュールはアセンブリマニフェストを含んでいなければなりませんというエラーが出ることがあります。
ソリューションのクリーンやプロジェクトのクリーンをしたあとで、
ソリューションのリビルドをしたときに、エラーがでなければ、とりあえず
デバッグできます。



VS.NET 2008では、.Net2.0、3.0、3.5に対応していますが、
プログラムの追加と削除でサービスパックも含めて、一旦、全て削除してから、NET Framework 3.5 Service Pack 1を再インストールしたら、エラーがでなくなりました。
NET Framework 3.5 Service Pack 1は、たぶん、2.0も3.0も含んでいるので、依存関係の 1 つが読み込めませんでしたといった感じのエラーが出ていたのではないかと思います。


posted by VB.NET+MSDE+ActiveReports at 15:29 | Comment(0) | TrackBack(0) | VB.NET

VB.NETで画像を合体、結合させる

VB.NETで複数の画像を例えば、縦200ピクセル、横300ピクセルの画像を2枚
縦に並べて結合させたい場合


Dim bmpAll As Bitmap '結合後の画像
Dim bmpTemp As Bitmap '各画像
Dim g As Graphics

'結合後の画像のサイズは各画像を縦に2枚並べたサイズ
bmpAll = New Bitmap(300, 400, Imaging.PixelFormat.Format32bppArgb)
g = Graphics.FromImage(bmpAll)
g.Clear(Color.White)

'1枚目は左上から描写
bmpTemp = New Bitmap("[1枚目の画像ファイルのパス]")
g.DrawImage( _
bmpTemp, _
0, _
0, _
CSng(bmpTemp.Width), _
CSng(bmpTemp.Height))

'2枚目は左上から200ピクセル下げた位置に描写
bmpTemp = New Bitmap("[2枚目の画像ファイルのパス]")
g.DrawImage( _
bmpTemp, _
0, _
200, _
CSng(bmpTemp.Width), _
CSng(bmpTemp.Height))

g.Dispose()
'できた画像を保存
bmpAll.Save("[結合後の画像の保存先のパス]")







posted by VB.NET+MSDE+ActiveReports at 16:14 | Comment(0) | TrackBack(0) | VB.NET

VB.NETでDBCC CHECKDBの結果を取得する

当ブログの記事、EXCEPTION_ACCESS_VIOLATIONアサーションエラーのような現象がおきたときに、
DBCC CHECKDBを実行することがあります。

これをVB.NETで行います。
シングルユーザーモードにした後で、接続を閉じるとDBCC CHECKDBが実行できなくなります。
ソースコードを書きます。


Dim sSQL As String 'SQL文
Dim sDBNAME As String 'データベース名
Dim cnSQL As SqlConnection 'SQLコネクション
Dim sConSQL As String '接続文字列
Dim objCom As SqlCommand
Dim dtReader As SqlDataReader
Dim sText As String
Dim i As Integer

'接続文字列はmasterに接続するようにします。
'シングルユーザーモードにする
sSQL = "ALTER DATABASE " & sDBNAME & " SET SINGLE_USER"
cnSQL = New SqlConnection(sConSQL)
cnSQL.Open()
objCom = New SqlCommand(sSQL, cnSQL)
objCom.ExecuteNonQuery()
'ここで接続を閉じないようにします。
'DBCC CHECKDBのコマンドをデータリーダーで実行します。
'WITH TABLERESULTSをつけることにより、
'結果がテーブルとして返ってきます。
sSQL = "DBCC CHECKDB('" & sDBNAME & "',"
sSQL &= "REPAIR_ALLOW_DATA_LOSS) WITH TABLERESULTS"
objCom = New SqlCommand(sSQL, cnSQL)
dtReader = objCom.ExecuteReader
'結果を1行ずつ読み込みます。
'どんなテーブルなのかわからなかったので、
'1列ずつカンマ区切りで取得しました。
Do While dtReader.Read()
For i = 0 To dtReader.FieldCount - 1
If Not IsDBNull(dtReader.Item(i)) Then
sText &= dtReader.Item(i)
End If
sText &= ", "
Next
sText &= vbCrLf
Loop
dtReader.Close()
'マルチユーザーモードにします。
sSQL = "ALTER DATABASE " & sDBNAME & " SET MULTI_USER"
cnSQL = New SqlConnection(sConSQL)
cnSQL.Open()
objCom = New SqlCommand(sSQL, cnSQL)
objCom.ExecuteNonQuery()
'接続を閉じます。
cnSQL.Close()
posted by VB.NET+MSDE+ActiveReports at 15:29 | Comment(10) | TrackBack(0) | VB.NET

Windowsフォームに変数を渡す

Windowsフォームに変数を渡して、戻り値を読み込むことができます。


Public Class Form1
Private miValue As Integer
Public Property piValue() As Integer
Get
Return miValue
End Get
Set(ByVal Value As Integer)
miValue = Value
End Set
End Property
End Class


こんな感じに宣言します。
そして、フォームを呼び出すときに

Dim Form1 As New frmSearch()
Dim iRtn As Integer
Form1.piValue = 0
Form1.ShowDialog()
If Form1.DialogResult = DialogResult.OK Then
iRtn = Form1.piValue
End If

という感じで使います。
意外とこのことを知らなくて、グローバル変数を使いまくっている人がいます。
その時は、よくよくても、後で、プログラムが巨大化してきたときに苦労するので、無駄なグローバル変数は、できれば使わないほうがよいです。
posted by VB.NET+MSDE+ActiveReports at 16:56 | Comment(0) | TrackBack(0) | VB.NET

バイナリファイルの読み込みで位置がずれる

バイナリファイルというんでしょうか。
10年以上前のソフトを使っているところのファイルをコンバートしたいというような話がよくあります。
固定長のデータのファイルを順番に読んでいけばよいのですが、変なデータが混ざっていたりすると、読み込むときに位置がずれてしまったりします。
位置がずれたら、固定長の意味がないです。
実際には位置がずれるというよりは、終端文字が無かったりするせいで、VB.NETのEncoding.GetStringがうまく動作しないということのようです。
例えば、200バイト目から10バイトとかいって読み込むと、その200バイトの中に2バイトの文字列の中途半端というか終端文字がないような部分があったりすると、VB.NETで読み込むときに、1バイトずれてしまったりします。
それを回避するためには、一旦、NotepadやTeraPadなどで、ファイルを開いて上書きします。
ただし、TeraPadで開くときに、
「Null文字を含むファイルです。Null文字は半角スペースに変換されました。...」
というメッセージが出る場合は、&H0 が &H32 になるので、その点、注意が必要です。
位置がずれるという点が解消されるので、取り扱いがだいぶ楽になります。
MS-DOSのファイルなのかよくわかりませんが、意味不明なデータがところどころに入っているのに、よくちゃんど動作するなと思います。
多分、以前はデータベースのデータが壊れやすかったのではないかと思います。
posted by VB.NET+MSDE+ActiveReports at 18:43 | Comment(0) | TrackBack(0) | VB.NET

GDI+ で汎用エラーが発生しました。

PictureBoxの画像をプログラムで保存しようとすると、
「GDI+ で汎用エラーが発生しました。」というエラーが発生することがあります。
コマンドラインで画像のパスを渡して、自動で画像を保存するソフトを作ったのですが、
なぜか上のエラーが出て、困っていました。
テストしているときは大丈夫でも、実際に使用するとエラーになるということでした。

テストと実際の使用時の違いは、パスの長さと、パスに2バイトの文字列が含まれることでした。
案の定、パスを短くして、日本語を無しにしたら、うまく動きました。
「GDI+ で汎用エラーが発生しました。」と出る場合は、保存先のパスを確認してみるとよいです。
このエラーを回避するために、一旦別の場所(エラーにならないパス)に保存してからコピーするようにしました。

GDI+では、謎のエラーがよく出て困りますが、工夫すれば、回避する方法はあるようです。
posted by VB.NET+MSDE+ActiveReports at 12:37 | Comment(0) | TrackBack(0) | VB.NET

Visual Studio 2005 評価版をインストールしてみました

いまさらですが、Visual Studio 2005 評価版をインストールしてみました。
Windows Mobile 6 でVB.NET 2003のスマートデバイスアプリケーションがうまく動作せず、
デバッグも出来ないので、Visual Studio 2005 評価版をインストールしてみました。
Visual Studio 2008にすればいいように思われるかもしれませんが、
実際に購入するかもしれないので、 スマートデバイス開発が出来るエディションの値段が、VS.NET 2008の方がかなり高いので、VS.NET 2005を試すことにしました。
ダウンロードしたのは、Visual Studio 2005 Professional Edition 90日間限定評価版で、
インストールしたのは、Windows Vista Businessです。
Visual Studio 2005 Professional Edition 90日間限定評価版をインストールした後で、
Visual Studio 2005 Service Pack 1と
Visual Studio 2005 Service Pack 1 Update for Windows Vista
をインストールする必要があります。
Visual Studio 2005 Professional Edition 90日間限定評価版をインストールしている途中で、Windows Vista用のアップデートをインストールしないといけないというような
メッセージがでて、後でインストールしようと思って、そのまま続行すると、
インストールが途中で固まってしまいましたが、キャンセルを押して、
ロールバックしますか?と聞かれて、それをキャンセルする
(インストールを途中でやめようとして、そのやめようとしたことをやめる)と先に進むようになり、無事インストール完了できました。

ダウンロードしたファイルは3ギガくらいあるイメージファイルなので、
DVDに焼いてから、インストールしなければならないのですが、
リモートデスクトップで作業をしていたので、そんなわけにもいかず
DAEMON Tools Lite と言うものを使うと、そのままイメージファイルにマウントできるので、
それで直接インストールしました。
スマートデバイスアプリケーションを作って見ようと思ったら、
Windows Vistaの場合はActive Syncが使用できず、Windows Mobile デバイス センター
をインストールしました。
後で調べたら、Windows Vista場合は最初から、Windows Mobile デバイスを接続できるみたいです。

実機でデバッグしてみようとしたら、配置はうまくいきますが、なぜかブレークポイントで止まってくれませんでした。
しかし、うまくいかないのは、HP iPAQ 112 Classic Handheldの場合で
HP iPAQ hx2410 Pocket PCの場合はうまく行きます。
Windows MobileR 6 Classicだと、セキュリティが厳しくなっていて、
何らかの設定が必要だと思われます。
posted by VB.NET+MSDE+ActiveReports at 19:22 | Comment(0) | TrackBack(0) | VB.NET

DateTimePicker.Value プロパティが表示と一致しない

DateTimePickerを使用していると、
DateTimePicker.Value プロパティが表示と一致しないことがあります。
具体的には、DateTimePickerの中の値を直接キーボードで編集して、
その直後にLabelをクリックして、DateTimePicker.Value プロパティを参照する場合です。
カレンダーを表示させて選択する場合はうまくいきますが、
直接、編集して、そのままLabelをクリックするような場合は、
DateTimePicker.ValueChanged イベントがうまく発生しません。
Buttonの場合は大丈夫なようです。
Labelをクリックするようなことは、あまりないかもしれませんが、
ButtonだとTabでフォーカスが移ってしまうのが邪魔なときなどに、
LabelをButtonのかわりに使うことがあります。

Labelのクリックイベントでうまくいかないということは
他の処理でもうまくいかないことがあると思います。

これを回避するためには、適当なラベルを配置して、行いたい処理の最初に
そのラベルへフォーカスを移します。
仮にLabel1を配置した場合は、処理の最初にLabel1.Focusとすることで、
DateTimePicker.Value プロパティが表示されているものに更新されます。

Label1を隠したい場合に、Label1.Visible = False としてしまうとうまくいきません。
他のコントロールの後ろに隠すか、
Label1.Text = ""
Label1.BackColor = Color.Transparent
として見えなくしてください。
Labelの場合は、フォーカスを移しても、実際には移らないので便利です。
posted by VB.NET+MSDE+ActiveReports at 19:44 | Comment(1) | TrackBack(0) | VB.NET

VB.NETでブラウザのテキストを取得する

ブラウザに表示されているテキストを取得したい場合があります。
VB.NET 2005 ExpressやVB.NET 2008 Expressでは、WebBrowserコントロールがあるので、
WebBrowserコントロールをフォームに貼り付けて、


'WebBrowser1にフォーカスを移して
WebBrowser1.Focus()
'全て選択して
SendKeys.Send("^A")
'コピー
SendKeys.Send("^C")


とやってみましたが、うまくいきませんでした。
FocusをSelectに変えても、ダメでうまくフォーカスが移らないような感じでした。

HTMLで取得する場合は、WebBrowser1.Document.body.innerHTML
とやればよく、タグをはずしたいのなら、正規表現でやればいいような気もしますが、
WebBrowser1.Document.body.innerTextとやれば、簡単にテキストのみ取れてしまいます。
実際に、選択して、コピーしたものとは少し違うかもしれませんが、
HTMLのタグが混ざっているものよりは役に立ちそうです。

これは、VB.NET 2005やVB.NET 2008のWebBrowserコントロールだけでなく、
VB.NET 2002やVB.NET 2003でshdocvw.dllを参照して、IEを使っている場合も、
多分大丈夫です。
posted by VB.NET+MSDE+ActiveReports at 19:20 | Comment(0) | TrackBack(0) | VB.NET

マーキーのようなものを作る


携帯サイトなどで、よく見られるマーキーのようなものを作ります。
文字がスクロールするものです。
右から左に文字がスクロールするのが普通みたいですが、
左から右にスクロールするものを作ってしまいました。

フォームにラベルとタイマーを配置して、
タイマーイベントのたびに文字をずらすだけです。

ソースコードは以下のようになります。

    '文字の左端の位置
    Dim iLeft As Integer
    'フォームロード時にタイマーをスタート
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'タイマーのインターバルで文字の進む速度が決まります
        Timer1.Interval = 10
        Timer1.Start()
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim objG As Graphics
      
        objG = Label1.CreateGraphics()
        'ここで一旦クリアしないと真っ黒になります
        objG.Clear(Label1.BackColor)
        '左端を決めて、文字を描画する
        objG.DrawString(Label1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLeft, 0)
        '左端をずらす
        iLeft += 1
        If iLeft > Label1.Width Then
            '右端までいったら戻す
            iLeft = 0
        End If
        objG.Dispose()
    End Sub


右から左に移動させたい場合は、
この逆をおこなえばよいです。

ちなみにホームページでマーキーを使いたい場合は、
<marquee>[スクロールさせたい文字列]</marquee>
とするだけです。
[スクロールさせたい文字列]


posted by VB.NET+MSDE+ActiveReports at 16:45 | Comment(3) | TrackBack(0) | VB.NET

データグリッドで新しい行の追加を禁止する


データグリッドにテーブルと表示するときに、
一番下に米印のついた新規行が表示されます。
行を追加したくない場合は、新規行を表示したくありません。
通常はデータグリッドにデータテーブルを表示することが多いですが、
新しい行の追加を禁止したい場合は、データビューを使用します。


        Dim objeDataView As DataView
        Dim objeDataTable As DataTable
        objeDataView = New DataView(objeDataTable, "", "", DataViewRowState.CurrentRows)
        'データビューに新しい行の追加を禁止
        objeDataView.AllowNew = False
        'データグリッドにデータビューを表示
        dgInventory.DataSource = objeDataView

以上で、新しい行の追加を禁止することができます。
また、DataViewの引数で、行にフィルタをかけたり、
ソートすることもできます。
例えば、
        objeDataView = New DataView(objeDataTable, "行1=1 AND 行2=1", "", DataViewRowState.CurrentRows)
として、行1が1、かつ、行2が1のものだけ絞り込んだり

        objeDataView = New DataView(objeDataTable, "", "行1", DataViewRowState.CurrentRows)
として、行1でソートすることもできます。

posted by VB.NET+MSDE+ActiveReports at 17:59 | Comment(0) | TrackBack(0) | VB.NET

VB.NETで常駐アプリケーションを作る


VB.NETで常駐アプリケーションを作る方法です。

常駐アプリケーションとして、
1、コンピュータの起動時にアプリケーションも起動する。
2、タスクバーのタスクトレイにアイコンを表示する。
3、タスクトレイのアイコンを右クリックで、フォームを開く。
4、フォームの最小化ボタンで隠れる。
と言うものを考えます。

コンピュータの起動時にアプリケーションも起動するためには、まず、
実行ファイル(EXEファイル)を右クリックして、ショートカットの作成をします。
スタート→すべてのプログラム→スタートアップを右クリック→開くで、
スタートアップのフォルダの中に、作成したショートカットを入れます。

アプリケーション起動時にフォームを非表示にするためには、通常、

    Public Sub Main()
        Dim Form1 As New Form1()

        Application.Run()

    End Sub

としますが、ここでは、フォームをロードしてイベントを発生させたりしたいので、

    Public Sub Main()
        Dim Form1 As New Form1()

        Application.Run(Form1)

    End Sub

とします。
しかし、こうしてしまうと、起動時にフォームが表示されてしまいます。
フォームロードイベントで、Me.Visible = False とか、Me.Hide()としても、
うまくいきません。
Me.WindowState = FormWindowState.Minimized としても、タイトルバーが右下に
表示されてしまいます。
この場合は、デザイナで編集するときに、WindowStateをMinimizedにして、
ShowInTaskbarをFalseにします。

タスクバーのタスクトレイにアイコンを表示するためには、
NotifyIcon コントロールをフォームに貼り付け、アイコンを選択します。

タスクトレイのアイコンを右クリックで、フォームを開くためには、
ContextMenu コントロールをフォームに貼り付け、NotifyIcon コントロールの
ContextMenu プロパティで、フォームに貼り付けたContextMenu コントロールを選択し、
「開く」という、MenuItemを作成し、これがクリックされたところで、Me.Show()とします。

これだけだと、フォームの最小化ボタンを押して、再度、隠そうとすると、
また、タイトルバーが右下に表示されてしまいます。

この場合は、

    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
        If Me.WindowState = FormWindowState.Minimized Then
            Me.Visible = False
        End If
    End Sub

とすれば、何度でも隠したり表示したりすることができます。

posted by VB.NET+MSDE+ActiveReports at 17:18 | Comment(1) | TrackBack(0) | VB.NET