Listbox füllen, Verständniss Problem
-
Hallo Zusammen,
Bin gerade dabei mich in c++ einzuarbeiten und noch absoluter Anfänger im Objekt orientierten Bereich(Kenne mich bisher nur mit C für Mikrokontroller aus).
Ich habe ein fertiges Projekt das ich erweitern möchte, dort gibt es ein Dialog mit einer Listbox in der zugehörigen Cpp datei gibt es folgenden Funktion um diese Listbox zu füllen:
void CUsbHidDemoCodeDlg::AddRecievedData(CString NewData) { m_RecievedData.AddString( NewData ); // display only last 100 messages recieved if(m_RecievedData.GetCount()>100) { m_RecievedData.DeleteString(0); } // Set Focus on Last Element int nCount = m_RecievedData.GetCount(); if (nCount > 0) m_RecievedData.SetCurSel(nCount-1); }Das funktioniert auch wunderbar, jetzt möchte aus einem anderem Modul in diese Listbox auftretene Fehler reinschreiben. Dieses andere Modul wird mit einem Button aus dem gleichen Dialog aufgerufen. Wie geht man jetzt am besten vor? Dises Listbox Element irgendwie der Funktion in dem andere Modul übergeben? Kann ich direkt auf die Listbox zugreifen?
Anbei noch der code, der Header Datei
(KommToolDlg.h), kann man hier auch komplette Zip's hochladen, weil ich nicht genau weiß was noch wichtig ist.// UsbHidDemoCodeDlg.h : header file // #if !defined(AFX_USBHIDDEMOCODEDLG_H__F9AA5915_C6E4_4CF0_95B7_2C6EB1964BAB__INCLUDED_) #define AFX_USBHIDDEMOCODEDLG_H__F9AA5915_C6E4_4CF0_95B7_2C6EB1964BAB__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 ///////////////////////////////////////////////////////////////////////////// // CUsbHidDemoCodeDlg dialog class CUsbHidDemoCodeDlg : public CDialog { // Construction public: void AddRecievedData(CString NewData); void ConnectDevice(); void DisableLedButton(); void EnableLedButton(); boolean Led1; boolean Led2; boolean Led3; boolean Led4; boolean IsConnected; HINSTANCE hLib; int Vid; int Pid; CUsbHidDemoCodeDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CUsbHidDemoCodeDlg) enum { IDD = IDD_USBHIDDEMOCODE_DIALOG }; CButton m_FwUpgrade; CListBox m_RecievedData; CStatic m_Status; CButton m_Led4; CButton m_Led3; CButton m_Led2; CButton m_Led1; CString m_PID; CString m_VID; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CUsbHidDemoCodeDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CUsbHidDemoCodeDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnLed1(); afx_msg void OnLed2(); afx_msg void OnLed3(); afx_msg void OnLed4(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnFwUpgrade(); virtual void OnCancel(); afx_msg void OnButtonVidPid(); //}}AFX_MSG DECLARE_MESSAGE_MAP() BOOL OnDeviceChange(UINT nEventType, DWORD dwData); public: //afx_msg void OnBnClickedMfcbutton1(); //afx_msg void OnBnClickedStatus2(); //afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButtonOpenfile(); afx_msg void OnBnClickedButtonstartupgrade(); }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_USBHIDDEMOCODEDLG_H__F9AA5915_C6E4_4CF0_95B7_2C6EB1964BAB__INCLUDED_)Wünsche noch einen Abend!
- Falko
-
Solange ich receive nicht richtig schreiben kann, würde ich einfach deutsche Variablennamen benutzen, um mir peinliche Antworten wie meine zu ersparen.
-
spatzvoyager schrieb:
Solange ich receive nicht richtig schreiben kann, würde ich einfach deutsche Variablennamen benutzen, um mir peinliche Antworten wie meine zu ersparen.
Oh, ist mir noch gar nicht aufgefallen, aber lustig ist ja das der Code noch der original Atmel Demo Code ist...eigentlich eine amerikanische Firma 
- Falko
-
Da ich noch nicht wirklich weiter gekommen bin, hab ich mal versucht das Problem auf ein einfaches Beispiel zu reduzieren. Hab mit Visual Studio ein neues MFC Projekt angelegt. Eine Form hat ein Button "Firmware Update". Dort soll die Funktion firmwareupdate in der FirmwareUpdate.cpp gestartet werden. Damit die Funktion Statusmeldungen direkt darstellen kann, habe ich auch eine Listbox in diese Form gesetzt. Diese (bzw. das aufrufende Objekt) soll der Funktion übergeben werden, damit diese weiß, wo die Meldungen angezeigt werden sollen. Leider bekomme ich die Fehlermeldung:
firmwareupdate.cpp(10): error C2027: Verwendung des undefinierten Typs
"CmfcTest1Dlg"Obwohl ich in der Header die Klasse als Prototyp deklariert habe, wenn ich statt der Prototypen Deklaration den Header der Klasse inkludiere gibt es diverse andere Fehler.. was mache ich falsch?
Vielleicht ist mein Konzept ja voll daneben
, würde mich freuen, wenn mich jemand in die richtig Richtung bringt.Code ist wie folgt (mfcTest1Dlg.h):
// mfcTest1Dlg.h: Headerdatei // #pragma once #include "afxwin.h" // CmfcTest1Dlg-Dialogfeld class CmfcTest1Dlg : public CDialogEx { // Konstruktion public: CmfcTest1Dlg(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten enum { IDD = IDD_MFCTEST1_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: HICON m_hIcon; // Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedFwupdate(); afx_msg void OnLbnSelchangeList1(); CListBox m_RecievedData; };Die zugehörige cpp datei:
// mfcTest1Dlg.cpp: Implementierungsdatei // #include "stdafx.h" #include "mfcTest1.h" #include "mfcTest1Dlg.h" #include "afxdialogex.h" #include "FirmwareUpdate.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info" class CAboutDlg : public CDialogEx { public: CAboutDlg(); // Dialogfelddaten enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmfcTest1Dlg-Dialogfeld CmfcTest1Dlg::CmfcTest1Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmfcTest1Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmfcTest1Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_RecievedData); } BEGIN_MESSAGE_MAP(CmfcTest1Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_FWUpdate, &CmfcTest1Dlg::OnBnClickedFwupdate) ON_LBN_SELCHANGE(IDC_LIST1, &CmfcTest1Dlg::OnLbnSelchangeList1) END_MESSAGE_MAP() // CmfcTest1Dlg-Meldungshandler BOOL CmfcTest1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // TODO: Hier zusätzliche Initialisierung einfügen m_RecievedData.AddString( L"a" ); return TRUE; // TRUE zurückgeben, wenn der Fokus nicht auf ein Steuerelement gesetzt wird } void CmfcTest1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt. void CmfcTest1Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext zum Zeichnen SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Symbol in Clientrechteck zentrieren 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; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer // das minimierte Fenster mit der Maus zieht. HCURSOR CmfcTest1Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CmfcTest1Dlg::OnBnClickedFwupdate() { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. firmwareUpdate(this); }FirmwareUpdate.h:
#ifndef __FIRMWAREUPDATE_H_ #define __FIRMWAREUPDATE_H_ //#include "mfcTest1Dlg.h" //Prototyp der Klasse class CmfcTest1Dlg; //Prototyp der Funktion int firmwareUpdate(CmfcTest1Dlg * resultobjekt); #endifund die FirmwareUpdate.cpp:
#include "stdafx.h" #include "FirmwareUpdate.h" class CmfcTest1Dlg; int firmwareUpdate(CmfcTest1Dlg * resultobjekt); int firmwareUpdate(CmfcTest1Dlg * resultobjekt) { resultobjekt->m_RecievedData.AddString( L"Info: starte Firmware Update" ); return 3; }