Okno MDIChild i Action = caFree - Abnormal program terminati
Napisane: środa, 6 marca 2013, 18:47
WItam.
Oto ja oraz kolejny problem.
W sumie znam rozwiązanie, jednak nie rozumiem czemu ono skutkuje.
Mianowicie stworzyłem książkowa aplikację MDI.
Plik Unit1.cpp
Plik MDIChild.cpp
Skompilowanie kodu nie przynosi problemów.
Problem przychodzi w chwili, gdy muszę zamknąć okienko MDI Child. Na jednym komputerze wywala mi błąd "Abnormal program terminated" na innym komputerze mam błąd: "Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue. "
Kolega, który miał również problem z tym powiedział, że znalazł rozwiązanie. Mianowicie usunięcie linii: "child->Parent = this;"
Jednak nurtuje mnie ten problem. Skoro książka do C++Buildera 6 Personal podaje ten program jako przykład, to powinien on działać bezbłędnie.
Nie rozumiem, czemu usunięcie tej linijki sprawia poprawne działanie aplikacji.
Oto ja oraz kolejny problem.
W sumie znam rozwiązanie, jednak nie rozumiem czemu ono skutkuje.
Mianowicie stworzyłem książkowa aplikację MDI.
Plik Unit1.cpp
KOD cpp: UKRYJ
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "MDIChild.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
TChild* child = new TChild(this);
child->Parent = this;
child->Width = 100;
child->Height = 200;
child->Show();
}
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "MDIChild.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
TChild* child = new TChild(this);
child->Parent = this;
child->Width = 100;
child->Height = 200;
child->Show();
}
//---------------------------------------------------------------------------
Plik MDIChild.cpp
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MDIChild.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TChild *Child;
//---------------------------------------------------------------------------
__fastcall TChild::TChild(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TChild::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
//---------------------------------------------------------------------------
Skompilowanie kodu nie przynosi problemów.
Problem przychodzi w chwili, gdy muszę zamknąć okienko MDI Child. Na jednym komputerze wywala mi błąd "Abnormal program terminated" na innym komputerze mam błąd: "Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue. "
Kolega, który miał również problem z tym powiedział, że znalazł rozwiązanie. Mianowicie usunięcie linii: "child->Parent = this;"
Jednak nurtuje mnie ten problem. Skoro książka do C++Buildera 6 Personal podaje ten program jako przykład, to powinien on działać bezbłędnie.
Nie rozumiem, czemu usunięcie tej linijki sprawia poprawne działanie aplikacji.