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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить неглавн. форму вести себя как главн. 
:(
    Опции темы
ilyalyu
Дата 13.12.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Главная форма определяется свойством MainForm компоненты TApplication. Обычно, это первая форма которая создается в приложении с помощью функции Application.CreateForm. Во время выполнения программы главная форма не может быть изменена.

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

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

1. Когда я нажимаю на значок свернуть, форма 2 сворачивается, но затем снова разворачивается. При этом так происходит только если не активирована ни одна другая форма. Если же активирована еще одна форма, например, форма 3, то форма 2 сворачивается, а фокус смещается на форму 3.

2. Когда я нажимаю правой кнопкой мышки на значок формы на панели задач, не появляется меню, как для обычных приложений.

Если кто пытался решить аналогичную задачу и сталкивался с такими проблемами, напишите.
PM MAIL   Вверх
x77
Дата 13.12.2006, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а что мешает использовать по назначению главную форму? 

просто там очень много всяких штук повылазит сразу, лучше основную форму использовать именно как основную, а вот всё остальное - эмулировать.

можно написать так, например:
Код

...
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);

  Application.ShowMainForm := FALSE;
  Form2.Visible := TRUE;

  Application.Run;
end.


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

я пока не совсем понял, что требуется получить в итоге.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
ilyalyu
Дата 13.12.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ок. Поясню. Я работаю над 2 программами - чатом и мессенджером (на подобии аськи). Нетрудно догадаться, что они на 90% перекрываются. Поэтому я их объеденил в одну программу, но в зависимости от того, что я хочу получить, главным окном должен быть либо окно чата либо либо окно со списком контактов. Проблема в том, что есть несколько компонент, которые должны находиться именно на главной форме, и мне их приходится постоянно переносить с одной формы на другую. Поэтому я решил создать невидимую главную форму и поместить туда все такие компоненты. Как говорится, лучше иметь один раз большой геморой, чем постоянно сталкиваться с одним и тем же маленьким геморойчиком.

Проблем я не добивался - сами возникли smile
PM MAIL   Вверх
x77
Дата 13.12.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ilyalyu, почему бы не вынести все общие компоненты в модуль данных?


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
ilyalyu
Дата 13.12.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 х77:

Это я уже сделал:

Код

Application.ShowMainForm := FALSE;
 Form2.Visible := TRUE;


Окно приложения с панели задач убрал:
Код

ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOW);


Окно формы на панель задач поместил:
Код

procedure TAppWindow.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := GetDesktopWindow;
  Params.ExStyle   := Params.ExStyle or WS_EX_APPWINDOW
end;


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

Добавлено @ 15:41 
Цитата(x77 @ 13.12.2006,  15:35)
ilyalyu, почему бы не вынести все общие компоненты в модуль данных?

А как это делается? Подскажите. Сейчас сам попробую поискать..
PM MAIL   Вверх
Sunvas
Дата 13.12.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ilyalyu @  13.12.2006,  13:25 Найти цитируемый пост)
Мне нужно сделать главную форму невидимой и заставить неглавную форму (допустим форму 2) действовать в точности как главная.

А какая для тебя разница между главно и неглавной формой?? Главная форма - та, которая создается первой.


Цитата(ilyalyu @  13.12.2006,  13:25 Найти цитируемый пост)
1. Когда я нажимаю на значок свернуть, форма 2 сворачивается, но затем снова разворачивается. При этом так происходит только если не активирована ни одна другая форма. Если же активирована еще одна форма, например, форма 3, то форма 2 сворачивается, а фокус смещается на форму 3.

Отлавливай сообщение минимизации и делай так: application.minimize;
Цитата(ilyalyu @  13.12.2006,  13:25 Найти цитируемый пост)
2. Когда я нажимаю правой кнопкой мышки на значок формы на панели задач, не появляется меню, как для обычных приложений.

А что ты вкладываешь в понятие "меню для обычных приложений"?


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


Шустрый
*


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

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



2 x77

Модуль данных нашел, но похоже мне уже будет проще доделать все как есть.

2 Sunvas

Спасибо, попробую использовать application.minimize

Я имею ввиду то меню, которое в которое можно  забраться, когда приложение свернуто. Такое меню только одно smile
PM MAIL   Вверх
x77
Дата 13.12.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



боюсь, я всё равно чего-то не понимаю smile

две формы, одна основная. на ней все компоненты. вместо Close говорим ей Hide, и все компоненты будут всегда доступны, независимо от того, на экране форма или нет.

мне кажется, что все эти пляски с бубном вокруг MainForm - просто излишни.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Lence
Дата 13.12.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


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

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



попробуй так сделать 

для первой формы 
AlphaBlend надо включить, хочешь программно хочешь инспекторе

Код

 ShowWindow(Application.Handle, SW_HIDE); // не будет на панели задачь окошка первой формы - лучше повесить на таймер это свойство

form1.AlphaBlendValue = 0 ; // тогда точно не будет первой формы


для второй формы 
Код

///  если тебе надо чтоб приложение закрывалось сразу 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form1.Close;
end;

...
/// это сделает твоей второй форме окно на панели задач и оно будет нормально сворачивать, не в угол
//  на событие  TForm2.FormShow - будет появляться окошко программы и будет тебе меню нормальное появляться

procedure TForm2.FormShow(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE,
   GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
end;


Это сообщение отредактировал(а) Lence - 13.12.2006, 16:41
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
ilyalyu
Дата 13.12.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2  x77

Все-таки решил перенести все в DataModule, провозился час, но теперь все заработало как надо. СПАСИБО.
К сожалению, при самообучении часто возникают пробелы в элементарных вопросах smile
PM MAIL   Вверх
x77
Дата 13.12.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ilyalyu, не за что ;)


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Sunvas
Дата 13.12.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Lence @  13.12.2006,  16:30 Найти цитируемый пост)
form1.AlphaBlendValue = 0 ; // тогда точно не будет первой формы

Чистой воды бред! Делать форму прозрачно только для того, чтобы ее не было видно это чревато тем, что форма все еще может быть активна но невидима! К тому же это не будет работать на Вин32.

Если хочется сделать главную форму невидимой при старте приложения то лучше чем в Oncreate прописать application.showmainform:=false; не найти!




Цитата(ilyalyu @  13.12.2006,  16:43 Найти цитируемый пост)
К сожалению, при самообучении часто возникают пробелы в элементарных вопросах 

Хорошо, что их есть кому задавать! smile 


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


Эксперт
***


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

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



Цитата(Sunvas @  13.12.2006,  18:37 Найти цитируемый пост)
form1.AlphaBlendValue = 0


ещё можно попробовать перепрограммировать лучевую пушку монитора так, чтобы её лучи не высвечивали пиксели, принадлежащие "спрятанной" форме. 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Akella
Дата 14.12.2006, 09:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Код

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;

PM MAIL   Вверх
Student00
Дата 16.5.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ситуация такая. Есть готовая программа, написанная на delphi 7.
Возникла необходимость сделать так, чтобы при запуске первое что запускалось - это окошко для ввода логина и пароля.
Т.е. необходимо теперь чтобы главная форма -  form1 стала второй (все остальные - подчиненный соотвественно 3, 4...), а новая созданная форма стала первой и именно она была стартовой.

Переделать всю программу если чесно не очень охота...
Ребят, подскажите пожалуйста как сделать чтобы любая не главная форма (form2, 3, 4...) - стала главной и стартовой, а все остальные (и в частности form1) запускались в последствии именно с неё?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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