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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы в MDI окнах 
:(
    Опции темы
HalkaR
  Дата 4.4.2003, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



У мнея снова проблемы с MDI окнами. Я описал класс
Код
class cNet
{
private:

       int  comp_n, coords[50][2];

public:

       cNet();
       ~cNet();
       int Num();
       int Test(int x, int y);
       void Add(int x, int y);

};
//---------------------------------------------------------------------------
cNet::cNet()
{
int i;
comp_n=0;
for(i=1; i<=50; i++){coords[i][0]=0;coords[i][1]=0;};
};
Но проблема втом, что в каждом отдельном чилдовском окне должна быть своя переменная этого класса и они не должны между собой контактировать.[CODE]cNet* Net=new cNet();/CODE]Однако данные во всех окнах одни и теже, т.е. для всех окон получается как бы одна переменная Net.
Что делатьconfused.gif?
P.S. Логично, что это тоже Билдер.
PM MAIL   Вверх
Step
Дата 4.4.2003, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата
cNet* Net=new cNet();/
во первых где ты эту хрень пишеш

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


пише весь код со всеми функциями своего класса


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
HalkaR
Дата 4.4.2003, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Я кой чо подправил, теперь конкретно эта проблема исчезла. Сейчас все работает хорошо, но при попытке закрыть главную форму появляется Debugger Exeption Notification с сообщением о какой-то ошибке (я в исключениях разбираюсь примерно также как и в английском, то есть никак smile.gif)
Код
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
Ошибка показывается здесь, при уничтожении формы.
Код
Net=new cNet();
Вот так я создаю новый элемент в функции FormCreate в cpp дочернего окна.
Код
class cNet
{
private:

       int  comp_n, coords[50][2];

public:

       cNet();
       ~cNet();
       int Num();
       int Test(int x, int y);
       void Add(int x, int y);

};
//---------------------------------------------------------------------------
cNet::cNet()
{
int i;
comp_n=0;
for(i=1; i<=50; i++){coords[i][0]=0;coords[i][1]=0;};
};
//---------------------------------------------------------------------------
cNet::~cNet()
{
};
//---------------------------------------------------------------------------
Пропуск
//---------------------------------------------------------------------------



class TFDoc : public TForm
{
__published: // IDE-managed Components
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
       TEdit *Edit1;
       TEdit *Edit2;
void __fastcall MOpenClick(TObject *Sender);
void __fastcall MSaveClick(TObject *Sender);
       void __fastcall Image1Click(TObject *Sender);
       void __fastcall N1Click(TObject *Sender);
private: // User declarations
public:  // User declarations
__fastcall TFDoc(TComponent* Owner);


       cNet* Net; //Это признаться честно не сам придумал

};
//---------------------------------------------------------------------------
extern PACKAGE TFDoc *FDoc;
//---------------------------------------------------------------------------
#endif
Вот Unit.h дочернего окна.
И где тут ошибка? Что не так?
Спасибо.
PM MAIL   Вверх
Step
Дата 4.4.2003, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата
inline __fastcall virtual ~TForm(void) { }
было бы не плохо если бы ты сюда вставил код удаления тех объектов для которых ты нью делал, правила с такие, и их надо соблюдать, хотя изредко именно на эти правила можно и забить

кстати юнит срр ты дать не хочеш

и конкретно какие проблемы у тебя остались


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
HalkaR
  Дата 4.4.2003, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Да я в ~TForm ничо не менял, я туда даже не заглядывал. Удаление TFDoc* TF = new TFDoc(this); я даж не знаю куда сунуть. А удаление Net=new cNet(); я пытался ставить в FormClose для дочернего окна, но тогда таже самая ошибка появляется при попытке зарыть дочернее окно.
Моя единственная проблема сейчас, что при попытке закрыть главное или дочернее окно (в зависимости от того ставлю я деструктор Net->~cNet(); или нет)выдают Debugger Exeption Notification (там чтото про Access Voluation).
Может просто обьясните куда в таких случаях нуна деструктор ставить? Или дело в чем-то еще?

Это сообщение отредактировал(а) HalkaR - 4.4.2003, 17:15
PM MAIL   Вверх
Step
Дата 4.4.2003, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



HalkaR ты меня морально убил, но ничего поможем
Код
[QUOTE]inline __fastcall virtual ~TForm(void) {
Net->~cNet();
delete Net;
}



--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Step
Дата 4.4.2003, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата
Net->~cNet();
хотя этого наверное не надо


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
HalkaR
Дата 4.4.2003, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Код
inline __fastcall virtual ~TForm(void) {
Net->~cNet();
delete Net;
}
А куда мне это загнать?
PM MAIL   Вверх
DENNN
Дата 4.4.2003, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Деструктор вызывать не нужно. Он вызывается автоматически при удалении объекта. Пиши просто delete NET;
PM ICQ   Вверх
HalkaR
Дата 4.4.2003, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



ГДЕ?
PM MAIL   Вверх
DENNN
Дата 4.4.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Смотря по программе. Обычно в деструкторе объекта-контейнера. Но если к примеру уничтожаемы объект тоже некоторое окно, то тогда в момент закрытия MDI-окна.
Из твоих текстов ведь не видно когда ты его создаешь и когда тебе он больше не нужен.
PM ICQ   Вверх
HalkaR
Дата 6.4.2003, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Child.cpp
Код

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

   void __fastcall TFDoc::FormCreate(TObject *Sender)
   {
   Net=new cNet();
   Image1->Repaint();
   }
   //---------------------------------------------------------------------------


   void __fastcall TFDoc::FormCloseQuery(TObject *Sender, bool &CanClose)
   {
   int res = Application->MessageBoxA("Сохранить документ?","Сохранение", MB_YESNOCANCEL + MB_ICONQUESTION);
   if(res == IDCANCEL){CanClose = false;}
   if(res == IDYES){}
   if(res == IDNO){}
   }

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

   void __fastcall TFDoc::FormDestroy(TObject *Sender)
   {
   delete Net;
   }
   //---------------------------------------------------------------------------

   void __fastcall TFDoc::FormClose(TObject *Sender, TCloseAction &Action)
   {
   Action = caFree;
   }
   //---------------------------------------------------------------------------


Child.h
Код

   class cNet
   {
   private:

   int comp_n, coords[50][2];

   public:

   cNet();
   ~cNet();
   int Num();
   int Test(int x, int y);
   void Add(int x, int y);

   };
   //---------------------------------------------------------------------------
   cNet::cNet()
   {
   int i;
   comp_n=0;
   for(i=1; i<=50; i++){coords[i][0]=0;coords[i][1]=0;};
   };
   //---------------------------------------------------------------------------
   cNet::~cNet()
   {
   };
   //---------------------------------------------------------------------------


   class TFDoc : public TForm
   {
   __published: // IDE-managed Components
   TOpenDialog *OpenDialog1;
   TSaveDialog *SaveDialog1;
   TMainMenu *MainMenu1;
   TMenuItem *MFile;
   TMenuItem *MOpen;
   TMenuItem *MSave;
   TImage *Image1;
   TImageList *ImageList1;
   TToolBar *ToolBar1;
   TToolButton *ToolButton1;
   TToolButton *ToolButton2;
   TMenuItem *N1;
   TEdit *Edit1;
   TEdit *Edit2;
   void __fastcall MOpenClick(TObject *Sender);
   void __fastcall MSaveClick(TObject *Sender);
   void __fastcall Image1MouseDown(TObject *Sender,
   TMouseButton Button, TShiftState Shift, int X, int Y);
   void __fastcall Image1DblClick(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
   void __fastcall Image1Click(TObject *Sender);
   void __fastcall N1Click(TObject *Sender);
   void __fastcall FormDestroy(TObject *Sender);
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
   private: // User declarations
   public: // User declarations
   __fastcall TFDoc(TComponent* Owner);
   cNet* Net;

   };
   //---------------------------------------------------------------------------
   extern PACKAGE TFDoc *FDoc;
   //---------------------------------------------------------------------------
   #endif


MDIForm.cpp
Код

   //---------------------------------------------------------------------------
   #include <vcl.h>
   #pragma hdrstop

   #include "UMDI.h"
   #include "UDoc.h"
   #include "Unit1.h"
   //---------------------------------------------------------------------------
   #pragma package(smart_init)
   #pragma resource "*.dfm"
   TFMDI *FMDI;
   //---------------------------------------------------------------------------
   __fastcall TFMDI::TFMDI(TComponent* Owner)
   : TForm(Owner)
   {
   }

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

   void __fastcall TFMDI::MVertClick(TObject *Sender)
   {
   TileMode = tbVertical;
   Tile();
   }
   //---------------------------------------------------------------------------
   void __fastcall TFMDI::MIconsClick(TObject *Sender)
   {
   ArrangeIcons();
   }
   //---------------------------------------------------------------------------
   void __fastcall TFMDI::MNewClick(TObject *Sender)
   {
   TFDoc* TF = new TFDoc(this);
   TF->Caption = "Документ " + IntToStr(MDIChildCount);
   }
   //---------------------------------------------------------------------------

PM MAIL   Вверх
HalkaR
Дата 6.4.2003, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Все ошибка найдена. Спасибо.
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.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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