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
|
В тот момент времени не было искать
Один из вариантов
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
|
Понял.
Эти строки нужно добавить к существующим формам.
|
|
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
|
"Ну барин ты задачки ставишь" . Это делать надо. Сечас сделаю — вышлю, только у меня Builder 5. |
|
AVC |
Отправлено: 25.11.2004, 17:19 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Послал. Еще одно но — пример для GDI с MDI за вами (ну не работаю я с ними ) |
|
Pan-SQL |
Отправлено: 26.11.2004, 14:34 |
|
Не зарегистрирован
|
Вау!!! Получилось! Только вот как быть, когда открыто несколько форм.
Я не могу перейти к самой первой (исходной) форме, щелкая мышкой по ярлычку на панели задач Windows? |
|
avc* |
Отправлено: 26.11.2004, 15:22 |
|
Не зарегистрирован
|
Именно поэтому для GDI эта технология бесполезна |
|
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
Возможное решение отказ от 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-ми программ, не считая тех, что в трее.
На всякий случай — пример.
|
|
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 при закрытиии.
Считаете необходимым — делайте. Может потом поделитесь опытом . Если у вас "непересекающиеся" отчеты то все будет тип-топ в противном случае это такаааая головная боль. Этого же эффекта можно добиться дважды запустив приложение. Хотя поэкспериментировать с "многоокнностью" было бы интересно. |
|
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, или я ошибаюсь? |
|