WindowsXP、VB6.0でデレクトリをTreeViewに表示するプログラムです。
フォームにTreeViewコントロールとコマンドボタンを貼り付け、
下記のプログラムを実行します。
curFolder.Name に "System Volume Information" がでると
エラーになり、それを回避するために "On Error Resume Next"をいれて
EXEファイルを作り、実行するとフォームが消えてしまいます。
どなたか教えて下さい。

Private Sub Command1_Click()
' Microsoft Scripting Runtime を参照設定する。
Dim item1 As Node, FsoObj As New scripting.FileSystemObject
Set item1 = TreeView1.Nodes.Add(, , , "c:")
Call SearchFolder(FsoObj.GetFolder("c:\"), item1)
End Sub

Private Sub SearchFolder(NextFolder As scripting.Folder,
              itemX As Node)
On Error Resume Next
Dim TreeItem As Node, curFolder As scripting.Folder
For Each curFolder In NextFolder.SubFolders
' Debug.Print curFolder.Path
Set TreeItem = TreeView1.Nodes.Add(itemX.Index,
               tvwChild, , curFolder.Name)
Call SearchFolder(curFolder, TreeItem)
Next
End Sub

A 回答 (5件)

このフォルダにはインデックスサービスを利用してファイル検索を高速にするための情報が入っているようです。


しかし、この中身を勝手に参照されると困るようで、アクセス制御によってどんなファイルが入っているかはもちろん、このフォルダの作成日時なども見られないようになっています。
管理者は無理矢理このフォルダの内容を見ることができますが、やめたほうがいいでしょう。
よって、このフォルダの中身を参照しようとすると、VBの場合実行時エラーが発生します。

これは、おそらくFileSystemObjectを使っているのが原因で、このオブジェクトはフォルダ名を参照するだけでもそのフォルダの情報を取得しようとしている可能性があります。
API関数なら "参照できませんでした、はい残念" で済むのですが、VBコンポーネントの場合、外側でOn Error Resume Nextを指定しても中まで届かないことがあるみたいです。

API関数を使う方法を知っていますか?

WIN32_FIND_DATA
FindFirstFile
FindNextFile
FindClose

これらのキーワードで検索してみてください。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
TreeViewにすべてのフォルダを表示するには、フォルダの再帰検索を
しなければなりませんが、Dir関数を使って無理やり再帰検索すると
かなり面倒なプログラムになります。
このMicrosoft Scripting Runtimeを参照設定して、FileSystemObjectを
使うと嘘のように簡単になるので、「これはいい!」と
思ったのですが.....。 駄目なようですね。
そのAPI関数を使うか、あるいはVBでフォルダの再帰検索をすると
かなり時間がかかるので、VC++でフォルダ再帰検索のActiveXを作って
そのOCXを参照設定するか、これから検討してみます。
大変参考になりました。有難うございました。

お礼日時:2002/02/20 20:01

VCでOCXを作る力があるくらいなら、VBからAPIでファイルリストを作ることも簡単でしょう。



>かなり時間がかかるので
じつは、FileSystemObjectは、あまり効率のいい構造はしていないみたいです。
フォルダやファイル1つ1つが固有のオブジェクトになっているため、検索のたびにそれぞれがインスタンスを作るので、余計なメモリも消費されているようです。

FindFirstFileは作成時間や属性なども同時に取得してくれるので、エクスプローラの様なアプリケーションを作るために必要な情報は、一通りそろっています。
それでも、FileSystemObjectの10倍くらい速いみたいです(根拠なし)。

楽してインターフェースから作り始めるのもいいですが、内部からごりごり作っていくのもおもしろいですよ。
がんばってください。

この回答への補足

有難うございます。
>VCでOCXを作る.......。
などと表面だけ見ると、いかにも実力がありそうにみえますが実際は
参考書とのにらみ合いになるでしょう。

補足日時:2002/02/20 20:31
    • good
    • 0

if(curFolder.Path = "System Volume Information")then


else
end if

この回答への補足

>if(curFolder.Path = "System Volume Information")then
>else
>end if

回答有難うございます。
上記のサンプルを実行してみましたが、"For Each ....." の所で
"書き込み出来ません"のエラーが出て駄目でした。

補足日時:2002/02/19 18:56
    • good
    • 0

>EXEファイルを実行した時に、多分エラーになるファイルをアクセスした時に


>消えてしまうのではないかと思っています。

それなら、MsgBox curFolder.Pathを入れることにより、エラーになるファイル
を含むフォルダを特定できるのでは?

この回答への補足

>それなら、MsgBox curFolder.Pathを入れることにより、
>エラーになるファイルを含むフォルダを特定できるのでは?

再度の回答、有難う御座います。

最初の質問に書きましたが "System Volume Information" をアクセスした
時にエラーになるようです。何かシステムに関係あるファイルのようで
Cドライブにも、Dドライブにもあります。何故このフォルダ(?)を
アクセスした時にエラーになるのか、あるいはこのフォルダ(?)を
アクセスしないようにすれば、実行画面が消えないのでは....と
思いますがそれが分かりません。

補足日時:2002/02/19 16:35
    • good
    • 0

>' Debug.Print curFolder.Path



MsgBox curFolder.Path にしてみては?

この回答への補足

>MsgBox curFolder.Path にしてみては?

早速の回答、有難うございます。
' Debug.Print curFolder.Path はどんなファイルをアクセスした時に
エラーになるのかを確認するためにいれてあります。実行ファイル作成時は
コメントにしています。
VBのデバッグ環境では正常に動作しますが、EXEファイルを
実行した時に、多分エラーになるファイルをアクセスした時に
消えてしまうのではないかと思っています。このような事は初めてなので
とまどっています。

補足日時:2002/02/19 14:11
    • good
    • 0

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

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

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

Q画面の設定以外で文字の大きさを変更したい場合

こんばんは。WinXPを使っています。
画面のプロパティーから解像度を変更しても、文字の大きさが大きく感じます。WinXPの画面の設定から文字の大きさを変更する場合は解像度を変更しればいいと思うのですが、それでも小さくならない場合はどのようにして文字を小さくする事ができるでしょうか?

Aベストアンサー

解像度以外の手段では
画面のプロパティ→「デザイン」タブ→詳細設定
で、アクティブタイトルバー、パレットタイトル、ヒント、メッセージボックス、メニュー、選択項目、非アクティブタイトルバーの文字の大きさをポイント単位で変更できます。

ブラウザの文字の大きさなら、ブラウズの最中にマウスのスクロールボタンをCtrlボタンを押しながらグリグリすると5段階に変更できます。

ExcelやWordでしたら、ツール→オプション→全般タブから標準の文字の大きさをポイント単位で変更できます。

QFor ~ Next の中での Dim宣言について

四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。

他にスマートな記述があれば教えてください。
よろしくお願いします。

---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
  Dim rect As New Rectangle(x, y* i , w, h)
  g.DrawRectangle(Pen.Black, rect)
Next

Aベストアンサー

RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります

dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
  g.DrawRectangle( Pens.Black. rect )
  rect.Offset( 0, 1 )
next
といった具合です …

Q「新しいウィンドウで開く」で開く画面の大きさの変更の仕方を教えて下さい。

 恐れ入ります。初歩的な質問で済みません。
検索結果などがたくさん出て、それら一つ一つを右クリックで「新しいウィンドウで開く」をクリックし表示される画面の大きさを変更するにはどうしたら良いのでしょうか?
 ちなみに今は画面の中央に小さく表示されるのですが、目一杯の大きさに変更したいのです。
どうか宜しくお願い致します。

Aベストアンサー

>検索結果などがたくさん出て

タブブラウザを使った方がいいかな~と思います。

IEだと仰る様に一つ一つを右クリックで「新しいウィンドウで開く」をクリック
するのも面倒ですし、下におろすのも面倒です。

タブブラウザなら、画面がウインドウだらけになるうっとうしさも無いですし、
ポップアップも制御できます。

画面の切り替えもタブをクリックするだけですし、たくさんひらいた
ページをまとめて閉じることもできます。

ご存知でしたら失礼しました。

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QOutlookメールで、画面の文字の大きさを変更するには、どうしたらよ

Outlookメールで、画面の文字の大きさを変更するには、どうしたらよいのですか。

Aベストアンサー

画面の文字の大きさは、
[表示] メニュー → [現在のビュー] → [現在のビューの編集] →
[その他の設定] と [自動書式] の項目でそれぞれフォントの大きさが変更できます。
また、送信メールとテキスト形式の受信メールのフォントの大きさは、
[ツール] メニュー → [メール形式] タブ → [ひな形およびフォント] → [ひな形] タブでそれぞれ変更できます。

QTreeViewのNodeについて

任意のNodeがフォーカスを得た場合、背景色を変更しています。
ところがNodeにLostFocusのようなイベントがないのでフォー
カスが他に移った場合にもとに戻せません。元に戻すにはどの
ような作業をすればいいのでしょうか?

よろしくお願いします。

VB6+Windows2000です。

Aベストアンサー

現在のノードを保存しといて、
他のノードに移ったか、
もしくはTreeViewからLostFocusしたときに
元に戻せばいいのでは?

Q最初に表示されるIEの画面の大きさは、変更可能?

こんにちは、みなさん。

インターネットを見る時に、最初に表示される、インターネットエクスプローラーの
画面の大きさは変更できますか??

変更できるなら、どんなやり方ですか??

ご存知の方、いらっしゃいましたら、宜しくお願いします。

Aベストアンサー

IEを起動して始めに表示される画面(ホームページ)の状態で操作します。
マウスを使って表示させたい大きさにIEの全体のウィンドウを変更します。
任意の大きさと位置が決まったら「Shiftキー」を押しながら閉じるボタンをクリックしてIEを終了させます。

※Shiftキーでうまくいかない場合はShiftキーの替わりにCtrlキーを使って試してみてください
※大きさを決めるときは、いつも始めに開いたページでウィドウの大きさ・位置を決めるのがコツです
※IEにい限らず、エクスプローラも同じ要領で変更できます

QTreeViewのChild Node

任意のNodeのChild Nodeの 一覧を取得したいのですが、
これはどこでというかどうやると取得できるのでしょうか?


よろしくお願いします。

VB6+Windows2000です。

Aベストアンサー

再帰呼出を使って取得する方法が普通です。
例えば、

'Dim intNodesCount As Integer
'Dim nodChildren() As Node
'
'Sub GetAllNodeChildren(ByVal nodSetNode As Node)
' intNodesCount = 0
' Erase nodChildren
' Call GetNodeChildren(nodSetNode)
'End Sub
'Sub GetNodeChildren(ByVal ParentNode As Node)
'Dim nodX As Node
' For Each nodX In TreeView1.Nodes
' If nodX.Parent Is ParentNode Then
' intNodesCount = intNodesCount + 1
' ReDim Preserve nodChildren(1 To intNodesCount)
' Set nodChildren(intNodesCount) = nodX
' Call GetNodeChildren(nodX)
' End If
' Next
'End Sub
こんな感じでどうでしょう?

再帰呼出を使って取得する方法が普通です。
例えば、

'Dim intNodesCount As Integer
'Dim nodChildren() As Node
'
'Sub GetAllNodeChildren(ByVal nodSetNode As Node)
' intNodesCount = 0
' Erase nodChildren
' Call GetNodeChildren(nodSetNode)
'End Sub
'Sub GetNodeChildren(ByVal ParentNode As Node)
'Dim nodX As Node
' For Each nodX In TreeView1.Nodes
' If nodX.Parent Is ParentNode Then
' intNodesCount = intNodesCount + 1
' ...続きを読む

Qようこそ画面アイコン大きさ変更

ようこそ画面でアイコンの大きさを変更したいのですが、どのようにしたらよいでしょうか、
ちなみに以下のレジストリー変更ではダメでした。
HKE_CURRENT_USER→desktoptop→logpixelsで数値の値を変える

Aベストアンサー

変えられないと思います。

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。


人気Q&Aランキング

おすすめ情報