Borland C++ Builder Tips


Borland C++ Builder 3がベースになっています。

 

Q1. 実行ファイルのディレクトリを取得するには?
(例)

AnsiString aaa = "e:\test\test1\test2\test3.exe" の場合、

ExtractFilePath(aaa)  は e:\test\test1\test2\

となる。
Q2. 実行ファイルの名前を取得するには?
(例)

AnsiString aaa = "e:\test\test1\test2\test3.exe" の場合、

 ExtractFileName(aaa)は、

    test3.exe

となる。
Q3. 実行ファイルの拡張子を取得するには?
(例)

AnsiString aaa = "e:\test\test1\test2\test3.exe" の場合、

  ExtractFileExt(aaa) は

   .exe

  となる。
Q4. 実行ファイルのドライブを取得するには?
(例)

AnsiString aaa="e:\test\test1\test2\test3.exe" の場合

ExtractFileDrive(aaa) は
  
    e:

となる。
Q5. 拡張子を変更するには?
(例)

AnsiString a;

a = ExtractFileName(Application->ExeName);

Label1->Caption = a;

Label2->Caption = ChangeFileExt(a,".ini");

実行すると

Label1->Captionには "Project1.exe"
Label2->Captionには "Project1.ini"

が表示される。
Q6. 画面のプロパティに設定されているスクリーンセーバを起動するには?
PostMessage(GetDesktopWindow( ), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
Q7. 画面の表示/非表示をするには?

画面を表示する

ShowWindow(Application->Handle, SW_SHOW);
Show();

画面を非表示にする

ShowWindow(Application->Handle,SW_HIDE);
Hide();
Q8. 画面のハードコピーをとるには?
	long lWidth = Screen->Width;
	long lHeight = Screen->Height;

	// Bitmapオブジェクトを生成
	Graphics::TBitmap *Bitmap;
	Bitmap = new TBitmap();

	// Bitmap オブジェクトのサイズを設定
	Bitmap->Width = lWidth;
	Bitmap->Height = lHeight;

	//デスクトップのHDCを取得
	HDC hDC = GetDC(0);

	// 画面のイメージをメモリにコピー
	lRet = BitBlt(Bitmap->Canvas->Handle, 0, 0, lWidth, lHeight, hDC, 0, 0, 	SRCCOPY);

	// HDCを開放
	ReleaseDC(0,hDC);

Q9. フォルダ(ディレクトリ)選択ダイアログを表示するにはには?
#include 
 
 char path[MAX_PATH];
 BROWSEINFO bi;
 ZeroMemory(&bi, sizeof(bi));
 bi.hwndOwner = Handle;
 bi.lpszTitle = "フォルダを選択";
 bi.ulFlags = BIF_RETURNONLYFSDIRS;
 LPITEMIDLIST itemIdList = SHBrowseForFolder(&bi);
 if(itemIdList){
   SHGetPathFromIDList(itemIdList, path);
 }

Q10. ファイルの検索方法
 下記の例では、
   ListFile("a:\\");
 を実行すると、aドライブ内の全てのファイルがListBox1に表示されます。
   ListBox1->Items->Append(path + s);
 の部分を任意に書き直せば、目的の処理が可能でしょう。


void TForm1::ListFile(AnsiString path) {
    WIN32_FIND_DATA fd;
    HANDLE hFind = FindFirstFile((path + "*").c_str(), &fd);

    if (hFind != INVALID_HANDLE_VALUE)    {
  
       do {
            AnsiString s = (AnsiString)fd.cFileName;

            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                if (s != "." && s != "..") {
                    ListFile(path + s + "\\");
                }
            } else {
                ListBox1->Items->Append(path + s);     //ここに処理を入れる
            } 
       } while(FindNextFile(hFind, &fd));

        FindClose(hFind);
    }
}
Q11. ファイルの存在の確認方法(その1)
ファイル有無の確認はaccess関数を利用する

#include 
int access(FILENAME, mode);
     char  *FILENAME;
     int mode
mode 
   0         ファイルの存在のみを調べる
   2         書き込み許可設定を調べる
   4         読み込み許可設定を調べる
   6         読み書き設定許可を調べる

指定モードを満たせば 0 、そうでなければ -1 を返す
Q12. ファイルの存在の確認方法(その2)
ヘッダーファイルに追加

#include 


AnsiString File;

File = "text.txt";

if (FileExists(File)) {
	ShowMessage("ファイルは存在します");
} else {
	ShowMessage("ファイルは存在しません");
}

Q13. 指定されたディレクトリが存在するかどうか調べるには?
ヘッダーファイルに追加

#include 


AnsiString Directory;

Directory = "C:\\aaa\\bbb";

if (DirectoryExists(Directory)) {
	ShowMessage("ディレクトリは存在します");
} else {
	ShowMessage("ディレクトリは存在しません");
Q14. ヘルプファイルを起動するには?/td>
ヘルプファイルの起動


ヘルプファイルがアプリケーションと同じディレクトリにある場合:

AnsiString HelpName = ExtractFilePath(Application->ExeName) + "help.hlp";

ShellExecute(Form1->Handle,NULL,HelpName.c_str(),NULL,NULL,SW_SHOW);
Q15. パラメータ(引数)を取得するには?
ParamCount関数・・・・・コマンドラインパラメーターの個数

ParamStr(0) 〜 ParamStr(ParamCount-1)までが有効なコマンドラインパラメータ

コマンドライン全体・・・・CmdLine変数(Char *)に渡される
Q16. C++ Builder内からアプリケーションを実行するには?
WinExec関数を利用する

(例)

WinExec("test.exe",SW_SHOWDEFAULT);

Q17. 設定ファイル(.ini)を作成するには?
Unit1.hファイルの先頭に以下を追加

    #include 


    クラスの Private:に以下を追加

    TIniFile *myIniFile;

Unit1.cpp

         myIniFile = new TIniFile(ファイルパス);

    【設定ファイルの読み込み】

    AnsiString ddd = myIniFile->ReadString("設定1","設定2","設定3");

        設定1: データ値を取り出すキーを識別する文字列
        設定2: 返されるデータ値の名前を識別する文字列
        設定3: Section に対応するキーまたは Ident に対応するデータ値がない場合に
                    使われる文字列値

        【設定ファイルの書き込み】

        myIniFile->WriteString("設定1","設定2","設定3");

        設定1: 文字列値が書き込まれるキーのあるファイル内のセクションを指定
        設定2: 値を設定するキーの名前
        設定3: 書き込まれる文字列値


    必ず解放をすること

        delete myIniFile;

Q18. 動的リンクライブラリを利用するには?
1.DLL のインポートライブラリを作成する

  NKF32.DLLを利用する場合:

    IMPLIB   NKF32.LIB  NKF32.DLL

2.作成されたライブラリファイルをメイクファイルのALLLIBに追加する

  メイクファイルの表示

   [表示] - [プロジェクト メイクファイル]

3.ヘッダーファイルの編集

  NKF32.Hを編集する

  extern "C" _declspec(dllimport)を追加する

  void CALLBACK GetNkfVersion(LPSTR);
           ↓
  extern "C" __declspec(dllimport) void CALLBACK GetNkfVersion(LPSTR);


4.ヘッダーファイルを追加する

  Unit1.cppにNKF32.Hを追加する

5.NKF32.DLLをSYSTEMディレクトリ、またはプログラムのあるディレクトリに置く。

Q19. FormCreate内でプログラムを終了するには?
FormCreaate内では Close( );では終了することができない。


Application->Terminate( );

で終了する。

Q20. TStringListの配列について
方法1  ポインタの配列を使う
//確保
TStringList **mString = new TStringList*[MyCounter];
for(int i=0; iAdd("abc");
Memo1->Lines->AddStrings(mString[0]);
....
//解放
for(int i=0; i を使う
#include 
using namespace std;
//確保
vector mString(MyCounter);
for(int i=0; iAdd("abc");
Memo1->Lines->AddStrings(mString[0]);
....
//解放
for(int i=0; i > を使う
#include 
using namespace std;
//確保
vector > mString(MyCounter);
for(int i=0; i(new TStringList);
}
....
//使用例
//基本的には普通のポインタの配列や vector と同じように使えるが
//直接値を必要とする場合だけは .get()というのを付ける必要がある。
mString[0]->Add("abc");
Memo1->Lines->AddStrings(mString[0].get());
....
//解放は不要。

Q21. 起動時にフォームを表示しないプログラムを作成するには?
「表示」メニューで「プロジェクトソース」を選び、コードエディタにプロジェクトソースが
表示されるようにする。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
     try
     {
             Application->Initialize( );
             Application->ShowMainForm = false;   //これを追加
             Application->CreateForm(__classid(TForm1), &Form1);
             Application->Run();
     }
    catch (Exception &exception)
   {
             Application->ShowException(&exception);
   }
   return 0;
]

Q22. 配布可能なプログラムを作成するには?
以下の設定を行ないます。

[プロジェクト] - [オプション] - [パッケージ] - [実行時パッケージを使って構築]  チェックをはずす

[プロジェクト] - [オプション] - [リンカ] - [リンク] - [ダイナミックRTLを使用]  チェックをはずす
ImageListから画像を抽出するには?
  // Bitmapの定義
    Graphics::TBitmap *bmap;
    bmap = new Graphics::TBitmap;

    TRect Src,Dest;

    // ImageListから画像を取り出す
    ImageList1->GetBitmap(0,bmap);

  // 画像のサイズを設定
    Src = Rect(0,0, bmap->Width,bmap->Height);
    Dest = Rect(0,0,bmap->Width,bmap->Height);

    Image1->Width = bmap->Width;
    Image1->Height = bmap->Height;

  // 画像のコピー
    Image1->Canvas->CopyRect(Dest, bmap->Canvas, Src);

  // クラスの解放
    delete bmap;
Q24. ファイル名を指定して実行するには?
ヘッダファイルに指定する
  #include 

ShellExecuteを利用する場合、関連付けされたアプリケーションが起動される
(例としてhtmlファイルを指定する)
  AnsiString hp_adr = "http://www.ne.jp/asahi/protech/hiroaki/" ;
  ShellExecute(Handle, NULL, hp_adr.c_str(), NULL, NULL, SW_SHOWNORMAL);