比如TreeView显示了几个目录
My music
Video
当鼠标放在My music提示“这是歌曲"
当鼠标放在Video提示“这是视频"意思是,如果鼠标节点等于“My music”就提示这是歌曲要如何写? 懂的给个示列,感谢!

解决方案 »

  1.   


    procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      MyHitTest : THitTests;
      tr:TTreeNode;
    begin
      tr:=self.TreeView1.GetNodeAt(x,y);
      if tr<>nil then
      begin
        self.TreeView1.ShowHint:=True;
        if tr.Text='My Music' then
          self.TreeView1.Hint:='这是歌曲';
        if tr.Text='Video' then
          self.TreeView1.Hint:='这是视频';
      end;
    end;
      

  2.   

    这样效果更明显一些procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      MyHitTest : THitTests;
      tr:TTreeNode;
    begin
      tr:=self.TreeView1.GetNodeAt(x,y);
      if tr<>nil then
      begin
        self.TreeView1.Refresh;
        self.TreeView1.ShowHint:=True;
        if tr.Text='My Music' then
          self.Label8.Caption:='这是歌曲';
        if tr.Text='Video' then
          self.Label8.Caption:='这是视频';
        tr.Focused:=True;
      end;
    end;
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        procedure TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      tr:TTreeNode;
    begin
      tr:= self.TreeView1.GetNodeAt(x,y);
      if tr = nil then exit;
      if tr.Data = nil then exit;
      self.TreeView1.Hint:= String(Pointer(tr.Data)^)
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      rootNode,node: TTreeNode;
      s: ^string;
    begin
      self.TreeView1.ShowHint:= true;
      rootNode:= self.TreeView1.Items.Add(nil,'root');
      node:= self.TreeView1.Items.AddChild(rootNode,'My Music');
      new(s);
      s^:= '这是歌曲';
      node.Data:= TObject(s);
      node:= self.TreeView1.Items.AddChild(rootNode,'Video');
      new(s);
      s^:= '这是视频';
      node.Data:= TObject(s);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      //处理 释放 node.Data
    end;end.
      

  4.   

    上面的方法都有一点小问题,就是hint不能即时刷新,这个问题如何解决呢
      

  5.   

    都不知道ApplicationEvents里有个OnShowHint事件可以很容易处理这件事么?
      

  6.   

    按Seamour 的方法可以实现效果,其实不是大家不知道OnShowHint事件,而是想找一个比较直观的操作来实现这个功能
    随便写了一个,有不妥或者罗嗦的地,也请大家见谅了
    定义一个事件
    procedure MyHint(var HintStr: string; var CanShow: Boolean;var HintInfo: THintInfo);procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnShowHint := MyHint;
    end;procedure TForm1.MyHint(var HintStr: string; var CanShow: Boolean;
      var HintInfo: THintInfo);
    var
      p:TPoint;
    begin
      CanShow := True;
      HintInfo.ReshowTimeout := 100;//这个值,可以自己修改
      if HintInfo.HintControl = TreeView1 then
      begin
        node := TTreeView(HintInfo.HintControl).GetNodeAt(HintInfo.CursorPos.X,HintInfo.CursorPos.Y);
        if node = nil then Exit;
        if node.Text = 'My music' then
          HintStr := '这是歌曲'
        else if node.Text = 'Video' then
          HintStr := '这是视频';
      end;
    end;
      

  7.   

    下面是我写的模仿msn的效果,就是鼠标移动到头像上面时,就立马提示相关信息,你可以更改里面的提示为你的提示,当然需要增加判断,我的这种效果绝对满足你的需要了。
    当然下面的代码是我抠出来的一部分,你需要修改的。//鼠标移动上去,更换头像图标,改变鼠标手势
    //移走后恢复原头像图标,恢复鼠标手势
    procedure TForm1.dataMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      xTreeNode:TTreeNode;  HintRect: TRect;
      pt: TPoint;
    begin
      GetCursorPos(pt);
      xTreeNode := TTreeView(Sender).GetNodeAt(X,Y);
      if not Assigned(xTreeNode) then
      begin
        Timer1.Enabled :=True;
        Exit;
      end;  
      if xTreeNode.HasChildren then Exit;  if htOnIcon in TTreeView(Sender).GetHitTestInfoAt(X,Y) then
      begin
        Screen.Cursor := crHandPoint; 
        //========================================================================//
        if (not onlyOnce) then //不同
        begin
          onlyOnce :=True;//初始化
          k:= xTreeNode.ImageIndex;
          Memo2.Lines.Add(oldText+'//old==>//'+xTreeNode.Text+'//k==>'+inttostr(k));
          //**********************************************************************//
          oldText:=xTreeNode.Text;
          oldTreeNode:=xTreeNode;
          //Memo3.Lines.Clear;
          Memo3.Lines.Add(xTreeNode.Text);
          //**********************************************************************//
          Hint := '查看此人的联系人卡片';//提示信息
        end
        else
        begin
          if oldText <> xTreeNode.Text then
          begin
            //Memo4.Lines.Clear;
            Memo4.Lines.Add(IntToStr(oldTreeNode.ImageIndex)+'==>变换成==>'+IntToStr(k));        data.Items.BeginUpdate;
            if oldTreeNode.Selected then
              oldTreeNode.SelectedIndex:=k
            else
              oldTreeNode.ImageIndex:=k;
            data.Items.EndUpdate;        onlyOnce:=False;
            oldText:=xTreeNode.Text;
            oldTreeNode:=xTreeNode;
            k:= xTreeNode.ImageIndex;
            CurrentHintWindow.ReleaseHandle;
          end
          else
          begin
            if (xTreeNode.ImageIndex=4) or (xTreeNode.SelectedIndex= 4) then //已经变换,则不重复刷新
              Exit;
            data.Items.BeginUpdate;
            if xTreeNode.Selected then  //更改选中节点图标,没有此句,则选中节点图标不变
              xTreeNode.SelectedIndex:= 4
            else
            xTreeNode.ImageIndex:=4;//k+3;
            data.Items.EndUpdate;        //Memo1.Lines.Clear;
            Memo1.Lines.Add(IntToStr(xTreeNode.ImageIndex));        LastMouse.X := pt.X;
            LastMouse.Y := pt.Y+20;
            HintRect := CurrentHintWindow.CalcHintRect(Screen.Width, Hint, nil);
            CurrentHintWindow.ActivateHint(Rect(LastMouse.X, LastMouse.Y, LastMouse.X+HintRect.Right, HintRect.Bottom+LastMouse.Y), Hint);
          end;
        end; 
        //========================================================================//
      end
      else  //鼠标移开
      begin
        if (htOnItem in TTreeView(Sender).GetHitTestInfoAt(X,Y)) and (not IsPrompt) then
        begin
          Hint := xTreeNode.Text + #13 +
                 '右键单击以查看您可以与此人进行交流的方式。';//提示信息
          LastMouse.X := pt.X+10;
          LastMouse.Y := pt.Y+20;
          HintRect := CurrentHintWindow.CalcHintRect(200, Hint, nil);
          CurrentHintWindow.ActivateHint(Rect(LastMouse.X, LastMouse.Y, LastMouse.X+HintRect.Right, HintRect.Bottom+LastMouse.Y), Hint);
        end
        else
          CurrentHintWindow.ReleaseHandle;
        //========================================================================//
        if onlyOnce then //有初始化,才执行,否则保持不变
        begin
          //Memo4.Lines.Clear;
          Memo4.Lines.Add(IntToStr(oldTreeNode.ImageIndex)+'==>变换成==>'+IntToStr(k));      data.Items.BeginUpdate;
          if oldTreeNode.Selected then
            oldTreeNode.SelectedIndex:=k
          else
            oldTreeNode.ImageIndex:=k;
          data.Items.EndUpdate;      onlyOnce:=False;
          Screen.Cursor := crDefault;
          CurrentHintWindow.ReleaseHandle;
        end;
        //========================================================================//
        Timer1.Enabled :=True;
      end;
    end;
      

  8.   


      OnMouseMove事件:主体内容如下    if  (Node.Text ='My music')  then  //Level 展开的层数
           begin
               fcDBTreeView2.Hint:='这是歌曲';
               fcDBTreeView2.ShowHint:=true;
           end
        else
        if   (Node.Text ='Video')  then  //Level 展开的层数
           begin
               fcDBTreeView2.Hint:='这是视频';
               fcDBTreeView2.ShowHint:=true; 
           end
        else
               fcDBTreeView2.ShowHint:=false;