VB6.0マルチセレクトダイアログで250個のファイルを選択しよう。エラー発生の原因と解決方法は?

このQ&Aのポイント
  • VB6.0のマルチセレクトダイアログで250個のファイルを選択するとエラーが出る問題が発生しています。10個程度の選択ならエラーは出ません。エラーの内容は、GetFileNameが空でファイル名を取得できないことです。エラーの解決方法を教えてください。
  • VB6.0のマルチセレクトダイアログで大量のファイルを選択する場合、エラーが発生します。エラーの内容は、GetFileNameが空でファイル名を取得できないことです。現在のコードはGetOpenFileName関数を使用していますが、エラーを回避するためにはどのような修正が必要でしょうか?
  • VB6.0のマルチセレクトダイアログでファイルを選択する際に、250個以上の選択ができないエラーが発生しています。10個程度の選択ではエラーは発生しません。エラーの内容は、GetFileNameが空でファイル名を取得できないことです。このエラーを解決するためには、どのような修正を行えば良いでしょうか?
回答を見る
  • ベストアンサー

VB6.0のマルチセレクトダイアログで250個のファイルを選択したいの

VB6.0のマルチセレクトダイアログで250個のファイルを選択したいのですがエラーが出ます。 10個程度の選択ならエラーが出ません。 どこをどう修正したら多数のファイル選択が可能になるのでしょうか? どなたかわかる方教えてください。 どうぞよろしくお願いいたします。 エラー内容:下記のGetFileNameが空でファイル名を取得できない。 Dim GetFileName As Variant 'ファイル名(フルパス) GetFileName = apiGetOpenFileName(Form1.hWnd, strFilter, strDir) 'ダイアログ表示 使用したコード:下記リンク先のコードにマルチセレクト用のコードを追加しました。 "?http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm"? 以下、追加したコードです。---------------------------- Public Const OFN_LONGNAMES = &H200000 '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする Public Const OFN_EXPLORER = &H80000 'エクスプローラ型ダイアログとして表示 '構造体の設定 With OFN .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加

  • ddtqp
  • お礼率68% (139/203)

質問者が選んだベストアンサー

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

前回の質問に、 「バッファが足りないのでは?」 などの回答がありましたが、それらの問題は解決されての再質問ですか? http://oshiete1.goo.ne.jp/qa5707422.html あと、関係ないですけど普通のコントロールを使わないのはなぜですか?

ddtqp
質問者

お礼

回答ありがとうございます。 おそらく指摘されてるバッファサイズが問題だと思います。 バッファサイズを大きく取ると、「メモリが足りません」や「メソッドに失敗しました」と表示されますので、パソコンにメモリを増やさないと解決できなさそうです。 他の人のPCで試してみます。 >普通のコントロールを使わないのはなぜですか? 視覚障害者ですので、マウス操作がちょっと・・・

その他の回答 (1)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

貴殿の先の同内容の質問に回答したものです。 問題点の指摘だけで、解決コードそのものを書きませんでしたが、理解できなかったなら補足ででも追加質問していただければその旨答えるつもりだったんですけどね。 そのものズバリのコードを提示するよりも、自分なりに考えて解決策を見つけたり、ヒントを元に検索して答えを見つける事で問題解決力が身に付くからなんですけどね。 そのものズバリの回答は、先の質問からコードを引用すると以下のような感じですね。 .nMaxFile = 257 'ファイル名のバッファのサイズを設定 .lpstrFileTitle = String(257, Chr(0)) 'フルパス用のバッファを確保 .nMaxFileTitle = 257 'フルパス用のバッファのサイズを設定 .lpstrFile = String(257, Chr(0)) 'ファイル名のバッファを確保 ↓ .nMaxFile = 64251 'ファイル名のバッファのサイズを設定 .lpstrFileTitle = String(64251, Chr(0)) 'フルパス用のバッファを確保 .nMaxFileTitle = 64251 'フルパス用のバッファのサイズを設定 .lpstrFile = String(64251, Chr(0)) 'ファイル名のバッファを確保 実際問題、64251ってのは適当な数字です。 1ファイルで257バイト用意するのが理想で、かけることの250ファイル分 リスト終端はChr(0)が二つ重なる為、+1って計算です。 現実問題、257バイト必要なフルパスファイル名で運用する事は考えにくいでしょうから、実運用上は500ファイルでも余裕で選択できるでしょうね。 バッファが足りないんだから、バッファを増やせばいいだけ。 それでも足りなきゃ(最大同時選択ファイル数が250以上を想定しているなら)128501でも、257001でも、好きな数字を指定してください。

関連するQ&A

  • VB6.0で、APIのダイアログボックスを使い複数のファイル名を取得したいのですが

    以下のサイトのファイルを開くコードを引用して、なんとかダイアログボックスをマルチセレクトにするところまではできました。 以下のコードを実行すると、strFileNameにファイルが入っているフォルダのパス名だけが取得されます。複数のファイル名を取得したいのですが。 どこを直せばいいのかわからず教えていただきたいのですが。 アドバイスお願いいたします。 "http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm" 以下、追加したコードです。---------------------------- Public Const OFN_LONGNAMES = &H200000 '旧スタイルのダイアログのとき、ロングファイル名を使用可能にする Public Const OFN_EXPLORER = &H80000 'エクスプローラ型ダイアログとして表示 '構造体の設定 With OFN .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加

  • VB6.0で、ファイルのマルチセレクトダイアログでエラーがでます。

    VB6.0で、ファイルのマルチセレクトダイアログでエラーがでます。 ファイルを10個ほど選択ならエラーがでません。 250個ほどファイルを選択したいのですが、 コードを何度みなおしてもわかりません。 どなたか、どこをどう修正したらよいのかアドバイスをいただけませんでしょうか。 お手数をおかけしますがよろしくお願いします。 エラー箇所は下部の For i = 1 To UBound(GetFileName) です。 Public Function apiGetOpenFileName(nHandle As Long, nFilter As String, nDir As String) As Variant Dim OFN As OPENFILENAME 'OPENFILENAME構造体 Dim Ret As Long '戻り値 With OFN '構造体の設定 .Flags = OFN_PATHMUSTEXIST Or _ OFN_FILEMUSTEXIST Or _ OFN_HIDEREADONLY Or _ OFN_ALLOWMULTISELECT Or OFN_EXPLORER 'マルチセレクト追加 .hInstance = App.hInstance 'インスタンスハンドルを設定 .hwndOwner = nHandle 'ウインドウハンドルを設定 .lpstrTitle = "ファイルを開く" 'コモンダイアログのタイトルを設定 .lpstrFilter = nFilter 'フィルタを設定 .lStructSize = Len(OFN) '構造体のサイズを設定 .nMaxFile = 257 'ファイル名のバッファのサイズを設定 .lpstrFileTitle = String(257, Chr(0)) 'フルパス用のバッファを確保 .nMaxFileTitle = 257 'フルパス用のバッファのサイズを設定 .lpstrFile = String(257, Chr(0)) 'ファイル名のバッファを確保 .lpstrInitialDir = nDir 'デフォルトのディレクトリを指定 End With Ret = GetOpenFileName(OFN) '「ファイルを開く」ダイアログボックスを表示する If Ret = 0 Then '[キャンセル]を押した時 apiGetOpenFileName = vbNullString Exit Function Else '[OK]を押した時 apiGetOpenFileName = Split(OFN.lpstrFile, Chr(0)) End If End Function ' ファイル名を取得する ・・・コード省略 Dim GetFileName As Variant 'ファイル名(フルパス) GetFileName = apiGetOpenFileName(Form1.hWnd, strFilter, strDir) 'ダイアログ表示 'ファイル名取得 j = 1 For i = 1 To UBound(GetFileName) ←ここでエラーが出ます If GetFileName(i) <> "" Then strDFname(j) = GetFileName(i) j = j + 1 End If Next i

  • ファイルを開くダイアログについて

    いつもお世話になっています。 VS2005でWindowsアプリケーション作成を行っております。 ファイルを開くダイアログについて、  OPENFILENAME ofn;  ofn.lpstrFilter = TEXT("テキストファイル(*.txt)\0*.txt\0\0"); 対象ファイルを上記のようにテキストファイルと指定しているとき、 ユーザがテキストファイル以外を誤って?選択してOKをクリックした場合に エラーを表示したいのですが、ユーザが選択したファイル名の拡張子が lpstrFilterと一致するか調べる方法を教えていただきたいです。 ご教授お願いいたします。

  • VB6.0で、マルチセレクトダイアログボックス(API)を使うと、パス名にチルダが混ざってしまうのですが。

    VB6.0で、APIのファイルを開くダイアログボックスで複数のファイルを開こうとしています。 下記のページで、openfilename構造体のFlagsにOFN_ALLOWMULTISELECTを指定したのですが、 パス名のところどころにチルダ「~」が混じってしまいます。 対処法をご存知ないでしょうか? ​http://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm​

  • UWSCでファイルダイアログからフルパスを取得したい(APIコード有り)

    UWSCでダイアログを表示し、ユーザーにファイルを選択させ、Excelファイルをオープンしたいと思っています。ファイルダイアログのソースはネットで見つけました。 しかし、APIの知識はまったく無いので下記コードの意味がわかりません。 最終的にやりたいことは、戻値 = XLOPEN( [ファイル名] ) 関数を利用して、「ファイル名」の所にユーザーが選択したファイルのフルパスを入力したいです。 下記のAPIのコードを使ってどのようにフルパスを取得することができますでしょうか? よろしくお願いいたします。 ///////////////////////////////////////////////////////////////////////////////   v_Path = FileOpenDLG.Get(v_Path)   Module FileOpenDLG     DEF_DLL GetOpenFileNameA({Long, Long, Long, var string, var string, Long, Long _                  , var pchar, Long, var pchar, Long, var string, var string _                  , Long, DWORD, var string, Long, Long, var string}): Bool: COMDLG32     CONST STRUCT_SIZE = 76   // 構造体のサイズ     CONST OFN_HIDEREADONLY = $4   // 書き込み禁止(Read Only)のチェックボックスを非表示。     CONST OFN_FILEMUSTEXIST = $1000  // 存在しないファイルを選択できないようにする。     CONST OFN_EXPLORER = $80000 // ダイアログボックスをエクスプローラ風にする。     Dim Flag = OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_EXPLORER     Dim Len_1024 = $400     Dim Buff_1024 = Format(ChrB(0), This.Len_1024)     Dim Name     Dim Title = "Excelファイルを選択。"     Dim ExtFilter = "Excel (*.xls)" + ChrB(0) + "*.xls" + ChrB(0) _             + "全て (*.*)" + ChrB(0) + "*"     Dim DefaultDir = null  // 初期表示ディレクトリ null は CurrentDirectory。     Function Get(var v_Path)       v_Path = This.Buff_1024       This.Name = This.Buff_1024       Result = GetOpenFileNameA(_         STRUCT_SIZE, 0, 0, This.ExtFilter + ChrB(0), NULL, 0, 0 _         , v_Path, This.Len_1024, This.Name, This.Len_1024, This.DefaultDir, This.Title _         , This.Flag, 0, NULL, 0, 0, NULL)     FEnd   EndModule ///////////////////////////////////////////////////////////////////////////////

  • ファイルの保存ダイアログでデフォルト命名したい

    ファイルの保存ダイアログでデフォルト命名したい Win32API(C言語)編 第55章 ファイルを開く・保存のコモンダイアログ http://www.geocities.jp/ky_webid/win32c/055.html をみてファイルの保存ダイアログを出せるようになりました。 しかし、たまーにフリーソフトなどでもファイルを保存する際に、 デフォルトのファイル名が初期値として指定されているものもあります。 私のソフトでもそのようにしたいのですが、色々な部分に文字列を 入れてみて試してみても、思ったとおりの結果にはなりませんでした。 下記は上記サイトに記載されている ファイルを保存する際のダイアログの出し方から引用したものですが、 これをどのようにしたらダイアログが開いた際にファイル名部分に デフォルト命名された状態で開けるのでしょうか? static OPENFILENAME ofn; static TCHAR filename_full[MAX_PATH]; // ファイル名(フルパス)を受け取る領域 static TCHAR filename[MAX_PATH]; // ファイル名を受け取る領域 // 構造体に情報をセット ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく ofn.lStructSize = sizeof(ofn); // 構造体のサイズ ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類 ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定 ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類 // 名前を付けて保存コモンダイアログを作成 if( !GetOpenFileName( &ofn ) ) { MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK ); SendMessage( hWnd, WM_CLOSE, 0, 0 ); }

  • Active Basic ファイルの複数選択

    AB 4.23.00を使っています。 ファイルの複数選択し、それぞれのファイルパスと名前をリストボックスに送信したいのですが、NULL文字の検索のやり方がわかりません。 すみませんが、どのようにすればよいのかをご教授ください。 コードは、 Dim ofn As OPENFILENAME Dim FilePath[MAX_PATH-1] As Byte 'ファイル名を取得 ofn.lStructSize=Len(ofn) ofn.hwndOwner=hMainWnd ofn.lpstrFilter=Ex"音楽 ファイル(wav;mp3;mid;midi)\0*.wav;*.mp3;*.mid;*.midi\0\0" ofn.nFilterIndex=0 ofn.lpstrFile=FilePath ofn.nMaxFile=MAX_PATH ofn.lpstrTitle="Soundファイルを開く" ofn.Flags=OFN_ALLOWMULTISELECT or OFN_HIDEREADONLY or OFN_LONGNAMES or OFN_EXPLORER If GetOpenFileName(ofn)=0 Then Exit Sub End If を使っています。 ここから、1つずつならファイル名とファイルパスは取得できるのですが、複数選択の場合のやり方がわかりません。 すみませんが、お願いします。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • ファイルダイアログでのファイルの複数選択について

    VC++6.0でプログラムをしているのですが、CFileDialogクラスのコモンダイアログでファイルを開くときに、ファイルを複数選択できるようにしています。 しかし、試してみると14枚までしか開くことができません。プログラムは以下のとおりです。 CFileDialog dlg(TRUE, "bmp", "*.bmp", OFN_ALLOWMULTISELECT); if (dlg.DoModal() != IDOK) { return; } ファイルを15枚以上選択するとif文の中のreturnに入って関数を抜けてしまいます。原因が何なのか分かる方教えてください。

  • コンソールアプリでファイル選択ダイアログを出したい

    C++Builder6 で作っているコンソールアプリがあります。 これに、ファイル選択ダイアログを出す機能を追加したいのですが 可能でしょうか? 試しに TOpenDialog *OpenDialog1; OpenDialog1 = new TOpenDialog; //※ delete OpenDialog1; というコードを書いてみましたが、※の行で 「'TOpenDialog::TOpenDialog()' に一致するものが見つからない」 というコンパイルエラーになりました。

専門家に質問してみよう