お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ListBoxにヒント表示機能を追加"



みなさん、こんにちは。SUNです。

リストボックスで文字列が長すぎて表示がはみ出している項目上にマウスポインタ
を移動させると項目の全文字列をヒントとして表示するようにしたTListBoxから
継承したコンポーネントです。

Delphiのコードエディタ下部に表示されるコンパイルエラーリストの様な
コンポーネントです。

また、コンポーネントのフォントの設定がヒント表示に反映するようにしています。





unit HintLstBox;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;

type
  TListBoxHintWindow = class(THintWindow)
  private
    procedure ActivateHintData(Rect: TRect; const AHint: string;
        AData: Pointer); override;
  end;

  THintListBox = class(TListBox)
  private
    procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [THintListBox]);
end;


{ THintListBox }

// ヒントが表示される時に呼ばれるメッセージハンドラ
procedure THintListBox.CMHintShow(var Message: TMessage);
var
  Index: Integer;
begin
  with THintInfo(Pointer(Message.LParam)^) do // LParamをTHintInfo型にキャスト
  begin
    HintStr := '';                            // ヒント文字列を空にする
    HintWindowClass := TListBoxHintWindow;    // ヒント表示を独自の方法で行う
    Index := CursorPos.y div ItemHeight + TopIndex;// マウスのある項目のインデックス
    Canvas.Font.Assign(Font);           // CanvasのFontをコンポーネントと同じにする

    // インデックスの範囲が正しく,項目の文字列が全て表示していない場合はヒントを表示
    if (Index < Items.Count) and
       (Canvas.TextWidth(Items[Index]) > ClientWidth) then
    begin
      HintStr := Items[Index];          // ヒント文字列に項目の文字列を設定
      HintData := Font;                 // フォント情報をヒントに渡す
      CursorRect := ItemRect(Index);    // ヒント表示対象エリア(※)の設定
      HintPos.x := CursorRect.Left - 1; // ヒント表示場所の設定
      HintPos.y := CursorRect.Top - 3;
      HintPos := ClientToScreen(HintPos); // ヒント表示場所を画面座標に変換

      // ※ ヒント表示対象エリア  ・・・ このエリアからマウスが出た場合にヒントが表示し直され
      //      ます。これをヒント表示中の項目のエリアにしておくと、マウスが違う項目に
      //      移動すると移動先の項目のヒントが表示されます。
    end;
  end;
end;


{ TListBoxHintWindow }

// 実際にヒントを表示する場合に実行されるメソッド
procedure TListBoxHintWindow.ActivateHintData(Rect: TRect;
      const AHint: string; AData: Pointer);
begin
  // ヒントのフォントをコンポーネントと同じにする
  Canvas.Font.Assign(TFont(AData));

  // フォントの変更によりヒントウィンドウサイズの再設定が必要
  Rect.Right := Rect.Left + Canvas.TextWidth(AHint)+5;
  Rect.Bottom := Rect.Top + Canvas.TextHeight(AHint)+2;

  // 実際の描画はデフォルトのまま
  inherited ActivateHintData(Rect, AHint, AData)
end;

end.

                                                    SUNでした。

Original document by SUN          氏 ID:(RXK14115)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum