- ベストアンサー
C++ BuilderでOpenDialog1->FileNameについて
- C++ Builderでプログラミングしている際、テキストボックスに書かれたファイルパスをOpenDialog1->FileNameに代入し、その値がNULLの場合にファイルの読み込みを中止する処理を行いたいです。
- テキストボックスに何も入力されていない状態でNULLかどうかの判定を行う際に、問題が発生しています。
- さらに、OpenDialog1->FileNameに格納されているパスが存在しない場合に、ファイル読み込みを中止させる方法を知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>Edit1->Text;のなかに何も入っていない状態でNULLかどうかのif文に来たときに、NULLではないと判定されるのですが、この書き方に問題があるのでしょうか? "" == NULLが真であれば、想定した動作になるハズです。 貴方のC++ Builderは""とNULLが等価であるとは判断していないのですよ。 # まぁ、当然ですが……。 NULLなら所謂ヌルポインタ(たいていは全Bitが0)ですが、""はどっかのアドレスを指しています。 そして、指している先には'\0'が入っています。 どこかのアドレスを指している以上、NULLにはなり得ません。 # 指している先が""だった場合にNULLを代入する処理を追加しないとならない…でしょうね。 # その処理が有用かどうかは…状況次第ですが。 OPENFILENAME構造体で、選択したファイル名を受け取るバッファへのポインタをNULLにしてAPIをコールして…正常に動作するかどうかは……どうなんでしょうかね? # キャンセルされれば正常動作でしょうが、何らかのファイルを選択するとNULLポインタアクセスで「正常に吹っ飛ぶ」でしょうね。
その他の回答 (3)
- 山本 隆(@tyamamoto)
- ベストアンサー率60% (12/20)
UnicodeStringが空かどうかを確認するにはUnicodeString.IsEmptyを使用します。 if (OpenDialog1->FileName.IsEmpty()) { //文字列が空のとき … } System.UnicodeString.IsEmpty - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.UnicodeString.IsEmpty ファイルが存在するかどうかを確認するにはTFile.Existsを使用します。 #include <System.IOUtils.hpp> if (TFile::Exists(OpenDialog1->FileName)) { //ファイルが存在するときの処理 … } System.IOUtils.TFile.Exists - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.IOUtils.TFile.Exists TOpenDialogを使って存在するファイルを選択させるには、次のようなコードになります。 //存在しないファイルをユーザーが選択しようとしたときにエラーメッセージを生成する OpenDialog1->Options << ofFileMustExist; //開くボタンが押されたとき if (OpenDialog1->Execute()) { //存在するファイルが選択されたときの処理 … } TOpenDialogのOptionsプロパティにofFileMustExistを設定すると、存在しないファイルを選択できません。 上のコードではOptionsプロパティを実行時に設定していますが、設計時にオブジェクトインスペクタのプロパティページでも設定できます。 TOpenDialogのExecuteメソッドは、開くボタンが押されたときにtrueを返します。 ファイルが選択されていないときは開くボタンを押すことができないため、戻り値がtrueのときは存在するファイルが選択されていることになります。 Optionsプロパティに設定できる値はマニュアルをご覧ください。 Vcl.Dialogs.TOpenOptions - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/Vcl.Dialogs.TOpenOptions
お礼
回答頂きありがとうございます。助かります。
- duke_kimura
- ベストアンサー率39% (53/134)
>> Edit1->Text;のなかに何も入っていない状態 この場合の一般的な比較対象はNULLではなく""(空文字)です。 が、C++ Builderに限って言えばOpenDialog1->FileNameはTFileName型の様なので、 後者のどちらかコンパイルが通る方を用いるのが自然かと思います。 C++ Builderのバージョンに依存する可能性があるので2つ書いています。 if(OpenDialog1->FileName == ""){ if(OpenDialog1->FileName.empty()){ // std::stringとの比較 if(OpenDialog1->FileName.IsEmpty()){ // AnsiStringとの比較 >> OpenDialog1->FileName に入っているパスが存在しない場合 この文をそのまま条件式に直すと次の様になります。 if(!FileExists(OpenDialog1->FileName)){
お礼
回答頂きありがとうございます。 if(!FileExists(OpenDialog1->FileName)) このやり方で解決しました。助かります。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もう少し、基本的な「型」の情報を学んだ方がいい気はしますが。 OpenDialog1->FileName は、char* ではなく、AnsiString (バージョンによっては UnicodeString)です。 もともとポインタではないので、 NULL を指すことはありません。 文字列としてないにもない場合、 OpenDialog1->FileName == "" で比較できます。 これは、char * でもいえることで、char *ptr が、「どこも指していない(= NULLを指している)」のと、「空の文字列を指している」のは別の状態です。混同しないようにしましょう。 (ちないみに、char * の場合、 ptr == "" の比較は、これも別の意味になります) > また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか? 実際にファイルをオープンしてみて、正常にオープンできるかどうか確認するのがお手軽な気はしますが。
お礼
回答頂きありがとうございます。いろいろと助かります。
お礼
回答頂きありがとうございます。助かります。