Помощь - Поиск - Пользователи - Календарь
Полная версия: Видимость переменных
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Здравствуйте!
Такой вопрос возник..:
Есть две формы, соответственно, 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
В header-файле для первого модуля опиши переменную, как внешнюю:
extern AnsiString pass;
, тогда линкер ее найдет.
18192123
спасибо, получилось!

теперь схожая ситуация с использованием функции:
имеется проект с одним модулем 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
Цитата
В UnitMain.h добавила
Не надо этого делать... Лучше добавь описание экземпляра класса (ну, или указателя на него), как extern. А то тип-то известен во втором файле, а название переменной - нет.
18192123
Цитата(volvo @ 16.05.2009 22:54) *

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

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

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