Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Задержка выполнения события вплоть до наступления следующего  (Прочитано 31886 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 12-04-2008 12:02 » 

Доброе время суток. Принялся за решение задачи получения хендла ключа, имя которого выбрано на данный момент в дереве. Всё ок, только возникла проблема в своевременности реакции.

Описываю процесс: Раскрываем один из ключей(например HKEY_USER). Кликаем на ключ .DEFAULT и не имеем никакой визуальной реакции, хотя уже сейчас мне хотелось бы иметь хендл этого ключа. При повторном клике на какую-либо строку из дерева с именем главного ключа или подключа, уже появляется окно с выбранным до этого ключа(в нашем случае .DEFAULT) и т.д. при нажатие на следующую строку.
в общем реакция запаздывания  Здесь была моя ладья...

Вот код :

Код:
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
        {
        case NM_CLICK:
            {
                if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
                {
                  tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView);
tvTempItem.mask=TVIF_TEXT;
tvTempItem.cchTextMax=256;
tvTempItem.pszText=SelectedTVIName;
TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem);
// SelectedTVIName - буфер с именем ключа
Get_KeyHandle(SelectedTVIName);
                }
    break;
}

void Get_KeyHandle(char*KeyName)
{
HKEY Temp=NULL;
for(int i=0,u=0;i<6 && !u;i++)
{
RegOpenKeyEx(hTopKeys[i],KeyName,NULL,KEY_ALL_ACCESS,&Temp);
if(Temp!=NULL)
{
MessageBox(NULL,KeyName,KeyName,0);
u=1;
}
}
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-04-2008 12:15 » 

хм, больше похоже на поведение вроде WM_KILLFOCUS для элемента
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 12-04-2008 18:06 » 

Дело в том, что данные выбранного ключа мне надо отображать в правом ListView. Need help  Здесь была моя ладья...

Вплоть до функции RegOpenKeyEx окно выскакивает при первом же событии(клике), но сразу после него окно выскакивает только в при след. наступлении

Использование

Код:
LONG WINAPI RegOpenKey(
  __in      HKEY hKey,
  __in_opt  LPCTSTR lpSubKey,
  __out     PHKEY phkResult
);


не сказалось на работе приложения
« Последнее редактирование: 12-04-2008 18:19 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 12-04-2008 18:20 » 

а может не перерисовывается просто ? Отправь окну WM_PAINT
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 12-04-2008 18:26 » 

а может не перерисовывается просто ? Отправь окну WM_PAINT
Код:
void Get_KeyHandle(char*KeyName,HWND hWnd)
{
HKEY Temp=NULL;
for(int i=0,u=0;i<6 && !u;i++)
{
if(RegOpenKey(hTopKeys[i],KeyName,&Temp)==ERROR_SUCCESS)
{
if(Temp!=NULL)
{
MessageBox(NULL,KeyName,KeyName,0);
SendMessage(hWnd,WM_PAINT,NULL,NULL);
u=1;
}
RegCloseKey(Temp);
}
}
}
Я правильно понял? не работает

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 12-04-2008 18:31 » 

FallenSoul, нет, не правильно (хотя порядок выполнения и верный, но лучше так: )

Код:
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
        {
        case NM_CLICK:
            {
                if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
                {
                  tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView);
tvTempItem.mask=TVIF_TEXT;
tvTempItem.cchTextMax=256;
tvTempItem.pszText=SelectedTVIName;
TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem);
// SelectedTVIName - буфер с именем ключа
Get_KeyHandle(SelectedTVIName);

PostMessage(hWnd,WM_PAINT,NULL,NULL);

                }
    break;
}

Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 12-04-2008 18:34 » 

Не работает =\
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 12-04-2008 18:39 » 

Код:
[code]Выяснилось что задержка появляется ещё до функции Get_KeyHandle с получением имени в переменную SelectedTVIName на этом этапе

[code]
    tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView);
tvTempItem.mask=TVIF_TEXT;
tvTempItem.cchTextMax=256;
tvTempItem.pszText=SelectedTVIName;
TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem);

2
При первом клике выдаёт FALSE

Код:
if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE)
MessageBox(NULL,"TRUE","TRUE",0);
[/code][/code]
« Последнее редактирование: 12-04-2008 18:54 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 12-04-2008 18:54 » 

FallenSoul, а что у тебя со скобками блоков ? Улыбаюсь У тебя

Код:
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
        {
        case NM_CLICK:
            {
                if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
                {
...
                }
      break;
            }


а для свича где парная скобка ?

-------------------

не понимаю, что значит - задержка ? Ты ждёшь, а через 10 секунд - оно вдруг появляется ? Или не появится ?
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 12-04-2008 18:56 » 

Задержка, это значит что только при повторном клике на той же строке дерева или уже на другой выдаётся окно с именем предыдущей записи
Код:
	switch(uMsg)
{
          case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case NM_CUSTOMDRAW:
{
if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
{
if(rTree1.right<rMainClient1.right/2)
{

}
else
{

}
}
break;
}
case NM_CLICK:
{
if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
{

}
break;
}

case TTN_NEEDTEXT:
{

}
}

default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
« Последнее редактирование: 12-04-2008 18:58 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 12-04-2008 18:56 » 

FallenSoul, блин, извини меня, я ступил

PostMessage(hWnd,WM_PAINT,NULL,NULL);

 - надо не hWnd, конечно же, а хендл твоего ListView
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 12-04-2008 18:57 » 

FallenSoul, это не задержка, а отсутствие синхронизации называется Улыбаюсь
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 12-04-2008 19:00 » 

FallenSoul, блин, извини меня, я ступил

PostMessage(hWnd,WM_PAINT,NULL,NULL);

 - надо не hWnd, конечно же, а хендл твоего ListView
Да вопрос уже несколько в другом.
Код:
				case NM_CLICK:
{
if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW)
{
    tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView);
tvTempItem.mask=TVIF_TEXT;
tvTempItem.cchTextMax=256;
tvTempItem.pszText=SelectedTVIName;
if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE)
MessageBox(NULL,"TRUE","TRUE",0);
// SelectedTVIName
MessageBox(NULL,SelectedTVIName,SelectedTVIName,0);
Get_KeyHandle(SelectedTVIName);
// PostMessage(hWnd,WM_PAINT,NULL,NULL);
}
break;
}
При первом клике на записи окно TRUE-TRUE не выдаётся, т.е. TreeView_GetItem в первый раз возвращает FALSE
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 12-04-2008 19:07 » 

у тебя tvTempItem - глобальная переменная ?
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 12-04-2008 19:10 » 

Да
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 12-04-2008 19:14 » 

FallenSoul, покажи содержимое переменной до и после самого ПЕРВОГО вызова

if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE)

--------------------
о, кстати и ещё
Цитата
Pointer to a TVITEM structure that specifies the information to retrieve and receives information about the item. With version 4.71 and later, you can use a TVITEMEX structure instead.
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 12-04-2008 19:22 » 

TVITEMEX tvTempItem; не помогло
Как посмотреть значение переменной во время работы программы (Debug если я правильно понял) не знаю Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 12-04-2008 19:31 » 

проект в режиме дебага.

на нужной строчке поставь точку останова (F9) , а потом запусти программу в режиме отладки (F5)

когда остановится - жми alt+3 (если окошка просмотра ещё нет на экране) и пиши туда переменную
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 12-04-2008 19:35 » 

проект в режиме дебага.
Поясни как это сделать
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 12-04-2008 19:45 » 

на баре с кнопками инструментов в студии есть комба для выбора режима проекта , по умолчанию там две позиции:
Win32 Debug
Win32 Release
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 12-04-2008 19:52 » 

Блин, выставил, нажал F5.

Окно

First-chance exception in Second.exe(NTDLL.DLL): 0xC00000008: Invalid Handle.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 12-04-2008 20:10 » 

хе хе хе...

делай так: когда это окно выскочет, нажми кнопку "повтор" , окажешься коде, где вылез косяк. Если непонятно там, жми alt+7 (появится окно стека вызовов) и смотри, откуда пришли - двигайся по шагам назад, пока не разберёшься, откуда хендл корявый взялся

Если хендл будет (хе хе хе) 0xcccccccc или 0xcdcdcdcd - это не инициализированная переменная значит

в релизе этот хендл скорее всего был ==0
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 12-04-2008 20:15 » 

Фигня какая-то,-ничего не получается.

Глянь если не сложно

* Second.rar (27.52 Кб - загружено 736 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 12-04-2008 20:32 » 

процедура
void Fill_ChildKeys(HWND hTreeView,HTREEITEM hItem,TV_INSERTSTRUCT TItemStruct,HKEY hTopKey,DWORD lpcSubKeys)

Код:
	for(int i=0;i<lpcSubKeys;i++)
{
}
RegCloseKey(hChildKey); //тут улетает.

когда у тебя lpcSubKeys==0 , то ты закрываешь hChildKey==0xcccccccc
Выводы:

1) переменные надо инициализировать
 ( не
   HKEY hChildKey;
а
   HKEY hChildKey=0;
 )

2) вообще не нужно вызывать RegCloseKey , если ты не открывал ключ:

Код:
if(hChildKey)
{
RegCloseKey(hChildKey);
}
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 12-04-2008 20:43 » 

За замечания спс,а значения &tvTempItem- адресс не изменный =\

При первом прогоне переменная hItem структуры tvTempItem инициализируется 0х00000000 и уже только на 2й прогон заполняется значением =\
Другими словами
Код:
tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); 
инициализирует нулевым значением =/


2
Код:
tvTempItem.hItem=TreeView_GetNextItem(m_MyHandles.hTreeView,hTempItem,TVGN_CARET);
смена функции не помогла  Не понял
« Последнее редактирование: 12-04-2008 20:57 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 12-04-2008 20:57 » 

ну тогда всё ясно Улыбаюсь

у тебя самый первый вызов tvTempItem.hItem == 0. Потому что
TreeView_GetSelection(m_MyHandles.hTreeView)==0;
 - что следует из названия функции (ведь ничего ещё не выделено). А когда что то было выделено, ты берёшь тот, выделенный, ПРЕДЫДУЩИЙ элемент


Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 12-04-2008 21:09 » 

ну тогда всё ясно Улыбаюсь

у тебя самый первый вызов tvTempItem.hItem == 0. Потому что
TreeView_GetSelection(m_MyHandles.hTreeView)==0;
 - что следует из названия функции (ведь ничего ещё не выделено). А когда что то было выделено, ты берёшь тот, выделенный, ПРЕДЫДУЩИЙ элемент

Другими словами при первом клике происходит не "выделение" а установка фокуса? Или то что запись "выделена", до ОСи доходит несколько позже и оконная процедура просто не успевает обработать сие?

Как это победить? Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #27 : 12-04-2008 21:28 » 

методом Научного Тыка я определил нужное тебе сообщение, это не NM_CLICK , а 0xfffffe6e. Но символьное название не знаю

зы
Алексей1153++, FallenSoul и 15 Гостей смотрят эту тему.  ))))))))
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 12-04-2008 21:43 » 

методом Научного Тыка я определил нужное тебе сообщение, это не NM_CLICK , а 0xfffffe6e. Но символьное название не знаю

зы
Алексей1153++, FallenSoul и 15 Гостей смотрят эту тему.  ))))))))
Это сильно Улыбаюсь Можно хотя бы в краце узнать как ты его определял, а то перед преподом будет неудобно- обяз. спросит Отлично

2Символьное значение есть :

Код:
TVN_SELCHANGEDA / TVN_SELCHANGED
« Последнее редактирование: 12-04-2008 21:47 от FallenSoul » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 12-04-2008 21:53 » 

определил как - под отладчиком поставил точку в

Код:
case WM_NOTIFY:
{
    int iii= (((LPNMHDR)lParam)->code);
    iii=1;  //тут точку останова поставил
}

и что прилетало не в тему, то писал себе -  это не оно Улыбаюсь . Когда добился, что некое сообщение появляется только при отпускании левой кнопки с контрола - попробовал это сообщение, оказалось то, что нужно
Записан

Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines