如何处理Synedit表名上的链接?

时间:2018-05-06 05:53:57

标签: delphi synedit

我正在使用Delphi中的TSynEdit编写Sql编辑器。 我在荧光笔和自动填充的表名中有我的对象名称(表格,存储过程,域等),它们以蓝色和下划线显示这是我想要的但我想知道我是否可以将这些链接到一个事件我实际上可以打开那个对象。

有没有办法

a)当鼠标悬停在关键字上时,将光标更改为handPoint?

b)点击这样的关键词时执行一个事件,程序,功能?

感谢您的任何建议。

enter image description here

1 个答案:

答案 0 :(得分:6)

要获取鼠标指向的令牌信息,您可以编写例如像这样的辅助方法:

type
  TSynEditHelper = class helper for TSynEdit
  public
    function GetTokenInfo(const CursorPos: TPoint; out TokenType: Integer; out TokenText: UnicodeString): Boolean; overload;
    function GetTokenInfo(const LineCharPos: TBufferCoord; out TokenType: Integer; out TokenText: UnicodeString): Boolean; overload;
  end;

{ TSynEditHelper }

function TSynEditHelper.GetTokenInfo(const CursorPos: TPoint; out TokenType: Integer; out TokenText: UnicodeString): Boolean;
begin
  Result := GetTokenInfo(DisplayToBufferPos(PixelsToRowColumn(CursorPos.X, CursorPos.Y)), TokenType, TokenText);
end;

function TSynEditHelper.GetTokenInfo(const LineCharPos: TBufferCoord; out TokenType: Integer; out TokenText: UnicodeString): Boolean;
var
  I: Integer;
  A: TSynHighlighterAttributes;
begin
  Result := GetHighlighterAttriAtRowColEx(LineCharPos, TokenText, TokenType, I, A);
end;

OnMouseCursor 中使用它们来设置光标,并使用 OnClick 进行关键字导航:

procedure TForm1.SynEdit1Click(Sender: TObject);
var
  TokenType: Integer;
  TokenText: UnicodeString;
begin
  if TSynEdit(Sender).GetTokenInfo(TSynEdit(Sender).ScreenToClient(Mouse.CursorPos), TokenType, TokenText) and
    (TokenType = Ord(tkTableName)) then
  begin
    ShowMessage(Format('Table token clicked: %s', [TokenText]));
  end;
end;

procedure TForm1.SynEdit1MouseCursor(Sender: TObject; const ALineCharPos: TBufferCoord; var ACursor: TCursor);
var
  TokenType: Integer;
  TokenText: UnicodeString;
begin
  if TSynEdit(Sender).GetTokenInfo(ALineCharPos, TokenType, TokenText) and (TokenType = Ord(tkTableName)) then
    ACursor := crHandPoint;
end;

我无法找到此功能的原生方式。