Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.29;
Скачать: CL | DM;

Вниз

MDI окно и хэндл   Найти похожие ветки 

 
D@nger   (2008-06-03 13:13) [0]

Здравствуйте мастера! Подскажите пожалуйста, как, зная хэндл дочернего MDI  окна, получить доступ к его свойствам и методам из родительского MDI окна? Пробовал так:

TmyMDIChild(mdihandle).Windowstate:=wsMaximized;

Выходит ошибка....


 
D@nger   (2008-06-03 13:21) [1]

вернее ничего не происходит....никакой реакции...


 
ZENsan ©   (2008-06-03 13:40) [2]

Попробуй TForm(FindControl(mdihandle)).WindowState := wsMaximized;


 
AndreyV ©   (2008-06-03 13:49) [3]

Искать в цикле
i := 0;
while ((i < MDIChildCount) and (MDIChild[i].Handle <> mdihandle)) do inc(i);
if (i < MDIChildCount) then MDIChild[i].WindowState := wsMaximized;


 
D@nger   (2008-06-03 13:52) [4]

вобщем мне это нужно для активизации дочерних окон из меню...
если окно не свернуто ты вывести его на передний план я делаю так:

 BringWindowToTop(MdiHandle);

а если окно свернуто то оно таким методом не восстонавливается...
Как его восстановить имя хендл окна?


 
clickmaker ©   (2008-06-03 13:56) [5]

ShowWindow(Handle, SW_RESTORE)?


 
Юрий Зотов ©   (2008-06-03 13:58) [6]

> 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;


 
AndreyV ©   (2008-06-03 14:02) [7]

А хендл ты откуда берёшь? Может проще работать непосредственно с экземплярами TForm.


 
D@nger   (2008-06-03 14:04) [8]


> AndreyV ©   (03.06.08 14:02) [7]
> А хендл ты откуда берёшь? Может проще работать непосредственно
> с экземплярами TForm.

хэндл я записываю в массив при создании формы


 
AndreyV ©   (2008-06-03 14:08) [9]

> [8] D@nger   (03.06.08 14:04)
> > А хендл ты откуда берёшь? Может проще работать непосредственно
> > с экземплярами TForm.
>
> хэндл я записываю в массив при создании формы

Этот массив и так автоматически поддерживается, только с указателями на TMyMDIChild.


 
ZENsan ©   (2008-06-03 14:18) [10]

А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство, которое всё это уже делает...


 
DiamondShark ©   (2008-06-03 14:18) [11]


> хэндл я записываю в массив при создании формы

Прямо как в том анекдоте: "...только в гамаке и на лыжах".

А что б тебе в массив ссылку на экземпляр TForm не записывать? Или готовым MDIChildren пользоваться?


 
D@nger   (2008-06-03 14:28) [12]


> ZENsan ©   (03.06.08 14:18) [10]
> А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство,
>  которое всё это уже делает...


а как этим воспользоваться? привидите пример кода пожалуйста...

у меня в главном меню список дочерних окон...цель активировать нужное окно при клике в меню на соответствующее название окна...
сейчас у меня это выглядет так...


  if isIconic(mdihandle) then showwindow(mdihandle,1)
                               else bringWindowtoTop(mdihandle);


может есть более красивое решение...


 
DiamondShark ©   (2008-06-03 14:50) [13]


> А Зачем тебе это всё? Если у MdiForm есть ObjectMenu свойство

Ты имел в виду WindowMenu? ObjectMenu -- несколько для других целей.


> а как этим воспользоваться? привидите пример кода пожалуйста.
> ..

Да там, собственно, и кода никакого не надо. Просто в дизайнере укажи в какой пункт меню будет добавляться список дочерних окон.


 
ZENsan ©   (2008-06-03 15:04) [14]

Da da..imenno.


 
ZENsan ©   (2008-06-03 15:08) [15]

берешь ActionManager -> New standard action -> Window (закрашиваешь все)
Нажимаешь ок. Добавляешь этот Window елемент к главному меню главной формы. Форме WindowMenu := присваиваешь этот меню эелемент Window1 (или как назовешь). Всё вроде..


 
ZENsan ©   (2008-06-03 15:12) [16]

Кстати на счёт массивов совет. Пиши не в массив а в TList.

List.Add(Self) - OnCreate;
List.Remove(Self) - OnClose;

Гораздо проще потом будет.. Никаких там SetLength/Length...


 
Amoeba ©   (2008-06-03 15:49) [17]


> Пиши не в массив а в TList.

Лучше в TObjectList.


 
ZENsan ©   (2008-06-03 16:50) [18]

А это уже от ситуации зависит..


 
MsGuns ©   (2008-06-03 17:02) [19]

Хэндлы, массивы, обжектлисты.. Зачем все это.
Для решения задачи в [4] достаточно по событию нажатия соотв.кнопки (пункта меню) динамически опросить все дочерние окна (MDIChildCount, MDIChildren) и составить список подменю с их титулами, который и показать. Индекс выбранного пункта и укажет индекс "дочки" в списке, по которому можно к ней обратиться для активации


 
ZENsan ©   (2008-06-03 17:07) [20]


>  динамически опросить все дочерние окна (MDIChildCount,
> MDIChildren) и составить список подменю с их титулами, который
> и показать.


Зачем если это уже давно всё реализовано в дельфи и только надо ленивыми ручками ыто вставить... А про листы это мы не по тому вопросу писали. Читай чуть внимательней.


 
MsGuns ©   (2008-06-03 21:24) [21]

>ZENsan ©   (03.06.08 17:07) [20]

Согласен, просмотрел ;)



Страницы: 1 вся ветка

Текущий архив: 2008.06.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1212383370
snake-as
2008-06-02 09:09
2008.06.29
Не исчезает WebBrowser


2-1212269187
Randew
2008-06-01 01:26
2008.06.29
Помогите найти ошибку, пожалуйста...


8-1182507646
leonidus
2007-06-22 14:20
2008.06.29
Ищу библиотеку для работы с RAW-файлами


11-1190587748
Jon
2007-09-24 02:49
2008.06.29
Database large object


2-1212327471
Ceil
2008-06-01 17:37
2008.06.29
Панель задач