Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модальная MDIChild, Возможно ли это? 
:(
    Опции темы
StayAtHome
Дата 4.4.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Возникла потребность отобразить модально MDIChild-форму. C удивлением, обнаружил, что ShowModal не работает, т к Child-форма видима сразу после создания Кроме того ей вообще невозможно установить Visible:=False
Мож кто прояснит, зачем существует такое ограничение, и как его обойти?

Это сообщение отредактировал(а) StayAtHome - 4.4.2005, 02:21
PM MAIL WWW ICQ YIM   Вверх
FRAGNATIC
Дата 4.4.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Цитата
ей вообще невозможно установить Visible:=False
убрать форму из автосоздания и создовать при необходимости
PM MAIL   Вверх
StayAtHome
Дата 5.4.2005, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Я так и сделал, но после создания формы и ДО ее появления на экране, мне нужно выполнить кое-какой код, а MDIChild сразу отображается после Create (при установке FormStyle=fsMDIChild). И ShowModal все равно в результате не пашет.

Это сообщение отредактировал(а) StayAtHome - 5.4.2005, 01:07
PM MAIL WWW ICQ YIM   Вверх
<Spawn>
Дата 5.4.2005, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Можешь явным образом изменить видимость у окна:

Код

  ShowWindow(Handle, SW_HIDE);


и потом восстановить, когда нужно будет

Код

  ShowWindow(Handle, SW_SHOW);



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Girder
Дата 5.4.2005, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



1. Убераеш свою MDIChild форму из автосоздания: (MainMenu)Project->Options->Forms. Там её перебрасываеш в: Available forms
2. Переключаешся на свою MDIChild форму и дописываеш в описание класса(пусть например твой класс формы для MDIChild называется TForm2):
Код
...
 TForm2 = class(TForm)
    ...
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  private
    { Private declarations }
  public
...

3. Реализуеш енту процедуру:
Код
procedure TForm2.CreateWindowHandle(const Params: TCreateParams);
var Comp:TForm2;
begin
 inherited;
 Comp:=TForm2(Application.Components[Application.ComponentCount-1]);
 Comp.Visible:=false;
end;



4.Ну и например создание ентой формы:
Код
uses Unit2; //ссылка на модуль MDIChild формы

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var vv:TForm2;
begin
 vv:=TForm2.Create(Application);
 //... Здесь форма не видна
 vv.Memo1.Lines.Add('123123'); //Типо что-то заполняем на MDIChild форме
 Caption:='2';
 Sleep(2000);
 Caption:='0';
 //.. Здесь форма до сих пор не видна
 vv.Show;
end;


Удачи.

Это сообщение отредактировал(а) Girder - 5.4.2005, 11:45


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
StayAtHome
Дата 6.4.2005, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Исчерпывающий ответ. Спасибо! smile
С Show все работает, но ShowModal использовать так и не удалось. Там в первой же строке реализации черным по белому:
Код
  if Visible or not Enabled or (fsModal in FFormState) or
    (FormStyle = fsMDIChild) then
    raise EInvalidOperation.Create(SCannotShowModal);

Увы, вопрос остается открытым.
PM MAIL WWW ICQ YIM   Вверх
Петрович
Дата 6.4.2005, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Не совсем понятно зачем бы делать ShowModal для MDI формы. Дело в том, что у MDI форм очень сложные взаимоотношения с другими окнами.
Если уж есть какая-то необходимость, то перед созданием этого окна сделай его не MDI.
Ааа. Кажется понял. Ты хочешь уже созданное окно отображать то модально, то нет. Тогда тебе не повезло.
Правда мне все равно не понятно зачем такое делать. По своей природе, дочернии MDI-окна равноправны. А ты хочешь сделать как всегда: все равны, но некоторые ровнее. smile


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 6.4.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата(StayAtHome @ 6.4.2005, 02:20)
Увы, вопрос остается открытым.
smile

Создаем "модульную" MDIChild форму:
Код
procedure TForm1.CreateShowModal();
var vv:TForm2;
    i:integer;
begin
 vv:=TForm2.Create(Application);
 vv.Show;
 for i:=0 to MDIChildCount-1 do
  EnableWindow(MDIChildren[i].Handle,false);
 EnableWindow(vv.Handle,true);
end;


И гл́авное! Не забываем востановить все при закрытии "модальной" MDIChild формы smile :
Код
uses Unit1;

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
begin
 Action:=caFree;
 for i:=0 to Form1.MDIChildCount-1 do
  EnableWindow(Form1.MDIChildren[i].Handle,true);
end;


Это сообщение отредактировал(а) Girder - 6.4.2005, 12:03


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
StayAtHome
Дата 6.4.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Петрович
Ты угадал, я создаю формы-экземпляры одного класса, но некоторые -- модальные, а некоторые нет. Такой изврат нужен для отображения таблиц БД связанных по Foreign Key. Т. е. при добавлении записи в таблицу в которой есть FK на другую, пользователь значение поля по которому создан FK сможет выбирать из формы-справочника, которая, естественно, должна отображаться в модальном режиме. Если же мне нужно просто посмотреть/поправить справочники -- та же форма (точнее другой ее экземпляр) должна открываться в обычном режиме (немодальном).
Возможно это все дикий изврат, но мне показалось так удобнее и мне и пользователю. smile

Girder
Это уже интересней! (аж стыдно, что сам не догадался) Попробую. Пока сделал на OnDeactivate
Код

procedure MDIChildFormDeactivate(Sender: TObject);
begin
if IsModal then
  begin
  BringToFront;
  SetFocus;
  end;
end;

PM MAIL WWW ICQ YIM   Вверх
Medved
Дата 10.4.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Цитата
Правда мне все равно не понятно зачем такое делать. По своей природе, дочернии MDI-окна равноправны. А ты хочешь сделать как всегда: все равны, но некоторые ровнее. smile


Согласен на сто процетов. smile

Я так и не понимаю зачем это делать. В этом решении больше геммороя, чер практической пользы.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
icc
Дата 11.4.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.4.2005

Репутация: нет
Всего: нет



Не знаю насколько это правильно, но я использую такую конструкцию.
Форма создается при вызове.

with TEmterpriseCard.Create(Application) do
begin
// код до создания
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.