Как обрабатывать ссылки на имена таблиц Synedit? - PullRequest
0 голосов
/ 06 мая 2018

Я работаю над редактором Sql, используя TSynEdit в Delphi. У меня есть имена объектов (таблицы, хранимые процедуры, домены и т. Д.) В именах таблиц маркера и автозаполнения, они отображаются синим цветом и подчеркнуты, что я и хотел, но мне интересно, могу ли я связать их с событием, когда я действительно могу открыть этот объект.

Есть ли способ

a) Изменить курсор на handPoint, когда указатель мыши находится над таким ключевым словом?

б) Выполнить событие, процедуру, функцию при нажатии на такое ключевое слово?

Спасибо за любой совет.

enter image description here

1 Ответ

0 голосов
/ 06 мая 2018

Для получения информации о маркере с указанием мыши вы можете написать, например, вспомогательные методы, подобные этому:

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;

Мне не удалось найти собственный способ для этой функции.

...