![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум
Наследники 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]Без исходников этого наследника сказать что-либо трудно.
Нечего проанализировать.