MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 16.01.2018, 06:11   #31
Nouba
MOF Guru
MOF Guru
Standard

@JPA,

im Formular-Klassenmodul:
Code:

Option Explicit

' =============================================================================
Private CanClose As Boolean
' =============================================================================


' =============================================================================
Private Sub Form_AfterUpdate()
   AllowClose EnableClose
End Sub
' =============================================================================


' =============================================================================
Private Sub Form_Current()
   AllowClose EnableClose
End Sub
' =============================================================================


' =============================================================================
Private Sub Form_Dirty(Cancel As Integer)
   AllowClose RemoveClose
End Sub
' =============================================================================


' =============================================================================
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   If Not CanClose Then
      If KeyCode = vbKeyF4 And Shift = acAltMask Then KeyCode = 0
   End If
End Sub
' =============================================================================


' =============================================================================
Private Sub Form_Load()
   Me.KeyPreview = True
End Sub
' =============================================================================


' =============================================================================
Private Sub Form_Undo(Cancel As Integer)
   AllowClose EnableClose
End Sub
' =============================================================================


' =============================================================================
Private Sub AllowClose(ByVal aState As SysMenuCloseState)
   SetSysMenuCloseState Me.hWnd, aState
   Me.ShortcutMenu = CBool(aState)
   CanClose = CBool(aState)
End Sub
' =============================================================================
In einem allgemeinen Modul:
Code:

Option Explicit

' =============================================================================
Private Const MF_BYPOSITION As Long = &H400&
Private Const MF_REMOVE As Long = &H1000&
' =============================================================================


' =============================================================================
' DECLARE FUNCTION GetSystemMenu IMPORT "USER32.DLL" ALIAS "GetSystemMenu" ( _
'    BYVAL hWnd AS DWORD _                                ' __in HWND hWnd
'  , BYVAL bRevert AS LONG _                              ' __in BOOL bRevert
'  ) AS DWORD                                             ' HMENU
Private Declare PtrSafe Function GetSystemMenu Lib "user32" ( _
   ByVal hWnd As LongPtr, ByVal bRevert As Long) As LongPtr
' =============================================================================
   

' =============================================================================
' DECLARE FUNCTION GetMenuItemCount IMPORT "USER32.DLL" ALIAS "GetMenuItemCount" ( _
'    OPTIONAL BYVAL hMenu AS DWORD _                      ' __in_opt HMENU hMenu
'  ) AS LONG                                              ' int
Private Declare PtrSafe Function GetMenuItemCount Lib "user32" ( _
   ByVal hMenu As LongPtr) As Long
' =============================================================================
   

' =============================================================================
' DECLARE FUNCTION RemoveMenu IMPORT "USER32.DLL" ALIAS "RemoveMenu" ( _
'    BYVAL hMenu AS DWORD _                               ' __in HMENU hMenu
'  , BYVAL uPosition AS DWORD _                           ' __in UINT uPosition
'  , BYVAL uFlags AS DWORD _                              ' __in UINT uFlags
'  ) AS LONG                                              ' BOOL
Private Declare PtrSafe Function RemoveMenu Lib "user32" ( _
   ByVal hMenu As LongPtr, ByVal uPosition As Long, _
   ByVal uFlags As Long) As Long
' =============================================================================
   

' =============================================================================
' DECLARE FUNCTION DrawMenuBar IMPORT "USER32.DLL" ALIAS "DrawMenuBar" ( _
'    BYVAL hWnd AS DWORD _                                ' __in HWND hWnd
'  ) AS LONG                                              ' BOOL
Private Declare PtrSafe Function DrawMenuBar Lib "user32" ( _
   ByVal hWnd As LongPtr) As Long
' =============================================================================


' =============================================================================
Public Enum SysMenuCloseState
   RemoveClose = False
   EnableClose = True
End Enum

#If 0 Then
RemoveClose , EnableClose
#End If
' =============================================================================


' =============================================================================
Public Sub SetSysMenuCloseState(ByVal hWnd As LongPtr, _
                                Optional State As SysMenuCloseState _
                              = RemoveClose)

   Dim hMenu As LongPtr
   Dim i As Long

   Select Case State
      Case EnableClose
         GetSystemMenu hWnd, True
      Case RemoveClose
         hMenu = GetSystemMenu(hWnd, False)
         i = GetMenuItemCount(hMenu)

         'remove Close
         Call RemoveMenu(hMenu, i - 1, MF_REMOVE Or _
                                       MF_BYPOSITION)
         'remoove separator line
         Call RemoveMenu(hMenu, i - 2, MF_REMOVE Or _
                                       MF_BYPOSITION)
   End Select

   Call DrawMenuBar(hWnd)

End Sub
' =============================================================================
Nouba ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 08:22   #32
Frithjiof
Neuer Benutzer
Neuer Benutzer
Standard

Ich habe hier auch ein kleines süßes Tool gebastelt, mit dem das geschilderte Problem gelöst werden kann.

Die Frage ist was geschehen soll wenn ein Dirty- Formular geschlossen wird. Es gibt 3 Möglichkeiten

1. Änderungen verwerfen
2. Änderungen speichern
3. Änderungen bearbeiten.

„Cancel“ = „true“ im Form_BeforeUpdate-Ereignis führt leider zu zwei Meldungen die den Benutzer quälen. Da muss noch bisschen dran gearbeitet werden!

Frithjof
Angehängte Dateien
Dateityp: zip SpeichernPruefen.zip (33,6 KB, 6x aufgerufen)
Frithjiof ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 09:35   #33
markusxy
MOF Meister
MOF Meister
Standard

@Frithjof, lies #14.
Nach 20 bis 30 Kommentaren offenbart JPA dann immer was Sache ist. Für die Helfer immer eher frustrierend.
Da wundert er sich dann immer über die kleinen Seitenhiebe, denkt aber nicht daran, dass er sie selbst provoziert.
markusxy ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 09:48   #34
JPA
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

@Frithjiof
Vielen Dank für dein Beispiel.
Es trifft nicht ganz meine Frage.
Bzgl. das Thema welches du dort behandelts würde ich es allgemeiner halten, in dem du es in einer Klasse auslagerst. So wa in jedem Formular zu hinterlegen wird aufwendig.

Hier eine kleine Anregung.
VG
JPA
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 10:07   #35
JPA
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

@Marsu65
vielen Dank für deine Antwort. Mir geht es um gebunde Formulare.

Nach den kommentaren, kann ich nun meine Frage präziser stellen (ist aber weiterhin die aus #1).
Wie kann festgestellt wie der Datensatzspeichervorgang ausgelöst wurde im Before_Update-Event um über das bekannt verfahren (cancel=true) ggf. den Vorgang abbrechen zu lassen.

Scheint, mit Bordmittel nicht realisierbar zu sein.

Ein Beispiel was mein Wunch hoffentlich veranschaulicht:
Bei forms2.0 gibt es das Event:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

über CloseMode kann dann erkannt werden, "wie" der Schliessvorgang ausgelöst wurde.

VG
JPA
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 11:21   #36
Frithjiof
Neuer Benutzer
Neuer Benutzer
Standard

Hallo JPA.
In deinem Beispiel geht es um Datenvollständigkeit und Datenintegrität. =anderes Thema.

In meinem Beispiel wird erstens festgestellt ob der Ok-Button (bzw. andere) das Form_BeforeUpdate-Ereignis ausgelöst hat oder nicht, und zweitens ob sich Daten geändert haben.
Die geänderten Felder werden farbig hervorgehoben um dem Benutzer die Entscheidung ob speichern, verwerfen oder bearbeiten zu erleichtern.
Also das Beispiel erschlägt einen großen Teil der von dir geforderten Funktionalität.
(vielleicht kannst du mir das in eine Klasse packen?)

Aber es beantwortet nicht deine Frage, ob es feststellbar ist, wodurch das Form_BeforeUpdate-ereignis des Formulars ausgelöst wurde.
M.W. kann das nicht direkt mit einfachen Mitteln herausgefunden werden, sondern nur indirekt durch Prüfung verschiedener Fragen wie z.B. Was ist das aktive Kontrollelement? Wo befindet sich der Focus? usw..

Frithjof
Frithjiof ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 12:10   #37
markusxy
MOF Meister
MOF Meister
Standard

Zitat: von JPA Beitrag anzeigen

Ein Beispiel was mein Wunch hoffentlich veranschaulicht:
Bei forms2.0 gibt es das Event:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

über CloseMode kann dann erkannt werden, "wie" der Schliessvorgang ausgelöst wurde.

Nur hilft dir das QueryClose Event nichts, wenn das Update Event davor ausgelöst wird.

Im Prinzip wird es so sein: Die Access Anwendung erhält vom Betriebssystem den Befehl das Form zu Schließen. Jetzt kommt das Update und sonstige Events. Danach wird das Unload Event ausgelöst - Wenn alles passt wird das Fenster endgültige entladen. (Falls es wer ganz genau weiß, bitte posten).

Vielleicht hat auch jemand Erfahrung wie man beim Sublassing genau vorgehen müsste. Ansonsten eignen sich die C-Foren für diese Themen. Oder man "probiert" halt eben.
markusxy ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 12:35   #38
JPA
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

@Frithjiof
Nein/ja, bei meinem Beispiel ging es ums prinzip Auslagerung in klassen.
Für deine Anforderung habe ich hier ein Beispiel extra für Dich angehängt.

@markusxy

Zitat:

Nur hilft dir das QueryClose Event nichts, wenn das Update Event davor ausgelöst wird.

Absolut, des wegen was es nur ein Beispiel.

Im Prinzip wäre folgendes was es braucht:
Code:

Private Sub Form_BeforeUpdate(Cancel As Integer, UpdateMode as Integer)
Vielleicht was für access.usersvoice
Angehängte Dateien
Dateityp: zip RecValidation.zip (35,1 KB, 6x aufgerufen)
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 14:35   #39
Frithjiof
Neuer Benutzer
Neuer Benutzer
Standard

Hallo JPA

Zitat: von JPA Beitrag anzeigen

@Frithjiof
Nein/ja, bei meinem Beispiel ging es ums prinzip Auslagerung in klassen.
Für deine Anforderung habe ich hier ein Beispiel extra für Dich angehängt.

Dein Beispiel hat mit meinem Ansatz nichts zu tun. Es ist dasselbe worauf du bereits verlinkt hast.
Vermutlich hast du mein Beispiel nicht angesehen?

Zitat: von JPA Beitrag anzeigen

@Frithjiof
Im Prinzip wäre folgendes was es braucht:

Code:

Private Sub Form_BeforeUpdate(Cancel As Integer, UpdateMode as Integer)
Vielleicht was für access.usersvoice

Den Ansatz habe ich dir eigentlich geliefert, nur wird "UpdateMode" der Funktion nicht übergeben (wer soll das auch machen?) sondern innerhalb der Funktion ermittelt.

Ich vermute mal du willst hier nur Werbung für dein Zeugs machen?

Frithjof
Frithjiof ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 14:59   #40
JPA
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

Danke für dein Beispiel, du prüfst ob die Speicherung über eine gewisse Schaltfläche passiert ist. Ziel ist es festzustelen ob es über Fensterschliessen ausgelöst wurde. Da das offensichtlich nicht geht könnten wir alle anderen Auslöser prüfen. Wenn es nicht einer von denen ist, dann war es der Fensterschliessen. Nur dann hätten wir viel zu tun: prüfen auf Datensatzmarkierer, auf Tastenkombi usw...
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2018, 18:33   #41
Frithjiof
Neuer Benutzer
Neuer Benutzer
Standard

Hallo JPA.

Zitat: von JPA Beitrag anzeigen

Danke für dein Beispiel, du prüfst ob die Speicherung über eine gewisse Schaltfläche passiert ist.

Nein, wenn das Ereignis nicht durch die Ok-Schaltfläche ausgelöst wurde, wird die Benutzerin aufgefordert sich zwischen speichern, verwerfen, bearbeiten zu entscheiden und die Datenänderungen werden im Formular hervorgehoben, was ihr die Entscheidung erleichtert.

Zitat: von JPA Beitrag anzeigen

Ziel ist es festzustellen ob es über Fensterschliessen ausgelöst wurde.

Die Frage ist m.E. mittlerweile beantwortet. Es gibt keine direkte Möglichkeit.

Zitat: von JPA Beitrag anzeigen

Da das offensichtlich nicht geht könnten wir alle anderen Auslöser prüfen.

Genauso ist es.
Es ist aber nicht klar ob wirklich alle Auslöser identifizierbar sind.
Das Fenster kann auch durch Beenden von Access oder Runterfahren des Rechners geschlossen werden.

Darum stellt sich die Frage: Wozu muss der eigentliche Auslöser für das Schließen identifiziert werden!

Und genau die von dir genannte Anforderung: verhindern, dass ein Schließen zu einer ungewollten Datensatzänderung führt, ist in meinem Beispiel einfach realisiert.

Frithjof
Frithjiof ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.01.2018, 09:14   #42
JPA
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

@nouba
vielen dank für dein programmcode.
Die Zeilen "Private Declare PtrSafe Function" sind bei mir rot.

Wenn ich den Code richtig interpretiere, wird die Fensterschliess-Schaltfläche ausgendet/deaktiviert wenn der Datensatz im Form dirty ist, oder?

Ist auf jedenfall eine Problemvermeidung strategie, danke.

VG
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.01.2018, 09:24   #43
markusxy
MOF Meister
MOF Meister
Standard

Zitat: von JPA Beitrag anzeigen

@nouba
vielen dank für dein programmcode.
Die Zeilen "Private Declare PtrSafe Function" sind bei mir rot.

https://msdn.microsoft.com/de-de/lib...ffice.14).aspx


Edit:
Die Office Version muss longptr unterstützen, damit du den Code 1:1 verwenden kannst.
Ich dacht 2010 hat das bereits.

Geändert von markusxy (19.01.2018 um 09:34 Uhr).
markusxy ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.