Zum Inhalt springen

Sdi


Loki876

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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