Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ Builder: область видимости переменных 
:(
    Опции темы
fara
Дата 18.6.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



В форме Form2 задан массив int D[n] (в файле Unit2.h),
Код

#ifndef Unit2H 
#define Unit2H 
//--------------------------------------------------------------------------- 
#include <Classes.hpp> 
#include <Controls.hpp> 
#include <StdCtrls.hpp> 
#include <Forms.hpp> 
#include <ExtCtrls.hpp> 
#include <Graphics.hpp> 
#include <jpeg.hpp> 
//--------------------------------------------------------------------------- 
class TForm2 : public TForm 
{ 
__published: // IDE-managed Components 
        TImage *Image1; 
        TEdit *d0; 
        TEdit *d1; 
        TEdit *d2; 
        TEdit *d3; 
        TEdit *d4; 
        TEdit *d5; 
        TEdit *d6; 
        TButton *Button1; 
        TEdit *d7; 
        TButton *Button2; 
        void __fastcall Button1Click(TObject *Sender); 
        void __fastcall d7Change(TObject *Sender); 
        void __fastcall d6Change(TObject *Sender); 
        void __fastcall d5Change(TObject *Sender); 
        void __fastcall d4Change(TObject *Sender); 
        void __fastcall d3Change(TObject *Sender); 
        void __fastcall d1Change(TObject *Sender); 
        void __fastcall d2Change(TObject *Sender); 
        void __fastcall d0Change(TObject *Sender); 
        void __fastcall Button2Click(TObject *Sender); 
private: // User declarations 
public: // User declarations 
enum 
{n=8}; 
int D[n]; 
bool isSet; 
 
        __fastcall TForm2(TComponent* Owner); 
}; 
//--------------------------------------------------------------------------- 
extern PACKAGE TForm2 *Form2; 
//--------------------------------------------------------------------------- 
#endif 


из формы Form13 пытаюсь получить доступ к массиву:

Form2->D[0];

но в ответ _пустота_
делаю Label1->Caption = IntToStr(Form2->D[0]);
на Label1 ничего не выводиться.

Никаких ошибок не выдается.
,
хотя массив был до этого задан (числа там должны быть):
в Unit2.cpp в ф-ии обработчике события нажатия на кнопку ОК
Код


D[0] = StrToInt(Form2->d0->Text); 
D[1] = StrToInt(Form2->d1->Text); 
D[2] = StrToInt(Form2->d2->Text); 
D[3] = StrToInt(Form2->d3->Text); 
D[4] = StrToInt(Form2->d4->Text); 
D[5] = StrToInt(Form2->d5->Text); 
D[6] = StrToInt(Form2->d6->Text); 
D[7] = StrToInt(Form2->d7->Text); 
Form2->Hide(); 

.

include "unit2.h" присутствует в unit13.cpp


--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
comcon1
Дата 18.6.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Что за "ничего не выводится"?? Какие-то числа там по-любому лежат - массив-то статический. Если бы твоя функция
Label1->Caption = IntToStr(D[0]);
работала, она бы выводила хотя бы ноль. "Пустота" - не возваращается функцией IntToStr(D[0]).
Так что для начала реши проблему с выводом на экран.

Доступ к Форме2 - у тебя есть на нее указатель в модуле с другой формой?? Или ты в объект-инспекторе прописал: IntToStr(D[0]) и думаешь, что это будет реагировать на изменения переменных в Реал-Тайме??
Кое-какие переменные можно так, но не эту smile


--------------------
PM MAIL   Вверх
fara
Дата 18.6.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



comcon1
действительно Label1->Caption = ..
выводит ноль (хотя это не совпадает с тем что находиться в массиве).

По поводу доступа к форме2:
в модуле с др формой в файле unit13.cpp прописана строка #include "Unit2.h"
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit13.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm13 *Form13;
int x = 1, r = 2;
double d = 1;

//---------------------------------------------------------------------------
__fastcall TForm13::TForm13(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm13::FormCreate(TObject *Sender)
{
Label1->Caption=IntToStr(Form2->D[0]);

....

--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
comcon1
Дата 18.6.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



таки-так. Посмотри в програме. КАКАЯ из этих форм креатится первой. По-видимому форма с массивом креатится второй и ФОРМКРЕАТЕ для нее запускается позже, чем ты присваиваешь.
Хм...
Так если ты прописываешь в ФОРМКРЕАТЕ сообщение о выводе - это значит, что это сообщение выводится только один раз при запуске конструкторов этой формы.
Или ты думаешь, что
Label1->Caption=IntToStr(Form2->D[0]);
устанавливает динамическую ссылку....????
нет уж батенька, сделай кнопочку, в обработчичке события пропиши вывод свой, и жми эту кнопочку. А там посмотрим, видится у тебя массив али нет ;)

Ты вообще не забывай, что кроме Unit1 и Unit2 у тебя еще есть тело програмы ;)


--------------------
PM MAIL   Вверх
fara
Дата 18.6.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



Цитата(comcon1 @ 18.6.2005, 12:19)
КАКАЯ из этих форм креатится первой

Та что Form2.

comcon1 вы не могли поменьше умных оборотов,а то я мало что понимаю в том как все сидит в этом билдере и в самом C++ smile

--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
comcon1
Дата 18.6.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Ну смотри: у тебя к телу програмы подключаются 2 файла-заголовка с твоими формами...
1. Открой главный файл и посмотри, как это сделано.
> Там создается что-то вроде объекта Application и при помощи метода
> Application->FormCreate() добавляются твои формы из модулей smile.
> Во время этого создания запускается кроме всего прочего и определенная тобою функция
void __fastcall TForm13::FormCreate(TObject *Sender)
2. Если ты написал в этой функции о том, что
Label1->Caption=IntToStr(Form2->D[0]);
> Это означает, что ты в МОМЕНТ СОЗДАНИЯ формы вывел в заголовок содержимое массива D[0]. А он пока пустой.
3. Потом две формы создались и ты обрабатывая нажатие кнопки ОК изменяешь содержимое массива!
> Конечно, но ведь Label1->Caption не будет изменяться вместе с массивом, поскольку функция IntToStr
УЖЕ присвоила аттрибуту Caption константу!
smile


--------------------
PM MAIL   Вверх
fara
Дата 18.6.2005, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 15.3.2004
Где: С.-Петербург

Репутация: нет
Всего: 2



comcon1
дай я тебя пацелую!!! smile
спасибо, хорошо объяснил!!!
теперь понятно в чем загвоздка!

к сожалению, репутации тебе добавить не могу (у меня меньше чем 100 сообщ).
--------------------
Крыша хлопает в ладоши -Спасибо всем за план хороший!
PM MAIL ICQ   Вверх
comcon1
Дата 18.6.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Всегда пожалуйста. Тока тему зря так назвал.
Если бы проблема состояла в области видимости, то ругался бы компилятор, ну или Run-time были бы ошибки. Например, когда указываешь на один объект, а обращаешься как к другому и вызываешь несуществующий метод (если один объект - сынок другого) : комплиятор такие штуки увидеть, естественно не может. Происходит указывание в никуда и RUNTIME- ерроры. Ну удачи!


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.