Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.18;
Скачать: CL | DM;

Вниз

редактирование TreeNode.Text   Найти похожие ветки 

 
Bless   (2003-07-14 15:50) [0]

Всем привет.
Люди, помогитн разобраться, а то я уже запутался.
Пишу свой компонент, а в winApi - полный ноль.
Надо как-то реагировать на редактирование текста узла в компоненте TreeView, причем, как на редактирование из программы, так и пользователем.
В книжке по этому поводу написано:
"...Программа может дать пользователю возможность изменить текст элемента, послав этому элементу сообщение TVM_EDITLABEL. В этом случае родительское окно получает нотификационные сообщения TVN_BEGINLABELEDIT перед началом редактирования и TVM_ENDLABELEDIT после его окончания..."

TVN_BEGINLABELEDIT и TVM_ENDLABELEDIT, вероятно не подходят, потому что я же не знаю, кто будет родителем моего компонента. Или ка-то можно их использовать.
А если написать
MyTreeView=class(TCustomTreeView)
...
private
procedure EditReaction(var mes:TMessage);message TVM_EDITLABEL;
...
то в тело этой процедуры я не попадаю, сколько бы ни редактировал текст узлов. Почему???

В принципе работает вариант

MyTreeView=class(TCustomTreeView)
...
private
procedure EditReaction(var mes:TMessage);message TVM_SETITEM;

Но это сообщение(TVM_SETITEM) посылается не только тогда, когда изменен текст узла, но и когда узел выбран, получил фокус
и др. Как отфильтровать лишнее?


 
clickmaker ©   (2003-07-14 18:06) [1]

TVN_BEGINLABELEDIT/TVN_ENDLABELEDIT можно юзать. Прежде чем попасть родителю, они проходят через сам TreeView


 
Bless   (2003-07-15 09:17) [2]

А как их юзать?
Строка
procedure MyEdit(var mes:tMessage); message TVN_BEGINLABELEDIT;
приводит к ошибке
Illegal message method index



 
clickmaker ©   (2003-07-15 11:48) [3]

TVN_BEGINLABELEDIT это не сообщение. Это код извещения в WM_NOTIFY, поле code структуры NMHDR, передаваемой в LParam


 
Bless   (2003-07-15 14:20) [4]

>TVN_BEGINLABELEDIT это не сообщение. Это код извещения в
>WM_NOTIFY, поле code структуры NMHDR, передаваемой в LParam

Так как правильно писать?
А то следующий код
type
...
TMyTree=class (TCustomTreeView)
private
procedure TWM_Edit(var mes:tWMNotify); message WM_NOTIFY;
...
end.
...
procedure TMyTree.TWM_Edit(var mes:tWMNotify);
begin
if mes.NMHdr.code=TVN_BEGINLABELEDIT
then ShowMessage("begin");
if mes.NMHdr.code=TVN_ENDLABELEDIT
( "end") >TVN_BEGINLABELEDIT это не сообщение. Это код извещения в
>WM_NOTIFY, поле code структуры NMHDR, передаваемой в LParam

Так как правильно писать?
А то следующий код
type
...
TMyTree=class (TCustomTreeView)
private
procedure TWM_Edit(var mes:tWMNotify); message WM_NOTIFY;
...
end.
...
procedure TMyTree.TWM_Edit(var mes:tWMNotify);
begin
if mes.NMHdr.code=TVN_BEGINLABELEDIT
then ShowMessage("begin");
if mes.NMHdr.code=TVN_ENDLABELEDIT
then ShowMessage("end");
inherited;
end;

что-то не работает. И даже для родителя процедура с таким же текстом

TForm1.TWM_Edit(var mes:tWMNotify); message WM_NOTIFY;

не работает

:(


 
Юрий Зотов ©   (2003-07-15 14:37) [5]

А непосредственно в WndProc - работает?


 
Bless   (2003-07-15 15:15) [6]

>А непосредственно в WndProc - работает?

:) Об этом я даже не подумал.
Сейчас попробую.


 
Bless   (2003-07-15 15:44) [7]

Я, конечно, могу ошибаться, но вроде не работает. Какие-то WM_NOTIFY возникают(не проверял какие), если изменять текс узла во время выполнения мышкой и клавой, но если менять текс программно, то - ноль на массу. Или сказывается кривизна рук...


 
clickmaker ©   (2003-07-15 15:55) [8]

В MSDN: "Notifies a tree view control"s parent window about the start of label editing"

Т.е. отслеживается начало редактирования именно ручками, когда F2 жмешь, например. А ежели ты программно меняешь, то зачем тебе WM_NOTIFY? Ты и так можешь редактирование обработать


 
Bless   (2003-07-17 12:03) [9]

>...Ты и так можешь редактирование обработать

Каким образом?
Если редактирование где-то анутри методоа компонента, то конечно могу.
А если это редактирование где-то в обработчике событий моего компонента, написанное кем-то, то как мне эо редактирование обработать?

В общем, ответ я уже нашел сам.
Работает следующий вариант (причем, вроде бы корректно. То есть обрабатывает ТОЛЬКО ТО, что надо и вознивает ВСЕГДА, КОГДА НАДО, то бишь во время редактирования текста узла программно или пользователем).

type
MyMes=packed record
msg:Cardinal;
wParam:Longint;
lParam:^TTVItem;
result:longint;
end;
TMyTree=class (TCustomTreeView)
private
procedure WM_Edit(var mes:MyMes); message TVM_SETITEM;
...
end.
...
implementation
procedure TMyTree.WM_Edit(var mes:MyMes);
begin

if (Mes.lParam.mask AND TVIF_TEXT)<>0 then
( "YPA!!!!!!!!!") >...Ты и так можешь редактирование обработать

Каким образом?
Если редактирование где-то анутри методоа компонента, то конечно могу.
А если это редактирование где-то в обработчике событий моего компонента, написанное кем-то, то как мне эо редактирование обработать?

В общем, ответ я уже нашел сам.
Работает следующий вариант (причем, вроде бы корректно. То есть обрабатывает ТОЛЬКО ТО, что надо и вознивает ВСЕГДА, КОГДА НАДО, то бишь во время редактирования текста узла программно или пользователем).

type
MyMes=packed record
msg:Cardinal;
wParam:Longint;
lParam:^TTVItem;
result:longint;
end;
TMyTree=class (TCustomTreeView)
private
procedure WM_Edit(var mes:MyMes); message TVM_SETITEM;
...
end.
...
implementation
procedure TMyTree.WM_Edit(var mes:MyMes);
begin

if (Mes.lParam.mask AND TVIF_TEXT)<>0 then
showMessage("YPA!!!!!!!!!");
inherited;
end;

P.S.
Первое знакомство с Win API состоялось.
В результате - больше вопросов, чем ответов :)


 
Bless   (2003-07-17 12:24) [10]

Кстати, вводить собственную структуру необязательно.
Работает и такой вариант:
TMyTree=class (TCustomTreeView)
private
procedure WM_Edit(var mes:TMessage); message TVM_SETITEM;
...
end.
...
implementation
procedure TMyTree.WM_Edit(var mes:MyMes);
begin
if (TTVItem(pointer(Mes.lParam)^).mask AND TVIF_TEXT)<>0 then
showMessage("YPA!!!!!!!!!");
inherited;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.09.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
7-58925
ctapik
2003-07-07 20:03
2003.09.18
Как остановить работу с ком портом?


1-58726
Xtz
2003-09-07 21:01
2003.09.18
Как использывать таймер в консольном приложении и без QExtCtrls


14-58859
Карлсон
2003-08-30 21:17
2003.09.18
Глюк форума или моего софта?


14-58918
Digitman
2003-08-28 15:21
2003.09.18
Небольшой вопрос по спецификации ANSI C++


3-58593
fool
2003-08-26 17:00
2003.09.18
LookUp поле в ADODataSet