Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к элементам формы из подключаемого класса. Непонятки с видимостью переменных. 
V
    Опции темы
Alex13
  Дата 10.6.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



Имеется файл Notesclass.h, подключаемый в Unit1.h с помощью #include "Notesclass.h".
Вот его содержимое:
Код

#include <vector.h>;
//Note-structure-------------------------------------------------------------
 struct Note{
  AnsiString name;
  AnsiString content;
  int access;
  AnsiString password;
 };

//Folder-structure-------------------------------------------------------------
 struct Folder{
  AnsiString name;
  int access;
  AnsiString password;
  vector<Note> notes;
 };

//-----------------------------------------------------------------------------
class Notes{
 private:
 vector<Folder> root;
 public:
 Notes(void){
  this->SetTree();
 }
 void SetTree(void){
  AddFolder("Folder1",0,"");
 }
 void AddFolder(AnsiString name,int access,AnsiString password){
  struct Folder tempfolder;
  tempfolder.name=name;
  tempfolder.access=access;
  tempfolder.password=password;
  this->root.push_back(tempfolder);
  Mainform->TreeView->Items->Add(Mainform->TreeView->Items->GetFirstNode(),name);
 }
};

Форма называется Mainform, на ней содержится элемент типа TTreeView сименем TreeView.
При компиляции данного кода Билдер выдает ошибку:
Цитата

Undefined symbol 'Mainform'

Объясните, пожалуйста, почему возникает эта ошибка и как с нею бороться 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
Oberon83
Дата 10.6.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 6.5.2005
Где: Республика Чуваши я

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



Alex13, передай в класс компонент TTreeView.
Код

class Notes{    
 private:    
 vector<Folder> root;
 TTreeView* tree_view;
 public:    
 Notes(TTreeView* tree){    
    tree_view = tree;
 }    
 void SetTree(void){    
  AddFolder("Folder1",0,"");    
 }    
 void AddFolder(AnsiString name,int access,AnsiString password){    
  struct Folder tempfolder;    
  tempfolder.name=name;    
  tempfolder.access=access;    
  tempfolder.password=password;    
  this->root.push_back(tempfolder);    
  tree_view->TreeView->Items->Add(Mainform->TreeView->Items->GetFirstNode(),name);    
 }    
};


У меня таким образом все работает.  

Это сообщение отредактировал(а) Oberon83 - 10.6.2006, 22:07
--------------------
OpenArea.ru
PM MAIL ICQ   Вверх
Alex13
Дата 11.6.2006, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



Oberon83, сэнкс, попробую. 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
Alex13
Дата 11.6.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



хм.. вроде как этот код вполне работовпособен в таком виде, но теперь возникла другая проблема. Я пытаюсь создать объект Notes типа TNotes вот таким кодом:
Unit1.cpp
Код

 //---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainform *Mainform;
TNotes Notes(Mainform->TreeView);
//---------------------------------------------------------------------------
__fastcall TMainform::TMainform(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

Сам класс теперь выглядит так:
 Noteclass.h
Код

#include <vector.h>;
//using std::vector;
//Note-structure-------------------------------------------------------------
 struct TNote{
  AnsiString name;
  AnsiString content;
  int access;
  AnsiString password;
 };

//Folder-structure-------------------------------------------------------------
 struct TFolder{
  AnsiString name;
  int access;
  AnsiString password;
  vector<TNote> notes;
 };

//Class,-containing-notes-tree-info--------------------------------------------
class TNotes{
 private:
 vector<TFolder> root;
 TTreeView* tree_view;
 public:
 TNotes(TTreeView *tree){
  this->tree_view = tree;
 }
 void SetTree(void){
  AddFolder("Folder1",0,"");
 }
 void AddFolder(AnsiString name,int access,AnsiString password){
  struct TFolder tempfolder;
  tempfolder.name=name;
  tempfolder.access=access;
  tempfolder.password=password;
  this->root.push_back(tempfolder);
  this->tree_view->Items->Add(this->tree_view->Items->GetFirstNode(),name);
 }
 void UpdateTree(void){
 }
};


Но при запуске возникает следующее сообщение
Цитата

Project Notes.exe raised exception class EAccessViolation with message 'Access Violation at address 00401B7C. Read of address 000002F8'. Process stopped. Use Step or Run to continue.


Я так понял, что глюк состоит в том, что на момент создания Notes, Mainform->TreeView еще не инициализирован. Но как с этим бороться я не знаю. 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
Oberon83
Дата 11.6.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 6.5.2005
Где: Республика Чуваши я

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



Alex13, ты память под свой класс не выделяшь.
В Unit1.h в public объявляй свой класс:
TNotes* Notes;

Далее в Unit1.cpp пиши:
Notes = TNotes(Mainform->TreeView);

Попробуй, думаю все должно заработать. 
--------------------
OpenArea.ru
PM MAIL ICQ   Вверх
Alex13
Дата 11.6.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



Oberon83, на строке 
Notes = TNotes(Mainform->TreeView);
выдает
Type name expected 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
Oberon83
Дата 11.6.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 6.5.2005
Где: Республика Чуваши я

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



Кстати, извиняй. Ошибся немного, надо вот так писать: 
                        Notes = new TNotes(Mainform->TreeView);

А насчет Type name expected, сделай так:
Код

 //---------------------------------------------------------------------------    
#include <vcl.h>    
#pragma hdrstop    
#include "Unit1.h"    
//---------------------------------------------------------------------------    
#pragma package(smart_init)    
#pragma resource "*.dfm"    
TMainform *Mainform;    
//---------------------------------------------------------------------------    
__fastcall TMainform::TMainform(TComponent* Owner)    
        : TForm(Owner)    
{    
Notes = new TNotes(Mainform->TreeView);
}    
//---------------------------------------------------------------------------


Все заработает. Проверено smile) 
--------------------
OpenArea.ru
PM MAIL ICQ   Вверх
Alex13
Дата 12.6.2006, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



Oberon83, я пробовал похожим образом, но мне надо, чтобы класс глобальный был и после завершения функции не умерал. 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
Alex13
Дата 12.6.2006, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

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



Сорри, это я не подумавши ляпнул. Все отлично работает. Огромное спасибо за помощь. 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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