![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI окно и хэндл [D7, XP]
D@nger © (2008-06-03 13:13:00)Здравствуйте мастера! Подскажите пожалуйста, как, зная хэндл дочернего MDI окна, получить доступ к его свойствам и методам из родительского MDI окна? Пробовал так:
TmyMDIChild(mdihandle).Windowstate:=wsMaximized;
Выходит ошибка....
MsGuns (2008-06-03 21:24:00) [1]>ZENsan © (03.06.08 17:07) [20]
Согласен, просмотрел ;)
ZENsan (2008-06-03 17:07:00) [2]
> динамически опросить все дочерние окна (MDIChildCount,
> MDIChildren) и составить список подменю с их титулами, который
> и показать.
Зачем если это уже давно всё реализовано в дельфи и только надо ленивыми ручками ыто вставить... А про листы это мы не по тому вопросу писали. Читай чуть внимательней.
MsGuns (2008-06-03 17:02:00) [3]Хэндлы, массивы, обжектлисты.. Зачем все это.
Для решения задачи в [4] достаточно по событию нажатия соотв.кнопки (пункта меню) динамически опросить все дочерние окна (MDIChildCount, MDIChildren) и составить список подменю с их титулами, который и показать. Индекс выбранного пункта и укажет индекс "дочки" в списке, по которому можно к ней обратиться для активации
ZENsan (2008-06-03 16:50:00) [4]А это уже от ситуации зависит..
Amoeba (2008-06-03 15:49:00) [5]
> Пиши не в массив а в TList.
Лучше в TObjectList.
ZENsan (2008-06-03 15:12:00) [6]Кстати на счёт массивов совет. Пиши не в массив а в TList.
List.Add(Self) - OnCreate;
List.Remove(Self) - OnClose;
Гораздо проще потом будет.. Никаких там SetLength/Length...
ZENsan (2008-06-03 15:08:00) [7]берешь ActionManager -> New standard action -> Window (закрашиваешь все)
Нажимаешь ок. Добавляешь этот Window елемент к главному меню главной формы. Форме WindowMenu := присваиваешь этот меню эелемент Window1 (или как назовешь). Всё вроде..
ZENsan (2008-06-03 15:04:00) [8]Da da..imenno.
DiamondShark (2008-06-03 14:50:00) [9]
> А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство
Ты имел в виду WindowMenu? ObjectMenu -- несколько для других целей.
> а как этим воспользоваться? привидите пример кода пожалуйста.
> ..
Да там, собственно, и кода никакого не надо. Просто в дизайнере укажи в какой пункт меню будет добавляться список дочерних окон.
D@nger (2008-06-03 14:28:00) [10]
> ZENsan © (03.06.08 14:18) [10]
> А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство,
> которое всё это уже делает...
а как этим воспользоваться? привидите пример кода пожалуйста...
у меня в главном меню список дочерних окон...цель активировать нужное окно при клике в меню на соответствующее название окна...
сейчас у меня это выглядет так...
if isIconic(mdihandle) then showwindow(mdihandle,1)
else bringWindowtoTop(mdihandle);
может есть более красивое решение...
DiamondShark (2008-06-03 14:18:00) [11]
> хэндл я записываю в массив при создании формы
Прямо как в том анекдоте: "...только в гамаке и на лыжах".
А что б тебе в массив ссылку на экземпляр TForm не записывать? Или готовым MDIChildren пользоваться?
ZENsan (2008-06-03 14:18:00) [12]А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство, которое всё это уже делает...
AndreyV (2008-06-03 14:08:00) [13]> [8] D@nger (03.06.08 14:04)
> > А хендл ты откуда берёшь? Может проще работать непосредственно
> > с экземплярами TForm.
>
> хэндл я записываю в массив при создании формы
Этот массив и так автоматически поддерживается, только с указателями на TMyMDIChild.
D@nger (2008-06-03 14:04:00) [14]
> AndreyV © (03.06.08 14:02) [7]
> А хендл ты откуда берёшь? Может проще работать непосредственно
> с экземплярами TForm.
хэндл я записываю в массив при создании формы
AndreyV (2008-06-03 14:02:00) [15]А хендл ты откуда берёшь? Может проще работать непосредственно с экземплярами TForm.
Юрий Зотов (2008-06-03 13:58:00) [16]> D@nger (03.06.08 13:13)
Хэндл окна - это не объект, а просто число. Поэтому приведение
TmyMDIChild(mdihandle)
неверно и выдает ошибку.
А вот так будет правильно:
var
Control: TWinControl;
begin
Control := FindControl(mdiHandle);
if not (Control is TmyMDIChild) then
raise Exception.Create('Дочерняя форма не найдена');
TMyMDIChild(Control).Windowstate := wsMaximized;
clickmaker (2008-06-03 13:56:00) [17]ShowWindow(Handle, SW_RESTORE)?
D@nger (2008-06-03 13:52:00) [18]вобщем мне это нужно для активизации дочерних окон из меню...
если окно не свернуто ты вывести его на передний план я делаю так:
BringWindowToTop(MdiHandle);
а если окно свернуто то оно таким методом не восстонавливается...
Как его восстановить имя хендл окна?
AndreyV (2008-06-03 13:49:00) [19]Искать в цикле
i := 0;
while ((i < MDIChildCount) and (MDIChild[i].Handle <> mdihandle)) do inc(i);
if (i < MDIChildCount) then MDIChild[i].WindowState := wsMaximized;
ZENsan (2008-06-03 13:40:00) [20]Попробуй TForm(FindControl(mdihandle)).WindowState := wsMaximized;