プロが教えるわが家の防犯対策術!

C++ Builderでプログラミングしています。


OpenDialog1->FileName = Edit1->Text;

このようなテキストボックスに書かれたファイルパスをOpenDialog1->FileNameにいれてそこがNULLだった場合は、ファイルの読み込みを中止する処理をするようなことをやりたいと思っています。


if(OpenDialog1->FileName == NULL){



Edit1->Text;のなかに何も入っていない状態でNULLかどうかのif文に来たときに、NULLではないと判定されるのですが、この書き方に問題があるのでしょうか?


また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか?

どうぞ、ご教授の程よろしくおねがい致します。

A 回答 (4件)

>Edit1->Text;のなかに何も入っていない状態でNULLかどうかのif文に来たときに、NULLではないと判定されるのですが、この書き方に問題があるのでしょうか?



"" == NULLが真であれば、想定した動作になるハズです。
貴方のC++ Builderは""とNULLが等価であるとは判断していないのですよ。
# まぁ、当然ですが……。

NULLなら所謂ヌルポインタ(たいていは全Bitが0)ですが、""はどっかのアドレスを指しています。
そして、指している先には'\0'が入っています。
どこかのアドレスを指している以上、NULLにはなり得ません。
# 指している先が""だった場合にNULLを代入する処理を追加しないとならない…でしょうね。
# その処理が有用かどうかは…状況次第ですが。

OPENFILENAME構造体で、選択したファイル名を受け取るバッファへのポインタをNULLにしてAPIをコールして…正常に動作するかどうかは……どうなんでしょうかね?
# キャンセルされれば正常動作でしょうが、何らかのファイルを選択するとNULLポインタアクセスで「正常に吹っ飛ぶ」でしょうね。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。助かります。

お礼日時:2013/08/11 17:54

UnicodeStringが空かどうかを確認するにはUnicodeString.IsEmptyを使用します。



if (OpenDialog1->FileName.IsEmpty()) {
//文字列が空のとき

}

System.UnicodeString.IsEmpty - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

ファイルが存在するかどうかを確認するには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/ …

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/ …
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。助かります。

お礼日時:2014/02/03 16:42

>> 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)){
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。

if(!FileExists(OpenDialog1->FileName))

このやり方で解決しました。助かります。

お礼日時:2013/08/11 18:04

もう少し、基本的な「型」の情報を学んだ方がいい気はしますが。



OpenDialog1->FileName は、char* ではなく、AnsiString (バージョンによっては UnicodeString)です。
もともとポインタではないので、 NULL を指すことはありません。
文字列としてないにもない場合、 OpenDialog1->FileName == "" で比較できます。

これは、char * でもいえることで、char *ptr が、「どこも指していない(= NULLを指している)」のと、「空の文字列を指している」のは別の状態です。混同しないようにしましょう。
(ちないみに、char * の場合、 ptr == "" の比較は、これも別の意味になります)

> また、OpenDialog1->FileName に入っているパスが存在しない場合にファイル読み込みを中止させるような方法はありますでしょうか?

実際にファイルをオープンしてみて、正常にオープンできるかどうか確認するのがお手軽な気はしますが。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。いろいろと助かります。

お礼日時:2013/08/11 17:55

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