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

 
Вопрос по формам
Mack
Отправлено: 18.01.2006, 18:37


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







Здравствуйте еще раз!
Уж простите за вопрос новичка smile.gif
У меня вот какая задача: Мне нужно заполнить TTreeView нодами и при нажатии на ноде (TTreeNode) нужно вызывать формы. Но вот что лучше поместить в свойство Data у нода и как потом вызвать форму не пойму smile.gif Может можно вызывать формы по имени? Или надо передавать объект формы? Помогите плиз разобраться.

Заранее благодарен.
Konstantine
Отправлено: 19.01.2006, 09:56


Мастер участка

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



мало данных
объекты форм существуют? если да — то проще повводить их в Data а потом по нажатию:
CODE
((TForm*)(Node->Data))->Show();

для вызова по имени — напрямую не получится — а например через switch
Mack
Отправлено: 19.01.2006, 10:50


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







Спасибо! Самое оно! Объекты есть. Тоесть мне надо в Data засунуть указатель на форму?
CODE

TForm *Form;

TreeNode->Data = Form;


Так?
gvg
Отправлено: 19.01.2006, 11:47


Машинист паровоза

Группа: Участник
Сообщений: 222



TreeNode->Data = (void*)Form;
Mack
Отправлено: 19.01.2006, 12:32


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







И вот какой вопрос еще. В MDI приложении как правильно вызвать эту форму? Form->Show() не подходит.
Mack
Отправлено: 19.01.2006, 12:59


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







И не подскажете как вообще работать с MDI? Если форму делаешь MDIChild то она сразу показывается при старте главной формы. Я боролся с этим в файле проекта коментировал строчку Application->CreateForm(__classid(TDM), &DM); Но мне кажется так не совсем верно, потому как потом приходится делать конструктор этой формы DM=new TDM(Application);
olegenty
Отправлено: 19.01.2006, 14:08


Ветеран

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



всё просто, при работе с MDI, если не требуется обратного, MDI-дети должны быть безжалостно вытерты из списка Autocreate Forms и создаваться явно. а для того, чтобы при закрытии они не минимизировались, а реально закрывались, в OnClose Action = caFree; (опять же, если не требуется обратного).
Mack
Отправлено: 19.01.2006, 14:59


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







Да, это я понял, спасибо! Но мне вот что не понятно, если я передаю ссылку на форму:
CODE

TTree *Node;
Node->Data = (void*)Form1;
........................
А потом пытаюсь ее вызвать:
TreeNode *Node;
Node = TreeView1->Selected;
вот дальше что писать?
((TForm*)(Node->Data))->Show(); — не может вызваться без конструктора (new)!!!
Application->CreateForm(...) — не знаю как выполнить!!!
Вот мне именно надо понять как мне теперь вызвать-то форму переданную в Node->Data??? Заранее конструктора формы не происходит так как это MDI.
olegenty
Отправлено: 19.01.2006, 15:14


Ветеран

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



всё проще намного. в Data храни НЕ УКАЗАТЕЛЬ НА ФОРМУ, а нечто, с помощью чего сможешь определить, какое именно MDI окно создавать. его и создавай.

но если у тебя там дерево, значит, вероятнее всего, на экране будет отображаться только один экземпляр каждого MDI-Child класса. а это значит, что нет необходимости в MDI, можно обойтись обычной формой и встраивать её в форму-контейнер посредством установки св-ва parent.
Mack
Отправлено: 19.01.2006, 15:28


Ученик-кочегар

Группа: Участник
Сообщений: 3



Ясно, спасибо! Тоесть вообще нет возможности передать объект, инициализировать и выполнить?
Guest
Отправлено: 19.01.2006, 16:02


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







QUOTE

Node->Data = (void*)Form1;
вот дальше что писать?
((TForm*)(Node->Data))->Show(); — не может вызваться без конструктора (new)!!!
Application->CreateForm(...) — не знаю как выполнить!!!

Блин, подумайте сами — вы же пытаетесь хранить указатель на несозданный объект. Можно поробовать создать все формы и управлять видимостью — порочный путь или как писал olegenty хранить там что то типа ярлычка и по нему (switch или if elseif) создавать новый объект класса формы.

QUOTE

Тоесть вообще нет возможности передать объект, инициализировать и выполнить?

Есть, но для этого его нужно сначала создать. smile.gif (инициализировать == активировать?)
olegenty
Отправлено: 19.01.2006, 16:37


Ветеран

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



MDI-child не может быть невидимым, в том-то и фокус.
Mack
Отправлено: 19.01.2006, 17:24


Ученик-кочегар

Группа: Участник
Сообщений: 3



Да я так и сделал как советовали! Хотя я думал что за спрос не бьют! Однако! Но не смотря на это у меня возник еще один вопрос smile.gif) Я в событии OnCreate хочу заполнить ну скажем тоже самый Tree, но у меня не выходит, потому как я понял что обратиться к сонтролу еще нельзя так как Form->Tree->Items->Add(...) — Form еще все NULL. Подскажите как быть?
Mack
Отправлено: 19.01.2006, 17:31


Ученик-кочегар

Группа: Участник
Сообщений: 3



Упс! Прошу прощения это я облажался smile.gif Если открыватьформу через new — то действительно в OnCreate она еще не доступна а только в OnPaint а если через Application->CreateForm(..) — то все ок!

Всем спасибо!
Grigoriy
Отправлено: 19.01.2006, 21:53


Мастер участка

Группа: Участник
Сообщений: 381



А можно в Node->Data хранить указатель на указатель на форму. smile.gif

Вернуться в Вопросы программирования в C++Builder