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

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

Работа с TTreeView [D7, XP]


Viod ©   (2008-07-30 07:43:00) 

Пытаюсь реализовать создание нового узла в дереве.
Смысл такой: пользователь из контекстного меню выбирает "создать" и в нужной ветке появляется новый узел, при этом узел выделяется для редактирования его заголовка.

node:=TreeView1.Items.AddChild(parent_node,'');
parent_node.Expanded:=true;
node.EditText;

Дальше должен выполняться код записи в базу данных для которого нужен node.text. На деле получается что если после метода node.EditText идут другие операторы, то редактирование прекращается и node.text остается ==''.  
Как обработать ввод пользователем. Нужно чтобы код не выполнялся дальше, пока не закончится редактирование


Viod   (2008-07-31 12:21:00) [1]

MsGuns, не нужно ничего лишнего. Нужно просто понять ввел юзер то что хотел или ввел что-то и передумав ажал escape :)


Viod   (2008-07-31 12:16:00) [2]

Vlad Oshin, со всем вышеперечисленным не работает..  Такое решение естественно сразу в голову пришло. Если бы работало - не спрашивал бы


Viod   (2008-07-31 12:15:00) [3]

MsGuns, это здорово, но как это делать?


MsGuns   (2008-07-31 10:25:00) [4]

ИМХО, сабж существенно проще решается с помощью "виртуальной" панельки, отрисовываемой в прямоугольнике ноды. На панельке можно расположить не только эдит, куда вводится текст ноды, но и другие контролы, камбобоксы, чекбоксы, кнопки и т.д. Т.е. можно вводить даже те поля объекта, которые непосредственно в дереве не отображаются. И события проще контролировать  - в частности нельзя будет "спрыгнуть" с панельки. не закончив редактирование.


Vlad Oshin   (2008-07-31 09:41:00) [5]

работает..

procedure TForm1.TreeView1KeyPress(Sender: TObject; var Key: Char);
begin
 caption:=  caption+Key;
end;


Viod   (2008-07-31 08:37:00) [6]

не работает. Как только создается окно ввода, ну в смысле ячейка для ввода заголовка узла - все управление передается куда-то... OnKey*** не срабатывает ни на TreeView ни на Form


KilkennyCat   (2008-07-30 13:09:00) [7]

Реально. Если написать обработку кода клавиши в событии OnKeyDown или на щелкание мышки.


Viod   (2008-07-30 10:59:00) [8]

А реально отследить какой клавишой был закончен ввод. В частности Escape или Enter или мышкой куда-то щелкнули


Viod   (2008-07-30 09:51:00) [9]

Спасибо, Юрий. Реально работает.
Сначала сам пробовал так же, только не было Node.Selected:=true;
Может ошибаюсь, но помоему в таком случае isEditing сразу после EditText возвращает false


Юрий Зотов   (2008-07-30 08:49:00) [10]

А вот так - НЕ будет подгружать CPU:

while TreeView1.IsEditing do
begin
 Application.ProcessMessages;
 Sleep(1)
end;


Юрий Зотов   (2008-07-30 08:39:00) [11]


procedure TForm1.Button1Click(Sender: TObject);
var
 Node: TTreeNode;
begin
 Caption := 'Start';
 if TreeView1.Items.Count <> 0 then
 begin
   Node := TreeView1.Selected;
   if Node = nil then
     Exit;
   Node := TreeView1.Items.AddChild(Node, '');
   Node.Parent.Expand(False);
 end
 else
   Node := TreeView1.Items.AddFirst(nil, '');
 Node.Selected := True;
 TreeView1.SetFocus; // Иначе по клавише Enter снова сработает Button1
 Node.EditText;
 
 while TreeView1.IsEditing do
   Application.ProcessMessages; // Самое простое, но будет подгружать CPU

 Caption := 'Finish'
end;


Наверх

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