2016-07-03 7 views
0

Я пытаюсь найти универсальное ** решение для расширения встроенного Treeview/TreeNode с помощью некоторых функций, таких как подсказки для узла. Поэтому сначала я получил TExtendedTreeNode = class(TTreeNode) и добавил соответствующее свойство, которое, кажется, работает нормально - я могу добавить TExtendedTreeNodes с разными подсказками для каждого узла.Lazarus (Delphi/FPC): конструктор в вспомогательном классе не выполнен

Для следующего шага я хочу использовать событие TTreeView.OnMouseMove, чтобы показать соответствующую подсказку, но каково наилучшее решение для расширения этой функциональности универсальным ** способом?

Моя идея состояла в том, чтобы использовать class helper for TTreeView:

type 
    TTreeViewExtension = class helper for TTreeView 
    private 
    procedure ShowNodeToolTips(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    public 
    constructor Create(AnOwner: TComponent); 
    end; 

...

constructor TTreeViewExtension.Create(AnOwner: TComponent); 

begin 
    inherited Create(AnOwner); 

    ShowMessage('TTreeViewExtension.Create'); 

    self.OnMouseMove := @self.ShowNodeToolTips; 
end; 

код компилируется без предупреждений или ошибок, но этот конструктор не выполняется на создание treeview в моей форме.

И да, я использую advancedrecords в objfpc mode в обоих, моя единичная форма и мой блок расширения - для того, чтобы использовать вспомогательный класс:

{$mode objfpc}{$H+} 
{$modeswitch advancedrecords+} 

** «универсальный» означает, что я хочу использовать интегрированные элементы управления из моей Lazarus IDE, по крайней мере, для элемента управления TreeView, но используйте расширенную функциональность, не записывая код дважды.

+1

Создайте потомка TTreeView и переопределите его защищенный метод 'procedure MouseMove (Shift: TShiftState; X, Y: Integer); override; ' – Abelisto

+0

Yup, не злоупотребляйте строками барокко, такими как помощники класса, если это можно сделать вперёд. Я не уверен, что помощники класса позволяют в любом случае переопределять методы. Классовые помощники - это костыль, а не швейцарская армия. –

+0

@Marco: Я не знаю о FPC, но в Delphi помощники класса не могут переопределить виртуальные или динамические методы по понятным причинам. И действительно, это костыль, изначально предназначенный для того, чтобы сделать TObject и некоторые другие классы совместимыми с соответствующими классами C#. Они используются больше, но они остаются костылем. –

ответ

2

Почему бы вам не использовать уже имеющееся событие OnHint, чтобы показать эти всплывающие подсказки. Событие TTreeView.OnHint уже возвращает вам ссылку на узел дерева, который находится под курсором мыши, поэтому у вас не должно возникнуть проблемы с чтением пользовательских подсказок (подсказок) из узла.

Если подсказки могут отображаться в одной строке текста, вы можете просто изменить значение переменной Hint, которое отображается в этом методе.

Вы можете легко прочитать такое значение из своего Extended TreeNode, указав переменную Node, возвращаемую методом события, на ваш класс TExtendedTreeNode. Не забудьте проверить, действительно ли рассматриваемый узел действительно относится к классу.

procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode; 
    var Hint: string); 
begin 
    //Check to see if the node beneath the cursor is the extended node 
    if Node is TExtendedTreeNode then 
    //if it is change the hint text to the custom hint stored in the 
    //node itself 
    Hint := TExtendedTreeNode(Node).CustomHint 
    //Else change the hint to empty string so no hintbox will be shown 
    else Hint := ''; 
end; 

И если вы не хотите какой-либо текст намек будет показано и показать вашу информацию другим способом вы просто установите значение в пустую строку Hint.

procedure TForm1.TreeView1Hint(Sender: TObject; const Node: TTreeNode; 
    var Hint: string); 
begin 
    //Set Hint to empty string in order to not show any hint box 
    Hint := ''; 
    //Do some other code instead if you like 
    MessageBeep(0); 
end; 
+0

Спасибо за совет, но это не решает мой основной вопрос об интеграции его во все существующие и будущие TreeViews, созданные дизайнером форм IDE в моем приложении, без написания дополнительного кода. Хорошо, возможно, я не объяснил это безошибочно - мой английский не самый лучший. –

+0

В этом случае я считаю, что лучшим решением будет также расширить компонент TTreeView с дополнительным кодом и заменить все существующие компоненты TTreeView на расширенный. – SilverWarior

+0

Похоже, у Lazarus нет события TTreeview.OnHint - я думаю, он был создан в новых версиях Delphi, и Lazarus поддержит его в более позднем выпуске ... Там только событие TTreeview..OnShowHint - это лучше, чем MouseMove, потому что это только когда требуется новый подсказку, но я должен определить текущий узел так же, как указано выше. Я просто вхожу в разработку компонента IDE, который можно зарегистрировать как визуальный элемент управления в дизайнере форм. Теперь я знаю, что это по крайней мере возможно, и это действительно лучшее решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^