Loki876 Geschrieben 3. Februar 2006 Geschrieben 3. Februar 2006 Hi, bis jetzt habe ich mein Programm "Dialogfeld basierend" programmiert und mich jetzt (aus verschiedenen Gruenden) dazu entschlossen auf SDI zu wechseln. Habe vorher noch nie in diese Richtung programmiert, bin also was das angeht recht jungfraeulich und meine frage koennten dem einen oder anderen etwas banal vorkommen. zu meinem problem: ich hab mir schon ne halbwegs ordendliche benutzeroberflaeche, mit dem unter http://www.codeproject.com/dialog/visualfx.asp zu beziehenden Quellcode fuer ein paar nuetzliche Klassen, zusammengebastelt. Habe mein Hauptfenster unterteilt und in eins der teilfenster ein Dialogfenster(CFormView) eingtefuegt. Dieses Dialogfenster besitzt u.a. ein eingabefeld, dem ich die membervariable m_sFileName zu geordnet habe. In der Klasse CApplicationDoc habe ich die Funktion OnOpenFile implementiert. Nun will ich den ausgewaehlten Dateinamen in dieses Eingabefeld reinschreiben. Bekomm dies aber nicht hin. gruss Thomas Zitieren
Loki876 Geschrieben 6. Februar 2006 Autor Geschrieben 6. Februar 2006 Kann mir keiner helfen? Oder werden noch irgendwelche anderen angaben benoetigt? Zitieren
Klotzkopp Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Wobei denn helfen? Du hast weder eine Frage gestellt noch eine konkrete Problembeschreibung geliefert oder beschrieben, was du versucht hast, um das Problem zu lösen. Auf "Bekomm dies aber nicht hin" wird hier kaum jemand anspringen. Zitieren
Loki876 Geschrieben 6. Februar 2006 Autor Geschrieben 6. Februar 2006 Naja, ich war der meinung ich haette recht genau beschrieben was ich machen will. Aber anscheinend war dem nicht so ich moechte in das eingabefeld(mit m_sFileName) des dialogfeldes, dem die Klasse CDlg(Basisklasse CFormView) zu geordnet ist, etwas schreiben, das in einer Fukntion des Klasse (CApplicationDoc) festgelegt wird. In meinem Fall moechte ich den in CApplication::OnFileOpen() ermittelten Dateinamen in dieses besagte Eingabefeld schreiben. Dazu habe ich jetzt versucht in CApplicationDoc einen Pointer auf die Klasse CDlg zu definierern. CDlg* pDlg und dann nach dem der dateipfad m_cstrFilePath ermittelt wurde. ((CDlg*)pDlg->m_sFileName = m_cstrFilePath: Beim Compilieren wurd mir kein fehler angezeigt. Jedoch wenn ich das Programm laufen lasse, kommt: Unbehandelte Ausnahme in Application.exe (MFC42D.DLL): 0xC0000005: Access Violation Zitieren
Hexagon Geschrieben 6. Februar 2006 Geschrieben 6. Februar 2006 Dazu habe ich jetzt versucht in CApplicationDoc einen Pointer auf die Klasse CDlg zu definierern. CDlg* pDlg und dann nach dem der dateipfad m_cstrFilePath ermittelt wurde. ((CDlg*)pDlg->m_sFileName = m_cstrFilePath: Beim Compilieren wurd mir kein fehler angezeigt. Jedoch wenn ich das Programm laufen lasse, kommt: Unbehandelte Ausnahme in Application.exe (MFC42D.DLL): 0xC0000005: Access Violation Hast du denn auch für den Pointer pDlg ein Objekt erzeugt? Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Waere es denn rein theoretisch denkbar das oben beschriebene Problem auch gaenzlich ohne pointer zu loesen? Habe jetzt mal versucht eine Variable m_dDlg (CDlg) zu deklarieren und dann zum testen: BOOL CApplicationDoc::OnOpenDocument(LPCTSRT lpszPathName) { ... m_dDlg.m_sFileName = "Test"; UpdateAllViews(NULL): return TRUE; } aber in dem Dialogfeld wird nix angezeigt. Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Einen Dialog sollte man ja auch irgendwie anzeigen, oder? Da gibt es verschiedene Möglichkeiten, aber die einfachste ist ein DoModal(). Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 das dialogfeld, gehoert zur klasse CFormView, und wird durch CMainFrame::OnCreateClient in die Ansicht eingebaut. Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Besteht den die Verbindung zwischen m_sFileName und dem Dialogfeld? Damit meine ich ganz speziell DoDataExchange(...). Siehe auch hier. Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Mit DoDataExchange habe ich nix gemacht. wie implementiere ich das dort? Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Hab nachgesehen. die funktion DoDataExchange ist vorhanden. und es gibt mehrere eintraege der form: DDX_Text(pDX, IDC_FILENAME, m_sFileName); Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Überschreib doch mal OnUpdate in deiner FormView und füge an erster Stelle ein UpdateDate(false) ein... Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Überschreib doch mal OnUpdate in deiner FormView und füge an erster Stelle ein UpdateDate(false) ein... Hab jetzt folgendes eingefuegt: void CDlg::OnUpdate(CView* pSender, LPARAM lHint, Cobject* pHint) { UpdateData(FALSE); } Passieren tut sich allerding nix. Muss ich die Funktion OnUpdate dann nochmal explizit aufrufen oder wird sie von UpdateAllViews(NULL) automtatisch ausgefuehrt? Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 So... Lesen!Wieso zum Henker heißt eine FormView bei dir Dlg? Kann es sein, daß du das alte Projekt einfach überschrieben hast? Ach ja...die OnUpdate-Funktion der übergeordneten Klasse sollte man auch aufrufen, oder? :confused: Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Zu 1.) Das habe ich schon. Trotzdem danke! Zu 2.) Die habe ich nur hier CDlg genannt. In meinem Programm heisst sie anders. Hab sie hier so genannt weil ich dir Form mit dem Dialog Editor erstellt habe. Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Muss ich die Funktion OnUpdate dann nochmal explizit aufrufen oder wird sie von UpdateAllViews(NULL) automtatisch ausgefuehrt? Laut MSDN-Doku wird durch UpdateAllViews(...) das OnUpdate(...) aufgerufen! Re: Zu 1.) Wußt ich nicht, sorry! Re: Zu 2.) Aha. Ist ein bissel verwirrend, aber nagut...:beagolisc Rufst du denn in CDlg::OnUpdate(...) auch das CFormView::OnUpdate(...) auf? Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Nein, noch nicht. welche Parameter schreibe ich dann fort rein? die selben die auch schon bei CDlg::OnUpdate(...) deklarierrt(oder definiert wie auch immer) werden? Sorry wenn meine fragen etwas diletantisch wirken, bin kein programmierer. Muss es aber fuer meine Diplom Arbeit. Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Nein, noch nicht. welche Parameter schreibe ich dann fort rein? die selben die auch schon bei CDlg::OnUpdate(...) deklarierrt(oder definiert wie auch immer) werden? Einfach die Parameter nehmen, die du bekommst. Also: pSender, lHint und pHint. Ist sozusagen "nur" noch das weiterreichen an die Basisklasse! Sorry wenn meine fragen etwas diletantisch wirken, bin kein programmierer. Muss es aber fuer meine Diplom Arbeit. Oha! Gefährliche Mischung! :floet: :e@sy Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Einfach die Parameter nehmen, die du bekommst. Also: pSender, lHint und pHint. Ist sozusagen "nur" noch das weiterreichen an die Basisklasse! hab ich gemacht. passiert trotzdem nix. Oha! Gefährliche Mischung! :floet: :e@sy Ich weiss Is aber nicht wie wenn ich es nicht vorher selbst versuche rauszubekommen und meine programmiertechnischen probleme zu loesen. Aber bei der sache hier, steh ich vor einem raetsel. Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 hab ich gemacht. passiert trotzdem nix. Hm...das ist dann aber in der Tat etwas merkwürdig. :beagolisc Ich weiss Is aber nicht wie wenn ich es nicht vorher selbst versuche rauszubekommen und meine programmiertechnischen probleme zu loesen. Aber bei der sache hier, steh ich vor einem raetsel. Ich leider auch. Sorry... Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Ich leider auch. Sorry... ja trotzdem danke. und ne alternative rangehensweise wuerde dir jetzt spontan auch nicht einfallen? so rein zufaellig... Zitieren
Hexagon Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Hm...brechstangen methoden... CEdit *theEditField = (CEdit *)(GetDlgItem(IDC_FILENAME)); if (theEditField) { theEditFiled->SetWindowText(m_sFileName); theEditFileld->UpdateData(false); theEditField->UpdateWindow(); } Aber wie immer: Alles ohne Gewähr! Zitieren
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Hm...brechstangen methoden... CEdit *theEditField = (CEdit *)(GetDlgItem(IDC_FILENAME)); if (theEditField) { theEditFiled->SetWindowText(m_sFileName); theEditFileld->UpdateData(false); theEditField->UpdateWindow(); } Aber wie immer: Alles ohne Gewähr! hab es mal eingetipt. Bei GetDlgItem verlangt er nen 2 parameter. Unter msdn.microsoft.com steht: HWND GetDlgItem( HWND hDlg, int nIDDlgItem ); was sollte ich fuer hDlg annehmen? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Bei GetDlgItem verlangt er nen 2 parameter.Dann hast du das nicht in eine Memberfunktion einer von CWnd abgeleiteten Klasse geschrieben. Das muss schon in die View, oder du musst einen Zeiger auf die View vor GetDlgItem setzen. Zitieren
Loki876 Geschrieben 8. Februar 2006 Autor Geschrieben 8. Februar 2006 Hab es grad hinbekommen. Hab in CApplicationDoc::OnOpenFile den Dateinamen an die Membervaribale m_sFile uebergeben, Und in die Funktion OnUpdate(...) folgendes eingefuegt: CApllicationDoc* pDoc = static_cast <CApplicationDoc*>(GetDocument); ASSERT(pDoc); m_sFileName = pDoc->m_sFile; Danke nochmals fuer alle beitraege. Gruss Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.