Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2011, 22:24   #1
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию Проблема отображения главной формы над другими

Может кто знает как обуздать следующую ситуацию (D 2009).

Главная форма обычная: FormStale = fsNormal.
Из главной формы динамически создаются несколько других не модальных одного класса.
FormStale = fsNormal, BorderStyle = bsSizeToolWin (впрочем, последнее не влияет на решение проблемы).

После создания динамической формы она автоматом становится активной и частично перекрывает главную (динамически созданные формы могут иметь разные размеры и перекрывают главную по разному).

Проблема.
При активации главной формы (тыкаем мышкой в видимую ее часть) она становиться активной, но не вытаскивается поверх той, которая была ранее активной. Т.е. все равно главная перекрыта созданной формой.
Хотелось чтобы главная при активации была как говорится "stay on top".

Но FormStyle = fsStayOnTop, в принципе, проблему не решают.
Попытка была такая: при активации главной формы (в OnActivate) присвоить FormStyle = fsStayOnTop, а при создании динамической формы возвращать значение в fsNormal. И на первый взгляд это даже работает, но только на первый взгляд. При создании динамических форм тыкание мышки в главную выносит ее поверх всех созданных, но только если не трогать те созданные. Стоит только ткнуть в любую созданную форму и на этом эффект перекрытия главной формы остается уже постоянно.
fsStayOnTop главной при ее активации как бы не срабатывает и она все равно перекрыта другими.

Еще неприятность: "stay on top" главной формы не требуется и только мешает, т.е. принципиально не хотелось бы применять;

---
Обнаружил, что в D 7 такого эффекта не наблюдается. Главная форма при активации прилежно выползает поверх всех других.

Последний раз редактировалось Прик; 22.01.2011 в 22:37. Причина: Уточнение
Прик вне форума Ответить с цитированием
Старый 23.01.2011, 12:21   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Может попробывать
Код:
procedure TfrmMain.FormActivate(Sender: TObject);
begin
  frmMain.BringToFront;
end;
Sibedir вне форума Ответить с цитированием
Старый 23.01.2011, 12:57   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В первом посте не отметил, что и BringToFront тоже не помогает. Испытано. Да этот метод и действует только на компоненты формы, к форме не применим.
Для большего понимания проблемы картинка. На ней видно, что главная форма активна, а перед этим созданная - нет. Тем не менее главная форма перекрыта.
Изображения
Тип файла: gif ex.gif (16.6 Кб, 84 просмотров)
Прик вне форума Ответить с цитированием
Старый 23.01.2011, 13:03   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

покажите как создаете и показываете формы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.01.2011, 13:36   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure TForm1.DBGridEh1DblClick(Sender: TObject);
var N : string;
begin
  N := ADOQuery1.FieldValues['TableName'];
  if N <> '' then begin
    if not IsFormOpen(N) then begin
      frmRecords := TfrmRecords.Create(Application);
      frmRecords.Init(N);
      frmRecords.Show;
    end;
  end;
end;
В методе Init динамической формы нет ничего такого, чтобы влияло на появление формы, кроме вычисление ее размеров.

Последний раз редактировалось Прик; 23.01.2011 в 13:50.
Прик вне форума Ответить с цитированием
Старый 23.01.2011, 14:47   #6
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
frmRecords := TfrmRecords.Create(Application);
Замените на SELF...
asmodey1 вне форума Ответить с цитированием
Старый 23.01.2011, 16:42   #7
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Пытал и Self, и nil. Результат один - все то же самое, главная форма перекрывается.
Хм, где же собака зарылась?..
Прик вне форума Ответить с цитированием
Старый 23.01.2011, 23:30   #8
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Ну не знаю...
Я сделал 3 формы, каждая создается и показывается из предыдущей. И все нормально, если у них у всех FormStyle=fsNormal, а не fsStayOnTop. Ни одна из них не торчит поверх главной...
asmodey1 вне форума Ответить с цитированием
Старый 24.01.2011, 09:00   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Кто работает с D 2009 компильните приложенный примитивный проект, в котором проявляется проблемный эффект (во всяком случае, у меня).
Версии:
Delphi® 2009 Version 12.0.3170.16989
Windows XP (Build 2600: Service Pack 3). Обновляемый через Windows Update.
Вложения
Тип файла: zip simple_prj.zip (5.1 Кб, 11 просмотров)
Прик вне форума Ответить с цитированием
Старый 24.01.2011, 11:17   #10
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Компильнул в Д7 - все нормально, только в проекте закомментировал строку
Application.MainFormOnTaskbar := True;
asmodey1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неглавная форма всегда над главной. Как исправить? TwiX Общие вопросы Delphi 19 03.11.2012 17:17
Преимуществах delphi над другими языками nmtr Софт 19 16.08.2010 14:11
Как программно закрыть все открытые модальные формы перед сворачиванием главной формы в трей? SkAndrew Общие вопросы Delphi 8 27.01.2010 22:44
Найти минимум из элементов над главной диагональю Mashinegunner Общие вопросы C/C++ 1 27.11.2009 23:40
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00