Haupt-DialogFeld problem
-
Hi
Ich möchte von eine klasse aus auf die Funktionen des Haupt-Dialoges zugreifen.
Ich habe Das Haupt Dialog In der kalsse MyMidiIn.cpp includiert.und eine instanz angelegt
//---------------
#include "stdafx.h"
#include <MaxMidi.h>
#include "MyMidiIn.h"
#include "AkkordErkennung.h"
#include "HauptDlg.h"BOOL MyMidiIn::ProcessMidiData(LPMIDIEVENT lpEvent)
{HauptDlg HDlg;
if(EchoOut)
EchoOut->Put(lpEvent);HDlg->m_AkkAnzeige="Hallo Can..";
HDlg->UpdateData(false);return TRUE;
}
}
//--------
c:\Dokumente und Einstellungen\can\Desktop\Artur projekt\ArturProjektNew\F_Music.Net\FK_MUSIC\projekt_src\MyMidiIn.cpp(33): error C2079: 'HDlg' verwendet undefiniertes class 'HauptDlg'Mit diese fehler meldung kann nichts Anfangen

Wie erhalte ich zugriff auf die Funktionen der klasse HauptDlg.cpp ?
Komisch mit anderen kalssen geht es nur mit dem HautpDlg.cpp nicht!!
Für hilfe jetz bin ich seher Dankbar....
Grüße Can
-
Ich weiss nicht ob ich genau verstanden habe was du da veranstalltest
Ich vermute mal du hast dein dialog mit DoModal() vom "Hauptdialog" aus gestartet...mit AfxGetMainWnd() bekommst du ein CWnd* das du eigentlich nur nachdeinem hauptdialog casten musst und dann kannst du auf die members deines hauptdialoges zugreifen...
-
Hallo Windalf
Danke für deine Antwort!
Ich habe nicht zwei Dialoge.
Nur den Haupt-DialogAuf die Haupt-Dialog Members möchte ich über die klasse MyMidiIn.cpp zugreifen.
Da ich Programmier Anfänger bin habe ich auch nicht verstanden was meinst.
wie macht man es wenn mann ein Steuerelement (Textfeld) in HauptDialog über eine Andere klasse Aktualisiert ?
-
Ich fürchte ich weiss auch noch nicht so ganz was du da veranstallten willst...

also wenn ich dich richtig verstanden habe hast du von deiner klasse HauptDlg eine Instanz HDlg angelegt...
so wenn du jetzt auf die members dieser insanz zugreifen willst brauchst du nur den Punkt-operator zu verwenden HDlg.memberVon deiner Fehlermeldung her würd ich allerdings sagen das die Klasse in dem File HauptDlg.cpp nicht HauptDlg heisst... musst mal in das File reingucken wie du die Klasse da genannt hast... laut fehlermeldung ist er ja nicht mal in der lage eine instanz der klasse anzulegen weil er sie nicht kennt...
-
ich Hatte es umgeschrieben
so ist es in orginal#include "stdafx.h"
#include <MaxMidi.h>
#include "MyMidiIn.h"
#include "AkkordErkennung.h"
#include "FK_MusikDlg.h"
//BEGIN_MESSAGE_MAP(MyMidiIn, CMaxMidiIn)
// //{{AFX_MSG_MAP(MyMidiIn)
// //}}AFX_MSG_MAP
//END_MESSAGE_MAP()//---------------------------------------------------------------------------
// Constructor
//---------------------------------------------------------------------------
MyMidiIn::MyMidiIn()
{
EchoOut = NULL;
}/////////////////////////////////////////////////////////////////////////////
// MyMidiIn virtual functions//---------------------------------------------------------------------------
// ProcessMidiData
//---------------------------------------------------------------------------
BOOL MyMidiIn::ProcessMidiData(LPMIDIEVENT lpEvent)
{FK_MusikDlg HDlg;//Haupt Dialog Funktioniert nicht
AkkordErkennung AkkEr;// Es Funktioniert
CString sNote;if(EchoOut)
{
EchoOut->Put(lpEvent);//sNote=AkkEr.sGetNoteName(lpEvent->data1);
//HDlg->m_AkkAnzeige="Hallo fuat";
}
return TRUE;
}
//--------
c:\Dokumente und Einstellungen\can\Desktop\Artur projekt\ArturProjektNew\F_Music.Net\FK_MUSIC\projekt_src\MyMidiIn.cpp(33): error C2079: 'HDlg' verwendet undefiniertes class 'FK_MusikDlg'HDlg wird nicht erkannt denke ich oder? Aber AkkEr wird erkannt hab doch das gleiche gemacht.
Also LPMIDIEVENT lpEvent sind die noten die von dem Midi-Keyboard gesendet werden.
Ich möchte einfach sagen wenn ich eine Keyboard Taste drücke
if(lpEvent->data1 !=0)
Dann soll in HDlg das Text-Feld ein String bekommenHDlg->m_AkkAnzeige = "Hallo Can";
HDlg->UpdateData(FALSE);ich hatte es in Vc++6 geschreiben und es hat funktioniert
gestern habe ich mir das Vc++.Net gekauft aber hier geht es nicht.der punkt . und der zugrifs op haben keine wirkung
-
wenn er schon an der Stelle nicht will FK_MusikDlg HDlg; also da wenn du keine instanz von FK_MusikDlg anlegen kannst...kann ich dir so auch nicht sagen woran das liegt
includieren tust du ja "FK_MusikDlg.h" ,wo ja vermutlich die klasse FK_MusikDlg drin deklariert ist...
wenn es in FK_MusikDlg.h eine Klasse FK_MusikDlg gibt musst du auf jeden fall dort eine Intanz anlegen können (wie sinnvoll das an der Stelle ist sei mal dahingestellt)...also dass das nur an der umstellung der entwicklungsumgebung liegen soll kann ich in deinem fall nicht nachvollziehen... Hast du denn wenigstens alle include und lib pfade auch VS.Net gesetzt so wie du es in Vc++6 hattest?
-
Ich glaube, du sollest grundsätzlich lernen:
Trenne Daten immer von der Ansicht (Dialog/View).Und zu deinem Problem:
1. Verwende einen Pointer oder eine Referenz auf den Hauptdialog,
eine eigene Variable dafür bringt dich nur in Schwierigkeiten,
da du dann eine 2. Instanz deiner Dialogklasse hast.
2. Wenn er die Klasse nicht kennt (bzw. nicht kennen will),
verwende Forward Dekleration, um diesen Problemen auszuweichen.Devil
-
Dankee für die Antworten ich habe es jetz!
#include "stdafx.h"
#include <MaxMidi.h>
#include "MyMidiIn.h"
#include "AkkordErkennung.h"
#include "FK_MusikDlg.h"
//BEGIN_MESSAGE_MAP(MyMidiIn, CMaxMidiIn)
// //{{AFX_MSG_MAP(MyMidiIn)
// //}}AFX_MSG_MAP
//END_MESSAGE_MAP()//---------------------------------------------------------------------------
// Constructor
//---------------------------------------------------------------------------
MyMidiIn::MyMidiIn()
{
EchoOut = NULL;
}/////////////////////////////////////////////////////////////////////////////
// MyMidiIn virtual functions//---------------------------------------------------------------------------
// ProcessMidiData
//---------------------------------------------------------------------------
BOOL MyMidiIn::ProcessMidiData(LPMIDIEVENT lpEvent)
{//CFK_MusikDlg *HDlg;
CFK_MusikDlg *Dialog;
AkkordErkennung AkkEr;
CString sNote;
if(EchoOut)
{
EchoOut->Put(lpEvent);sNote=AkkEr.sGetNoteName(lpEvent->data1);
Dialog->m_AkkAnzeige=sNote; // hier bleibt der debug pfeil stehen
Dialog->UpdateData(false);}
return TRUE;
}jetz kann ich ohne fehler das programm aus führen
Aber wenn ich eine Taste drücke dann stürtz das programm ab und der debuger pfeil bleibt beiDialog->m_AkkAnzeige=sNote; Stehen.
Es scheit das immer noch etwas nicht stimmt
-
ist ja auch nicht weiter verwunderlich
wenn du es so deklarierst
CFK_MusikDlg *Dialog;ist Dialog ein zeiger...
wenn du das teil nicht auf ne instanz zeigen lässt muss der ja abschmieren (die chance das der zufällig auf etwas "vernünftiges" zeigt dürfte geringer sein als im lotto zu gewinnen)...
also entweder mit new ne instanz erzeugen oder gleich CFK_MusikDlg Dialog; nicht als pointer verwenden...
-
Hertzlichen
Dankeeeeee!! jetz gehts

Grüße Can