Заголовочный файл .h, чего в нём не хватает ?
Unit1.cpp, Unit1.h, и другие.
В Unit1.cpp я добавляю:
#include "0.h" // здесь прототипы/описания функций и глобальные переменные
#include "1.h" // здесь определения расчётных функций (графические компоненты не используются)
В Unit1.cpp в обработчиках кнопок я использую графические компоненты Image1 , но в этом файле очень много строк и я хочу функции, используемые в обработчиках кнопок, разнести по заголовочным файлам 2.h, ... 6.h, но программа не работает. Вопрос: что нужно добавить в заголовочные файлы, что бы всё заработало?
Сначала была ошибка E2451 Undefined symbol 'Image1'
я записал Image1->... в виде Form1->Image1->...
Потом появилась форма с кнопками, но при нажатии на кнопку опять ошибка в диалоговом окошке
"Debugger Exception Notification"
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address
0040207E in module 'Project1.exe'. Write of address 0000004C'. Process stopped. Use Step or Run to
continue.
и ссылка на самую первую строку с графическим компонентом (в подключённом заголовочном файле):
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));
Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"
Смысл в том, что проще эти функции для обработчиков писать, что-то путём копирования. И проще переходить по закладкам между файлами 2.h ... 6.h, чем пользоваться прокруткой в Unit1.cpp.
Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"
Посмотрите этот пример, может, он прояснит проблему
Так при создании проекта и были автоматически созданы Unit1.h и Unit1.cpp. Потом, при разрастании Unit1.cpp я решил функции обработчиков кнопок разбросать по отдельным *.h, и подключил их в Unit1.cpp с помощью директивы #include:
#include "2.h"
...
#include "6.h"
Посмотрите этот пример, может, он прояснит проблему
Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));
Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));
Там, где вызывается этот метод, компилятору не известно, что такое Form1. Значит, это явно, не в файле Unit1.cpp, а в каком то, созданном Вами файле.
Вы, даже, не сказали в каком файле эта строка. Хоть схематично привели бы структуру проекта, какие файлы, какие инклуды, какие и где объявления.
Заочно, трудно помогать.
Вот пример с Image:
Спасибо за пример. Сделал всё как в нём, но выскакивает ошибка:
Undefined symbol 'Form1' и ссылка на строку :
Form1->Image1->Canvas->FillRect(Rect(0, 0, Form1->Image1->Width, Form1->Image1->Height));
Там, где вызывается этот метод, компилятору не известно, что такое Form1. Значит, это явно, не в файле Unit1.cpp, а в каком то, созданном Вами файле.
Вы, даже, не сказали в каком файле эта строка. Хоть схематично привели бы структуру проекта, какие файлы, какие инклуды, какие и где объявления.
Заочно, трудно помогать.
Вот пример с Image:
#include <vcl.h>
#include <math.h>//математические функции
#include <fstream.h>//ofstream,ifstream
#pragma hdrstop
#include "Unit1.h"
#include "0.h"
#include "1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
he=Screen->Height; // Высота экрана
ih=he-Y0-40; // Высота объекта Image1
Image1->Height=ih; // Высота объекта Image1
//...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
F1(Form1->Image1);// Здесь ранее не было Form1->Image1
}
//————————————————————————————————————————
——— Файл 1.cpp ———————————————————————————
#include "0.h" // Здесь объявлены переменные, которые используются в во всех *.cpp
#include "1.h"
void F1(TImage *Image1) // Здесь ранее не было Form1->Image1
{
//...
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));// Здесь удалил Form1->
//...
double dKsi=0.0006/ih; // Здесь почему-то "деление на ноль", но при наведении курсора - "ih=688"
//...
}
//————————————————————————————————————————
——— Файл 0.h ———————————————————————————
#include <math.h> // Математические функции
int iw, ih; // Ширина и высота объекта Image1 (Свои значения получают в обработчике формировании формы)
const double mu0=4*M_PI*1.0e-7;
//...
//————————————————————————————————————————
——— Файл 1.h ———————————————————————————
#include <vcl.h>
#include <fstream.h> // Доступ к sprintf
#include <math.h> // Математические функции
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp> // Для доступа к TMemo
#include <Forms.hpp> // Для доступа к TForm
#include <ExtCtrls.hpp> // Для доступа к TImage - этого не было, добавил
//--------------------------
void F1(TImage *Image1);// Здесь void заменил на TImage *Image1
//————————————————————————————————————————
Они у меня объявлены в файле 0.h, и этот файл подключаю в 1.cpp, но после запуска
программы и нажатии на кнопку Button1 выскакивает ошибка деления на ноль:
Debugger Exception Notification
Project Project1.exe raised exception class EZeroDivide with message 'Floating point division by zero'.
Process stopped. Use Step or Run continue.
и даёт ссылка на строку: double dKsi=0.0006/ih;
но при наведении курсора на ih всплывает его значение ih=688
Выдаёт:
[Linker Fatal Error] Fatal: Object file C:PROGRWM FILESBORLANDCBUILDER6PROJECTSПГ_41.OBJ is missing a section of class 2
Сначала, все глобальные переменные пусть будут в файле Unit1.cpp, а алгоритмы реализованы непосредственно в обработчиках. Затем, если все будет работать, оформить глобальные переменные и методы в виде класса, таким образом, чтобы в обработчиках вызывались, лишь, методы класса. Добиться работы такой программы и попытаться сделать так, чтобы класс не работал непосредственно с элементами библиотеки VCL, такими как: TForm, TImage и т.п. Т.е. класс должен предоставлять только алгоритмы. Это не обязательное требование, но библиотек, которые предоставляют пользовательский интерфейс много, а Ваши алгоритмы - в единственном экземпляре, поэтому имеет смысл их развязать. Наконец, можно вынести объявление Вашего класса и его реализацию в отдельный модуль.
Эти рекомендации вытекают из того, что Ваш проект, судя по всему не такой уж и большой, а ошибки ломятся в дверь. Надо пересмотреть архитектуру программы, хотя бы, ради упрощения отладки.
Сначала, все глобальные переменные пусть будут в файле Unit1.cpp, а алгоритмы реализованы непосредственно в обработчиках. Затем, если все будет работать, оформить глобальные переменные и методы в виде класса, таким образом, чтобы в обработчиках вызывались, лишь, методы класса. Добиться работы такой программы и попытаться сделать так, чтобы класс не работал непосредственно с элементами библиотеки VCL, такими как: TForm, TImage и т.п. Т.е. класс должен предоставлять только алгоритмы. Это не обязательное требование, но библиотек, которые предоставляют пользовательский интерфейс много, а Ваши алгоритмы - в единственном экземпляре, поэтому имеет смысл их развязать. Наконец, можно вынести объявление Вашего класса и его реализацию в отдельный модуль.
Эти рекомендации вытекают из того, что Ваш проект, судя по всему не такой уж и большой, а ошибки ломятся в дверь. Надо пересмотреть архитектуру программы, хотя бы, ради упрощения отладки.
Огромное вам спасибо за помощь. Сейчас начну перелопачивать проект. О результатах сообщу дополнительно.
ссылка на строку "Form1->Height=he;" в файле "1.cpp"
Если в аргументы функции NF1() ввести TForm1 *Form1, то выдаёт ту же ошибку.
Как объяснить кампилятору, что такое Form1 в файле "1.cpp"
Unit.1
#pragma hdrstop
#include "Unit1.h"
#include "1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
NF1(Form1->Image1);
}
int X0=10, Y0=40;
//--------------------------
#include "0.h"
#include "3.h"
//--------------------------
void NF1(TImage *Image1)
{
int he=Screen->Height;//высота экрана
int we=Screen->Width; //ширина экрана
//Объект Form1
Form1->Height=he;//высота формы
Form1->Width=we; //ширина формы
Form1->Left=0; //левая привязка
Form1->Top=0; //верхняя привязка
//Объект Image1
Image1->Height=he-Y0-40;//высота графического поля Image1
Image1->Width=we-X0-15; //ширина графического поля Image1
Image1->Left=X0; //левая привязка графического поля
Image1->Top=Y0; //верхняя привязка графического поля
}
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//--------------------------
void NF1(TImage *Image1);
//--------------------------
Но Вы снова пытаетесь оперировать элементами библиотеки VCL из своих функций, и к тому же выносите их в самодельный .cpp файл. Зачем Вы это делаете?
Но Вы снова пытаетесь оперировать элементами библиотеки VCL из своих функций, и к тому же выносите их в самодельный .cpp файл. Зачем Вы это делаете?
Что-то у меня ничего не получилось, выдало сначало:
F1004 Internal compiler error at 0xc64f00 with base 0xc10000
а потом тот же Fatal - это капец.
Сделал всё, как было инзначально:
Unit1.cpp - здесь добавил стандартные заголовочные файлы и свои:
#include <*.h>
#include "0.h", ..., "6.h"
Обработчики кнопок, в которых использую все переменные и функции из "0.h", ..., "6.h"
0.h - здесь объявил все глоб.переменные, описал (написал прототипы) функции
1.h, ..., 6.h - здесь определил/реализовал (написал программный код функций)
И получилось всё Ok, но как в сказке "О рыбаке и золотой рыбке".
П.С. Хотелось бы затронуть тему лексики С++, но это отдельная тема.
Откуда у вас Form1 берется, вы на него через заголовочный файл ссылаетесь, где его вы определяете?
Вам Meander правильно написал, у вас область видимости переменных храмает.
Взялись уж за визуальное программирование, извольте основы си++ выучит для начала.
Хватит насиловать людям мозг:)