Form.Location im Vorhinein abfragen

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Form.Location im Vorhinein abfragen

    Hi,

    Ich muss ein wenig ausholen ...

    Ich habe die MessageBox Klasse durch eine Klasse ClMsgBoxDark ersetzt. Die verhält sich ähnlich wie die originale Klasse ... aber sie hat insbesondere einen dunklen Hintergrund. Das Fenster soll immer in der Mitte der (rufenden) Parent Form aufspringen. Deshalb verwende ich FormStartPosition.CenterParent.

    Der Aufruf sieht dann wie folgt aus MsgBoxDark.Show( ....) .... Parameter wie bei der MessageBox

    Soweit so gut ...


    Allerding klappt das nicht, wenn ich MsgBoxDark aus der LoadProzedur einer Form aus aufrufe. Da ist die Form noch nicht vollständig initialisiert und damit führt FormStartPosition.CenterParent zur StartLocation = (0,0) also die linke obere Ecke.

    In diesem Fall würde ich gern MsgBoxDark mit FormStartPosition.CenterScreen öffnen.

    Nur wie kann ich das unterscheiden ? So habe ich das versucht:

    VB.NET-Quellcode

    1. 'Display dark messagebox
    2. Debug.Print("f.Location=" & f.Location.ToString)
    3. Debug.Print("f.Parent=" & If(f.Parent Is Nothing, "N/A", f.Parent.ToString))
    4. If f.Location = New Drawing.Point(0, 0) Then
    5. f.StartPosition = FormStartPosition.CenterScreen
    6. End If
    7. f.ShowDialog()
    8. f.Dispose()
    9. Return f.DialogResult


    Das klappt aber nicht.


    Egal wo der Aufruf erfolgt ist (ob aus einer "normalen" Prozdure" oder einer "Load Prozedur), ich erhalte:

    Quellcode

    1. f.Location={X=0,Y=0}
    2. f.Parent=N/A


    Die Anweisung FormStartPosition.CenterScreen wird korrekt umgesetzt. Nur springt jetzt meine Message Box IMMER in der Bildschirmmitte auf.

    Die Properties f.Location und f.Parent sind also nicht für die Fallunterscheidung geeignet.

    Wie kann ich also abfragen, ob MsgBoxDark.Show aus einer Load Prozedur aufgerufen wurde oder nicht. Oder anders ausgedrückt: wie kann ich im VORHINEIN herausfinden, ob die Message Form an der Location (0,0) aufspringen wird.

    Am Call selbst will ich nichts ändern, weil ich diese Klasse in vielen Programmen bereits verwende.

    Uff ... ich hoffe, ich habe mein Problem verständlich machen können ...

    LG
    Peter

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Peter329“ ()

    Ich weiß ja nicht, wie Deine MessageBox aufgerufen wird, aber schau mal nach, ob Du statt mit f.Parent über f.Owner an die gewünschten Infos kommst. Denn ein Dialog, welcher mit …ShowDialog(Me) aufgerufen wird, hat kein Parent, sondern einen Owner.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Peter329 dann redhne Dir die dann stets manuelle Startposition aus:

    Quellcode

    1. x = (Bildschirmbreite - Dialogbreite) / 2
    2. y analog
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke, für deinen Beitrag ... leider hilft an dieser Stelle f.Owner auch nicht weiter (das Dingens ist ebenfalls "nothing" ...

    Aber ich habe jetzt eine Lösung gefunden ... Ich verlagere die Prüfung der Location aus der .Show Funktion der MsgBoxDark Klasse in die Load Prozedur der FrmMsgBoxDark Form. Da kann ich dann abfragen, ob die Location = (0,0) ist oder nicht.

    An dieser Stelle kann ich zwar nicht mehr auf

    Quellcode

    1. FormStartPosition.CenterScreen
    wechseln (weil das schon "passiert" ist) ... aber ich kann natürlich die Center Screen Position errechnen und einsetzen. So hab ich das jetzt gelöst:

    VB.NET-Quellcode

    1. Private Sub FrmMsgBoxDark_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'Check location
    3. If Me.Location = New Drawing.Point(0, 0) Then
    4. 'Adjust location to center screen
    5. Dim myNewLocation = New Drawing.Point(0, 0)
    6. Dim myScreenSize As Rectangle = Screen.PrimaryScreen.WorkingArea
    7. myNewLocation.X = CInt((myScreenSize.Width - Me.Width) / 2)
    8. myNewLocation.Y = CInt((myScreenSize.Height - Me.Height) / 2)
    9. Me.Location = myNewLocation
    10. End If
    11. End Sub


    Das klappt prima ... obwohl ich fürchte, dass vielleicht nicht unbedingt jeder auf Anhieb verstehen mag, wo mein Problem lag ... :) ... ist halt eine etwas komplexe Geschichte ... Aber Hauptsache die Kuh ist vom Eis.

    Vielen Dank für den Denkanstoß und einen schönen Tag !


    [edit] Den Beitrag von RFG habe ich erst nach diesem Posting entdeckt ... da haben wir uns wohl gedanklich überholt ... :)
    @Peter329 Machst Du Integer-Division:

    VB.NET-Quellcode

    1. myNewLocation.X = (myScreenSize.Width - Me.Width) \ 2
    2. myNewLocation.Y = (myScreenSize.Height - Me.Height) \ 2
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!