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

Вниз

ListView и редактирование InPlace   Найти похожие ветки 

 
Андрей Молчанов   (2005-11-07 22:24) [0]

Использую ListView со свойством ReadOnly = False. В программе используются горячие клавиши Del и Enter, перед редактированием их надо отключать, а после - включать. Выключаю по событию OnEditing, а вот когда включать? Событие OnEdited вызывается только если данные были изменены. Как бороться?


 
gdaujk ©   (2005-11-08 06:23) [1]

OnExit


 
begin...end ©   (2005-11-08 08:49) [2]

> Андрей Молчанов   (07.11.05 22:24)
> Событие OnEdited вызывается только если данные были изменены.

Верно. По окончании редактирования генерируется уведомление LVN_ENDLABELEDIT. Оно содержит указатель на запись NMLVDISPINFO (это комбинация структур NMHDR и LVITEM), в котором находится информация об этом событии. Читаем в MSDN про LVN_ENDLABELEDIT:

If the user cancels editing, the pszText member of the LVITEM structure is NULL; otherwise, pszText is the address of the edited text.

Теперь смотрим в реализацию TCustomListView.CNNotify:

with Message do
   case NMHdr^.code of
     ...
     LVN_ENDLABELEDIT:
       with PLVDispInfo(NMHdr)^ do
         if (item.pszText <> nil) and (item.IItem <> -1) then
           Edit(item);
     ...


Т.е. если item.pszText = nil (а это означает, что пользователь отменил редактирование), до метода Edit дело не доходит (а именно в нём вызывается обработчик OnEdited). Поэтому события OnEdited и не происходит.

Вывод -- можно самостоятельно, без введения ограничений на содержимое item.pszText, обрабатывать уведомление LVN_ENDLABELEDIT (оно посылается в форме сообщения WM_NOTIFY родительскому окну ListView"а). Например, если parent"ом ListView"у приходится форма, то можно написать такой её обработчик:

uses CommCtrl;

type
 TMyForm = class(TForm)
   MyListView: TListView;
 private
   procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
 end;

procedure TMyForm.WMNotify(var Message: TWMNotify);
begin
 with Message.NMHdr^ do
   if (hwndFrom = MyListView.Handle) and (code = LVN_ENDLABELEDIT) then
   begin
     // Ваши действия
   end
   else
     inherited
end


 
Андрей Молчанов   (2005-11-08 18:16) [3]

begin...end, большое спасибо тебе! Наверное, напишу потомка TListView.



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

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

Наверх




Память: 0.47 MB
Время: 0.052 c
1-1131584384
Dementiy
2005-11-10 03:59
2005.12.04
Browse For Folder Dialog


2-1132221469
IAMDANIL
2005-11-17 12:57
2005.12.04
DEBUG


14-1131999808
x.pro
2005-11-14 23:23
2005.12.04
А чем Linux так хорош?


3-1129654773
mmms
2005-10-18 20:59
2005.12.04
Проектирование БД под репликацию


4-1128067443
XGarik
2005-09-30 12:04
2005.12.04
Ошибка API ф-ии библиотеки RAPI.DLL?