MS-Office-Forum

MS-Office-Forum (http://www.ms-office-forum.net/forum/index.php)
-   Microsoft Access (http://www.ms-office-forum.net/forum/forumdisplay.php?f=60)
-   -   Feststellen ob mit acDialog geöffnet (http://www.ms-office-forum.net/forum/showthread.php?t=340260)

rfurrer 21.02.2017 21:09

Feststellen ob mit acDialog geöffnet
 
Hallo

Wie kann ich in einem Formular (MeinForm) feststellen, ob dieses "normal" oder über "acDialog" geöffnet wurde?

1. DoCmd.OpenForm "MeinForm", , , , , acDialog

2. DoCmd.OpenForm "MeinForm"

Mit Me.Modal oder Me.Popup bekomme ich in beiden Fällen FALSE. Ich müsste aber im 1. Fall ein True bekommen und im 2. Fall ein False.
Wie geht das?

Grüsse und Danke
Rolf

fredfred 21.02.2017 21:16

Hi,
wie sieht denn dein vollständiger Code (in welchem Ereignis welchen Formulars) dazu aus ?

ich habe das selbst kurz getestet und bekomme korrekte Angaben.

rfurrer 21.02.2017 21:24

hm, das docmd.openform mache ich mal aus dem Hauptmenü, dann ohne acDialog.
Der andere Fall ist aus einem geöffneten Fenster über einen Button, dann mit acDialog.

Und feststellen möchte ich das im Form_Load von "MeinFormular", also in jenem, welches ich mal mit, mal ohne acDialog öffne. In diesem bekomme ich an dieser Stelle immer ein FALSE. Und in den Eigenschaften des Formular ändere ich nichts: Rahmenart bleibt immer "Veränderbar"

ebs17 21.02.2017 22:08

Wenn das Formular keine geeigneten Eigenschaften zur Direktabfrage der gewünschten Information bietet, gibst Du diese dann eben
- in OpenArgs mit oder
- Du gibst dem Formular eine eigene Eigenschaft (das Formular ist immerhin eine Klasse) und verwendest diese.

Josef P. 21.02.2017 22:19

Hallo!

Nur als Idee und nicht ausgereift:
Code:

Dim frm As Form

For Each frm In Application.Forms
  If Not frm Is Me Then
      frm.SetFocus
      exit for
  End If
Next

If Screen.ActiveForm Is Me Then
  MsgBox "acDialog oder Modal, da Fokus nicht gewechselt werden konnte"
Else
  Me.SetFocus
  MsgBox "Fokus konnte gewechselt werden"
End If

mfg
Josef

rfurrer 22.02.2017 07:49

Hallo Josef

Irgendwie komm ich damit nicht weiter. Ich habe das in eine Funktion gelegt, welche ich beim Laden des Form aufrufe und dabei das aufgerufene Form übergebe. Der Focus kann trotz acDialog auf ein anderes offenes Form verlegt werden.

Hallo Eberhard

OpenArgs wäre eine Idee, da ich die aber schon für anderes verwende müsste ich das mit Trennzeichen und Parsen lösen. Wäre dann vermutlich der letzte Ausweg.
Das mit der Eigenschaft leuchtet mir nicht ein. Wenn ich das gleiche Form mal mit/mal ohne acDialog öffne, was könnte denn diese Eigenschaft steuern bzw. wie stellt dann die fest, ob es mit/ohne geöffnet wurde?

Gruss
Rolf

Josef P. 22.02.2017 08:47

Hallo!

Damit das funktioniert, muss das Formular vermutlich vollständig geladen sein.
Ich probierte den Code über eine Schaltfläche im Formular aus, das einmal mit und ohne acDialog geöffnet wurde.

Musst du schon zum Zeitpunkt des Ladevorgangs wissen, ob mit acDialog geöffnet wurde?

mfg
Josef

JPA 22.02.2017 08:53

In der Timer-Funktion geht der Code von Josef.

Vielleicht solltest du umdenken und dein Formular über Objekt-Instanz öffnen. Da kannst du mehr Daten dem Form übergeben und über WithEvents mehrere Information zurück bekommen.

G
JPA

rfurrer 22.02.2017 09:44

Hallo Josef

Ja, ich müsste dass schon beim Laden wissen, bzw. dann nochmals beim Unload. Hintergrund ist, dass ich die Filter Felder schon abfüllen will bzw. beim schliessen den Inhalt der FilterFelder in eine Tabelle schreiben will. Und da das Formular als Dialog etwas andere Filterfelder hat, müsste ich das unterscheiden können.

Hallo JPA
Das sind leider einige Formulare und sehr, sehr viele Docmd.openform die dann wahrscheinlich angepasst werden müssten. Da scheue ich den Aufwand noch.

Gruss
Rolf

ebs17 22.02.2017 10:02

Mein zweiter Hinweis entspricht dem, was JPA etwas anders formuliert.

Insgesamt sehe ich es eben nicht als sinnvoll, erst einen Stein ins Wasser zu werfen und ihn dann zu suchen, wenn ich ihn schon in der Hand halte.

Zitat:

Und da das Formular als Dialog etwas andere Filterfelder hat
Wie ist das zu verstehen?

rfurrer 22.02.2017 10:14

Die Formulare sind Listen, aus denen der Benutzer einen Eintrag wählen kann. Und damit er nicht alle Einträge durch muss, kann im Kopfbereich oben in Felder Filter eingegeben werden, zBsp. bei Hersteller "XY", dann werden in der Liste nur die Einträge vom Hersteller XY angezeigt.
Das sind meine FilterFelder, die ich gerne beim öffnen mit den Werten des letzten öffnens wieder belegt hätte. Dies funktioniert soweit alles, nur eben soll unterschieden werden, ob das Form als Dialog oder normal geöffnet wurde.

Dein "Steinwurf" leuchtet ein, nur eben der Aufwand und ich habe keine Ahnung wie das geht :eek:

Josef P. 22.02.2017 11:17

Hallo!

Zitat:

Ja, ich müsste dass schon beim Laden wissen, ..
Muss es wirklich beim Laden sein? Oder willst du es nur wissen, wenn du die Konfiguration der Filter einstellst?

Beispiel (Luftcode):
Code:

private sub Form_Load()
  Me.TimerInterval = 1
  ' Call FilterEinstellen() ' <-- verlagern nach Form_Timer
end sub

private sub Form_Timer()
    me.Timerinterval = 0
    Call FilterEinstellen()
end sub

private sub FilterEinstellen()
   
  if DialogModus then
      Call ...
  else
      call ...
  end if 
 
end Sub

private function DialogModus() as Boolean
 
  Dim frm As Form

  For Each frm In Application.Forms
      If Not frm Is Me Then
        frm.SetFocus
        exit for
      End If
  Next

  If Screen.ActiveForm Is Me Then
      DialogModus = True
  Else
      Me.SetFocus
      DialogModus = false
  End If

end function

mfg
Josef

JPA 22.02.2017 11:48

Machen wir es mal dreckig :p
Bei acDialog gibt es ja keine MinMax-Buttons, und die frage ich einfach ab:
Code:

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)

Public Function IsFormModal(frm As Form) As Long
    Dim hWnd As Long, lngStyle As Long
   
    hWnd = frm.hWnd
    lngStyle = GetWindowLong(hWnd, GWL_STYLE)
    IsFormModal = (lngStyle = -2033713152)
End Function

Das Funz auch im Event Form_Load :grins:

G
JPA

Josef P. 22.02.2017 11:55

@JPA:
Da du auf API ausweichst: Kann man per API vielleicht auch den Modul-Zustand des Fensters abfragen?

mfg
Josef

JPA 22.02.2017 12:03

Zitat:

Kann man per API vielleicht auch den Modul-Zustand des Fensters abfragen?
War auch mein erster Gedanke, aber nicht gefunden :weinen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.

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