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

 
Вызов функций ...
creater
  Отправлено: 29.10.2003, 14:52


Станционный диспетчер

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



Народ, объясните ламеру как сделать.

Есть основная форма при работе с которой вызываются некоторые функции. И есть еще одна форма, которая может вызываться по нажатии бутона, при работе с которой так же возможен вызов тех же самых функций.

Как эти функции куда-нить поместить чтобы при необходимости их вызывать?
Георгий
Отправлено: 30.10.2003, 01:29


Почетный железнодорожник

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



Может я что то не так понял, но если их прототипы поместить в файл заголовков, который включить в нужные файлы, то всё будет хорошо.
creater
Отправлено: 30.10.2003, 07:36


Станционный диспетчер

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



QUOTE (Георгий @ 30/10/2003, 02:31)
Может я что то не так понял, но если их прототипы поместить в файл заголовков, который включить в нужные файлы, то всё будет хорошо.

Т.е. как?

Вот допустим у меня есть в Unit1.cpp ряд функций. Которые идут самые первые.

Функции типа:
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);
Далее Я хочу вызвать эту функцию в another_fileform.cpp и прописываю их прототипы в another_fileform.h
На строку в которой Я вызываю эту функцию он перестает ругаться. Но после выдает, что Unresolved external TForm2::WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue); referenced from ...
Asher
Отправлено: 30.10.2003, 09:18


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

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



Все верно. Так и должно ругаться. Ты не создал реализации.
Если сделать по-простому, то
В cpp-файл Unit2 надо добавить include "Unit1.h" и далее юзать нужные функции из Unit1 через Form1->...имя функции


Георгий
Отправлено: 30.10.2003, 09:29


Почетный железнодорожник

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



QUOTE
TForm2::WriteIni(

Так это у тебя методы класса или всё таки функции?
creater
Отправлено: 30.10.2003, 13:14


Станционный диспетчер

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



QUOTE (Георгий @ 30/10/2003, 10:31)
QUOTE
TForm2::WriteIni(

Так это у тебя методы класса или всё таки функции?

Просто функции.
Но ошибку выдает как
Unresolved external TForm2::WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue); referenced from another_fileform.obj
Георгий
Отправлено: 30.10.2003, 21:35


Почетный железнодорожник

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



Былобы интересно на это посмотреть в живую — приложи покромсаный проектик.
creater
Отправлено: 31.10.2003, 14:47


Станционный диспетчер

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



QUOTE (Георгий @ 30/10/2003, 22:37)
Былобы интересно на это посмотреть в живую — приложи покромсаный проектик.

Здесь ругается на строчку 1, во втором куске : Call to undefindet funcion "WriteIni"
Причем в Unit2, #include "Unit1.h" делаю.
И причем из Unit2 функция ShowBox() вызывается.

Почему ругается на вызов "WriteIni"?

Кусок 1 (основной формы)
//---------------------------------------------------------------------------

#include
#include
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue)
{
TIniFile *sIniFile;
sIniFile=new TIniFile(ChangeFileExt( Application->ExeName, ".INI"));
sIniFile->WriteString(ASection, AString, AValue);
delete sIniFile;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
WriteIni("level1", "name", "1");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowBox();
}
//---------------------------------------------------------------------------


Кусок 2 (форма вызываемая нажатием бутона)
//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall ShowBox()
{
TForm2* a = new TForm2(Application);
try{
a->ShowModal();
}
catch(...){
a->Free();
throw;
}
a->Free();
}
void __fastcall TForm2::FormCreate(TObject *Sender)
{
WriteIni("level2", "name", "2"); //1
}
//---------------------------------------------------------------------------
Георгий
Отправлено: 31.10.2003, 15:57


Почетный железнодорожник

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



Уже жалею, что просил показать кусок smile.gif

это что такое?
QUOTE
#include "Unit2.cpp"


Вместо этого надо или
CODE
#include "Unit2.h"

или жми
CODE
File->Include Unit Hdr-> и выбирай нужный тебе модуль

(что впрочем эквивалентно первому способу)
Теперь — файл заголовков — Unit1.h редактировал?
в нём должна быть такая строчка
CODE
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);
creater
Отправлено: 31.10.2003, 18:13


Станционный диспетчер

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



QUOTE

Уже жалею, что просил показать кусок smile.gif

Это еще ничего, Я просто создал новый проект безо всяких вырезок smile.gif

QUOTE

это что такое?
#include "Unit2.cpp"
Вместо этого надо или
#include "Unit2.h"

В общем то после этого ничего не изменилось

QUOTE

Теперь — файл заголовков — Unit1.h редактировал?
в нём должна быть такая строчка
CODE
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);



Да-да, она там есть.
Но при компиляции ругается на строку вызова WriteIni в Unit2.cpp
Георгий
Отправлено: 31.10.2003, 19:04


Почетный железнодорожник

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



Сдаюсь....

Unit1.cpp
CODE
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <inifiles.hpp>
#include "Unit1.h"
#include "unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue)
{
TIniFile *sIniFile;
sIniFile=new TIniFile(ChangeFileExt( Application->ExeName, ".INI"));
sIniFile->WriteString(ASection, AString, AValue);
delete sIniFile;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowBox();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
WriteIni("level1", "name", "1");        
}
//---------------------------------------------------------------------------


Unit1.h
CODE
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------

void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);

class TForm1 : public TForm
{
__published: // IDE-managed Components
       TButton *Button1;
       void __fastcall Button1Click(TObject *Sender);
       void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public:  // User declarations
       __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit2.cpp
CODE
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall ShowBox(void)
{
TForm2* a = new TForm2(Application);
try{
a->ShowModal();
}
catch(...){
a->Free();
throw;
}
a->Free();
}


void __fastcall TForm2::FormCreate(TObject *Sender)
{
WriteIni("level2", "name", "2");
}
//---------------------------------------------------------------------------

Unit2.h
CODE
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------

void __fastcall ShowBox(void);

class TForm2 : public TForm
{
__published: // IDE-managed Components
       TButton *Button1;
       void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public:  // User declarations
       __fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif


оно У меня нормально компилится и, даже, работает.

User Attached Image Скачать файл
TestForm.rar


creater
Отправлено: 31.10.2003, 20:20


Станционный диспетчер

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



QUOTE

Сдаюсь....

Спасибо большое.

Дело было (в генах :-)) ) в в том, что Я в Unit1.h
void __fastcall WriteIni(AnsiString ASection, AnsiString AString, AnsiString AValue);
поместил в тело class TForm1 cool.gif , а не перед ним.
Все работает.

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