Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Видимость переменных

Автор: 18192123 16.05.2009 0:54

Здравствуйте!
Такой вопрос возник..:
Есть две формы, соответственно, 2 модуля..
В 1-м модуле описана переменная, которая должна использоваться и во 2-м..
Для 1-го модуля:


#include <vcl.h>
#pragma hdrstop

#include "UnitMain.h"
#include "UnitKey.h"
#include "wincrypt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;

AnsiString pass;



Для 2-го:

#include <vcl.h>
#pragma hdrstop

#include "UnitKey.h"
#include "UnitMain.h"
#include "wincrypt.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormKey *FormKey;

void __fastcall TFormKey::ButOkClick(TObject *Sender)
{
pass=LabEdPas->Text;
}



В результате - ошибка, переменная pass не найдена..
Объясните пожалуйста, как исправить это?

Автор: volvo 16.05.2009 2:02

В header-файле для первого модуля опиши переменную, как внешнюю:

extern AnsiString pass;
, тогда линкер ее найдет.

Автор: 18192123 17.05.2009 1:42

спасибо, получилось!

теперь схожая ситуация с использованием функции:
имеется проект с одним модулем UnitMain
к этому проекту через Add to project подключаю модуль (Unit2) из другого проекта. В Unit2 имеется процедура


void __fastcall TFormHem::ButEmcryptionClick(TObject *Sender)


которую нужно вызвать в UnitMain..
В UnitMain.h добавила

extern void __fastcall TFormHem::ButEmcryptionClick(TObject *Sender);



при запуске приложения ошибка:
[Linker Error] Unresolved external '__fastcall ButEmcryptionClick(System::TObject *)' referenced from E:\3_2 \ОБЩЕЕ\PROJECT\UNITMAIN.OBJ

Подскажите пожалуйста, как исправить ошибку?

Автор: volvo 17.05.2009 1:54

Цитата
В UnitMain.h добавила
Не надо этого делать... Лучше добавь описание экземпляра класса (ну, или указателя на него), как extern. А то тип-то известен во втором файле, а название переменной - нет.

Автор: 18192123 17.05.2009 2:12

Цитата(volvo @ 16.05.2009 22:54) *

Не надо этого делать... Лучше добавь описание экземпляра класса (ну, или указателя на него), как extern. А то тип-то известен во втором файле, а название переменной - нет.

Не поняла.., о каком экземпляре класса идёт речь?

Автор: volvo 17.05.2009 5:31

Как ты собираешься вызывать TFormHem::ButEmcryptionClick, не зная как называется переменная типа TFormHem? Вот по умолчанию форма называется Form1, хотя класс, ее описывающий называется TForm1. Здесь Form1 - имя экземпляра, а TForm1 - имя типа... Обратиться к контролу на форме (или к какому-то обработчику) можно только по имени экземпляра, то есть, ты должна написать Form1->Edit1..., а не TForm1::Edit1. Поэтому обычно указатель на форму описывается в хидере как extern TForm1 *Form1, и при подключении к другому модулю этого хидера можно обращаться к Form1->{что-то}

Почему у тебя этого не произошло (т.е., почему обращение к ButEmcryptionClick по имени ФОРМЫ а не КЛАССА невозможно) - я не знаю... Приводи проект, будем разбираться...