Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-58909
Vini
2003-08-29 10:28
2003.09.18
TrayIcon


7-58923
e_a
2003-07-07 20:07
2003.09.18
контроллеры


7-58950
Deus
2003-07-02 14:13
2003.09.18
Как запустить ярлык (.lnk)??


1-58717
McSimm2
2003-09-08 08:58
2003.09.18
TreeViewCreateNodeClass не могу объявить


3-58547
kedis
2003-08-28 08:14
2003.09.18
Как создать dbf IV а не dbf for Windows???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский