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.

Empfohlene Antworten

Veröffentlicht

Hallo,

wie schließe ich das gerade aktuelle Formular?

Wenn im OnInitialUpdate() der View eine bestimmte Bedingung wahr ist, so soll das Fenster nicht mehr weiter aufgebaut, sondern geschlossen werdne.

Technician

Originally posted by Guybrush Threepwood

Hi,

hast du schon DestroyWindow() ausprobiert?

Gruß

Guybrush

jetzt eben ;)

DestroyWindow() führt zu einem "Die Anweisung ... verweist auf Speicher..."



void CMeinProgrammView::OnInitialUpdate()

{

	CFormView::OnInitialUpdate();

	ResizeParentToFit();


	if(wert>5)

	{

	int yesno = MessageBox(messText,  "Wert größer 5", MB_YESNO|MB_ICONEXCLAMATION);

		if(yesno == IDNO)

		{


			[b]//fenster schließen[/b]



		}


	}


Ich weiß nicht, was "wert" ist, und wann es gültige Daten enthält, aber OnInitialUpdate ist ein wenig zu spät, um den Fensteraufbau abzubrechen.

Kannst Du die MessageBox eventuell auch schon in PreCreateWindow anzeigen? Da müsstest Du nur FALSE zurückgeben.

Originally posted by Klotzkopp

Ich weiß nicht, was "wert" ist, und wann es gültige Daten enthält,

Das ist in diesem Fall egal; ich kann theoretisch hier jede Bedingung einsetzen (was ich eben im Programm brauche).

Originally posted by Klotzkopp

aber OnInitialUpdate ist ein wenig zu spät, um den Fensteraufbau abzubrechen.

Kannst Du die MessageBox eventuell auch schon in PreCreateWindow anzeigen? Da müsstest Du nur FALSE zurückgeben.

PreCreateWindow geht allerdings auch nicht --> "wert" kommt nämlich aus dem Doc und ist nicht in der View selbst enthalten...

Im Doc abzubrechen, scheint IMHO aber auch nicht zu gehen, da ich ja erst mal die Benutzerauswahl mittels MessageBox brauche...

:confused:

Technician

Originally posted by Guybrush Threepwood

Willst du nur das Fenster wieder schließen oder die ganze Anwendung beenden?

Nur das Fenster schließen - nicht die Anwendung!

Der Benutzer soll, wenn er "Nein" gewählt hat (und dadurch das Fenster geschlossen wurde), wieder ein Fenster aufmachen können. So wie in Word, wenn kein Dokument geöffnet ist.

Originally posted by Guybrush Threepwood

Und du kannst nicht irgendwie das Fensterobjekt an die Funktionübergeben

und dann damit CloseWindow() aufrufen?

Wenn ich

this->CloseWindow();

in der OnInitialUpdate() mache, wird das Fenster minimiert - CloseWindow schließt es nicht, sondern mimimiert es nur.

Das ist nicht, was ich erreichen möchte.

Außerdem kann man dann mit dem miminierten Fenster "herummalen", wenn ich es also verschiebe, werden's immer mehr (ich glaub, ihr kennt den Effekt...:rolleyes: ) - und das sollte wohl auch nicht sein...

Originally posted by Technician

PreCreateWindow geht allerdings auch nicht --> "wert" kommt nämlich aus dem Doc und ist nicht in der View selbst enthalten...

Aber wenn Du in CMeinProgrammView::OnInitialUpdate an "wert" herankommst, sollte es in CMeinProgrammView::PreCreateWindow doch auch gehen...
Originally posted by Klotzkopp

Aber wenn Du in CMeinProgrammView::OnInitialUpdate an "wert" herankommst, sollte es in CMeinProgrammView::PreCreateWindow doch auch gehen...

... wenn ich mir "wert" in PreCreateWindow hole, gibt's dann wieder (genau an der Stelle wo ich mir wert hole) ein hübsches "Die Anweisung in ... verweist auf..." :(

wert wird übrigens in CMeinProgrammDoc::OnOpenDocument(LPCTSTR lpszPathName) angelegt (wenn das was hilft)

Originally posted by Klotzkopp

Dann gib die MessageBox doch da aus, und mach bei IDNO einfach return FALSE.

Ich hab jetzt den Code eingefügt:



if(wert>5)

	{

	int yesno = MessageBox(messText,  "Wert größer 5", MB_YESNO|MB_ICONEXCLAMATION);

		if(yesno == IDNO)

		{


	                    return FALSE;	


		}


	}


Aber mit "MessageBox" scheint er hier nix anfangen zu können - Compiler-Fehler:

error C2660: 'MessageBoxA' : Funktion akzeptiert keine 3 Parameter

Was hat das zu bedeuten?!

:confused:

Originally posted by Guybrush Threepwood

Du mußt als ersten Parameter noch das Fenster angeben dem die

MessageBox gehört.

und wie sieht dieser Parameter aus?! :confused:

Die View hat ein Document, aber das Document hat doch keine View?!!

(Der Code steht im Document, bei OnOpenDocument)

Jede Viewklasse ist von CWnd abgeleitet, also kannst Du

int CWnd::MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

verwenden. Dokumentklassen sind nicht von CWnd abgeleitet, also brauchst Du die WinAPI-MessageBox:

int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );

In Deinem Fall sähe das so aus:

int yesno = MessageBox( AfxGetMainWnd()->GetSafeHwnd(), messText, "Wert größer 5", MB_YESNO|MB_ICONEXCLAMATION);

@Klotzkopp

Da wär ich nie drauf gekommen!

Danke :)

Der "standart" MessageBox Befehl sieht so aus:


int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
[/PHP]

In den MFC kann man ihn aber auch als Methode von CWindow oder CWnd ohne den

ersten Parameter aufrufen, dann muß man aber das Objekt einer solchen (oder davon

abgeleiteten) Klasse angeben.

Ich hab aber gerade auch gesehen das du dass auch ohne Objekt ein paar Posts weiter

oben gemacht hast, warum das ging weiß ich nicht.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

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.