Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben
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?

Geschrieben

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.

Geschrieben
Ü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?

Geschrieben

So...

  1. Lesen!
  2. 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:

Geschrieben

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.

Geschrieben
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?

Geschrieben

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.

Geschrieben
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

Geschrieben
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 :D

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.

Geschrieben
hab ich gemacht. passiert trotzdem nix.

Hm...das ist dann aber in der Tat etwas merkwürdig. :beagolisc

Ich weiss :D

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...

Geschrieben

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! :rolleyes:

Geschrieben
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! :rolleyes:

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?

Geschrieben

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.
Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...