Programmers Room Tips集 BCB編 更新[2000.06.29]

Contents

1.コマンドライン引数の取得 [1999.10.10]
2.ポップアップメニューをコード上から表示する [1999.11.11]
3.FileOpen Dialogもコードで [1999.11.13]
4.アイコンが壊れてしまったら[1999.11.30]
5.アイコンをビットマップに変換する[1999.12.02]

6.リスト等のフォントを部分的に変更する NEW [2000.06.29]

・・・初心者
・・・中級者
・・・上級者

■コマンドライン引数の取得  [ 1999.10.10]

BCBにおいて簡単にコマンドライン引数を取得するには以下のVCLの関数をコールします。

コマンドライン引数の取得

extern PACKAGE AnsiString __fastcall ParamStr(int Index);
引数のIndexに取得したい引数の番号を指定します。例えば1番目なら1を指定します。0を指定すると実行フィル名が取得できるます。そのへんは通常のC言語のコマンドライン引数に似ています。

コマンドライン引数の数を取得

extern PACKAGE int __fastcall ParamCount(void);


例として、APP.EXEという実行ファイルに

APP /A123 ABC

のようにコマンドライン引数を設定した場合
ParamCount();は2を返し、
ParamStr(0);は "APP.EXE"
ParamStr(1);は "/A123"
ParamStr(2);は "ABC"
ParamStr(3);は NULL をそれぞれ返します。

なお、以下は余談。引数にブランクを含む場合。VCLのHELPにも書いてあるはなしです。

コマンドライン引数はブランクかTABで区切るのですが、ブランクやTABをコマンドライン引数に含む場合はダブルコーテーションで囲みます。

APP "/A123 ABC" とした場合
ParamStr(1);は "/A123 ABC"
ParamStr(2);は NULL

これはBCBだけの話ではなく全体の話で、WindowsのショートカットやIE4以降についているランチャーに引数を指定するときも同様です。

■メニューのポップアップをコードでおこなう  [ 1999.11.11]

BCBでポップアップメニューを表示するにはどうしたらよいでしょう?

答えは右クリックした際にポップアップを表示させたいコントロールのPopupMenuプロパティにあらかじめ作成しておいたポップアップメニューのコントロールを設定(作成してあるなら選択するだけ)すれば万事OKです。

ところが、クリックされた場所により表示するメニューを変えたい場合などはどうしたら良いでしょうか?

まず、そのコントロールのMouseDownイベントメソッドを作成します。
そしてマウスボタンの右が押された場合に、ポップアップメニュを表示させればよいわけです。ポップアップメニューの表示はポップアップメニューのコントロールのメソッドPopup()をコールすればよいのです。

以下の例は、画面Form1上のImageコントロールのインスタンスImage1上でマウスの右クリックを行った場合の例です。


void __fastcall TForm1::Memo1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
       
// 右ボタンが押された場合の処理
        if(Button == mbRight){
              
// 引数はコントロール上の相対座標なので、
               // 画面上の絶対座標にする。

               int nX = X + Form1->Left + Image1->Left;
               int nY = Y + Form1->Top + Image1->Top;
 
               // ここで状況に応じたポップアップメニューの選択
               // 処理を入れる。例えばImageの右半分と左半分で
               // 表示されるメニューを替える
               if(X > (Image1->Width / 2) )
                             PopupMenu1->Popup(nX, nY);
               else
                             PopupMenu2->Popup(nX, nY);
        }

}

 

FileOpen Dialogもコードで  [1999.11.13]

ポップアップウィンドウをコードで書いたついでに、FileOpenのDialogをコードで書いてみましょう。


        // ファイルオープンダイアログ定義
        
TOpenDialog* OpenDialog1 = new TOpenDialog(this);
        // ダイアログ属性設定:
        // リードオンリボタンを表示しない|無効なパスチェック|パスの再設定
       
OpenDialog1->Options << ofHideReadOnly << ofPathMustExist << ofNoChangeDir;
        OpenDialog1->Filter =
"テキスト (*.txt)|*.txt|全てのファイル(*.*)|*.*";
        OpenDialog1->DefaultExt =
"dat";
        OpenDialog1->FileName = strPathName;
//最初に表示されるファイル
        // ファイルオープンダイアログ実行
        if ( OpenDialog1->Execute() ){
               
// ダイアログで「OK」が押された場合の処理をここに記述
                                   :
        }
        delete  OpenDialog1;

特にこのようにコードで各意味はあまりありません。(メモリが少し節約になるかな?)コンポーネントを画面に貼り付けて作成するのが一番でしょう。

アイコンが壊れてしまったら。  [1999.11.30]

アイコンを描いて、プログラムのオプションから登録し、メイクするとアイコンが実行ファイルに設定されるわけですが、どういうわけか、登録できなくて困ったことはありませんか?

経緯はわからないのですが、色々やっているうちに、全コンパイルしても、何しても修正できなくなることがありました。

こういうときは、実行ファイル(プロジェクトファイル)と同名のRESファイル(*.res)をImage Editorで開いてそこに自分の入れたいアイコンを登録すればOKです。
通常なら開いたときに、Tree表示で「ICON」と「Version」があるはずです。ダブルクリックして編集しましょう。(ICONが登録できなくて困ったわけだから、ICONファイルがあるのでしょうから、一緒に開いて、コピーすれば良いでしょう)

アイコンをビットマップに変換する。  [1999.12.02]

Win32API DrawIconEx を使います。

Icon1というTIconのポインタ(インスタンス)があった場合、以下のように処理します。


 
//Bitmapのインスタンス作成
  Graphics::TBitmap *Bmp = new Graphics::TBitmap; 
  Bmp->Width = 16;
//小さいアイコンの幅。大きいアイコンなら32
  Bmp->Height = 16;
//小さいアイコンの高さ。大きいアイコンなら32
  DrawIconEx(Bmp->Canvas->Handle, 0, 0, Icon1->Handle,
    0, 0, 0, 0,DI_NORMAL);
// Bmp にアイコンを描き込む

 

リスト等のフォントを部分的に変更する [2000.06.29]

リストや、リストビュー等のコントロールには、全体のFontのプロパティはありますが、個々の行の色を変えたりすることは、一見出来ません。ListViewなどは、ListItemにFontプロパティがあったら良いなぁとか考えたことはありませんか?

例えばTListViewならonCustomDrawItem(イベント関数)を使用します。

イベントのonCustomDrawItemをダブルクリックして、オーバロード関数を作成し、以下のようにします。
これは、リストアイテムのチェックボックスがチェックされていたら、フォントの色を赤にするという例です。


 void __fastcall Form1::ListView1CustomDrawItem(TCustomListView *Sender,
    TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
{
	  if(Item->Checked == true)
                ListView1->Canvas->Font->Color = clRed;
        else
                ListView1->Canvas->Font->Color = clWindowText;
        DefaultDraw = true;
}

       

この関数の参照引数のDefaultDrawをtrueに設定すると、通常の描画を続行します。通常の描画が始まる前に、ListViewのCanvasのフォント属性を都合よく変更してしまうということです。

フォントを部分的に変えたいがために、オーナードロウを使うのも大変なので、上記のようにすれば、楽に変更できるわけです。 


[TOPへもどる] [Soft Page TOPへもどる] [ProgramerS Room Topに戻る]  [このページのTop]