4 / 4 / 6
Регистрация: 23.05.2012
Сообщений: 445
1

Как обращаться к форме из стороннего юнита?

24.04.2015, 12:10. Показов 1481. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

У меня есть 2 юнита: Main.cpp и Func.cpp , у каждого внутри есть одноименный .h файл.

В указанных .h файлах я сделал связку между юнитами:

1)
C++
1
#include "Main.h"
- в файле Func.h
2)
C++
1
#include "Func.h"
- в файле Main.h

В Main unit есть форма "MainForm"

В одной из функций Func unit есть обращение к данной форме:
...
C++
1
MainForm->firmaGBox->Visible = false;
...

Выпадает ошибка в этом месте:

[BCC32 Error] Func.h(42): E2451 Undefined symbol 'MainForm'

В чем может быть причина?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2015, 12:10
Ответы с готовыми решениями:

Как обращаться к программно создаваемой форме
Подскажите пожалуйста. Есть код - создание формы: procedure TForm1.Button1Click(Sender: TObject);...

Как обращаться к форме в другом проекте?
Ситуация такая: Есть Project1 и у него есть Form1. Есть Project2 с Form2. Оба проекта в...

Как в firefox обращаться к форме, расположеной в соседнем фрейме?
в общем есть страничке, на ней 2 iframe в первом iframe есть форма. када она отправвляется...

Как обращаться с одной формы к DGV, находящемуся на другой форме
Здравствуйте, подскажите как обращаться с одной формы к датагриду находящемуся на другой форме,...

6
4955 / 2419 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
24.04.2015, 12:29 2
Цитата Сообщение от EVOSandru6 Посмотреть сообщение
- в файле Func.h
2)Код C++1
#include "Func.h"
Здесь надо добавить
C++
1
#include "Main.h"
И если быть точным то лучше добавлять связку не в h-файлы, а в cpp-файлы

Добавлено через 3 минуты
т.е должно быть так в Func.cpp
C++
1
2
#include "Func.h"
#include "Main.h"
1
4 / 4 / 6
Регистрация: 23.05.2012
Сообщений: 445
24.04.2015, 12:30  [ТС] 3
Если в Main.h добавить include на самого себя?!

Уточню.

Main - это Vcl Forms Application

А Func - простой unit
0
4955 / 2419 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
24.04.2015, 12:32 4
А в Main.cpp должно быть так

C++
1
2
#include "Main.h"
#include "Func.h"
1
4 / 4 / 6
Регистрация: 23.05.2012
Сообщений: 445
24.04.2015, 12:42  [ТС] 5
C++
1
#include "Func.h"
У меня было в Main.h

Сделал, как ты сказал, но ничего не изменилось.

Пробовал подключение в разных комбинациях. (#include "Func.h"
)

По отдельности из Main.cpp и Main.h , а также из обоих сразу.

В любом случае вышеупомянутая ошибка.
0
4955 / 2419 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
24.04.2015, 12:48 6
Лучший ответ Сообщение было отмечено EVOSandru6 как решение

Решение

А ты в проект добавил модуль Func.h и Func.cpp?
1
4 / 4 / 6
Регистрация: 23.05.2012
Сообщений: 445
24.04.2015, 13:01  [ТС] 7
Да они есть, дело оказалось в очередности подключений:

Цитата Сообщение от monah_tuk
У вас, ещё и Header guard, небось, есть? Или #pragma once?

Изучите как работает препроцессор и что они делает, когда встречает директиву #include.

По вашей проблеме:
Func.cpp подключает Func.h (определяется охранник FUNC_H /какой точно у вас - я не знаю/, теперь файл повторно не включится), тот, в свою очередь, подключает Main.h (MAIN_H), Main.h подключает Func.h, но охранник уже есть, поэтому игнорируется. Из текста ошибки следует, что не смог подключиться Main.h, т.к. был определён охранник MAIN_H, попробую возомнить себя телепатом, но, скорее всего, в Func.cpp у вас сначала инклудится Main.h, а потом Func.h, что и приводит к такому поведению.

Собственно, вам уже должно стать понятно, что без листингов этих файлов делать заключение очень проблемно. Ровно как и оказать посильную помощь.

А вообще, золотое правило: избегайте cross-reference заголовочных файлов. Подключайте нужные только в единицы трансляции. Используйте forward-declaration где нужно. Скрывайте детали реализации через PIMPL (гугл в помощь).

Спасибо за отклик Sasha!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2015, 13:01
Помогаю со студенческими работами здесь

Почему к главной форме можно обращаться как к статическому классу из любого места программы
Почему к главной форме Form1 можно обращаться как к статическому классу из любого места программы?...

Обращаться к форме и ее компонентам из другого класса
Здравствуйте. Как можно обращаться к форме и ее компонентам из другого класа или есть другой...

Открытие стороннего приложения в форме
Как можно сделать открытие стороннего приложения в программе. Суть: есть форма, кнопка, стороннее...

Как ограничить поворот юнита?
У меня юнит поворачивается с помощью transform.LookAt(myTransform); Как сделать, так чтобы юнит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru