Форум: "WinAPI";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Внизредактирование 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c