| 
| 
 | Вопрос # 384/ вопрос открыт / | 
 |  Проведём эксперемент (delphi 6, но скорее всего и в других версиях будет точно также): создадим новый проэкт и добавим ещё одну форму. Пусть form1 - главная - кинем на неё кнопку Button1 и form1.formstyle = fsMDIForm. В обработчике нажатия кнопки Button1 напишем form2.show;
 В oncreate второй формы form2 напишем:
 WindowS.SetParent(handle, Form1.Handle)
 
 Запускаем приложение, нажимаем на кнопочку, внутри появляется form2. А теперь нажимаем alt+tab и видим что наше тестовое приложение там отсутствует! Т. е. на него нельзя переключиться через alt+tab. Вот и вопрос: нужно от этого избавиться
 
 И пару комментариев (все имеют основание, поэтому просьба не спрашивать почему):
 1) Использовать form2.ParentWindow := ... вместо аналогичной (хотя врядли) ф-ии API setParent нельзя (она не обращает внимание на клиентскую обл.);
 2) Использовать именно form1.clientHandle, т. к. иначе, если использовать form1.handle, опять не обращается внимание на клиентскую обл.;
 3) form2.formstyle не должен быть fsMDIChild (если так, то форму нельзя нормально закрыть - она в уголочек сворачивается)
 P. S. Есть и другие обоснования, почему должны выполняться п. п. 1-3, но я уже все не помню :)
 
 Спасибо
 
|  |   Вопрос задал: mvp (статус: 4-ый класс)Вопрос отправлен: 7 марта 2007, 19:17
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Вадим К А если form2.formstyle = fsMDIChildтогда отображается?
 А проблема с сворачиванием решается просто.
 в вторую форму добавим
 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
 Action:=caFree;
 end;
 
 А также в главной форме перед строкой
 form2.Show;
 добавим
 form2:=TForm2.Create(Form1);
 
 А также незабудим исключить вторую форму со списка автоматически создаваемых.
 
 З.Ы.
 Циклические ссылки между двумя формами - ошибки проектирования, источник потенциальных глюков
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 7 марта 2007, 19:37
 Оценка за ответ: 3
 Комментарий к оценке: Читаем внимательнее P. S. Из-за этого Ваш ответ не подходит. У меня эти формы создаются при запуске и удаляются только при закрытии приложения (так надо). А по поводу циклических ссылок - это просто пример, чтобы не отвлекать от сути. А у меня вообще формы друг к другу обращаются только через интерфейсы, находящиеся в промежуточном модуле - в нём формы регистрируются и дополнительно указывают, какие оп-ии к ним можно преминить. Также промежуточный модуль проводит обработку ошибок и т. п. Т. е., очень легко сильно переработать одну из форм не трогая всё приложение. P. S. А показ второй формы вообще из обычного unit'а вызывается |  Ответ #2. Отвечает эксперт: Knjazev Здравствуйте, mvp!1. Всё же plan 3
 object Form1: TForm1
 ...
 FormStyle = fsMDIForm
 ...
 end
 и
 object Form2: TForm2
 ...
 FormStyle = fsMDIChild
 ...
 end
 2. в приложении как открывать и закрывать form2 (ничего нового - всё, как учат отцы)
 3. на fsMDIForm-формах обычно кнопки не держат, делают фон clAppWorkSpace, вся работа через меню и тулбар
 Приложение:Переключить в обычный режим  procedure TForm1.Button1Click(Sender: TObject);begin  if not Assigned(Form2) then    Form2 := TForm2.Create(self);  Form2.Show;end;//onCloseprocedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);begin  Action := caFree;  Form2 := nil;end;
|  | Ответ отправил: Knjazev (статус: 3-ий класс)Время отправки: 7 марта 2007, 21:18
 Оценка за ответ: 3
 Комментарий к оценке: формы должны существовать всегда и не mdichild. И хоть кнопки на mdi-формах не держат, но всякие там toolbar'ы кидают. А вообще - вопрос решён - конает parentWindow, просто был глюк в другом месте.  |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 9 марта 2007, 16:04; участников в обсуждении: 4. 
|   | Knjazev (статус: 3-ий класс), 7 марта 2007, 21:26 [#1]:P. S. Почитал комментарий к предыдущему ответу. Всё же стремление скрывать форму без освобождения ресурсов - хреновый стиль, как не крути  Либо сворачивай, либо уничтожай. |  
|   | Новаковский Юрий Аврамович (статус: 4-ый класс), 9 марта 2007, 11:38 [#2]:Здравствуйте, mvp! Открыть внутри главной формы другую форму, не являющейся дочерней по отношению к главной можно, но при этом перестанет работать механизм взаимодействия главной формы с дочерними.
 В модуле C:\Program Files\Borland\Delphi7\Source\Vcl\TForms.pas 7651 строк. Проверка-
 FormStyle = fsMDIChild или
 FormStyle <> fsMDIChild встречается 29 раз в различных методах по всему модулю. Создайте наследника от TCustomForm, большинство методов этого класса абстрактные, и Вам надо написать их конкретную реализацию для вашего класса, часть методов можно просто скопировать из реализации класса TForm, другие надо написать самому.
 Дерзайте, эксперты Вам помогут, удачи!
 |  
|   | mvp (статус: 4-ый класс), 9 марта 2007, 14:11 [#3]:Вопрос решён, как я уже писал в комментарии к ответу Ласкового Злоумышленника. Ну, а по поводу хренового стиля, если ресурсы не освобождать, то вопрос спорный - а какие затраты нужны на создание формы и наполнение её информацией???? А если информация где-то с сети тянется??? Другими словами, в моём случае формы должны быть всегда и это оправдано |  
|   | Вадим К (статус: Академик), 9 марта 2007, 14:18 [#4]:mvp Может у вас неправильно изначально подход к проектированию задачи? И мы тут будем распинаться, а вы браниться. Всё таки вы математик, а не программист, а это поверте две большие разницы, как говорят у нас в Одессе
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | mvp (статус: 4-ый класс), 9 марта 2007, 15:23 [#5]:2 Вадим К Дежавю... Я ж тоже с Одессы
  И такого же возраста. Или Вы это знаете? А по поводу притензий, отвечу Вашей же подписью с аськи: "Мы видим лишь то, что хотим видить, Мы слышим лишь то, что хотим слышать. А когда мы говорим, то что хотим - нас не понимают." Оценки были поставлены только за нарушение условий вопроса, т. к. то что Вы написали я и сам знал, но это не подходит. Т. е. Вы меня не услышали
  А такое проектирование оправдано, т. к. это финансовое приложение, которое получает достаточно большой поток информации on-line и, если оно будет распылять время на создание/удаление различных форм в run-time, то клиенты могут не успеть вовремя выполнить нужную операцию, что может повлечь убытки. Всё-таки не нужно быть таким категоричным - мой подход имеет минусы, но он в данном случае оправдан.
 По поводу математики - поройтесь в интернете и узнаете, что в последние 5-6 лет на различных олимпиадах и конкурсах по программированию, среди представителей из Одессы, представители моего факультета всегда занимали места выше (даже очень часто призовые и первые, в том числе 2 моих одногрупника), чем из любого другого ВУЗа Одессы. Т. е., прикладная математика - это факультет, где учат математике и программированию. А программист, который не знает математики - его удел рисовать окошки или стать web-программистом.
 А что у Вас за ВУЗ такой ONAT? Одесская Национальная Академия ...?
 |  
|   | Вадим К (статус: Академик), 9 марта 2007, 15:45 [#6]:Знал, что вы с Одессы, я много чего знаю. Вуз - Академия связи., только не говорите, что это похой вуз. Каждый кулик своё болото хвалит.
 Призовые места. А не Обухов Петя случайно ваш одногрупник?
 Вы пишете:
 которое получает достаточно большой поток информации on-line и, если оно будет распылять время на создание/удаление различных форм в run-time
 Поверте, время на создание формы несоезмеримо мало по сравнению с запросом данных с сети (я так онлайн понимаю)
 Возможно форма при создании запрашивает данные с сети? Да, тогда создание формы долго. Но есть кеширование.
 Вы пишете:
 представители моего факультета всегда занимали места выше
 Т. е., прикладная математика - это факультет, где учат математике и программированию.
 Победа на олимпиадах и реальное программирование сложных систем вещи разные. Вы можете написать алгоритм вычисления вейвлета, какого нибудь интеграла, но когда дело доходит до оптимизации - труба.
 Сам был сведетелем, как математики сделали прогу с сложными расчётами. вылизали по самое нельзя. Куски кода на асме. Но тормозит. Попросили программера. Он посмотрел, добавил пару строк. и прирост оказался порядка 30-40%. Вот так, прям с воздуха.
 Догадайтесь, что он сделал.
 
 З.Ы. Мож в асе спишемся?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | mvp (статус: 4-ый класс), 9 марта 2007, 16:04 [#7]:Но вот и нашли общих знакомых  Петя Обухов мой одногрупник. Продолжаем дальше в аське
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |