%IDCANCEL не отлавливается!

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

%IDCANCEL не отлавливается!

Сообщение jangle » 27.12.2006 (Ср) 11:54

В аттача пример поиска и замены строк, с помощью стандартных диалогов FIND, REPLACE, GOTO to Line.
Перенес этот код в свое приложение, EMD32 контрол тоже. Все работает, за исключением сокрытия диалогов при нажатии клавиши ESC. Причем в диалоге GOTO to Line нажатие ESC отрабатывается, а в остальных нет!

Код: Выделить всё
    Case %WM_COMMAND

        Select Case LoWrd(wParam)
     
              Dialog Set Text g_MainDialog, Str$(wParam)
             
                Case %IDCANCEL 'default Esc key  <---- Событие не ловится
                 
                    If HiWrd(wParam) = %BN_CLICKED Then
                           Call SendMessage( hDlg, %WM_CLOSE , 0, 0)
                    End If



Кароче в чем глюк, не понимаю! :?
Вложения
1.zip
(118.57 Кб) Скачиваний: 152

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Re: %IDCANCEL не отлавливается!

Сообщение volo » 27.12.2006 (Ср) 12:32

jangle писал(а):В аттача пример поиска и замены строк, с помощью стандартных диалогов FIND, REPLACE, GOTO to Line.
Перенес этот код в свое приложение, EMD32 контрол тоже. Все работает, за исключением сокрытия диалогов при нажатии клавиши ESC. Причем в диалоге GOTO to Line нажатие ESC отрабатывается, а в остальных нет!

Код: Выделить всё
    Case %WM_COMMAND

        Select Case LoWrd(wParam)
     
              Dialog Set Text g_MainDialog, Str$(wParam)
             
                Case %IDCANCEL 'default Esc key  <---- Событие не ловится
                 
                    If HiWrd(wParam) = %BN_CLICKED Then
                           Call SendMessage( hDlg, %WM_CLOSE , 0, 0)
                    End If



Кароче в чем глюк, не понимаю! :?



Ну не знаю, у меня во 'всех диалогах' ESC закрывает 'под-диалог' нормально.

FIND NEXT - нормально.
GoTo - нормально.
Find - нормально.
Replace - нормально.
Главный диалог - нормально.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.12.2006 (Ср) 12:39

Ну не знаю, у меня во 'всех диалогах' ESC закрывает 'под-диалог' нормально.

FIND NEXT - нормально.
GoTo - нормально.
Find - нормально.
Replace - нормально.
Главный диалог - нормально.


Этот пример у меня тоже работает. Дело в другом, я перенес этот код в свое приложение. Один в один. Ничего не меняя. Он нормально работает, за исключением того, что диалоги FIND и REPLACE не закрываются клавишей ESC, а GOTO to Line закрывается!
Из-за чего такой глюк не понимаю...
:(

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 13:02

jangle писал(а):
Ну не знаю, у меня во 'всех диалогах' ESC закрывает 'под-диалог' нормально.

FIND NEXT - нормально.
GoTo - нормально.
Find - нормально.
Replace - нормально.
Главный диалог - нормально.


Этот пример у меня тоже работает. Дело в другом, я перенес этот код в свое приложение. Один в один. Ничего не меняя. Он нормально работает, за исключением того, что диалоги FIND и REPLACE не закрываются клавишей ESC, а GOTO to Line закрывается!
Из-за чего такой глюк не понимаю...
:(



Если "навскидку", то скорее всего один индентификатор - перекрыл другой индентификтор.

Т.е. например %IDCANSEL_A = 400, и в программе было %IDCANSEL_B = 400. Управление перехватывается не %IDCANSEL_A а %IDCANSEL_B, которое первым было "обозначено"

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.12.2006 (Ср) 15:55

Если "навскидку", то скорее всего один индентификатор - перекрыл другой индентификтор.


Вроде не перекрывается, если не сложно можешь код взглянуть?
Пример в аттаче, надо скомпилировать IDE.bas
Вложения
IDE.zip
(81.55 Кб) Скачиваний: 156

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 17:35

jangle писал(а):
Если "навскидку", то скорее всего один индентификатор - перекрыл другой индентификтор.


Вроде не перекрывается, если не сложно можешь код взглянуть?
Пример в аттаче, надо скомпилировать IDE.bas




взглянув побыстрому:

вставь код и посмотри (SearchFindDlgProc) кнопка -искать-

нажатие на ESC - нулевая реакция, это значит управление обработкой
перенаправлено на "левую" процедуру, скорее всего на процедуру обработки GoTo. Либо где-то локальная переменная совпадает с глобальной
Код: Выделить всё
.......
CASE %WM_COMMAND
    setwindowtext hdlg, STR$(wParam) & STR$(%IDCANCEL) & " " & TIME$
    ........


volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 17:50

jangle писал(а):
Если "навскидку", то скорее всего один индентификатор - перекрыл другой индентификтор.


Вроде не перекрывается, если не сложно можешь код взглянуть?
Пример в аттаче, надо скомпилировать IDE.bas



Заметь, ты дал для Goto модальный диалог
CALL Dialogbox( g_hInstance, "MYGOTOLINE", ghEdit, CODEPTR(SearchFindDlgProc))


А для всего остального modeless:
' ghFindDlg = CreateDialog(g_hInstance,"MYFIND",ghEdit,CodePtr(SearchFindDlgProc) )

отличие улавливаешь ... попробуй поменяй

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.12.2006 (Ср) 17:53

вставь код и посмотри (SearchFindDlgProc) кнопка -искать-

нажатие на ESC - нулевая реакция, это значит управление обработкой
перенаправлено на "левую" процедуру, скорее всего на процедуру обработки GoTo. Либо где-то локальная переменная совпадает с глобальной


Да точно, ESC туда не попадает. Наверное главное окно его перехватывает?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.12.2006 (Ср) 18:01

Заметь, ты дал для Goto модальный диалог
CALL Dialogbox( g_hInstance, "MYGOTOLINE", ghEdit, CODEPTR(SearchFindDlgProc))


А для всего остального modeless:
' ghFindDlg = CreateDialog(g_hInstance,"MYFIND",ghEdit,CodePtr(SearchFindDlgProc) )

отличие улавливаешь ... попробуй поменяй


Cпасибо, я этого не заметил. Так нужно использовать функцию DialogBox ?

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 18:22

jangle писал(а):
Заметь, ты дал для Goto модальный диалог
CALL Dialogbox( g_hInstance, "MYGOTOLINE", ghEdit, CODEPTR(SearchFindDlgProc))


А для всего остального modeless:
' ghFindDlg = CreateDialog(g_hInstance,"MYFIND",ghEdit,CodePtr(SearchFindDlgProc) )

отличие улавливаешь ... попробуй поменяй


Cпасибо, я этого не заметил. Так нужно использовать функцию DialogBox ?



Что использовать нужно, зависит от постановки задачи, я честно говоря не вникал глубоко в задачу. Modeless имеет несколько отличную обработку потока управления.

В принципе если DialogBox удовлетворяет задаче, то можно использовать и это.


Что говорит классика нам:
для модал -
Код: Выделить всё
BOOL CALLBACK DeleteItemProc(hwndDlg, message, wParam, lParam)
HWND hwndDlg;
UINT message;
WPARAM wParam;
LPARAM lParam;
{
    switch (message) {
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case IDOK:
                    if (!GetDlgItemText(hwndDlg, ID_ITEMNAME,
                             szItemName, 80))
                         *szItemName=0;

                    // Fall through.


                case IDCANCEL:
                    EndDialog(hwndDlg, wParam);
                    return TRUE;
            }
    }
    return FALSE;
}




Для моделесс:

Код: Выделить всё

WND hwndGoto = NULL;  // window handle of dialog box 

    .
    .
    .

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
            case IDM_GOTO:
                if (!IsWindow(hwndGoto)) {
                    hwndGoto = CreateDialog(hinst,
                         MAKEINTRESOURCE(DLG_GOTO),
                         hwnd, (DLGPROC) GoToProc);
                    ShowWindow(hwndGoto, SW_SHOW);
                }
                break;

        }
        return 0L;


In the preceding statements, CreateDialog is called only if hwndGoto does not contain a valid window handle. This ensures that the application does not display two dialog boxes at the same time. To support this method of checking, the dialog procedure must set hwndGoto to NULL when it destroys the dialog box.
The message loop for an application consists of the following statements:

while (GetMessage(&msg, NULL, NULL, NULL)) { 
    if (!IsWindow(hwndGoto) || !IsDialogMessage(hwndGoto, &msg)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}


The loop checks the validity of the window handle for the dialog box and only calls the IsDialogMessage function if the handle is valid. IsDialogMessage only processes the message if it belongs to the dialog box. Otherwise, it returns FALSE and the loop dispatches the message to the appropriate window.
The following statements define the dialog box procedure:

int iLine;             // receives line number 
BOOL fRelative;        // receives check box status

    .
    .
    .

BOOL CALLBACK GoToProc(hwndDlg, message, wParam, lParam)
HWND hwndDlg;
UINT message;
WPARAM wParam;
LPARAM lParam;
{
    BOOL fError;

    switch (message) {
        case WM_INITDIALOG:
            CheckDlgButton(hwndDlg, ID_ABSREL, fRelative);
            return TRUE;

        case WM_COMMAND:
            switch (LOWORD(wParam)) {

                case IDOK:
                    fRelative = IsDlgButtonChecked(hwndDlg,
                        ID_ABSREL);
                    iLine = GetDlgItemInt(hwndDlg, ID_LINE,
                        &fError, fRelative);
                    if (fError) {
                        MessageBox(hwndDlg, SZINVALIDNUMBER,
                            SZGOTOERR, MB_OK);
                        SendDlgItemMessage(hwndDlg, ID_LINE,
                            EM_SETSEL, 0, -1L);

                    } else

                        .
                        . // Notify the owner window to carry
                        . // out the command.
                        .

                    return TRUE;

                case IDCANCEL:
                    DestroyWindow(hwndDlg);
                    hwndGoto = NULL;
                    return TRUE;
            }
    }
    return FALSE;
}



jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 9:44

Так у меня цикл обработки работает, проблема в том, что нажатия ESC он "не видит". Почему это происходит - мне непонятно...

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 28.12.2006 (Чт) 10:16

jangle писал(а):Так у меня цикл обработки работает, проблема в том, что нажатия ESC он "не видит". Почему это происходит - мне непонятно...



Посмотри еще у себя в RC файле, как ты оформил эти диалоги.
Я имею ввиду стили диалогов

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 10:36

Стили у всех одинаковые

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 28.12.2006 (Чт) 15:59

jangle писал(а):Стили у всех одинаковые

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU



Ну и ...?

Попробуй замени или убери DS_MODALFRAME

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 16:10

Ну и ...?

Попробуй замени или убери DS_MODALFRAME


Убрал, и заменял DS_MODALFRAME - результат тот же..

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 28.12.2006 (Чт) 17:38

jangle писал(а):
Ну и ...?

Попробуй замени или убери DS_MODALFRAME


Убрал, и заменял DS_MODALFRAME - результат тот же..


управление от ESC просто улетает куда-то в другое место,
не приходя даже в процедуру обработки.

ищи проблему либо:
Код: Выделить всё
the message loop for an application consists of the following statements:
while (GetMessage(&msg, NULL, NULL, NULL)) { 
    if (!IsWindow(hwndGoto) || !IsDialogMessage(hwndGoto, &msg)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}



либо в настройках окна диалога в т.ч. родительского, я имею ввиду
проблема взаимодействия DDT callback function и WIN callback

В первом примере, где все работает, кажется DDT callback функции нет.

CALLBACK FUNCTION DlgMainProc

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 29.12.2006 (Пт) 0:02

Попробуй следующее:
1. Добавь WS_DLGFRAME при создании диалога
2. Нужно сделать реордер элементов управления таким образом, чтобы кнока CANCEL была последней в списке. т.е. идентификатор IDCANCEL должен быть максимальным.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 29.12.2006 (Пт) 10:55

Что-то не помогает. Ладно попробую переделать эти диалоги на DDT

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 29.12.2006 (Пт) 12:08

Маленькая подсказака. Ты можешь сделать импорт RC файлов прямо в PowerForms.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 29.12.2006 (Пт) 12:15

Маленькая подсказака. Ты можешь сделать импорт RC файлов прямо в PowerForms.


А вот за это спасибо! :D Не знал про такую фичу...

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 29.12.2006 (Пт) 18:11

jangle писал(а):
Маленькая подсказака. Ты можешь сделать импорт RC файлов прямо в PowerForms.


А вот за это спасибо! :D Не знал про такую фичу...



Попробуй еще замени для тестирования - "DDT callback" на "обычную"
типа:

OS_OldProc = SetWindowLong(hDlg, %GWL_WNDPROC, CODEPTR(subclass))


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

    TopList