VB6で、テキストボックスを使ったツールを作ったのですが、起動して文字を入力していると、途中で急に入力した文字が消えてしまいます。
ただ入力を続けているだけなのに、何故でしょう?
文字数とかが関係しているのでしょうか?
そんなに文字数は入れてないんですが・・・。
どなたか教えてください!! お願いします!!

このQ&Aに関連する最新のQ&A

A 回答 (10件)

修正がある程度完了したら、またここに書いてみてください。


圧倒的に量が減っていると思います。

これからもサポートしていきたいと思いますので、あきらめずに続けてみてください。

>本を購入してきてその中のパターンを真似ているだけ
どの文がどういう動作をしているのかわからなかったら、本で調べるのもいいですし、ここで質問するのもいいでしょう。
ただし、質問する前にキーワードで検索したほうがいいです。


Stopステートメントのほかに、もう1つ便利なデバッグ方法。
ある行でF9を押してみましょう。
その行の色が変わります。
それから実行すると、その行に来ると必ず止まってくれます。

Text1.Text = .....

が書いてある行をすべてF9で色を変えてから実行し、止まったら、右辺(イコールの右の変数)にマウスポインタを当ててみましょう。
するとその変数の内容を表示してくれます。
    • good
    • 0
この回答へのお礼

こんにちは。色々と解説いただきありがとうございました。Stopステートメントは試してみましたが、次から次とストップしてしまい、結局原因の個所は特定できませんでした。とりあえず、ポイントがありますのでこの質問は締めさせていただきました。ほんとに参考になりました。ありがとうございました。日々疑問が出てくるので、また別の枠で質問をさせていただこうかと思います。その時はまたよろしくお願いしますね!お世話様でした。では。

お礼日時:2002/01/28 21:23

んんん。


これがフォーム上のコードすべてですか?

いろんなところに

If Text1.Text = "" Then Stop

を書いて、どの時点でテキストボックスのなかみが消えているか特定はできましたか?
このコードを見ても、名前が何のコントロールの名前なのか予測できないので、なんともいえません。

すみません、自信なくなってきました。

APIやカスタムコントロールを使っているので、いろいろ勉強なさっているとは思いますが、さすがにこれでは見やすいコードとはいえません。
コードを見やすく、無駄なく書き直せば、多少デバッグ効率が上がると思うのですが・・・。

○ ファイル名を作成する作業は何度も使うので、関数にしたほうがいい。

Function MakePathName(File As string) As String

MakePathName = App.Path + "\" + Replace(File, "/", "")

End Function

とか。

○ Weekday(startdate)を何度も呼び出すのは効率が悪いので、それを変数に入れてSelect Caseすればかなりコードが減る。

Dim Wd As Long, WdName

Wd = Weekday(startdate)

WdName = Array("日", "月", ・・・"土")
Form1.Label2.Caption = WdName(Wd)

Select Case Wd

Case 1

'赤にする文

Case 2 To 7

'黒にする文

End Select

ってな感じ。

○ Format(startdate, "mm/dd")もなんども呼び出してはダメ。

Dim Sd As String
Sd = Format(startdate, "mm/dd")

Select Case Sd

Case "01/01", "02/11",・・・"12/23"

'赤にする文

End Select

VBにはSelect Caseというほかの言語にはあまりない便利な分岐文があるので、利用しましょう。

○ Dimはサブルーチンの最初にまとめて書いたほうが良い○ Dimは,(コンマ)で1度に複数宣言できるので、同じような意味を持つ変数は同時に宣言

○ Timer1_Timerイベントにて、GetPrivateProfileStringに渡すファイル名やキー名は不変なので、フォーム内の(Declarations)で宣言し、Form_Loadで値を代入したほうがよい。

なんども同じ値を入力するのは無駄です。



なんだか、あまり関係ないことしか言ってませんが、他人に聞くときは、他人に見やすいコードを書くことも重要なのです。
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございます。ほんとに色々なやり方があるんですね。私の場合は、勉強してるというよりも、色々な本を購入してきて、その中のパターンを真似ているだけなので、実際にはよく理解できていないんです。しかも、本では今自分が求めるコードがどれなのかもよく分かりませんし。誰かに説明していただくと、すごく参考になります。とりあえず書いていただいたものは全部試してみたいと思います!

お礼日時:2002/01/23 20:21

このプログラムでは何のイベントなのかわからないのですが、カレンダーの日付クリックイベントなのでしょうか。


Private Sub ~~~()から書いてほしかったです。

このイベントが、タイマーやキーイベントなどのリアルタイムなイベントでない限り、テキストボックスに文字を入力中に文字が勝手に消えてしまうということはありえません。
やはりPrivate Sub ~~~()の部分がわからないことにはどうにも・・・。
あと、貼り付けているコントロールやそのコントロールで発生するイベントなどを補足してくだされば、おそらく解決の糸口は見つかるかと思います。

このようにどの時点で不具合が起こっているかわからないようなときは、それを起しうるイベントが特定できなければ、解決のしようがありません。
いろんなところに

If Text1.Text = "" Then Stop

を書いておくのも手です。
こうすれば、テキストが空になった時点でコードが中断し、場所を特定できます。


ちなみに、プログラム上のアドバイスを。

App.Pathは通常 "C:\Temp" などの、最後に "\" を含んでいない文字を保持していますが、プログラムがルートにある場合は "C:\" などと最後に "\" が含まれています。
このため、App.Path + filename とすると、\がダブってしまう可能性もあるということです。
プログラムの腕が上達してきて、配布などを考えることがあれば、この点は無視できません。

また、同じフォーム上のコントロールを指定するのに、Form1.Text1 のように Form1 と指定するのはオススメできません。

この回答への補足

ありがとうございます。ツールの内容は以下のとおりです。
Option Explicit
Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal naiyou As String, ByVal lpFileName As String) As Long
Private Sub clear_Click()
Form1.Label1.Caption = ""
Form1.Label2.Caption = ""
Form1.Text1.Text = ""
End Sub
Private Sub Command1_Click()
Dim out2 As String
Dim day As String
Dim filename As String
Dim henkan As String
Dim henkan2 As String
Dim ans As String
If Label1.Caption = "" Then
MsgBox "****************** ", vbCritical
Exit Sub
Else
If Text1.Text = "" Then
ans = MsgBox("******************", vbYesNo + vbQuestion
If ans = vbNo Then
Exit Sub
End If
End If
End If
henkan = Form1.Label1.Caption
henkan2 = Replace(henkan, "/", "")
filename = "\" & henkan2 & ".txt"
If Dir(App.Path & filename) = "" Then
out2 = Text1.Text
Open App.Path & filename For Output As #1
Print #1, out2
Close #1
Else
ans = MsgBox("******************", vbYesNo + vbQuestion
If ans = vbNo Then
Exit Sub
Else
Kill Dir(App.Path & filename)
out2 = Text1.Text
Open App.Path & filename For Output As #1
Print #1, out2
Close #1
End If
End If
End Sub
Private Sub copy_Click()
Clipboard.SetText Form1.Text1.SelText
End Sub
Private Sub cut_Click()
Clipboard.SetText Form1.Text1.SelText
Form1.Text1.SelText = ""
End Sub


Private Sub keep_Click()
Call Command1_Click
End Sub

Private Sub logon_Click()
optionman.Show
End Sub

Private Sub paste_Click()
Form1.Text1.SelText = Clipboard.GetText
End Sub
Private Sub fin_Click()
Unload Me
Unload myplan
End Sub
Private Sub monthview1_selchange(ByVal startdate As Date, _
ByVal enddate As Date, Cancel As Boolean)
Form1.Label1.Caption = startdate
If Weekday(startdate) = 1 Then
Form1.Label2.Caption = "日"
Form1.Label2.ForeColor = vbRed
Form1.Label1.ForeColor = vbRed
End If
If Weekday(startdate) = 2 Then
Form1.Label2.Caption = "月"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Weekday(startdate) = 3 Then
Form1.Label2.Caption = "火"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Weekday(startdate) = 4 Then
Form1.Label2.Caption = "水"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Weekday(startdate) = 5 Then
Form1.Label2.Caption = "木"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Weekday(startdate) = 6 Then
Form1.Label2.Caption = "金"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Weekday(startdate) = 7 Then
Form1.Label2.Caption = "土"
Form1.Label2.ForeColor = vbBlack
Form1.Label1.ForeColor = vbBlack
End If
If Format(startdate, "mm/dd") = "01/01" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "02/11" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "04/29" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "05/03" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "05/04" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "05/05" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "07/20" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "09/15" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "11/03" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "12/23" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "01/02" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
If Format(startdate, "mm/dd") = "01/03" Then
Form1.Label1.ForeColor = vbRed
Form1.Label2.ForeColor = vbRed
End If
Dim day As String
Dim filename As String
Dim henkan As String
Dim henkan2 As String
Dim readdata As String
Dim readend As String
Dim filename2 As String
henkan = Form1.Label1.Caption
henkan2 = Replace(henkan, "/", "")
filename = "\" & henkan2 & ".txt"
filename2 = "\" & henkan2 & ".dat"
If Dir(App.Path & filename) = "" Then
Form1.Text1.Text = ""
Else
Open App.Path & "\" & filename For Input As #1
Do Until EOF(1)
Line Input #1, day
readdata = readdata & day & vbCrLf
Loop
readend = Replace(readdata, "", "")
Close #1
Form1.Text1.Text = readend
End If
End Sub
Private Sub plan_Click()
myplan.Show
If Form1.Label1.Caption = "" Then
MsgBox "******************", vbExclamation
Unload myplan
Else
myplan.Label1.Caption = "20" & Form1.Label1.Caption & " (" & Form1.Label2.Caption & ")"
End If
End Sub

Private Sub Timer1_Timer()
Dim filename As String
Dim henkan As String
Dim henkan2 As String
Dim filename2 As String
henkan = Form1.Label1.Caption
henkan2 = Replace(henkan, "/", "")
filename2 = "\" & henkan2 & ".dat"
If App.Path & filename2 = "" Then
Form1.Label6.Caption = ""
Else
Dim strFileName As String
Dim strSectionName As String
Dim strKeyName As String
Dim strValue As String * 1024
Dim lngStrLength As Long
Dim lngResult As Long
strFileName = App.Path & filename2
strSectionName = "nikki"
strKeyName = "plantext"
lngStrLength = Len(strValue)
lngResult = _
GetPrivateProfileString( _
strSectionName, _
strKeyName, _
"", _
strValue, _
lngStrLength, _
strFileName)
Form1.Label6.Caption = _
Left(strValue, _
InStr(strValue, _
vbNullChar) - 1)
End If
Form1.Label6.Left = Form1.Label6.Left - 50
If Form1.Label6.Left + Form1.Label6.Width < 0 Then
Form1.Label6.Left = Form1.Label6.Width
End If
End Sub

Private Sub version2_Click()
Version.Show
End Sub
カレンダーの日付をクリックして、ラベルに日付を表示→テキストの内容を書いて、最後に「保存」専用ボタンを押す→yymmdd.txtに内容をセーブする→保存した日付をクリックすると、その日付のyymmdd.txtを読み込んでテキストボックスに表示する というものです。
あと、予定登録に文字を入れると、ファイルにセーブして、画面下のラベルを文字が流れて表示されるというのもあります。
こんなんでお分かりいただけるでしょうか。見当違いだったらごめんなさい!!!

補足日時:2002/01/22 21:06
    • good
    • 0

>If Dir(App.Path & filename) = "" Then


>Form1.Text1.Text = ""
>Else
の部分なんですけど、ファイル名が見つからなかったらテキストボックスの内容をクリアするってことですよね。
最初このファイルは存在するのでしょうか?
ファイルが存在しない場合実行しても結果はずっと同じですよ。
あらかじめApp.Pathの場所にそのファイルがあれば別ですが。
まず、if~の前に
Open App.Path & "\" & filename For Append As #1
Close #1
で空のテキストファイルを作ってみては?

この回答への補足

私の説明が至りませんでした。テキストボックスの内容をテキストファイルにセーブするようにしているので、最初は
If Dir(App.Path & filename) = "" Then
Form1.Text1.Text = ""
としないと、ファイルが存在しないということでエラーになるんです。
一度セーブすれば、次に対象の日付をカレンダーからクリックすると、その日付のファイルを読み込んでテキストボックスに表示するようにしています。

補足日時:2002/01/22 21:18
    • good
    • 0

文字が消えてしまうというのは、すべてですか?



これ以降の文は対象がText1であると仮定します。
編集メニューの検索で

"Text1.Text = "

という文字列を検索して、その付近のコードを調べてみましょう。

あと、Text1_Changeイベントに変なコードが入っていませんか?

消える文字が1文字とか数文字なら、KeyPress、KeyDown、KeyUpイベントも怪しいです。

>テキストボックスを使ったツール
できれば何をするツールなのか知りたいです。

ちなみにほかの方が語ってらっしゃる

Do Events

という文は

DoEvents

の間違いです。
単語を離してはいけません。

この回答への補足

文字が消えるのは、それまでにテキストボックスに入力した文全てです。ちなみに、ツールというのは日記帳です。
カレンダーの日付をクリックして、ラベルに日付を入れ、テキストボックスに内容を記入→保存ボタンで保存すると、次からはその日付をクリックするとテキストファイルを読み込んでテキストボックスに内容が表示される というものです。
一番怪しいのは、この辺りだと思うのですが。

Dim day As String
Dim filename As String
Dim henkan As String
Dim henkan2 As String
Dim readdata As String
Dim readend As String
Dim filename2 As String
henkan = Form1.Label1.Caption
henkan2 = Replace(henkan, "/", "")
filename = "\" & henkan2 & ".txt"
filename2 = "\" & henkan2 & ".dat"
If Dir(App.Path & filename) = "" Then
Form1.Text1.Text = ""
Else
Open App.Path & "\" & filename For Input As #1
Do Until EOF(1)
Line Input #1, day
readdata = readdata & day & vbCrLf
Loop
readend = Replace(readdata, "", "")
Close #1
Form1.Text1.Text = readend
End If
End Sub

ちょっと変な感じですが、なにぶん初心者なもので・・・。
KeyPress、KeyDown、KeyUpイベントは使っていません。
それと、Text1_Changeイベントというのはどこにもないんですが、どういうものなんでしょうか?

補足日時:2002/01/21 21:14
    • good
    • 0

半角文字が1バイト、全角文字が2バイトです。


キロバイトはバイトの1024倍ですから、32キロバイトだと
半角32768文字位、全角16384文字位ということですか。

この回答への補足

全角16384文字というのは、かなりの文字数ですよねぇ。とてもではないですが、そんな文字数は入力していません。1000文字とか2000文字くらいのレベルですから。

補足日時:2002/01/20 17:30
    • good
    • 0

「Do Events」をお分かりでないようなのでこの関数は使われていないようですね。

Do~Loop内ではないようです。

TextBoxのプロパティMultiLineがTrueになってませんか?
TrueになっているとTextBoxの端で改行されて入力した文字は上にいって隠れてしまう状態になります。消えているわけではありませんが・・・・

この回答への補足

MultiLineはtrueにしています。で、スクロールバーを縦横両方に付けています。画面の上にいったのではなく、いくら見ても消えているんです。前にも同じようなテキストボックスを使用したツールを使った時に、入力中に急に消えてしまったことがあったので、何かの設定で、よくあることかと思っていましたが、そうでもないようですね。

補足日時:2002/01/20 16:46
    • good
    • 0

TextBoxはMultiLinがFalseのときに半角で2048文字、


Trueのときで約32kバイトまでという制限がありますが・・・

この回答への補足

32kというのは実際にはどれくらいの文字数なのでしょうねぇ?そんなには文字を入れていないんです。

補足日時:2002/01/20 16:51
    • good
    • 0

テキストボックス(たとえばText1)に、代入しているようなところをチェックしなおして見てはどうでしょう?

    • good
    • 0

プログラム中Do Eventsなどでテキストボックスの内容をクリアするような記述はありませんか?

この回答への補足

早速ご回答いただき、ありがとうございます。
テキストボックスでは、Open ~ For Input As で一度保存した
テキストファイルをDo Until ~ Loopでテキストファイルの最終行まで
読み込んで、テキストボックスに表示するというコードを書いてます。
Doを使ってるのはここだけです。
保存前の全くのプランク状態からテキストボックスに文を入力している
途中で急に消えてしまうので、これは関係なさそうです。
うぅ~ん、分かりません。
やっぱりDoが関係しているんでしょうか?

補足日時:2002/01/20 03:42
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETで他のプロジェクトで作成したフォームを使う方法

こんにちは。
VB.NETのプロジェクトがぐちゃぐちゃで参照設定とかいろんなの呼んでしまっているので、新しく作成しなおしたいのですが、
新しいプロジェクトでプロジェクトを作成し、前のプロジェクトで必要なファイル(.vb、RESX)を新しいプロジェクトのフォルダにコピーしたのですが、
普通のモジュールは追加>新しい項目の追加でなんとか追加できたのですが、フォームの追加の仕方がわかりません><教えてくださいー

P.S. RESXファイルってフォームのデータが入ってるのでしょうか?そんな気がしてコピーしたのですが。

※VB6.0からVB.NETに以降した際にアップデート情報みたいなのがプログラム上にくっついてしまって.vbファイルも参照項目も増えまくってしまった

Aベストアンサー

ドラッグ&ドロップが使いやすい。
Windowsのエクスプローラでvbファイルをドラッグして、VS.NETのソリューションエクスプローラへドロップする。

QTextBoxに文字を書いても表示されない

お世話になります。
VB 2008 EE を使っており、まだ素人レベルですが宜しくお願いいたします。

データリーダーでテーブルデータを取得して計算結果をデータアダプター経由で保存する処理をテスト中です。
ダミーデータを10000件程度作ってSQLで並び替えをしても数秒で完了するのですが、計算を入れたらとても時間がかかります。(30分程)
これもプログラム構造の問題なのかもしれませんが現在調査中です。

そこで、計算処理の進捗状況をリッチテキストに書き込もうと思っています。
例"現在***まで完了しています(改行)"といったかんじです。
(現状は「ProgressBar」を表示させています。)

純粋に読み込み処理の前にテキストボックスに文字を書き換えても変わってくれません。
計算が全て完了した後であれば書き換えがでします。
「完了しました」のような感じです。
Call(サブルーチン)で間接的にやらせてもだめでした。

テキスト書き換えが完了するまえにデータリーダーの接続が始まった為?
って感じがします。

NET情報でも色々調べたのですがわかりません。

説明が不鮮明で分かりにくいかもしれませんが、ご理解のほど宜しくお願いいたします。

お世話になります。
VB 2008 EE を使っており、まだ素人レベルですが宜しくお願いいたします。

データリーダーでテーブルデータを取得して計算結果をデータアダプター経由で保存する処理をテスト中です。
ダミーデータを10000件程度作ってSQLで並び替えをしても数秒で完了するのですが、計算を入れたらとても時間がかかります。(30分程)
これもプログラム構造の問題なのかもしれませんが現在調査中です。

そこで、計算処理の進捗状況をリッチテキストに書き込もうと思っています。
例"現在***まで完了...続きを読む

Aベストアンサー

doEventsではなく、Textbox1.updateを使用してください。

QDataTableに入っているデータを全てinsertしたい!(C#)

はじめまして、okwebsamaです。
さっそく質問なのですが、
質問タイトルのままですが、DataTableに入っているデータを全てinsertしたいのです。
insert先のテーブルは、DataTableと同じ列名をもっています。

コード
DataTable d;
for(int i = 1; i <= d.Rows.Count; i++){
みたいな感じで作っていたんですが、ここから先が思いつきませんでした。
どなたかよろしくお願いします!!

Aベストアンサー

確認ですが、

・使っているデータベースは何ですか?
 (SQL Server or Oracle or Access or その他?)

・DBの接続方法には、何を使ってますか?
 (SqlClient? OleDb?)

・コピー元のDataSetは、型付DataSet?型無しDataSet?

・C# + ASP.NET でという話で宜しいでしょうか?
 (ASP.NETで質問されていますが、質問内容みると、C#という
 分類での質問になり、ASP.NETではないような気がします)

少々情報が足りないので、回答が的外れになるかもしれませんが、
どのDB&接続方法にしても、名前空間とクラス名が違うだけで
基本ロジック自体は、ほぼ一緒のため、
下記、型付きDataSetで、SQL Serverの例で、サンプル記載しておきます。

もし、SQL Serverじゃない&型無しDataSetの場合だったり、
どう応用したらいいかわからないという場合は、また質問して下さい。

#############################################################

// コピー元のDataTableを取得
DataTable d = コピー元DataTableを取得;

// データベースの接続
//(本来であれば、web.configやapp.configに設定されている接続先を取得する方法が望ましいわけで...)
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB名;Data Source=DBサーバのIPアドレス");

conn.Open();

// コピー元のデータ数分だけループ
foreach (DataRow row in d.Rows)
{
  // INSERT用SQLを生成
  System.Text.StringBuilder sql = new System.Text.StringBuilder();

  sql.Append("INSERT INTO [コピー先のスキーマ].[コピー先テーブル名] ");

  // INSERT項目
  System.Text.StringBuilder insertColumns = new System.Text.StringBuilder();

  // INSERT値
  System.Text.StringBuilder valueColumns = new System.Text.StringBuilder();

  // DataTableの列数分だけループ
  foreach (DataColumn col in d.Columns)
  {
    insertColumns.AppendFormat("{0},", col.ColumnName);

    // 列の型が文字列型の場合
    if (col.DataType == typeof(String))
    {
      valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString());
    }
    else
    {
      // 列の型が文字列型以外の場合
      valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString());
    }
  }

  // 不要な「,」を削除
  insertColumns.Remove(insertColumns.Length - 1, 1);
  valueColumns.Remove(valueColumns.Length - 1, 1);

  // INSERT用SQL文の生成
  sql.AppendFormat("({0}) VALUES ({1})", insertColumns.ToString(), valueColumns.ToString());

  // SQLの実行
  System.Data.OleDb.OleDbCommand command;
  command = new System.Data.OleDb.OleDbCommand(sql.ToString(), conn);
  command.ExecuteNonQuery();

  command.Dispose();
  command = null;
}

// DBの接続を閉じる
conn.Close();
conn.Dispose();
conn = null;

確認ですが、

・使っているデータベースは何ですか?
 (SQL Server or Oracle or Access or その他?)

・DBの接続方法には、何を使ってますか?
 (SqlClient? OleDb?)

・コピー元のDataSetは、型付DataSet?型無しDataSet?

・C# + ASP.NET でという話で宜しいでしょうか?
 (ASP.NETで質問されていますが、質問内容みると、C#という
 分類での質問になり、ASP.NETではないような気がします)

少々情報が足りないので、回答が的外れになるかもしれませんが、
どのDB&接続方法にし...続きを読む

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QFORMが開いているかどうかの確認方法

初歩の初歩だと思いますが。。。。

formが開いているかどうかの確認方法を教えてください。プロパティで確認できるのでしょうか?

Aベストアンサー

Form.Visible = True : 表示されている
Form.Visible = False : 表示されていない

でいいと思いますよ~

それとも二重起動禁止の方が知りたいんでしょうか?

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

QVB6、コマンドボタンの背景色を変更するには?

コマンドボタンのBackColorプロパティをいじってもコマンドボタンのCaptionの背景の色が変更されません。
ラベルコントロールとかだと同じプロパティをいじると色が変わるのですが…
色を変えるにはどうすればよいでしょうか?

Aベストアンサー

Style=グラフィック

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QVisualBasic6.0のFormat関数でmSecを表示したい

VisualBasic6.0のFormat関数で時刻をあらわす方法でFormat(CStr(Now),"h:mm:ss")としていますが、mSecをあらわすときはどうしたらいいのでしょうか。どなたか教えてください。
VB.NETのffを使ってみましたがだめでした。

Aベストアンサー

Now関数では ミリセカンドの精度は持っていないようです
dim d as Double
d = now
' 日付部分を削除
d = d - Fix(d)
' 秒単位に変換
d = d * 24. * 60 *60
' 秒部分を削除
d = d - Fix(d)
といった具合にすれば 秒未満の数値が取り出せそうですがここまでの分解能が無いため浮動小数点の誤差程度の値しか求まりません

ミリ秒を取得するのであれば WinAPIのGetSystemTimeなどを使ったほうがいいでしょう

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
といった具合で宣言して

dim st as STSEMTIME
GetSystemTime st
debug.print st.wMilliseconds
といった具合で取り出せますよ

Now関数では ミリセカンドの精度は持っていないようです
dim d as Double
d = now
' 日付部分を削除
d = d - Fix(d)
' 秒単位に変換
d = d * 24. * 60 *60
' 秒部分を削除
d = d - Fix(d)
といった具合にすれば 秒未満の数値が取り出せそうですがここまでの分解能が無いため浮動小数点の誤差程度の値しか求まりません

ミリ秒を取得するのであれば WinAPIのGetSystemTimeなどを使ったほうがいいでしょう

Private Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private T...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


人気Q&Aランキング

おすすめ情報