Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Главная форма приложения


Автор: Avers 18.9.2008, 09:29
Возможно ли изменить свойство Application.MainForm во время работы прграммы?
А во время запуска? В Sourc'е
И как узнать (во время работы программы) какое значение приняло  Application.MainForm  в данный момент.

Автор: Poseidon 18.9.2008, 09:38
Можно в dpr поставить условие. Обязательно до Application.Run. Там, какая форма создается первой, та и главная.

Код
begin
Application.Initialize;
if < какое - то условие > then
   begin
     Application.CreateForm(TForm1, Form1);
     Application.CreateForm(TForm2, Form2);
   end
else
   begin
     Application.CreateForm(TForm2, Form2);
     Application.CreateForm(TForm1, Form1);
   end;
end.
Application.Run;

Автор: Avers 18.9.2008, 09:44
Это, конечно, вариант, но не всегда. 
Например, у меня есть главная форма (мне надо бы, чтобы она была главной), но чтобы ее создать нужно сначала создать ДатаМодуль, который эта форма использует. 
А обращения к ДатаМодулю по типу Application.MainForm.что_нужно без надобности.
Поэтому очень интересно изменить это свойство, когда формы уже созданы.

Автор: Poseidon 18.9.2008, 09:46
Цитата(Avers @  18.9.2008,  09:44 Найти цитируемый пост)
Поэтому очень интересно изменить это свойство, когда формы уже созданы.
Никак

Автор: CodeMonkey 18.9.2008, 10:19
Посмотрите:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=57386
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=58488
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=63763
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=63889
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=64736

И вообще рекомендую:
http://www.delphikingdom.ru/lyceum/seminar.asp?ID=6
http://forum.vingrad.ru/books/topic-179930.html  ;)

Автор: ama_kid 18.9.2008, 10:48
Цитата(Avers @  18.9.2008,  10:44 Найти цитируемый пост)
Поэтому очень интересно изменить это свойство, когда формы уже созданы. 
Оно, конечно, нельзя, но как говорится: если хочется - то можно  smile 
Код
procedure SetNewMainForm(AForm:TForm); assembler;
asm
  push ebx
  mov ebx,[Application]
  mov [ebx+68],eax
  pop ebx
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 SetNewMainForm(Form2);
end;


Добавлено через 43 секунды
правда, это ненадежный вариант и зависит от версии дельфей... (у мну 7-ка)

Автор: CodeMonkey 18.9.2008, 11:04
Ну вот нафига надо было это писать, а? Ведь нормальные варианты ещё не все посмотрели. Не учите людей плохому.

Автор: ama_kid 18.9.2008, 11:47
Цитата(CodeMonkey @  18.9.2008,  12:04 Найти цитируемый пост)
Ведь нормальные варианты ещё не все посмотрели. Не учите людей плохому. 
Все нормальные варианты по ссылкам, предложенным Вами, не отвечают на поставленный ТС-ом вопрос. Они лишь отвечают на вопросы типа: "как создать форму перед главной при запуске приложения", ответы на которые можно найти в любом учебнике. А вопрос был в другом - как динамически (по команде) менять главную форму приложения  в любой момент (что, в принципе, запрещено архитектурой). Я показал решение, пусть и не совсем корректное с точки зрения этой самой архитектуры, но вполне себе рабочее... Думаю, ТС сам разберётся, нужно ему применять "плохой" метод или нет...  smile 

Автор: CodeMonkey 18.9.2008, 12:02
Цитата(ama_kid @  18.9.2008,  11:47 Найти цитируемый пост)
Все нормальные варианты по ссылкам, предложенным Вами, не отвечают на поставленный ТС-ом вопрос


Но в том-то и дело, что ему и не нужен ответ на его вопрос.
Ему нужно решение его задачи (это далеко не одно и то же):

Цитата(Avers @  18.9.2008,  09:44 Найти цитируемый пост)
Например, у меня есть главная форма (мне надо бы, чтобы она была главной), но чтобы ее создать нужно сначала создать ДатаМодуль, который эта форма использует. 


Чуете разницу?  smile 

P.S. По поводу того, как же важно правильно сформулировать свою задачу, а не задать вопрос, согласно своему видению, см. http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=60356 smile

Добавлено через 5 минут и 2 секунды
P.S. Я просто сужу вот по этой теме: http://forum.vingrad.ru/forum/topic-228606.html и по тому, что тема расположена в разделе для новичков. И я заключаю, что автору вопроса на самом деле не нужно менять главную форму приложения, а создать какую-либо форму до создания главной. И пытаюсь наставить его на путь истинный, вместо того, чтобы уводить в сторону, давая ему то, что он хочет (хотя, на самом деле, ему оно не нужно).

Автор: Avers 19.9.2008, 08:36
Всем спасибо за ответы)
В частности, мне действительно нужен был ответ на вопрос
Цитата

Поэтому очень интересно изменить это свойство, когда формы уже созданы.

Проблема создания форм в иной очередности, очевидно, имеет решения... и не мало. Надо посидеть и подумать. 
На мой взгляд это тоже не совсем comme il faut - "обманывать" приложение, обходя его требования (приложению нужен ДатаМодуль первым, значит нужен... хотя...). smile
Так что и ответ ama_kid хорош. Пригодиться smile

У меня вообще планируется главную форму брать из пакета .bpl. (о подобном написано все там же, в королевстве дельфи - статья "Еще раз о Plugin's"), а это дает чуть больше простора для очередности. 

И все же.... жаль, что нельзя (номинально) менять главную форму приложения во время работы оного ((

Автор: Akella 20.9.2008, 12:06
Цитата(Avers @  18.9.2008,  09:44 Найти цитируемый пост)
Поэтому очень интересно изменить это свойство, когда формы уже созданы. 


Цитата(Poseidon @  18.9.2008,  09:46 Найти цитируемый пост)
Никак

почему никак? Во так:
Код

procedure SetAsMainForm(aForm:TForm);
 var
   P:Pointer;
 begin
   P := @Application.Mainform;
   Pointer(P^) := aForm;
 end;



Вот так можно использовать
Код

procedure TfmLogon.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SetAsMainForm(fmMain);
  fmMain.Show;
end;


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)