Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум

Наследники TOpenPictureDialog не дружат с сообщениями [D6, Win2k]


Gepard ©   (2004-05-21 12:49:00) 

Добрый день! Может кто подскажет, почему наследники от TOpenPictureDialog с добавленными контролами работают некоректно. К примеру, добавил TEdit под панель Preview, а он рисуется не 3D. TMaskEdit не получает сообщение CM_EXIT и, соответсвенно, не делает ValidateEdit. В чем проблема?


GrayFace   (2004-06-27 08:37:00) [1]

Создай форму и делай Windows.SetParent(DialogHandle, FormHandle).


Igorek   (2004-06-24 14:27:00) [2]


> Юрий Зотов ©   (24.06.04 14:09) [7]

Упс. Мой проезд. Недосмотрел, что у вас :
> function TMyDialog.Execute: boolean
> begin
>  with TMyDialogForm.Create(Self) do

Разные классы.


Юрий Зотов   (2004-06-24 14:09:00) [3]

> Igorek ©   (28.05.04 17:50) [4]

> Можно уточнить, как именно метод, который вызовет Execute
> возьмет данные?

Как и обычно - через свойства самого компонента. В методе Execute берутся данные из формы и присваиваются свойствам самого компонента (скажем, FileName := Edit1.Text) - в результате они становятся доступными вызвавшему методу.

В общем-то, я удивлен. Это же самая обычная работа с модальной формой, простейший, голимый стандарт - неужели в ЭТОЙ конференции нужно объяснять ТАКИЕ вещи?


Igorek   (2004-06-07 11:31:00) [4]


> Можно уточнить, как именно метод, который вызовет Execute
> возьмет данные?

Возьму на себя смелость предложить callback вариант:

TDialogReceiveProc = procedure(Dialog: TMyDialog); of object;

function TMyDialog.Execute(ReceiveProc: TDialogReceiveProc): boolean;
begin
 ...
 ReceiveProc(Self)
 ...
end;


Gepard   (2004-06-01 17:49:00) [5]

Я, конечно же, дико извиняюсь, но хотелось бы услышать версию решения проблемы с сообщениями :)
Некрасивый получается отпрыск TOpenPictureDialog'a
Подскажите решение, плиз


Igorek   (2004-05-28 17:50:00) [6]


> Юрий Зотов ©   (21.05.04 17:48) [2]


>      ... // Берем из формы данные

Можно уточнить, как именно метод, который вызовет Execute возьмет данные?


Gepard   (2004-05-24 12:14:00) [7]

2Юрий Зотов

Или я чего-то не понял или.. При такой реализации нужно самому на TMyDialogForm лепить просмотр директорий, выбор файлов и т.д. Форма появляется, но никаким TOpenPictureDialogEx(наследник от TOpenPictureDialog) не пахнет.

Мож я не так идею понял?


Юрий Зотов   (2004-05-21 17:48:00) [8]

Диалоговые компоненты Delphi только вызывают функции API, которые уже и показывают само окно диалога. Соответственно, это окно есть именно окно Windows (а не форма Delphi) и содержит оно тоже контролы Windows (а не компоненты Delphi).

Ни о какой Delphi это окно и его контролы не имеют ни малейшего понятия - поэтому вполне естественно, что они не получают и не обрабатывают сообщения CM_xxx и CN_xxx, механизмы рассылки и обработки которых реализованы на уровне VCL, а не Windows.

Но никто не запрещает сделать для диалога любую свою форму, а в наследнике диалога перекрыть метод Execute:

function TMyDialog.Execute: boolean
begin
 with TMyDialogForm.Create(Self) do
 try
   ... // Настройка формы (если требуется)
   DoShow;
   Result := ShowModal = mrOK;
   DoClose;
   if Result then
   begin
     ... // Берем из формы данные
   end
 finally
   Free
 end
end;


Shkut   (2004-05-21 13:15:00) [9]

Без исходников этого наследника сказать что-либо трудно.
Нечего проанализировать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо