C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (3) < [1] 2 3 >
MDI-приложение
Pan-SQL
Отправлено: 25.11.2004, 14:44


Не зарегистрирован








Здравствуйте! Ещё один вопрос по C++Builder. Я создал MDI-приложение. В нём имеются две формы. Вторая форма открывается при нажатии кнопки на первой форме. Когда я сворачиваю вторую форму, ее пиктограмма появляется в нижнем углу первой формы. Можно ли сделать так, чтобы её пиктограмма появлялась на панели задач Windows как в Wordе, когда открыто два документа. Заранее большое спасибо.
AVC
Отправлено: 25.11.2004, 15:25


Ветеран

Группа: Модератор
Сообщений: 1583



А поискать? Ужо обсуждалось (кажется летом).
Pan-SQL
Отправлено: 25.11.2004, 15:52


Не зарегистрирован







Я долго искал, так и не нашел. Если вас не затруднит, помогите, очень прошу
Guest
Отправлено: 25.11.2004, 15:59


Не зарегистрирован







Или парочку ключевых слов для поиска.
AVC
Отправлено: 25.11.2004, 16:08


Ветеран

Группа: Модератор
Сообщений: 1583



В тот момент времени не было искать smile.gif
Один из вариантов
CODE

-- h
protected:
virtual void __fastcall CreateParams (Controls::TCreateParams &Params);

-- cpp
void __fastcall TForm1::CreateParams (Controls::TCreateParams &Params)
{
TForm::CreateParams(Params);
if (Screen->FormCount > 1) Params.ExStyle = WS_EX_APPWINDOW;
}
Guest
Отправлено: 25.11.2004, 16:25


Не зарегистрирован







Когда я объявляю данную функцию в классе программа выдает ошибку.

[Linker Error] Unresolved external '__fastcall TForm1::CreateParams(Controls::TCreateParams&)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
AVC
Отправлено: 25.11.2004, 16:32


Ветеран

Группа: Модератор
Сообщений: 1583



A ваш класс точно назавается TForm1?
А в unit1.h строку добавили?
AVC
Отправлено: 25.11.2004, 16:37


Ветеран

Группа: Модератор
Сообщений: 1583



Понял. smile.gif
Эти строки нужно добавить к существующим формам.
Pan-SQL
Отправлено: 25.11.2004, 16:41


Не зарегистрирован







Я добавил описание данной функции в заголовочный файл формы Form1. А саму функцию — в файл реализации.
Pan-SQL
Отправлено: 25.11.2004, 16:51


Не зарегистрирован







Вообще копм завис. Если вам не сложно, вышлите мне исходный проект (версия C++Builder 6) на мой майл. Вот его адрес: StasPisarevsky@rambler.ru. Заранее благодарен.
AVC
Отправлено: 25.11.2004, 17:01


Ветеран

Группа: Модератор
Сообщений: 1583



"Ну барин ты задачки ставишь" smile.gif . Это делать надо. Сечас сделаю — вышлю, только у меня Builder 5.
AVC
Отправлено: 25.11.2004, 17:19


Ветеран

Группа: Модератор
Сообщений: 1583



Послал. Еще одно но — пример для GDI с MDI за вами (ну не работаю я с ними smile.gif )
Pan-SQL
Отправлено: 26.11.2004, 14:34


Не зарегистрирован







Вау!!! Получилось! Только вот как быть, когда открыто несколько форм.
Я не могу перейти к самой первой (исходной) форме, щелкая мышкой по ярлычку на панели задач Windows?
avc*
Отправлено: 26.11.2004, 15:22


Не зарегистрирован







Именно поэтому для GDI эта технология бесполезна biggrin.gif
AVC
Отправлено: 26.11.2004, 15:37


Ветеран

Группа: Модератор
Сообщений: 1583



Пардон. Не GDI а ShowModal.
Pan-SQL
Отправлено: 26.11.2004, 16:30


Не зарегистрирован







Можно узнать, имеется ли какое-нибудь решение?
AVC
Отправлено: 26.11.2004, 16:43


Ветеран

Группа: Модератор
Сообщений: 1583



Конечно. Вы же видите Office и Explorer biggrin.gif
Возможное решение отказ от ShowModal и переход на Show или попробовать в MDI
Pan-SOL
Отправлено: 26.11.2004, 16:50


Не зарегистрирован







Я попробоваал ShowModal заменил на Show. Такая же шняга.
AVC
Отправлено: 26.11.2004, 16:53


Ветеран

Группа: Модератор
Сообщений: 1583



Такая перделка кода на скорую руку дает почти правильный результат
CODE

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
TForm1 *frm = new TForm1(Application);
try {
frm->Visible = false;
frm->Top  = this->Top  + 10;
frm->Left = this->Left + 10;
frm->Show(); // frm->ShowModal();
}
__finally {;// delete frm;
}
}
Pan-SQL
Отправлено: 26.11.2004, 17:00


Не зарегистрирован







Если я вас прравильно поонял, речъ идет о приложениии MDI.
AVC
Отправлено: 26.11.2004, 17:12


Ветеран

Группа: Модератор
Сообщений: 1583



Нет. Речь идет о том примере, который я вам послал. О GDI.
Pan-SQL
Отправлено: 27.11.2004, 11:39


Не зарегистрирован







Я так понял, данный код нужно прописать в щелечке кнопки и все.
AVC
Отправлено: 27.11.2004, 14:06


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Я так понял, данный код нужно прописать в щелечке кнопки и все.

Для кнопки да, а в общем нет. Не забудьте добавить обработку события FormClose.

PS. Вам это действительно нужно? Если только с целью удивить юсера, то больше одного раз он не удивится. Лично меня окошки Offise раздражают — зря забивают нижнюю пнель. И без них у меня обычно открыто не менее 7-ми программ, не считая тех, что в трее.

На всякий случай — пример.

User Attached Image Скачать файл
taskbar1.rar


Pan-SQL
Отправлено: 27.11.2004, 14:26


Не зарегистрирован







Событие OnClose необходимо обрабатывать во всех имеющихся формах?

P.S. Дело в том, что мое приложение работает з базой данных и в связи с этим я счинаю необходимым обеспечить максимум удобств пользователю при работе с несколькими отчетными формами одновременно.
AVC
Отправлено: 27.11.2004, 15:31


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Событие OnClose необходимо обрабатывать во всех имеющихся формах?

Как хотите. Фишка в использовании параметра Action для возврата caFree;
Обычная схема при ShowModal: new -- ShowModal -- delete, а при Show: new -- Show вместо delete используется caFree при закрытиии.

Считаете необходимым — делайте. Может потом поделитесь опытом smile.gif . Если у вас "непересекающиеся" отчеты то все будет тип-топ в противном случае это такаааая головная боль. Этого же эффекта можно добиться дважды запустив приложение. Хотя поэкспериментировать с "многоокнностью" было бы интересно.
Pan-SQL
Отправлено: 29.11.2004, 13:39


Не зарегистрирован







Еще раз здравствуйте! Все получилось, работает замечательно, но возникла следующая проблема: приложение имеет три формы (Form1, Form2 и Form3). Первая форма (Form1) имеет пункт меню «Открыть» и команды — «Форма1», «Форма2» и «Форма3» соответственно. Например, я открыл две формы (их пиктограммы отобразились на панели задач Windows). Можно ли в этом случае основную пиктограмму приложения как-то скрыть, так как она вводит в заблуждение пользователя (при щелчке мышкой по ней ничего не происходит) или чтобы при щелчке по ней открывалась первая (исходная) форма приложения.
Заранее благодарен.
AVC
Отправлено: 29.11.2004, 15:51


Ветеран

Группа: Модератор
Сообщений: 1583



При методе Show все формы "работают" паралельно (не путать с многопоточностью). Дайте функциональную нагрузку форме 1 и работаете с ней дальше (а обработка случая когда пользователь несколько раз клацнет по "открыть форма 2" — предусмотрена?).
PS. Вы обратили внимание, что если закрыть главную форму — то, что вполне закономерно, умрут все остальные.
Pan-SQL
Отправлено: 29.11.2004, 16:13


Не зарегистрирован







Я не до конца понял ваш вопрос про обработчик события "Открыть|Форма2". Для открытия формы2 я пишу следующие:

Form2->Show();

При попытке пользователя открыть данную форму второй раз активизируется ранее открытая форма (что в принипе и должно происходить в моем случае)
AVC
Отправлено: 29.11.2004, 16:21


Ветеран

Группа: Модератор
Сообщений: 1583



Все правильно. Просто в том примере что я писал — вы бы получили еще один экземпляр формы 2.
Pan-SQL
  Отправлено: 30.11.2004, 12:30


Не зарегистрирован







Можно уточнить, под фразой "дать функциональную нагрузку форме 1" подразумевается открыть форму 1, или я ошибаюсь?
стр.: (3) < [1] 2 3 >
Вернуться в Вопросы программирования в C++Builder