Avatar billede rigpig Nybegynder
03. marts 2006 - 22:56 Der er 13 kommentarer og
1 løsning

Brug af member fra anden dialog

Tja, så er det mig igen!
Har oprettet 2 dialoger, dialog1 kaldes fra knap på dialog1.

Hvordan kan man bruge en member fra dialog1 i dialog2?

Dialog1:
Class name: CTon.
Cintrol ID: IDC_BOY.
Member: m_Boy

Dialog2:
Class name: CTrip

Jeg har headerfile "Ton.h" og "TonDlg.h" i TonDlg implementation file, men aligevel får jeg " m_Boy undeclared identifier"
Hvad er det jeg har gjort forkert?

Peter
Avatar billede rigpig Nybegynder
04. marts 2006 - 00:09 #1
Hvis jeg har forstået det rigtigt, er alle elementer i en klasse private indtil andet anført, kan m_Boy gøres public og kan det hjælpe?
Glemte at sige at programmet der bruges er Visual c++ 6
Peter
Avatar billede jpk Nybegynder
04. marts 2006 - 09:19 #2
For at gøre m_Boy public, kan du bruge "public".
Jeg er ikke helt med på hvilken dialog der skal have adgang til den andens members..?

Fx:
class CTon : public CDialog
{
public:
  m_Boy;
};


// Et sted i koden...
CTon dlg;
dlg.m_Boy = someBoy;
dlg.DoModal();
Avatar billede rigpig Nybegynder
04. marts 2006 - 11:57 #3
Tak for svaret jpk.
På Dialog1(IDD_TONMILES_DIALOG) er der en editbox (IDC_BOY) den indeholder et resultat (m_Boy) som jeg gerne skulle bruge i Dialog2 (IDD_DRILLING_DIALOG)når der trykkes på en calculate knap (IDC_CALCULATE_DRILLING)
Dialog1 er en startside hvor brugeren indtaster nogle data som skal bruges i andre Dialoger.
Jeg håber dette er mere forståeligt jpk, beklager hvis mit spørgsmål var lidt "tåget" første gang.
Har lavet programmet i Visual Basic, vil nu gerne lave det i C++ men der er jo en lille bitte forskel i programeringen.
C++ er sjovt ! men pokkers svært.
Peter
Avatar billede rigpig Nybegynder
04. marts 2006 - 16:23 #4
Hvis jeg vælger Classview -> CTonmilesDlg, højreklikker kan jeg under: Add member function og add member variable vælge om denne skal være public,private eller protected, men er ikke helt klar over om det kan bruges.
Har prøvet at lege med jpk's kommentar, men får det ikke til at virke.

Peter
Avatar billede jpk Nybegynder
05. marts 2006 - 08:33 #5
Hej Peter

Hvad med at oprette den member (m_Boy) på begge dialoger, som public?
Så ville du kunne gøre således:

// Ved event-handler for tryk på knap
UpdateData(true); // Opdaterer membervariable med værdier fra controls (edit mv.).
CTon TonDlg;
TonDlg.m_Boy = m_Boy; // Sæt værdien af m_Boy til det samme som denne dialogs værdi for m_Boy.
TonDlg.DoModal(); // Vis dialogen.


Håber det hjælper, ellers skriv igen...

Mvh.
Jacob
Avatar billede rigpig Nybegynder
05. marts 2006 - 09:50 #6
Hmm har prøvet at indsætte member variable, men uden held. Viser lige lidt af koden:

void CTonMilesDlg::OnOk()  (Button på hovedsiden, denne udregner Bouyancy factor og viser den i IDC_BOUYANCY edit box:
{
    // TODO: Add your control notification handler code here
    //-----------------------------------------------
    // Calculating Bouyancy factor.
    //-----------------------------------------------
    UpdateData(true);
    m_Bouyancy = (65.5 - m_MudWeight) / 65.5;
    UpdateData(false);

Her til Button på IDD_TRIP_DIALOG:

// TripDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TonMiles.h"
#include "TripDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTripDlg dialog


CTripDlg::CTripDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTripDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CTripDlg)
    m_WgtDp = 0.0f;
    m_WgtCollar = 0.0f;
    m_Md = 0.0f;
    m_LengthCollar = 0.0f;
    m_DpStand = 0.0f;
    m_RoundTrip = 0;
    //}}AFX_DATA_INIT
}


void CTripDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTripDlg)
    DDX_Text(pDX, IDC_WGT_DRILLPIPE, m_WgtDp);
    DDX_Text(pDX, IDC_WGT_COLLAR, m_WgtCollar);
    DDX_Text(pDX, IDC_MD, m_Md);
    DDX_Text(pDX, IDC_LENGTH_COLLAR, m_LengthCollar);
    DDX_Text(pDX, IDC_DP_STAND, m_DpStand);
    DDX_Text(pDX, IDC_ROUND_TRIP_TM, m_RoundTrip);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTripDlg, CDialog)
    //{{AFX_MSG_MAP(CTripDlg)
    ON_BN_CLICKED(IDC_CALCULATE_TRIP, OnCalculateTrip)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripDlg message handlers

void CTripDlg::OnCalculateTrip() Button til udregning af trip tonmiles.
{
    // TODO: Add your control notification handler code here

Her skal jeg bruge m_Bouyancy til udregningen.
Under://{{AFX_DATA_INIT(CTripDlg) og CDialog::DoDataExchange(pDX);
kan jeg ikke se m_Bouyancy så det er vel derfor jeg får undeclared identifier ?
}
Undskyld det lange indlæg.

Peter
Avatar billede jpk Nybegynder
06. marts 2006 - 07:56 #7
Du bliver nødt til manuelt at tilføje/sætte værdien hvis du skal bruge den fra en anden dialog end den egentlig ligger på.

Prøv at vise mig koden hvor du opretter/viser dialogen der skal bruge m_Bouyancy.
Avatar billede rigpig Nybegynder
06. marts 2006 - 10:00 #8
Hej Jacob, håber dette hjælper, har lidt svært ved at forstå, at når man har navnet på dialogen, navnet på editboxen, navn på værdien i editboxen, at man så ikke kan hente denne i en anden dialog eller dennes kode uden videre, har nok rodet med Visual basic for længe. :)

IDD_TRIP_DIALOG: Her skal resultatet af udregningen vises in en editbox:

// TripDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TonMiles.h"
#include "TripDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTripDlg dialog


CTripDlg::CTripDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTripDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CTripDlg)
    m_WgtDp = 0.0f;
    m_WgtCollar = 0.0f;
    m_Md = 0.0f;
    m_LengthCollar = 0.0f;
    m_DpStand = 0.0f;
    m_RoundTrip = 0;
    //}}AFX_DATA_INIT
}


void CTripDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTripDlg)
    DDX_Text(pDX, IDC_WGT_DRILLPIPE, m_WgtDp);
    DDX_Text(pDX, IDC_WGT_COLLAR, m_WgtCollar);
    DDX_Text(pDX, IDC_MD, m_Md);
    DDX_Text(pDX, IDC_LENGTH_COLLAR, m_LengthCollar);
    DDX_Text(pDX, IDC_DP_STAND, m_DpStand);
    DDX_Text(pDX, IDC_ROUND_TRIP_TM, m_RoundTrip);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTripDlg, CDialog)
    //{{AFX_MSG_MAP(CTripDlg)
    ON_BN_CLICKED(IDC_CALCULATE_TRIP, OnCalculateTrip)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripDlg message handlers

void CTripDlg::OnCalculateTrip()    //Calculate Button på TripDlg:

{
    // TODO: Add your control notification handler code here

    // Her skal m_Bouyancy bruges til udregning f.eks: m_Bouyancy * m_WgtDp
        // m_Bouyancy skal ikke vises i en editbox på denne dialog, kun bruges i
        // udregningen.
        // Hvis det er nemmere, er det ok at der oprettes en editbox med m_Bouyancy
        // værdien. 

   
}
Avatar billede jpk Nybegynder
06. marts 2006 - 11:15 #9
Det er på CTon dialogen du indtaster m_Bouyancy, ikke?

Prøv at vise koden til der hvor du opretter/viser CTon dialogen.
Altså noget lign.:

CTon dlg;
dlg.DoModal();
Avatar billede rigpig Nybegynder
06. marts 2006 - 12:00 #10
m_Bouyancy bliver ikke indtastet, det er et resultat som bliver vist i en editbox på IDD_TONMILES_DIALOG, på samme dialog er der en button " Trip Tonmile" der åbnes IDD_TRIP_DIALOG hvor ved tryk på en button "Calculate" udregnes Trip Tonmiles, det er i denne calculate jeg skal bruge m_Bouyancy resultatet.

I mit første indlæg, prøvede jeg at opsætte et "simpelt" cenario der ikke havde så meget med mit project at gøre, jeg har fejlet totalt, det er klart at det er forvirrede hvis de blandes sammen.
Er der mulighed for at sende dig folderen med projectet, jeg har det dårligt med at du måske bruger en masse af din tid på at gætte hvad jeg mener.
Jeg er imponeret over din stædighed !

// TonMilesDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TonMiles.h"
#include "TonMilesDlg.h"
#include "TripDlg.h"
#include "DrilligDlg.h"
#include "CasingDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
        // No message handlers
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTonMilesDlg dialog

CTonMilesDlg::CTonMilesDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTonMilesDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CTonMilesDlg)
    m_MudWeight = 0.0f;
    m_Travel = 0;
    m_Bouyancy = 0.0;
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTonMilesDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTonMilesDlg)
    DDX_Text(pDX, IDC_MUDWEIGHT, m_MudWeight);
    DDX_Text(pDX, IDC_TRAVELIG_BLOCK, m_Travel);
    DDX_Text(pDX, IDC_BOUYANCY, m_Bouyancy);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTonMilesDlg, CDialog)
    //{{AFX_MSG_MAP(CTonMilesDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_TRIP_TM, OnTripTm)
    ON_BN_CLICKED(IDC_DRILL_TM, OnDrillTm)
    ON_BN_CLICKED(IDC_CASING_TM, OnCasingTm)
    ON_EN_CHANGE(IDC_TRAVELIG_BLOCK, OnChangeTraveligBlock)
    ON_BN_CLICKED(IDC_OK, OnOk)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTonMilesDlg message handlers

BOOL CTonMilesDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    // TODO: Add extra initialization here
   
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTonMilesDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTonMilesDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTonMilesDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CTonMilesDlg::OnTripTm()
{
    // TODO: Add your control notification handler code here
    //----------------------------
    // CTrip.h er included i ccp implementation file, se helt i top.
    //----------------------------
    CTripDlg Dlg;
   
    Dlg.DoModal();

Peter
Avatar billede jpk Nybegynder
06. marts 2006 - 12:08 #11
Du kan sende mig projektet på jacpost[snabel-a]post6.tele.dk.
Husk at slette debug/release foldere først, ellers fylder det så meget...
Avatar billede jpk Nybegynder
06. marts 2006 - 13:14 #12
Jeg kan se at du allerede har tilføjet m_Bouyancy til CTripDlg, altså skal du bare gøre sådan:

void CTonMilesDlg::OnTripTm()
{
    // TODO: Add your control notification handler code here
    //----------------------------
    // CTrip.h er included i ccp implementation file, se helt i top.
    //----------------------------
    CTripDlg Dlg;
    Dlg.m_Bouyancy = m_Bouyancy; // denne linie er alt jeg har tilføjet
    Dlg.DoModal();   
}

Du kan så anvende m_Bouyancy i OnCalculateTrip på CTripDlg:

void CTripDlg::OnCalculateTrip()
{
    // TODO: Add your control notification handler code here
    double d = m_Bouyancy * 5.0;
}
Avatar billede rigpig Nybegynder
06. marts 2006 - 17:02 #13
Det var pokkers, har prøvet noget lignende, som: CTonmilesDlg.m_Bouyancy = m_Bouyancy, samt en masse varianter, kunne ikke gætte den skulle hente værdien i sin egen dialog.
Rødderne til VB er ikke sådan at slippe af med.

Skal jeg tilføje m_Bouyancy til hver dialog hvor den skal bruges? (skal bruges i alle)

Smid endelig et svar jpk, tak for hjælpen igen.
Peter
Avatar billede jpk Nybegynder
06. marts 2006 - 17:06 #14
Det var godt problemet endelig blev løst.
Det er nok det letteste at tilføje m_Bouyancy til alle dialoger, ja...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester