Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Редактирование TreeView [D6]


Шурик Ш ©   (2002-09-09 15:34:00) 

Подскажите, пожалуйста, как отловить событие отмены редактирования названия узла TreeView, когда это самое название не было изменено?


Рыжик   (2002-09-09 16:59:00) [1]

Ещё вот это надо:
procedure TForm1.TreeView1Exit(Sender: TObject);
begin
if (TreeView1.Tag=1) then
begin
TreeView1.items.Delete(TreeView1.Selected);
TreeView1.Tag:=0;
end;
end;

procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
TreeView1.Repaint;
end;


Св-во Tag устанавливается при начале редактирования в 1. При отмене или завершении редактирования ставится в 0. Можно использовать какую-нибудь глобальную переменную.
CustomDraw происходит при перерисовывании Items-ов. Проверяем, начали ли редактирование (TreeView1.Tag=1) и чтобы не зацикливалось (cdsFocused in state) и удаляем.
Ещё сброс редактирования может происходить при выходе фокуса из TreeView, поэтому нужна проверка на OnExit.
Вроде работает, но наверно есть способ и по лучше. Это первое, что пришло в голову


Шурик Ш   (2002-09-09 16:47:00) [2]

Побоюсь показаться назойливым, но
1) Что значит свойство Tag;
2) И как этот код вообще работает?


Рыжик   (2002-09-09 16:38:00) [3]

Ещё наверное на OnExit надо поставить такую же проверку


Шурик Ш   (2002-09-09 16:34:00) [4]

Минуточку... Я сейчас переварю.


Рыжик   (2002-09-09 16:31:00) [5]

procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: String);
begin
TreeView1.Tag:=0;
end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (TreeView1.Tag=1) and (cdsFocused in state) then
begin
TTreeView(Sender).items.Delete(Node);
TreeView1.Tag:=0;
DefaultDraw:=false;
end;
end;

procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
begin
TreeView1.Tag:=1;
end;




Шурик Ш   (2002-09-09 16:29:00) [6]

Не понимаю.


MBo   (2002-09-09 16:07:00) [7]

Если для OnEditing нет парного OnEdited, то ...


Шурик Ш   (2002-09-09 15:48:00) [8]

Проблема в том, что если сразу после начала редактирования нажать Esc, то событие OnEdited вообще обрабатываться не будет.
Для ясности приведу задачу, которую мне необходимо решить:
В TreeView по контекстному меню создается подчиненный узел с названием "Новая группа" и сразу предоставляет себя для редактирования. Если пользователь изменяет его название, то узел остается, а если нет - удаляется. При изменении названия действительно обрабатывается OnEdited, а при нажатии на Esc - нет.


Шурик Ш   (2002-09-09 15:39:00) [9]

Ясно.


MBo   (2002-09-09 15:38:00) [10]

в OnEditing запоминай, в OnEdited сравнивай


Наверх

Титульная страница Поиск, карта сайта Написать письмо