Re[9]: Дочерний диалог в диалоге
От: angvelem  
Дата: 19.08.11 18:58
Оценка: +1 :)
Здравствуйте, kero, Вы писали:

K>Так вы бы хоть словечком намекнули, что у вас там групбокс в загашнике, такить нет, утаили, а уж если б показали ресурсы — в тот же миг верхняя крышка над эдитом и обнаружилась бы


K>Так что метод примитивнейшей, но рабочей демки (см. мой пример) в ситуации длительного заскока — оченно годится.


Сколько писал, никогда не думал, что GroupBox может такую подлянку подкинуть.
Когда посмотрел ваш пример на асме, понял — ошибок в коде нет. Значит, что то мешает. Ну и начал сначала куски кода отрубать, а когда не помогло и до ресурса добрался.
Re[7]: Дочерний диалог в диалоге
От: angvelem  
Дата: 19.08.11 09:44
Оценка: :)
A>Здравствуйте, kero, Вы писали:

Да, кстати, использование флага WS_CLIPCHILDREN, как в приведённом Вами примере, может весьма негативно сказаться на правильной отрисовке дочернего диалога. Правильнее использовать WS_CLIPSIBLINGS и то, только в дочернем диалоге.
Дочерний диалог в диалоге
От: angvelem  
Дата: 17.08.11 22:24
Оценка:
Имеется диалог, в который встроен ещё один (дочерний), напоминает SheetPage. На дочернем диалоге имеется контрол Edit (не TEdit) со стилем WS_EX_ACCEPTFILES, его я сабклассирую, чтобы перхвать очередь сообщений и перехватить сообщение WM_DROPFILES. Проблема в том, что именно это сообщение и не ловится. Если я ставлю ловушку на весь диалог, то сообщение в диалоге нормально ловится. Кто знает, в чём загвоздка?

// сабклассирование Edit-а
  ...
  case Msg of
    WM_DROPFILES :
    try
      if DragQueryFile(wParam, 0, FileName, MAX_PATH) > 0 then
      begin
        SendMessage(GetParent(Wnd), WM_COMMAND, ID_BTNFILE, 0);
        DragFinish(wParam);
        Exit;
      end;
    finally
      DragFinish(wParam);
    end;
  end;
  ...

  // дочерний диалог
  WM_INITDIALOG :
  begin
    ...
    // не нужно, но так на всякий случай
    // в ресурсном файле, этот флаг уже установлен
    DragAcceptFiles(GetDlgItem(hWndDlg, ID_EDTFILE), True);
    // subclass the drag-drop edit control
    hEditPrev := Pointer(GetWindowLong(GetDlgItem(hWndDlg, ID_EDTFILE), GWL_WNDPROC));
    SetWindowLong(GetDlgItem(hWndDlg, ID_EDTFILE), GWL_WNDPROC, Longint(@EditWndProc));
    SetWindowLong(GetDlgItem(hWndDlg, ID_EDTFILE), GWL_EXSTYLE, GetWindowLong(GetDlgItem(hWndDlg, ID_EDTFILE), GWL_EXSTYLE) or WS_EX_ACCEPTFILES);
    ...
  end;


Re: Дочерний диалог в диалоге
От: Oleg A. Bachin Украина  
Дата: 17.08.11 23:43
Оценка:
Здравствуйте, angvelem, Вы писали:

из вашего кода не совсем понятно где чьи хендлы, пока отмечу ошибочку — DragFinish(wParam) у вас вызывается дважды. секция финализации работает при любом раскладе.
Best regards,
Oleg A. Bachin
Re: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 00:32
Оценка:
Здравствуйте, angvelem, Вы писали:

A>Имеется диалог, в который встроен ещё один (дочерний), напоминает SheetPage. На дочернем диалоге имеется контрол Edit (не TEdit) со стилем WS_EX_ACCEPTFILES, его я сабклассирую, чтобы перхвать очередь сообщений и перехватить сообщение WM_DROPFILES. Проблема в том, что именно это сообщение и не ловится.


Ищите ошибку в вашей процедуре сабкласса, WM_DROPFILES ловится Edit-ом без разговоров
(и нафига "на всякий случай" на WM_INITDIALOG, раз WS_EX_ACCEPTFILES Edit-у уже назначено в ресурсах).
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 00:39
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, angvelem, Вы писали:


OAB>из вашего кода не совсем понятно где чьи хендлы,


Ну, это-то как раз совершенно понятно, раз ID_EDTFILE
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Дочерний диалог в диалоге
От: CEMb  
Дата: 18.08.11 02:08
Оценка:
Здравствуйте, angvelem, Вы писали:

A>Имеется диалог, в который встроен ещё один (дочерний), напоминает SheetPage. На дочернем диалоге имеется контрол Edit (не TEdit) со стилем WS_EX_ACCEPTFILES, его я сабклассирую, чтобы перхвать очередь сообщений и перехватить сообщение WM_DROPFILES. Проблема в том, что именно это сообщение и не ловится. Если я ставлю ловушку на весь диалог, то сообщение в диалоге нормально ловится. Кто знает, в чём загвоздка?


А если едит лежит на просто одном диалоге — всё ок работает?
Я бы ещё попробовал дочернему диалогу добавить стиль DS_CONTROL
Re[2]: Дочерний диалог в диалоге
От: Oleg A. Bachin Украина  
Дата: 18.08.11 02:10
Оценка:
Здравствуйте, kero, Вы писали:

K>Ищите ошибку в вашей процедуре сабкласса, WM_DROPFILES ловится Edit-ом без разговоров

какраз тут разговоры то есть

UAC
You will need to add WM_DROPFILES and WM_COPYGLOBALDATA to message filter (ChangeWindowMessageFilter), if you want to drag files from non-elevated applications to yours (elevated).

другое дело, что сперва действительно надо разобраться с сабклассингом, потому как "не ловится" и "не передается" это уже другое...
Best regards,
Oleg A. Bachin
Re[3]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 04:21
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

так что здесь хитрого?
http://files.rsdn.ru/42164/wmdropfiles_edit.zip
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 04:23
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Я бы ещё попробовал дочернему диалогу добавить стиль DS_CONTROL


в данном конкретном случае рояли не играет, а так да, стиль справный
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: Дочерний диалог в диалоге
От: Oleg A. Bachin Украина  
Дата: 18.08.11 05:07
Оценка:
Здравствуйте, kero, Вы писали:

K>так что здесь хитрого? -

я вроде написал что имеено там хитрого. можете почитать например тут:
http://serverfault.com/questions/39600/why-cant-i-drag-drop-a-file-for-editing-in-notepad-in-windows-server-2008

а сделать сабклассинг да еще и с глобальными переменными не проблема.
Best regards,
Oleg A. Bachin
Re[5]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 05:22
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>а сделать сабклассинг да еще и с глобальными переменными не проблема.


это-то тут причем?
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[6]: Дочерний диалог в диалоге
От: Oleg A. Bachin Украина  
Дата: 18.08.11 05:29
Оценка:
Здравствуйте, kero, Вы писали:

OAB>>а сделать сабклассинг да еще и с глобальными переменными не проблема.

K>это-то тут причем?
потому как у автора топика скорее всего проблема с сабклассингом, и сделай он как вы — проблем бы небыло, вот только реюзабильность этого кода стремится к нулю.
Best regards,
Oleg A. Bachin
Re[7]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 06:16
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>Здравствуйте, kero, Вы писали:


OAB>>>а сделать сабклассинг да еще и с глобальными переменными не проблема.

K>>это-то тут причем?
OAB>потому как у автора топика скорее всего проблема с сабклассингом, и сделай он как вы — проблем бы небыло, вот только реюзабильность этого кода стремится к нулю.

Какой ужас
Простейший рабочий примерчик всего-то и призван успокоить, что Edit — таки принимает.
GWL_USERDATA, SetProp, etc — опосля.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[8]: Дочерний диалог в диалоге
От: Oleg A. Bachin Украина  
Дата: 18.08.11 09:52
Оценка:
Здравствуйте, kero, Вы писали:

K>Какой ужас

K>Простейший рабочий примерчик всего-то и призван успокоить, что Edit — таки принимает.
K>GWL_USERDATA, SetProp, etc — опосля.

глубина ваших рассуждений для меня не постижима...
чтобы понять что edit, впрочем как и любой другой хэндлед контрол, принимает сообщение — примеры писать не надо, для этого есть msdn, ну и сабклассинг уж темболее не нужен для проверки.
Best regards,
Oleg A. Bachin
Re[9]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 18.08.11 11:04
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

я пас, скучно.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Дочерний диалог в диалоге
От: Pavel Dvorkin Россия  
Дата: 18.08.11 11:21
Оценка:
Здравствуйте, angvelem, Вы писали:

A>Имеется диалог, в который встроен ещё один (дочерний), напоминает SheetPage. На дочернем диалоге имеется контрол Edit (не TEdit) со стилем WS_EX_ACCEPTFILES, его я сабклассирую, чтобы перхвать очередь сообщений и перехватить сообщение WM_DROPFILES.


В Visual Studio есть утилита Spy++. В борландовских продуктах аналогичная утилита называется, если мне память не изменяет, winspectr. Запусти одну из них и натрави на свой edit, посмотри, приходит ли туда это сообщение.

>Проблема в том, что именно это сообщение и не ловится. Если я ставлю ловушку на весь диалог, то сообщение в диалоге нормально ловится. Кто знает, в чём загвоздка?


А вот это не совсем понятно. Что за ловушка на весь диалог и почему сообщение вдруг ловится в диалоге самом ?
With best regards
Pavel Dvorkin
Re[2]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 18:17
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

OAB>из вашего кода не совсем понятно где чьи хендлы, пока отмечу ошибочку — DragFinish(wParam) у вас вызывается дважды. секция финализации работает при любом раскладе.


Это я здесь забыл убрать.
Re[2]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 18:18
Оценка:
Здравствуйте, kero, Вы писали:

K>Ищите ошибку в вашей процедуре сабкласса, WM_DROPFILES ловится Edit-ом без разговоров

K>(и нафига "на всякий случай" на WM_INITDIALOG, раз WS_EX_ACCEPTFILES Edit-у уже назначено в ресурсах).

Ошибки в сабклассировании нет, остальные сообщения проходят.
Добавлял для проверки, когда не работало с флагом в ресурсах.
Re[2]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 18:20
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>А если едит лежит на просто одном диалоге — всё ок работает?

CEM>Я бы ещё попробовал дочернему диалогу добавить стиль DS_CONTROL

Не переносил, нужно проверить.
Стиль установлен.
Re[4]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 18:23
Оценка:
Здравствуйте, kero, Вы писали:

K>так что здесь хитрого? -

K>http://files.rsdn.ru/42164/wmdropfiles_edit.zip

Этот пример бесполезен, так как рассчитан на обычный диалог.
Re[2]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 18:40
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>В Visual Studio есть утилита Spy++. В борландовских продуктах аналогичная утилита называется, если мне память не изменяет, winspectr. Запусти одну из них и натрави на свой edit, посмотри, приходит ли туда это сообщение.

PD>А вот это не совсем понятно. Что за ловушка на весь диалог и почему сообщение вдруг ловится в диалоге самом ?

Не требуется и Spy, при пошаговом прохождении я туда не попадаю.
Когда я делаю вызов DragAcceptFiles(hWndDlg, True) для всего диалога, в диалоге WM_DROPFILES отлавливается.
Re[3]: Дочерний диалог в диалоге
От: angvelem  
Дата: 18.08.11 19:33
Оценка:
Всем спасибо. Сделал тестовое приложение в котором выкинул всё лишние оставив только два едита, на основном диалоге и дочернем, и запустил. Оба едита сообщение отлавливают. Теперь буду разбирать кто или что не пропускает его в основной программе.
Re[3]: Дочерний диалог в диалоге
От: Pavel Dvorkin Россия  
Дата: 19.08.11 03:11
Оценка:
Здравствуйте, angvelem, Вы писали:

A>Не требуется и Spy, при пошаговом прохождении я туда не попадаю.


Это не аргумент. Может быть, ты что-то не так сделал, поэтому и не попадаешь. Убедись, что это сообщение туда приходит. Для этого и нужен Spy++
With best regards
Pavel Dvorkin
Re[5]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 19.08.11 04:33
Оценка:
Здравствуйте, angvelem, Вы писали:

A>Здравствуйте, kero, Вы писали:


K>>так что здесь хитрого? -

K>>http://files.rsdn.ru/42164/wmdropfiles_edit.zip

A>Этот пример бесполезен, так как рассчитан на обычный диалог.


Выше вами описан необычный? И где же?
(А пример рассчитан на то, что вы новичок, как мне показалось).
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[6]: Дочерний диалог в диалоге
От: angvelem  
Дата: 19.08.11 09:39
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Это не аргумент. Может быть, ты что-то не так сделал, поэтому и не попадаешь. Убедись, что это сообщение туда приходит. Для этого и нужен Spy++


Не пригодился бы, в этом я убедился когда нашёл в чём причина.

=======================================================================

Здравствуйте, kero, Вы писали:

K>Выше вами описан необычный? И где же?

K>(А пример рассчитан на то, что вы новичок, как мне показалось).

Глаза замылились, показалось, что адрес msdn... , а их примеры я видел. Я давно не новичок и приведённый пример весьма примитивен , но на казусы попадают и достаточно опытные люди.

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

А теперь сама причина. Она оказалась до смешного простой. В ресурсном файле первым в списке находился GroupBox, он и мешал. Перенос его вниз списка решил проблему.
Re[8]: Дочерний диалог в диалоге
От: kero Россия  
Дата: 19.08.11 11:04
Оценка:
Здравствуйте, angvelem, Вы писали:

A>>Здравствуйте, kero, Вы писали:


A>Да, кстати, использование флага WS_CLIPCHILDREN, как в приведённом Вами примере, может весьма негативно сказаться на правильной отрисовке дочернего диалога. Правильнее использовать WS_CLIPSIBLINGS и то, только в дочернем диалоге.


Так вы бы хоть словечком намекнули, что у вас там групбокс в загашнике, такить нет, утаили, а уж если б показали ресурсы — в тот же миг верхняя крышка над эдитом и обнаружилась бы

Так что метод примитивнейшей, но рабочей демки (см. мой пример) в ситуации длительного заскока — оченно годится.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.