Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118

    Non riesco a puntare i membri della classe principale

    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);
    }

    ----------------------------------------------------------------------------------------

  2. #2
    Ho provato anche io a crearmi un MDI nel child ci metto un Button, nel main un label, nella on-click del child faccio MainForm->Label1->Caption = "CIao" ...e funziona

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Forse ci sarà un problema con gli argomenti della funzione "Buttonate".Forse la capacità di puntamento non è illimitata.

  4. #4
    Sinceramente non so che dire

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Può essere che ti funzioni?
    Potresti gentilmente postare l'esempio sottoforma di codice sorgente?

    Possibile che possa essere un problema derivato dalla macchina? VVoVe:

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464

    Re: Non riesco a puntare i membri della classe principale

    Originariamente inviato da cshark
    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).
    Non uso abitualmente C++Builder, ma conosco la libreria VCL su cui si basa (in quanto lavoro con Delphi).

    Mi sembra che ci sia un po' di confusione in quello che hai scritto: i puntatori a cui fai riferimento sono inizializzati, quando il form viene creato, per referenziare i controlli creati.

    E' possibile che sia il riferimento MainForm a non essere inizializzato.

    Adotterei in generale un altro approccio: passare alla form "figlia" un riferimento al form "principale" e, dalla form figlia, all'interno degli eventi, sfrutterei quel riferimento per modificare i controlli di quel form, appunto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Non credo dipenda dalla macchina...potrei postarti il codice ma credo che sia identico al tuo dato che quello che ho fatto è aggiungere solo una label al main creato dal wizard MDI e un pulsante al child creato dal wizard MDI.

    Comunque appoggio in pieno il suggerimento di Alka


  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Accetto il suggerimento di Alka. Mi sembra molto funzionale.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Come riferimento ho passato il puntatore della MainForm al puntatore a oggetti della finestra MDI. Sempre la stessa cosa. Per quanto riguarda il fattore ereditario, la finestra MDI assumerà lo stesso aspetto della MainForm, quindi cosa me ne faccio?

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464
    Originariamente inviato da cshark
    Come riferimento ho passato il puntatore della MainForm al puntatore a oggetti della finestra MDI. Sempre la stessa cosa. Per quanto riguarda il fattore ereditario, la finestra MDI assumerà lo stesso aspetto della MainForm, quindi cosa me ne faccio?
    Onestamente, io non riesco bene a capire come è organizzato il tuo codice, che tipo di struttura stai creando, in sostanza da dove arrivano i dubbi e perché quell'errore ti venga restituito.

    Forse con un po' di "debugging passo per passo"... :master:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.