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]