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
Loki876 Geschrieben 6. Februar 2006 Autor Geschrieben 6. Februar 2006 Kann mir keiner helfen? Oder werden noch irgendwelche anderen angaben benoetigt?
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.
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
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?
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.
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().
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.
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.
Loki876 Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Mit DoDataExchange habe ich nix gemacht. wie implementiere ich das dort?
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);
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...
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?
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:
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.
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?
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.
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
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.
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...
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...
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!
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?
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.
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden