VBでフォルダーをコピーするプログラムをつくりましたが、フォルダのコピー中は他のプログラムでの表示の更新処理などができません。うまく他のプログラムにも制御がいくような良い方法はないでしょうか?

コピーはFileSystemObject.CopyFolder で実行しています。

よろしくお願いします。

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

A 回答 (4件)

SHFileOperationはどうでしょう?


エクスプローラのコピペと同じように、"コピーしています"の画面が表示されます。
呼出側が真っ白になることはないようです。

参考URL:http://www.vbvbvb.com/jp/gtips/0951/gSHFileOpera …

この回答への補足

参考URLをみるのを忘れてました。ありがとうございます。

補足日時:2002/03/04 19:06
    • good
    • 0
この回答へのお礼

さっそくSHFileOperationなるものをMSDNでみてみました。
なんと英語!自分の力で使いこなせるかな?
ありがとうございます。

お礼日時:2002/03/04 19:01

さらに、こちらから質問です。



>大量データコピー中に他の処理をさせたい
他の処理とは主にどのようなことですか?
ただ、進捗状況を表示したいだけですか?

僕の経験上、大量データ処理最中に、別プロセスを極力働かさないように設計することが多いのですが・・・
同時に行いたい処理が何なのかが知りたいです。
    • good
    • 0
この回答へのお礼

度々ありがとうございます。
やりたいのはA.EXEでメニュー画面を表示。
メニュー画面には・データコピー・データグラフ表示等のボタンがある。
データコピークリック時にはB.EXEでデータをコピーする。
コピー中でもA.EXEのメニューからデータグラフ表示を行う。といったかんじです。
AutoRedraw=falseだったのでtrueにしてもだめでした。

お礼日時:2002/03/04 18:51

「現在コピー中です」と表示させているのは、どちらのEXEですか?



メインのEXEを「A.EXE」
コピーを実際に行っているEXEを「B.EXE」
としたとき、どちらのEXEでしょうか?


もしA.EXEなら、フォームのプロパティ[AutoRedraw]はTrueになってますか?
もし、B.EXEならプロセス監視が必要かも?
どちらも未検証です。
    • good
    • 0

CopyFolderはコピーを終了するまで、次の処理を行うのは不可能です。


CreateThreadで本来は行うべきなのでしょうが、VBはシングルスレッド言語なので、たぶん落ちまくるでしょう。

別プロセスにしてみてはいかがでしょう?
簡単にいうと別のEXEです。コピーをするだけの単機能EXEを用意して
Call Shell("hogehoge.exe c:\Program Files\hoge\/c:\hoge\")
などとして[hogehoge.exe]呼び出し、その[hogehoge.exe]でCommand関数で
"c:\Program Files\hoge\/c:\hoge\"
部分を認識させて、コピーを行うだけの処理をさせたらよいのでは?
    • good
    • 0
この回答へのお礼

さっそくのご教示ありがとうございました。さっそく別EXEでやってみましたら、なんとか少し(さくさくは動きません)はうごいているのですが「現在コピー中です」と表示しているウィンドウの上にエクスプローラなどを表示し、最小化すると下にあった「現在コピー中です」の文字や色が消えて真っ白になってしまいます。とほほ・・
これはもうあきらめでしょうか?度々恐縮ですが、もし良い方法をご存知でしたらお教えください。

お礼日時:2002/03/04 15:12

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

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

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

QVB4でエラーが出ます CreateObject Scripting.FileSystemObject

VB6で
Set fso = CreateObject("Scripting.FileSystemObject")

と書いてうまく動いていたbasを

VB4のプログラムに移植したところうまく動かないのですが、
どなたか分かりませんでしょうか?

Aベストアンサー

 
具体的に「どのように」うまく動かないのか書いていないので、よくわかりません。
PCの電源は入ってますよね?(一応、念のため)

実行時エラー429なら、実行環境に必要なライブラリ(scrrun.dll : Microsoft Scripting Runtime)が入っていないだけでは?
 

QPICNICのVB制御プログラム

お世話になります。
VBでPICNICボード(トライステート社製http://www.tristate.ne.jp/)の制御ソフトを作っているのですがコンパイルエラーがでて、プログラムの実行ができません。(VB初心者です)
(1)接点入力、アナログデータは取り込みできます。
(2)パラレルポートのピン方向制御はできます。
(3)パラレルポートのピン方向状態は読み込みできます。
(4)接点出力(I/O pinのLow,High)制御、液晶制御、RS232送信制御ができません。

問題ありソース
Dim retvalue As Variant
Dim n, m As Integer
Dim nameb As String
Dim rez As Integer
Dim status(0 To 3) As Boolean
Dim current As Integer
Dim data(100000) As Integer
Dim datab(100000) As Boolean

Private Sub Command1_Click()
data(current) = PICOCX1.ADinp(PortA, 4)
Label1.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃")
retvalue = PICOCX1.Dirp(PortB, 4, pinOutput)

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Timer1_Timer()

Call check

End Sub
Private Sub check()

n = 0
m = 0
nameb = "tanaka"

data(current) = PICOCX1.ADinp(PortA, 0)
Label2.Caption = "温度:" & Format(data(current) / 102.3 * 5, "#0.0℃")

data(current) = PICOCX1.ADinp(PortA, 1)
Label3.Caption = "湿度1:" & Format(data(current) / 10.23 * 5, "#0.0%")

data(current) = PICOCX1.ADinp(PortA, 2)
Label4.Caption = "湿度2:" & Format(data(current) / 10.23 * 5, "#0.0%")

data(current) = PICOCX1.ADinp(PortA, 3)
Label5.Caption = "空き:" & Format(data(current) / 10.23 * 5, "#0.0")

data(current) = PICOCX1.ADinp(PortA, 5)
Label6.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃")

'ポートRA5の値 基板側のミス?
data(current) = PICOCX1.ADinp(PortA, 4)
Label1.Caption = "温度:" & Format(data(current) / 10.23 * 5, "#0.0℃")

' 文法テスト
datab(10000) = PICOCX1.ADinp(PortA, 4)


'接点入力状態

status(0) = PICOCX1.Inp(PortB, 0)
If status(0) = True Then
Label7(0).Caption = "扉閉状態"
Else
Label7(0).Caption = "扉開状態"
End If

status(1) = PICOCX1.Inp(PortB, 1)
If status(1) = True Then
Label7(1).Caption = "扉施錠状態"
Else
Label7(1).Caption = "扉解除状態"
End If

status(2) = PICOCX1.Inp(PortB, 2)
If status(2) = True Then
Label7(2).Caption = "  "
Else
Label7(2).Caption = "人検知"
End If

status(3) = PICOCX1.Inp(PortB, 3)
If status(3) = True Then
Label7(3).Caption = "High"
Else
Label7(3).Caption = "Low"
End If

'パラレルポート入出力状態
retvalue = PICOCX1.GetDirp(PortB, 4)

'パラレルポート入出力方向制御
'retvalue = PICOCX1.Dirp(PortB, 4, pinInput)
' retvalue = PICOCX1.Dirp(PortB, 4, pinOutput)


'接点出力制御
'data(current) = PICOCX1.Outp(PortB, 4, High)
'void = PICOCX1.Outp(PortB, 4, High)
'retvalue = PICOCX1.Outp(PortB, 4, 0)


retvalue = PICOCX1.Outp(PortB, 4, High)


'液晶の制御
' retvalue = PICOCX1.LcdClear これはサポートされていなとのメッセージ
'retvalue = PICOCX1.ClearLcd '型の不一致エラー
' retvalue = PICOCX1.PutLcd(n, m, nameb)
'retvalue = PICOCX1.SetPos(n, m)
'retvalue = PICOCX1.PutLcd(n, m, nameb)

'シリアルI/F制御
'retvalue = PICOCX1.Transmit(nameb)
retvalue = PICOCX1.Receive '文法エラーでなく誰かがすでに使用しているとのメッセージ


End Sub

エラー内容及び疑問
(1) 接点出力制御
retvalue = PICOCX1.Outp(PortB, 4, High)
  コンパイルエラー
型が一致しません。
とのエラーがでます。基本的文法ミスですか?
retvalue を全種10種に型に変更しても変わりません。
(2) retvalue = PICOCX1.Outp(PortB, ・・とエディターで入力時、ADinp命令入力時みたいに入力支援メニュで型宣言がありません。型指定不要ですか?

以上 初歩的質問ですが、悩んでおります。
お忙しいところ申し訳ありませんが誰か教えてください。

お世話になります。
VBでPICNICボード(トライステート社製http://www.tristate.ne.jp/)の制御ソフトを作っているのですがコンパイルエラーがでて、プログラムの実行ができません。(VB初心者です)
(1)接点入力、アナログデータは取り込みできます。
(2)パラレルポートのピン方向制御はできます。
(3)パラレルポートのピン方向状態は読み込みできます。
(4)接点出力(I/O pinのLow,High)制御、液晶制御、RS232送信制御ができません。

問題ありソース
Dim retvalue As Variant
Dim n, m As Integer
Di...続きを読む

Aベストアンサー

PICNIC、わたしももっていますが、もうながいこと使っていませんでした。
本題ですが、Outpは単に出力するだけのものでしょうから、
戻り値がない=Sub指定なのではないでしょうか。
したがって
Call PicOcx1.Outp( PortB, 1, High )
のようにすればよいようにおもいます。
ただ、未確認ですので、ちがっていたらごめんなさいね

QVBでオープンしたファイルの制御をCのプログラムに渡す方法

VBでファイルのオープンをしてそのファイルの制御を
Cのプログラムに渡す方法ってありますか?

やりたいことを具体的にいうと
ファイルのオープン、クローズはVBでやって、
ループの中の変数の値を、Cのプログラムに渡して
Cのプログラムの中で印字するって処理をやりたいのです。
Cのプログラムをコールする際の引数で
VBで開いたファイルハンドル、出力したい変数の値を
渡してやれば良いのかなと思ったのですが、うまくいかないようです。
なにか方法があれば教えてください。
宜しくお願い致します。


Dim i as Integer

Open "\test.txt" For Output As #1

for i=0 to 10
call Cのプログラム(#1、i)
next i

close #1

Aベストアンサー

>Createfileの戻り値はLong型ですよね?

正確にはHANDLE型です。

>今回呼び出したいC言語のDLLではfprintf関数を使っており、
>fprintfの関数ではファイル構造体のポインタを渡す必要があるみたいです。

そうです。


>>VBからは、標準C関数は呼べないので、CreateFile()というAPIを使用するしかないでしょう。

fprintfは、標準C関数でオープンしたファイルポインタを使用するので、CreateFileで開いたハンドルは使用できません。

>VBで取得したCreatefileのLong型の戻り値と
>C言語のファイル構造体へのポインタというのは
>同じ値を持っているわけではないのでしょうか?

はい。違います。
よって、fprintfやfscanf、freadなどは使用できません。
読み書きにもWinAPIを使用する必要があります。
fprintfで直接ファイルに書式指定して書き込むのではなく、
sprintfで文字列を作成後、WriteFileというAPIで書き込む等の工夫が必要となります。


もしくは、DLLの方にファイルをオープンする関数、クローズする関数を追加し、VBからはそれらを呼び出す処理を追加するという方法もあります。
このときは、オープンする関数はファイルポインタを返してあげ、書き込む関数を呼び出すときには、受け取ったファイルポインタを引数に指定してあげればよいかと。

>Createfileの戻り値はLong型ですよね?

正確にはHANDLE型です。

>今回呼び出したいC言語のDLLではfprintf関数を使っており、
>fprintfの関数ではファイル構造体のポインタを渡す必要があるみたいです。

そうです。


>>VBからは、標準C関数は呼べないので、CreateFile()というAPIを使用するしかないでしょう。

fprintfは、標準C関数でオープンしたファイルポインタを使用するので、CreateFileで開いたハンドルは使用できません。

>VBで取得したCreatefileのLong型の戻り値と
>C言語のファイ...続きを読む

QVB6プログラムの実行中でのこと

VB6で作成したプログラムを実行していると、突然フリーズしたように
約10秒程止まる場合があります。一度、この現象が現れるとそれ以降は普通に
動作します。
実行するたびにこのようになります。
考えられる原因や対応方法などありましたら教えてください。

Aベストアンサー

今読み直して気が付いたのですが、、、

>止まる時は決まっていないのですが、Tabキーでの移動やコマンドボタンを
>クリックした時が多いような気がします。

もしかしてですが・・・・
SetFocusやGotFocus/LostFocusのイベント類を使用していませんか?
もし、コントロールAがフォーカスを受けた時、処理によってはコントロールBにフォーカスを移動させるなど・・・
フォーカス永久ループっていうことも考えられます。

以前に書いたように、1度目と2度目の実行は、メモリにロードされていない/されているという違いがあります。
よって、1つの処理についてのPCへの不可が比べ物にならないくらいかかります。
先に挙げたGotFocus/LostFocusイベントは、OSの状況によって左右されることもあります。

フォーカス永久ループの調査方法として、各GotFocusイベントにDebug.Print ActiveControl.Nameなどと記してみてください。

それと、、、思い出したのでついでに書いておきます。
Command1.FontBold = True とかしてませんか?
以前に経験したのですが、VB4ならこれでよいのですが、VB6のときたまにフォーカス永久ループになった経験があります。
Command1.Font.Bold = True とすることで回避できました。

FontBoldとFont.Boldの違いが、HP上では違いがわかりづらいですね。
一度、このページをテキストか何かにコピペして読んだらわかりやすいかも?

今読み直して気が付いたのですが、、、

>止まる時は決まっていないのですが、Tabキーでの移動やコマンドボタンを
>クリックした時が多いような気がします。

もしかしてですが・・・・
SetFocusやGotFocus/LostFocusのイベント類を使用していませんか?
もし、コントロールAがフォーカスを受けた時、処理によってはコントロールBにフォーカスを移動させるなど・・・
フォーカス永久ループっていうことも考えられます。

以前に書いたように、1度目と2度目の実行は、メモリにロードされていない/...続きを読む

QVB6のプログラムの実行

VB6で作成されて古いマシン(windows2000)で動作している
プログラムをWindowsXP Service Pack3にコピーして実行
しようとすると起動時に以下のエラーが出て立ち上がりません。
-------------------------------------
実行時エラー '5';
プロシージャの呼び出し、または引数が不正です
-------------------------------------

http://support.microsoft.com/kb/811469/ja
上記HPの方法は試したのですが、ダメでした。
尚、ソースが無い為、どこで落ちてるか確認出来ません。
何か分かる所は無いでしょうか?
(ちなみに基本的にVB6の動作って、OSの種類やバージョンや、
ServicePaceやWindowsUpdateに影響されると
 考えてよろしいのでしょうか?)

Aベストアンサー

>> ちなみに基本的にVB6の動作って、OSの種類やバージョンや、
>> ServicePaceやWindowsUpdateに影響されると
>> 考えてよろしいのでしょうか?

参照されたマイクロソフトのHPの内容を読みましたか?
2000とXPではウィンドウ マネージャの仕様が変わったと記載されています。
元々のプログラムが2000で動いていたと言うことは、2000の仕様に合った
プログラムがされていたということでしょう。
それをXPで動かすと、プログラムは2000の仕様で動こうとしているのに、
プログラムを実行する土台がXPの仕様で動いているため不都合が起きていると
なるわけです。

また上記の理由を含めて、VBがプログラマから見えなくしている
windows_api関連の実行で起きていると考えられます。

互換モードで動かなければ、最悪あきらめるしかないでしょう。
最終手段としてヴァーチャルマシン等で動かすことも出来ると思います。


人気Q&Aランキング

おすすめ情報