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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при создании экземпляров одного окна. Главным становится экземпляр. Почему? 
:(
    Опции темы
Компоратор
Дата 29.4.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В приложении есть две формы - Form1 и Form2. Главная - Form1.
В событии OnCreate первой формы создается экземпляр формы Form2:

Код

procedure TForm1.FormCreate(Sender: TObject);
var
  CloneWnd : TForm2;
begin
  Application.CreateForm(TForm2,CloneWnd);
  CloneWnd.Show;
end;


В результате данной операции на экран выведется только вторая форма, к тому же она станет главной (Application.MainForm). Скажет мне кто-нибудь, из-за чего так? Мне нужно, чтоб форма Form1 по прежнему оставалась главной. 

PM MAIL ICQ   Вверх
Guedda
Дата 29.4.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

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



Ну создай форму позже, например в TForm1.Show;


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Компоратор
Дата 29.4.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Ну создай форму позже, например в TForm1.Show; 


Еслиб все было так просто... Мне нужно  чтоб главную форму видно не было.
  Application.ShowMainForm := false;

Впринципе я нашел один способ - через таймер:

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  CloneWnd : TForm2;
begin
   Application.CreateForm(TForm2,CloneWnd);
   CloneWnd.Show;
   Timer1.Enabled := false;
end;



Это сообщение отредактировал(а) Компоратор - 30.4.2007, 03:55
PM MAIL ICQ   Вверх
Sunvas
Дата 1.5.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Компоратор, через таймер это как-то бредово.
Лучше после создания второй формы - показывай ее, а форму 1 скрывай.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Компоратор
Дата 1.5.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Компоратор, через таймер это как-то бредово.


Бредово, речи нет. Ну как еще не поизвращаешся, коли выхода другого не видишь...
PM MAIL ICQ   Вверх
Sunvas
Дата 1.5.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



А чем не подходит мой вариант:
Код

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.ShowMainForm:=false;
  Application.CreateForm(TForm2, Form2);
  form2.Show;
  Application.Run;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Компоратор
Дата 5.5.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А чем не подходит мой вариант


Дело в том, что мне нужно чтобы была возможность вторую форму вообще не показывать. А количество экземпляров второй формы произвольно - зависит от количества файлов в папке.
PM MAIL ICQ   Вверх
ACiDXX
Дата 5.5.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



после загрузке второй формы добавь апи
SetActiveWindow

Это сообщение отредактировал(а) ACiDXX - 5.5.2007, 09:31
PM MAIL   Вверх
ama_kid
Дата 5.5.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

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



Цитата(Компоратор @  29.4.2007,  09:16 Найти цитируемый пост)
В результате данной операции на экран выведется только вторая форма, к тому же она станет главной (Application.MainForm). Скажет мне кто-нибудь, из-за чего так? Мне нужно, чтоб форма Form1 по прежнему оставалась главной. 

Вот так форма 2 не будет становиться главной и создадутся обе формы:
Код
procedure TForm1.FormCreate(Sender: TObject);
var
 CloneWnd:TForm2;
begin
  CloneWnd:=TForm2.Create(Self);
  CloneWnd.Show;
end;



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Компоратор
Дата 7.5.2007, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так, ну с самой проблемой вроде разобрались. На самом деле мне бы хотелось узнать, почему так происходит? Не могу догнать. Ладно еслиб был пресловутый Access Violation Error, а тут такие кульбиты...
PM MAIL ICQ   Вверх
ama_kid
Дата 7.5.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

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



А что мешает оттрассировать код? Вот смотри:
Код
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Self);  // Вот здесь вызывается твой OnCreate второй формы
  except
    TComponent(Reference) := nil;
    raise;
  end;
  if (FMainForm = nil) and (Instance is TForm) then // Вот здесь идет присвоение
  begin                                             // главной формы
    TForm(Instance).HandleNeeded;
    FMainForm := TForm(Instance);
  end;
end;
Как видишь, присвоение главной формы у объекта Application идет после вызова OnCreate второй формы, которая и "успевает" стать главной благодаря тому, что в момент исполнения её вызова CreateForm FMainForm еще равно nil.


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
it_medved
Дата 7.5.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



можно гораздо проще
Application.ShowWindow(SW_HIDE);
и все, одной строкой smile
PM MAIL WWW   Вверх
Компоратор
Дата 8.5.2007, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А что мешает оттрассировать код?


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

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

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

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

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


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

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


 




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


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

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