Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Formular unterhalb eines Buttons plazieren und öffnen

Begonnen von Optiplex, November 21, 2010, 16:33:50

⏪ vorheriges - nächstes ⏩

Optiplex

Hallo zusammen,
gibt es eine Möglichkeit ein Formular unterhalb eines Buttons zu plazieren. Mir der Top Eigenschaft habe ich hauptsächlich Probleme die Left Eigenschaft klappt schon ganz gut. Gibt es eine Formel um Top und left so zu berechnen,dass das Fenster genau unter der dem Button steht.

Gruß Dieter

Hondo

Hallo,
du musst Button.height berücksichtigen und zu Button.top hinzuzählen.

Andreas

Optiplex

Hallo Hondo,
habe ich alles Berücksichtigt, ich glaube das liegt an den Fenstermaßenmaßen Rahmenbreite Captionbar usw. auch der Datensatzzeiger wenn ich denn ein und ausschalte liegt das fenster woanderst oder habe ich doch noch was übersehen?

Me.Move Forms!formular2.WindowLeft + Forms!formular2!Befehl0.Left, _
Forms!formular2.WindowTop + Forms!formular2.Formularkopf!Height + Forms!formular2!Befehl0.Top + Forms!formular2!Befehl0.Height

Gruß Dieter


Hondo

Hallo,
schau dir mal mein Beispiel dazu an:
http://www.accessblog.de/?dl_id=5
Ich plaziere da auch ein Popup-Form relativ zu einem Button auf einem anderen Form.
Den Code den du brauchst findest du im Modul. Hier der relevante Teil:

    Dim btn As CommandButton
    Dim ParentForm As Form
    Set dpform = Forms(Formname)
    Set btn = dpform.Controls(Buttonname)
    dpfieldname = textfieldname
    DoCmd.OpenForm "DatePicker"
    If dpform.BorderStyle > 0 Then
        'Rahmenhöhe hinzuaddieren (460)
        Forms("DatePicker").Move dpform.WindowLeft + btn.Left, dpform.WindowTop + btn.Top + btn.Height + 460
    Else
        Forms("DatePicker").Move dpform.WindowLeft + btn.Left, dpform.WindowTop + btn.Top + btn.Height
    End If
    Set btn = Nothing


Andreas

Optiplex

Hallo Hondo,
genau das ist was ich gesucht habe, was mir nicht so gut gefällt ist die feste Angabe für den Rahmen gibt es denn keine Funktion in welcher man die Rahmenbreite und die Höhe der Captionbar auslesen kann. Dann währe das perfekt auch für den Datepicker wäre dies eine Verbesserung. Aber ansonsten finde ich es Top.

Danke und Gruß Dieter

lumbumba

#5
Die Höhe der Captionbar wird eigentlich schon in der Berechnung für dpform.WindowTop berücksichtigt. Die hier verwendetete Wert von 460 beruht wahrscheinlich auf das von Hondo verwendete Theme.

probier mal folgendes, hab mal den Code von Hondo angepasst:


    Dim btn As CommandButton
   Dim ParentForm As Form
   Dim rcf As RECT
   Set dpform = Forms(Formname)
   Set btn = dpform.Controls(Buttonname)
   dpfieldname = textfieldname
   DoCmd.OpenForm "DatePicker"
   GetWindowRect Me.Form.hWnd, rcf
   MapWindowPoints GetDesktopWindow(), Me.Form.hWnd, rcf, 2
   Forms("DatePicker").Move dpform.WindowLeft + btn.Left - (rcf.nLeft * 15), dpform.WindowTop + btn.Top + btn.Height - (rcf.nTop * 15)
   Set btn = Nothing


und in einem Standardmodul noch folgendes rein:

Public Type RECT
 nLeft As Long
 nTop As Long
 nRight As Long
 nBottom As Long
End Type
Public Declare Function MapWindowPoints Lib "USER32.DLL" (ByVal hWndFrom As Long, ByVal hWndTo As Long, lppt As Any, ByVal cPoints As Long) As Long
Public Declare Function GetWindowRect Lib "USER32.DLL" (ByVal hWnd As Long, lpRect As RECT) As Long

---

Hondo

Hallo,
die 460 sind experimentell ermittelt. Da die Formular-CaptionBar um die es sich handelt in der Höhe fix für das jeweilige Theme ist, verstehe ich das Problem nicht da dieser Wert sich nicht ändert.
Wenn du es schöner haben möchtest, erstell in einem anderen Modul eine globale Constante und weise dieser den Wert 460 zu  :D

Andreas

Optiplex

Hallo Ihr beiden,

@Lumbumba
Habe es gestern nicht mehr geschafft deine Verbesserung zu testen, ich gehe aber davon aus, dass sie funktioniert.

@Hondo
dein Festwert von 460 stimmen das hat auch niemand angezweifelt, wenn man aber sieht was Microsoft mit den Fenstern alles macht (siehe Win7) dann ist es schon besser man hat eine Funktion um dies auszulesen. Aber ansonsten finde ich die den Datepicker Top.

Gruß Dieter

Optiplex

hallo lunbumba,
leider habe ich nun doch Probleme mit deiner Erweiterung, irgendwie kennt Access die Funktion GetDesktopWindow() nicht, kannst du mir da nochmal helfen?

Gruß Dieter

lumbumba

#9
Ups da hatte ich doch glatt ne Deklaration vergessen, ins Standardmodul noch die Zeile
Public Declare Function GetDesktopWindow Lib "USER32.DLL" () As Longrein. dann sollte es hoffentlich keine Fehlermeldung mehr geben.

Wenn du jetzt noch zusätzlich die TwipsperPixel bestimmen willst ( die hab ich hier mit dem Wert 15 eingesetzt, ist auf den meisten Systemen auch so ) dann ist in dem Standardmodul noch folgendes mit einzubringen, besser so müsste es ausschauen:



Public TwipsX as long
Public TwipsY as long

Public Type RECT
 nLeft As Long
 nTop As Long
 nRight As Long
 nBottom As Long
End Type
Public Declare Function MapWindowPoints Lib "USER32.DLL" (ByVal hWndFrom As Long, ByVal hWndTo As Long, lppt As Any, ByVal cPoints As Long) As Long
Public Declare Function GetWindowRect Lib "USER32.DLL" (ByVal hWnd As Long, lpRect As RECT) As Long
Public Declare Function GetDeviceCaps Lib "GDI32.DLL" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Public Declare Function GetDesktopWindow Lib "USER32.DLL" () As Long
Public Declare Function GetDC Lib "USER32.DLL" (ByVal hWnd As Long) As Long
Public Declare Function ReleaseDC Lib "USER32.DLL" (ByVal hWnd As Long, ByVal hdc As Long) As Long



Public Sub GetTwips()
  Dim hdc as long
  if TwipsX = 0 or TwipsY = 0 then
      Const LOGPIXELSY = 90
      Const LOGPIXELSX = 88
      hdc = GetDC(GetDesktopWindow()) 'Application.hWndAccessApp)
      TwipsX = 1440 / GetDeviceCaps(hdc, LOGPIXELSX )
      TwipsY = 1440 / GetDeviceCaps(hdc, LOGPIXELSY )
       ReleaseDC GetDesktopWindow(), hdc
   End If


dementsprechen müsste dann der Aufruf zur positionierung wie folgt lauten:

...
Call GetTwips
Forms("DatePicker").Move dpform.WindowLeft + btn.Left - (rcf.nLeft * TwipsX), dpform.WindowTop + btn.Top + btn.Height - (rcf.nTop * TwipsY)
...




Gruß Daniel
---

Optiplex

#10
Hallo Daniel,
also jetzt stimmt gar nichts mehr, hast du deine Routine mal getestet. Also ich habe mal probiert den Datepicker mit deinen Routinen umzuschreiben, des Formular ist jetzt alles aber nicht mehr unter dem Button. ich muss dazu sagen, dass ich Win7 habe und weis nicht obs daran liegt.

Gruß Dieter

Nachtrag :Die erste Version ohne twips funktioniert, scheinbar stimmt mit den Twips irgend etwas nicht.


lumbumba

#11
Hallo Dieter
Ich habe XP und habe diese Routine mit zwei verschiedenen Themes (Standardtheme und Area o2) getestet, die Popup-Fenster wurden richtig positioniert.
Wird das Fenster leicht über dem Button positioniert, oder völlig woanders? Lässt du twipsx und twipsy jetzt berechnen oder setzt du den festen Wert 15 ein? Kann aber auch sein das sich Win7 hier etwas anders verhält und anders berechnet.


PS: ich glaub wegen lese- und schreibübelappungen hier, hab ich deinen nachtrag nicht mitbekommen.
Aber auch ich hatte in meiner Post oben noch was berichtigt.
dim TwipsX as long
dim TwipsY as long

richtiger ist
Public TwipsX as long
public TwipsY as long
---

Optiplex

Hallo Daniel,
also das Formular wird oberhalb und links (geschätzte 20-30 Pixel)  vom Button dargestellt. Der Button ist komplett verdeckt.

Gruß Dieter