Ho volutamente creato un esempio con un'applicazione MDI per descrivere al meglio la situazione spiacevole in cui tutti potremmo trovarci. Praticamente, cliccando su "Nuovo", viene creata un finestra MDI sulla quale vi è un pulsante che, cliccandoci su, dovrebbe modificare la label sulla finestra principale.
La funzione chiamata dall' evento ON_WM_BUTTONCLICK, richiama una particolare funzione "Buttonate" che ha il ruolo di modificare la label della finestra principale, avendo il puntatore dell'oggetto stesso come parametro di questa funzione.
Nella chiamata di funzione a Buttonate, come argomento immetto il riferimento principale "MainForm->Label1" che dovrebbe farmi accedere a questo componente, invece ciò genera un errore di indirizzamento.
Il problema stà nel fatto che i puntatori alle finestre vengono dichirati e inizializzati da un oggetto della classe (TApplication), questi puntatori, però si comportano come puntatori a oggetto dichiarati e mai inizializzati, quindi idonei a puntare solo alle chiamate di funzione e non ai membri interni(in questo caso il componente TLabel).
Utilizzo l'ambiente Borland C++Builder.
Non sò come comportarmi, chiedo aiuto.
Allego i quattro file del progetto(file .cpp e header).
---------------------------------------------------------------------------------------
MAIN.H
//----------------------------------------------------------------------------
#ifndef MainH
#define MainH
//----------------------------------------------------------------------------
#include "ChildWin.h"
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Messages.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <StdCtrls.hpp>
#include <Menus.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
#include <Graphics.hpp>
#include <Classes.hpp>
#include <SysUtils.hpp>
#include <Windows.hpp>
#include <System.hpp>
#include <ActnList.hpp>
#include <ImgList.hpp>
#include <StdActns.hpp>
#include <ToolWin.hpp>
//----------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *FileNewItem;
TMenuItem *FileOpenItem;
TMenuItem *FileCloseItem;
TMenuItem *Window1;
TMenuItem *Help1;
TMenuItem *N1;
TMenuItem *FileExitItem;
TMenuItem *WindowCascadeItem;
TMenuItem *WindowTileItem;
TMenuItem *WindowArrangeItem;
TMenuItem *HelpAboutItem;
TOpenDialog *OpenDialog;
TMenuItem *FileSaveItem;
TMenuItem *FileSaveAsItem;
TMenuItem *Edit1;
TMenuItem *CutItem;
TMenuItem *CopyItem;
TMenuItem *PasteItem;
TMenuItem *WindowMinimizeItem;
TStatusBar *StatusBar;
TActionList *ActionList1;
TEditCut *EditCut1;
TEditCopy *EditCopy1;
TEditPaste *EditPaste1;
TAction *FileNew1;
TAction *FileSave1;
TAction *FileExit1;
TAction *FileOpen1;
TAction *FileSaveAs1;
TWindowCascade *WindowCascade1;
TWindowTileHorizontal *WindowTileHorizontal1;
TWindowArrange *WindowArrangeAll1;
TWindowMinimizeAll *WindowMinimizeAll1;
TAction *HelpAbout1;
TWindowClose *FileClose1;
TWindowTileVertical *WindowTileVertical1;
TMenuItem *WindowTileItem2;
TToolBar *ToolBar2;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TToolButton *ToolButton4;
TToolButton *ToolButton5;
TToolButton *ToolButton6;
TToolButton *ToolButton7;
TToolButton *ToolButton8;
TToolButton *ToolButton9;
TToolButton *ToolButton10;
TToolButton *ToolButton11;
TImageList *ImageList1;
TLabel *Label1;
void __fastcall FileNew1Execute(TObject *Sender);
void __fastcall FileOpen1Execute(TObject *Sender);
void __fastcall HelpAbout1Execute(TObject *Sender);
void __fastcall FileExit1Execute(TObject *Sender);
private:
TTreeNodes *DataNodes;
TTreeNode *DataNode;
int Index;
void __fastcall CreateMDIChild(const String Name);
TMDIChild* ChildArray[20];
public:
virtual __fastcall TMainForm(TComponent *Owner);
};
//----------------------------------------------------------------------------
extern TMainForm *MainForm;
extern TMDIChild *__fastcall MDIChildCreate(void);
//----------------------------------------------------------------------------
#endif
---------------------------------------------------------------------------------------
MAIN.CPP
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#include "About.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent *Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::CreateMDIChild(String Name)
{
//--- create a new MDI child window ----
ChildArray[0] = new TMDIChild(Application);
ChildArray[0]->Caption= "Finestra MDI";
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FileNew1Execute(TObject *Sender)
{
CreateMDIChild("NONAME" + IntToStr(MDIChildCount + 1));
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
----------------------------------------------------------------------------------------
CHILDWIN.H
//----------------------------------------------------------------------------
#ifndef ChildWinH
#define ChildWinH
//----------------------------------------------------------------------------
#include <Controls.hpp>
#include <Forms.hpp>
#include <Graphics.hpp>
#include <Classes.hpp>
#include <Windows.hpp>
#include <System.hpp>
#include <StdCtrls.hpp>
//----------------------------------------------------------------------------
class TMDIChild : public TForm
{
__published:
TButton *Button1;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall Button1Click(TObject *Sender);
private:
public:
virtual __fastcall TMDIChild(TComponent *Owner);
};
//----------------------------------------------------------------------------
#endif
---------------------------------------------------------------------------------------
CHILDWIN.CPP
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ChildWin.h"
#include "MAIN.CPP"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
//---------------------------------------------------------------------
__fastcall TMDIChild::TMDIChild(TComponent *Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------
void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
//---------------------------------------------------------------------
void Buttonate(TLabel *Label)
{
Label->Caption= "Label moddificata";
}
void __fastcall TMDIChild::Button1Click(TObject *Sender)
{
Buttonate(MainForm->Label1);
}
----------------------------------------------------------------------------------------