[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/03/20(Tue) 13:33
投稿者名:べた
Eメール:
URL :
タイトル:
テキストボックへの表示について
ファイルから読み込んだデータをDBに反映しています。
プログレスバーで進捗状況を表示し、テキストボックスに
処理結果を表示しています。

この処理結果ですが、処理が完全に終了した後でしか、
テキストボックスに表示されません。
ファイルから読み込んだレコード毎の処理が終わる毎に、
テキストボックスに表示したいのですが、テキストボックス
の内容を更新したいのですが、どうすればよいのですか。

また、これを行った場合、その表示のために処理は遅くなる
のでしょうか。

/*----------------------------------------------*/
Private Sub Command2_Click()
    Dim FN As String
    Dim buff  As String
    Dim ErrMsg As String
    Dim rFileNo As Integer
    Dim fnr     As Long
    Dim lngLen  As Long

On Error Resume Next

    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "CSV(*.csv)|*.csv"
    CommonDialog1.InitDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
    CommonDialog1.ShowOpen

    If Err.Number = cdlCancel Then
        Exit Sub
    End If

    FN = CommonDialog1.FileName
    If FN = "" Then
        Exit Sub
    End If

    ProgressBar1.Max = FileLen(FN)
    ProgressBar1.Visible = True

    rFileNo = FreeFile
    Open FN For Input As #rFileNo

    fnr = 0
    Do While Not EOF(rFileNo)
        Line Input #rFileNo, buff

        lngLen = lngLen + LenB(StrConv(buff, vbFromUnicode)) + Len(vbNewLine)
        ProgressBar1.Value = lngLen

        fnr = fnr + 1
        Call FunDBUpdate(buff, ErrMsg)
        Text1.Text = Text1.Text & Format(fnr, "@@@@") & " 行目:" & ErrMsg & Chr(13) & Chr(10)
    Loop

    Close #rFileNo

    ProgressBar1.Visible = False
End Sub

投稿時間:2007/03/20(Tue) 22:27
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: テキストボックへの表示について
>         Text1.Text = Text1.Text & Format(fnr, "@@@@") & " 行目:" & ErrMsg & Chr(13) & Chr(10)
          Doevents
>     Loop

>この処理結果ですが、処理が完全に終了した後でしか、
>テキストボックスに表示されません。

と1行追加しても同じでしょうか?

>また、これを行った場合、その表示のために処理は遅くなる
>のでしょうか。

自分で測定して確認して下さい。

投稿時間:2007/03/21(Wed) 12:52
投稿者名:べた
Eメール:
URL :
タイトル:
Re^2: テキストボックへの表示について
> >         Text1.Text = Text1.Text & Format(fnr, "@@@@") & " 行目:" & ErrMsg & Chr(13) & Chr(10)
>           Doevents
> >     Loop
>
> >この処理結果ですが、処理が完全に終了した後でしか、
> >テキストボックスに表示されません。
>
> と1行追加しても同じでしょうか?
>
ありがとうございます。
上手く行きました。

ただ、「Doevents」を追加すると、他のボタン操作やイベントが実行
できてしまいます。
そのため、画面の切替などができ、プログレスバーや表示内容が変わる
ことが発生しました。
処理中(ループ中)は、ボタンなどを押下できないようにしてしまえば
問題ないです。

また、「Refresh メソッド」を使っても同じことができました。
Text1.Refresh
で出来ました。

実際、使われ方としては、どちらがよいのでしょうか。

投稿時間:2007/03/21(Wed) 13:00
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: テキストボックへの表示について

> 実際、使われ方としては、どちらがよいのでしょうか。

どちらがよいかではなく、どうしたいのかだと思いますよ。
(違いを理解して、自分の求めているものに近い方を使えばいいのではないでしょうか)

投稿時間:2007/03/21(Wed) 13:05
投稿者名:べた
Eメール:
URL :
タイトル:
Re^4: テキストボックへの表示について
>
> > 実際、使われ方としては、どちらがよいのでしょうか。
>
> どちらがよいかではなく、どうしたいのかだと思いますよ。
> (違いを理解して、自分の求めているものに近い方を使えばいいのではないでしょうか)

ヘルプを見てもいまいちわからなかったものですから。
実現したいことにあったのを使います。

ありがとうございます。

投稿時間:2007/03/21(Wed) 13:41
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^3: 花ちゃんに補足
差し出がましいようですが、せっかく書いたので投稿させてください。m(__)m

>実際、使われ方としては、どちらがよいのでしょうか。

>ただ、「Doevents」を追加すると、他のボタン操作やイベントが実行
>できてしまいます。
そこまで自分で調べたなら、それが起こるとまずい状況では DoEvents が
使えないという判断ができるはずでは???

今回の場合、プログラムの実行中には、OSが常時行っている再描画処理
が走らないというのが原因です。
OSに制御を戻す必要があるなら DoEvents
再描画だけなら Refresh を使った方が良いと思います。
DoEvents が原因で予期せぬ動作が起こって『原因が分からない』と
質問する人は少なくないです。
>処理中(ループ中)は、ボタンなどを押下できないようにしてしまえば
>問題ないです。
といった対策も必要ないわけですし。

当然のことなんですが、プログラムにはそれぞれ意味があり、
目的・状況に応じて使い分けます。

例えば、
DoEvents とセットで使われる事が多いのが Sleep 関数ですが、
このサイトの解説でもちゃんと注意書きがあります。
http://hanatyan.sakura.ne.jp/vbhlp/sonota_API.htm
>但し、関数の機能等をよく調べ使用しないと動作が不安定になったりします。
>上記の例でも解るようにSleep関数を使って待ち時間を作るとその間は、
>他のイベントを受け付けなくなる等の不都合がでます。VBの機能でも工夫
>すれば便利に使えます。

言語によって使い方を考えた方が良い状況もあります。
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200606/06060002.txt

どちらにしろヘルプなどを読めば、そこに違う処理内容が書いてあるでしょう。
>実際、使われ方としては、どちらがよいのでしょうか。
はなから違うものを条件なしに比べることはできません。
目的・状況にあった方を、正しい使い方で使うのが良いのでは?

投稿時間:2007/03/21(Wed) 14:03
投稿者名:べた
Eメール:
URL :
タイトル:
Re^4: 花ちゃんに補足
説明、解説ありがとうございます。
ヘルプを再度、読み直し、理解してみます。

ありがとうございました。