Возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc
unit BetterTreeView;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, CommCtrl;
type
TTVNewEditCancelEvent = procedure( Sender: TObject; Node: TTreeNode; var Delete: Boolean) ofobject;
TBetterTreeView = class(TTreeView)
protected
FIsEditingNew: Boolean;
FOnEditCancel: TTVChangedEvent;
FOnNewEditCancel: TTVNewEditCancelEvent;
procedure Edit(const Item: TTVItem); override;
publicfunction NewChildAndEdit(Node: TTreeNode; const S: string): TTreeNode;
publishedproperty IsEditingNew: Boolean read FIsEditingNew;
property OnEditCancel: TTVChangedEvent read FOnEditCancel write FOnEditCancel;
property OnNewEditCancel: TTVNewEditCancelEvent read FOnNewEditCancel write FOnNewEditCancel;
end;
implementationprocedure TBetterTreeView.Edit(const Item: TTVItem);
var
Node: TTreeNode;
Action: Boolean;
beginwith Item dobegin{ Get the node }if (state and TVIF_PARAM) <> 0 then
Node := Pointer(lParam)
else
Node := Items.GetNode(hItem);
if pszText = nilthenbeginif FIsEditingNew thenbegin
Action := True;
if Assigned(FOnNewEditCancel) then
FOnNewEditCancel(Self, Node, Action);
if Action then
Node.Destroy
endelseif Assigned(FOnEditCancel) then
FOnEditCancel(Self, Node);
endelseinherited;
end;
FIsEditingNew := False;
end;
function TBetterTreeView.NewChildAndEdit(Node: TTreeNode; const S: string): TTreeNode;
begin
SetFocus;
Result := Items.AddChild(Node, S);
FIsEditingNew := True;
Node.Expand(False);
Result.EditText;
SetFocus;
end;
end.
Код, который вы предоставили, - это кастомное реализация компонента TTreeView в Delphi с дополнительной функцией отмены вставки нового узла при нажатии клавиши Esc при редактировании.
Вот подробный анализ того, что код делает:
TTVNewEditCancelEvent объявляется как процедура, принимающая три параметра: Sender, Node и var Delete. Это событие будет вызвано, когда пользователь пытается отменить вставку нового узла.
Класс TBetterTreeView наследуется от TTreeView и добавляет два дополнительных свойства: IsEditingNew и OnNewEditCancel.
Метод Edit переопределяется для проверки, является ли пользователь вставкой нового узла (т.е., FIsEditingNew истинно). Если да, то он проверяет, хочет ли пользователь отменить вставку, нажав на Esc. Если да, то он вызывает событие OnNewEditCancel и устанавливает Action в true, что уничтожит узел, если не будет отменено.
Метод NewChildAndEdit добавляет новый дочерний узел к указанному родительскому узлу (Node) с данным строковым значением (S). Он также устанавливает FIsEditingNew в true.
Чтобы реализовать отмену нажатия клавиши Esc, вы можете добавить обработчик события OnKeydown для контрола tree view. В этом обработчике проверьте, является ли нажатая клавиша клавишей Esc (код клавиши 27). Если да, то вызовите метод CancelEdit контрола tree view, чтобы отменить операцию редактирования.
В этом примере TreeView1 - это имя вашего кастомного компонента TBetterTreeView. Вы можете заменить его на фактическое имя вашего контрола tree view.
Обратите внимание, что для реализации этой функции вам нужно добавить обработчик события OnKeydown и модифицировать метод Edit, как описано выше.
В статье описана возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc, реализованная с помощью класса TBetterTreeView и событий OnEditCancel и OnNewEditCancel.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.