Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Sdi

Empfohlene Antworten

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

Kann mir keiner helfen? Oder werden noch irgendwelche anderen angaben benoetigt?

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

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?

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.

das dialogfeld, gehoert zur klasse CFormView, und wird durch CMainFrame::OnCreateClient in die Ansicht eingebaut.

Mit DoDataExchange habe ich nix gemacht.

wie implementiere ich das dort?

Hab nachgesehen.

die funktion DoDataExchange ist vorhanden. und es gibt mehrere eintraege der form:

DDX_Text(pDX, IDC_FILENAME, m_sFileName);

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

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:

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.

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?

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.

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

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.

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

Ich leider auch. :(

Sorry...

ja trotzdem danke.

und ne alternative rangehensweise wuerde dir jetzt spontan auch nicht einfallen? so rein zufaellig...

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:

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?

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.