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.

Absturtz beim öffnen mit DoModal()

Empfohlene Antworten

Veröffentlicht

Hi, mein Programm stürtzt beim öffnen eines neuen Dialogs ab und ich kann mir nicht erklären wieso. Es ging die ganze Zeit.

Hab ein Haltepunkt bei OnInitDialog gesetzt, aber das wird erst garnicht erreicht.

Das hier ist die Absturzstelle aber das sagt mir garnix:

	if (hWndCtrl == NULL)

	{

		TRACE1("Error: no data exchange control with ID 0x%04X.\n", nIDC);

		ASSERT(FALSE);

Könnt Ihr mir weiterhelfen? Woran könnte es liegen?

Gruß, Filou

Das hier ist die Absturzstelle aber das sagt mir garnix:
Es wäre sehr hilfreich gewesen, wenn du dazu geschrieben hättest, in welcher Datei bzw. Funktion dieser Code steht.

Ich vermute, du hast in deiner DoDataExchange-Methode einen Datenaustauschbefehl für ein Steuerelement, das nicht (mehr) da ist.

Oh Sorry!! Es steht in der Datei dlgdata.cpp

Line: 43

Die Funktion heißt: HWND CDataExchange::PrepareCtrl(int nIDC)

Wi egehe ich jetzt vor?

Soll ich alle Steuerelemente aus dem Dialog löschen?

Ich kanns mir nicht erklären. habe nämlich eigentlich nix geändert.

Kann ich irgendwie sehen an welchem Steuerelement das liegt?

Soll ich alle Steuerelemente aus dem Dialog löschen?
Nein.

Ich kanns mir nicht erklären. habe nämlich eigentlich nix geändert.
Jaja, das kenn' ich :D

Kann ich irgendwie sehen an welchem Steuerelement das liegt?
Ja. Wenn du das Programm im Debugger startest, kannst du in der Ausgabe die Trace-Meldung

TRACE1("Error: no data exchange control with ID 0x%04X.\n", nIDC);
sehen. Da drin steht die ID des Steuerelements, das an dem Ärger schuld ist. Du kannst dir auch nIDC auch einfach im Debugger ansehen.

In der resource.h kannst du die symbolische Konstante für diese Zahl raussuchen.

Ok, ok... ich hab doch was gemacht.

Lag an einem Static das bei doppelklick eine Funktion aufruft.

Die hatte ich umbenannt.

Habs nicht gleich gem,erkt weil ich in der zwischenzeit weiter programmiert hatte :rolleyes:

Ich schäme mich auch :hells: :)

Danke Dir!!

  • 4 Jahre später...

Ich hab den selben Fehler auch - ich hab bereits die komplette Klasse und Listview neu erstellt (mit dem Klassenassisstent, danach die alten Methoden etc. reinkopiert), wenn ich im Resource-Editor auf das Fenster klicke springt er auch korrekt in meinen Quelltext, daran liegts also nicht. Ich hab bereits mit den .rc-Dateien herumgespielt aber daran kann es auch nicht liegen wiel Einzig und Allein die Listview spinnt, alles andere funktioniert perfekt. Spaßeshalber hab ich meiner IDC_LIST1 mal die Zahl 4711 gegeben - keine Änderung ... hat jemand Vorschläge?

Infos :


  • die Klasse die die Resource "haben" soll ist abgleitet von CDialogEx
  • die resource selbst :
    IDD_MEINWINDOW DIALOGEX 0, 0, 317, 196
    
    STYLE DS_SETFONT | DS_FIXEDSYS | DS_NOFAILCREATE | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
    
    EXSTYLE WS_EX_NOPARENTNOTIFY | WS_EX_APPWINDOW
    
    CAPTION "Mein Titel hier"
    
    FONT 8, "MS Shell Dlg", 400, 0, 0x1
    
    BEGIN
    
        CONTROL         "Info-Meldungen",IDC_INFO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,6,67,10
    
        CONTROL         "Warnungen",IDC_WARNING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,90,6,53,10
    
        CONTROL         "Fehlermeldungen",IDC_ERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,174,6,71,10
    
        CONTROL         "DEBUG",IDC_DEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,270,6,36,10
    
        CONTROL         "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,6,18,306,174
    
    END



  • Klassendeklaration = Standard, vom Klassenassistenten über den Resource-Editor
  • Membervariable für das ClistCtrl = erstellt und als private in der Klasse

Lag an einem Static das bei doppelklick eine Funktion aufruft.

Die hatte ich umbenannt.

Was? Kannst du das (falls du hier noch aktiv bist) mal erläutern? Was hast du damals gemacht VOR und NACH dem Fehler?

Bearbeitet von registrierenFürNDokument
Weil?

(...)

Das Problem ist behoben, die Ursache war folgende :

Ich erstelle in einer Dummy-Klasse (erbt von CWnd) beliebig viele CDialogs (eigentlich CDialogEx) - es wird somit eine Resource (die eines kompletten Fensters) "aktiviert" und angezeigt die nicht immer (bisher : überhaupt nicht) den selben Inhalt hat - manche habe Listviews, andere wiederum nicht; ausserdem gilt die ID für meine listview sowieso nur für eine einzige Instanz, ist ja logisch - soweit war ich auch schon ;).

Das Problem ist nun dass die Entität, die beim Laden / Erstellen einer Resource (Ich mach es direkt in CDialog::Create) im RAM erstellt wird auch erst wirklich DANN existiert wenn der entspr. Punkt im übersetzten Quelltext erreicht ist - bei mir kann das zu einer beliebigen Zeit sein, nicht unbedingt nach dem Start der App. Erst wenn diese Entität im RAM liegt (daher : wenn der CDialog auch wirklich Create() erreicht) ist die listview gültig ... die komplette Control-resource ist also abhängig von Laufzeitcode .... das finde ich persönlich sehr seltsam aber nun gut

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.