プログラミング


タスクバーに表示しない
ドラッグ&ドロップを受け入れる
WM_MOUSEWHELLを捕らえる
多次元配列を変数パラメータとして渡す


タスクバーに表示しない

タイトルのことを実現するには,メインフォームのOnShowイベントに 次のように書く.

procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow( Application.Handle, SW_HIDE );
end;

ただし,これだけだと,一旦アプリケーションを最小化し,復元した場合に タスクバーにアイコンが残る.これを回避するには,Applicationオブジェクトの OnRestoreイベントに上のイベントハンドラを割り当てる.すなわち, メインフォームのOnCreateイベントの中で,

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnRestore := FormShow;
end;

とすれば良い.


ドラッグ&ドロップを受け入れる

エクスプローラなどからドロップしたファイルを受け入れるには, まずDragAcceptFiles関数によってメインフォームのハンドルをシステムに登録する. 登録に成功すると,ファイルをドロップしたときにWM_DROPFILESメッセージが送られてくるようになるので, このメッセージハンドラの中でファイルを読み込むなどの処理を行う. なお,DragAcceptFiles関数と後述のDragQueryFile関数およびDragFinish関数はShellAPIユニットで宣言されているので, このユニットをuses節に追加する.

例えば,フォーム上のRichEditに ドロップされたファイルを読み込む場合, メインフォームのOnCreateイベントハンドラおよびWM_DROPFILESのメッセージハンドラを それぞれ次のように書けばよい.

procedure TForm1.FormCreate(Sender: TObject);
begin
   DragAcceptFiles( Handle, True );
end;

procedure TForm1.WMDropFiles( var Msg:TWMDROPFILES );
var
  DroppedFile: array [ 0..255 ] of Char;
begin
   DragQueryFile( Msg.Drop, 0, DroppedFile, SizeOf( DroppedFile ) );
   RichEdit1.Lines.LoadFromFile( DroppedFile );
   DragFinish( Msg.Drop );
end;

DragQueryFile関数でドロップされたファイルの情報が取得できる. 最初の引数はファイルの情報が格納されている構造体のハンドルであり, 2番目の引数は情報を取得したいファイルのインデックスである. 3番目の引数はファイル名を格納する領域へのポインタであり,4番目の引数はその領域のサイズである. 処理が終了したらDragFinish関数を呼び出してファイル情報が格納されている構造体を解放しなければならない.


WM_MOUSEWHELLを捕らえる

Delphiのコンポーネントにはスクロールマウスのホイールを捕らえるイベントは無いが,Applicationオブジェクト のOnMessageイベントを使えば面白いことができる.

以下のコードはホイールの回転に合わせて数字が増減する. WM_MOUSEWHEELメッセージが来たとき,wParamの上位バイトが正ならばホイールの回転方向が利用者から遠ざかる 向きであり,負ならば逆向きである. このコードではHandledパラメータにTrueを代入しているので,フォーム上にWM_MOUSEWHELLメッセージに 応答する他のコンポーネントがあっても,それらにWM_MOUSEWHELLメッセージは届かない.

なお,このコードではApplicationEventsコンポーネントを使っている.

var Num: Ingeger = 0;

procedure TForm1.SetLabelCaption( ANum: Integer );
begin
   Label1.Caption := IntToStr( ANum );
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  Rotation: ShortInt;
begin
   if Msg.message = WM_MOUSEWHEEL then
   begin
      Rotation := HIWORD( Msg.wParam );
      if Rotation > 0 then
         Inc( Num )
      else
         Dec( Num );
      SetLabelCaption( Num );
      Handled := True;
   end;
end;


多次元配列を変数パラメータとして渡す

1次元配列は,

procedure Foo( var a: array of Integer );

のようにすれば変数パラメータとして渡すことができる. しかし,多次元配列の場合,例えば,

procedure Foo( var a: array of array of Integer );

としても,「型名が必要な場所に "array" があります」となり,コンパイルできない.

この場合,多次元配列を新たな型として宣言し,その型名を使って関数を宣言する. 以下の例は,渡されたByte型の2次元配列をByte型整数で埋めるものである.

type
  TByteArrays = array[ 0..4, 0..4 ] of Byte;

procedure FillNumber( var b: TByteArrays; Number: Byte );
begin
  FillChar( b, SizeOf( b ), Number );
end;

呼び出し側では,

var
  a: TByteArrays;

と宣言しておいて,

   FillNumber( a, 2 );

のようにする.


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送