Mack |
Отправлено: 18.01.2006, 18:37 |
|
Не зарегистрирован
|
Здравствуйте еще раз!
Уж простите за вопрос новичка
У меня вот какая задача: Мне нужно заполнить TTreeView нодами и при нажатии на ноде (TTreeNode) нужно вызывать формы. Но вот что лучше поместить в свойство Data у нода и как потом вызвать форму не пойму Может можно вызывать формы по имени? Или надо передавать объект формы? Помогите плиз разобраться.
Заранее благодарен.
|
|
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 |
Тоесть вообще нет возможности передать объект, инициализировать и выполнить?
|
Есть, но для этого его нужно сначала создать. (инициализировать == активировать?) |
|
olegenty |
Отправлено: 19.01.2006, 16:37 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
MDI-child не может быть невидимым, в том-то и фокус.
|
|
Mack |
Отправлено: 19.01.2006, 17:24 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
Да я так и сделал как советовали! Хотя я думал что за спрос не бьют! Однако! Но не смотря на это у меня возник еще один вопрос ) Я в событии OnCreate хочу заполнить ну скажем тоже самый Tree, но у меня не выходит, потому как я понял что обратиться к сонтролу еще нельзя так как Form->Tree->Items->Add(...) — Form еще все NULL. Подскажите как быть? |
|
Mack |
Отправлено: 19.01.2006, 17:31 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
Упс! Прошу прощения это я облажался Если открыватьформу через new — то действительно в OnCreate она еще не доступна а только в OnPaint а если через Application->CreateForm(..) — то все ок!
Всем спасибо! |
|
Grigoriy |
Отправлено: 19.01.2006, 21:53 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
А можно в Node->Data хранить указатель на указатель на форму.
|
|