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

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

MDI окно и хэндл [D7, XP]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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