|
Вопрос # 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;
- //onClose
- procedure 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]:
Но вот и нашли общих знакомых Петя Обухов мой одногрупник.
Продолжаем дальше в аське
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|