| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Вызов функций из другого модуля |
| Автор: Mal Hack 5.8.2005, 21:55 | ||||
| В делфи такое делал, но описывая класс во втором модуле. Задача такова. Есть модуль с формой. Хочу сделать отдельный модуль, который программными средствами будет создават кнопочки и т.п. на первой форме. Все описал. Модуль вот так:
модуль с формное начинается так:
Вот на месте ************ хочу вызвать BBCode_Create из второго модуля. Можно ли это как-ть сделать не описывая класса и не создавая объекта с нужной функцией? Задача по русски: хочу вынести генерацию элементов интерфейса в отдельный файл, оставив на файле с формой только рабочий код, основной опять же. |
| Автор: Vitalik 5.8.2005, 23:03 |
| Может добавить объявление функции в h-файл?.. Или во втором файле написать: "#include "Unit1.cpp"? А также можно объявление формы в h-файл засунуть P.S. Билдер очень давно не юзал, поэтому могу ошибаться |
| Автор: Vitalik 5.8.2005, 23:22 | ||||||
| Да... Чтобы не было пустых слов - сейчас проверил. Всё работает 1). Файл Unit1.cpp На форме находится панель с именем BBCodePanel.
2). Файл Unit2.cpp: Только добавил задание свойства Parent. Но это обязательно !
3). файл Unit2.h: Просто добавил объявление нашей функции, чтобы Unit1.cpp её видел
Всё готово http://forum.sources.ru/smiles/Main/wink.gif Удачи! |
| Автор: Mal Hack 6.8.2005, 00:05 | ||
Vitalik а указание тут:
родителя не достаточно? Хотя в Делфи всегда Parent писал Ща буду тестить, но заранее огромное спасибо. Ты меня еще первым постом навел на мою ошибку. Добавлено @ 00:11 Vitalik огромное спасибо, разобрался. Вот еще два вопросика из этой темы 1. Можно лим обойтись для второго модуля наличием только .cpp файла, или обязательно наличие .h? 2. __fastcall чем отличается от обычной функции. ЗЫ: Есть книжка Архангельского, но толи я не внимательно смотрел, толи там нет этой информации. Может есть сслки под рукой? |
| Автор: Vitalik 6.8.2005, 09:55 | ||||||
При создании vcl-компонента в качестве параметра указывается не родитель, а владелец (Owner). Чтобы новые кнопочки отобразились на форме нужно обязательно самому задать их родителя (Parent)
Теоретически можно Но я попробовал и у меня сразу AV выскочил при обращении к форме...
Та сильно так ничем и не отличается. Только способом передачи параметром (на "низком" уровне). Для функций-обработчиков событий этот сопособ вроде бы как считается быстрее, но это реально мизер Это в основном нужно при написании своих dll-ек. То есть там действительно нужно одинаково задать способ передачи параметров... |
| Автор: Mal Hack 6.8.2005, 12:53 | ||||||||
Ах вот оно что... А смысл указания Owner'a тогда? Тут ночью еще два вопроса появилолсь. 1. Есть ли в Си аналог with obj do... как в Делфи? Ман и Архангельский ответа не дали. 2. Как поставить на кнопку свой обработчик OnClick? пишу:
Получаю сообщение:
И еще один Создаю PageControl и Tab'ы - все замечательно.
но табы не видны, хотя Parent я указал. Чую, что надо какое-то свойство включить на PageControl'e... |
| Автор: Vitalik 6.8.2005, 15:09 | ||||||||||||||||
Справка пишет: "Owner property indicates the component that is responsible for streaming and freeing this component."
Аналога действительно нету
Дело в том, что функция-обработчик должна быть методом класса TForm1:
Всё гораздо проще Нужно просто для вкладок задать свойство PageСontrol:
И еще будет одно замечание Так писать нельзя:
|
| Автор: Mal Hack 6.8.2005, 16:42 | ||||||||
Даже не смотря на то, что кнопку я сам создаю, как-то не очень удобно получается. Может есть возможность обойти каким-ть образом, т.е. перехватить клик на кнопке?
Спасибо еще раз... Моя благодарность не знает границ Добавлено @ 16:44
А как тогда правильно объявить? Пишу char *BBCodeNames[26][6]; - пишет: [C++ Error] Unit2.cpp(50): E2277 Lvalue required |
| Автор: Vitalik 6.8.2005, 21:57 | ||||||
Как-то должно быть можно, но сейчас уже поздно, так что быстро не соображу... Утро вечера мудренее
Это что еще такое? Если написать просто:
Покажи ка весь участок кода |
| Автор: Mal Hack 6.8.2005, 22:03 | ||||||
Вот на этом и выдавал. Я решил проблемы так: AnsiString BBCodeNames[6];
Буду очень благодарен, если подскажешь. Главное не код, направь куда нужно |
| Автор: Vitalik 8.8.2005, 10:02 | ||||||||
Хороший вариант
Хм... Пытался вчера сделать что-нить по этому поводу, но так и не получилось. Единственно могу направить: твоя ф-ция должна быть типа TNotifyEvent, а также к ней (или её адресу) возможно нужно как-то прикрутить __closure. В справке по этому __closure написано много всякой всячины, но я так особо и не понял, что там к чему... Там есть примеры кода, но они хотя и не по теме, но направить могут.
|
| Автор: Mal Hack 8.8.2005, 17:04 |
| Че-то ничего не выходит... лан, будем думать... Спасибо в любом случае. |