Announcement

Collapse
No announcement yet.

Zurückholen eines verschobenen Forms

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zurückholen eines verschobenen Forms

    Hi,

    ich versuche gerade ein Funktion in ein Form einzubauen, das sie auf Knopfdruck zurückholt.
    in Deutsch:
    Form1 macht im Button1:
    Code:
    Dim Form2 As New Mask
    Form2.Show()
    Form1 bleibt weiter geöffnet.

    Bei Form2 ist es so das es sich seine letzte Position merkt an der es geschloßen wurde.
    Code:
    If My.Settings.Form2Position.IsEmpty Then
                    Me.Size = New System.Drawing.Size(570, 810)
                Else
                    Me.Location = My.Settings.Form2Position
                End If
    Jetzt will ich: wenn nochmals auf den Form1.Button1 gedrückt wird das Form nicht nochmal geöffnet wird sondern das bereits offene lediglich zentriert wird.

    Die Prüfung ob es offen ist hab ich schon, aber der Aufruf von CenterToScreen()
    geht nicht für ein anderes Form nur für das aktive.
    naja erstmal der Code:
    Code:
    Private Sub BtnOpenNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpenNew.Click
            If Not FormIsLoaded("NewMask") Then
                Dim Form2 As New NewMask
                Form2.Show()
            Else
                MsgBox("Die Maske ist bereits geladen!")
                Dim x, y As Integer
                NewMask.ToMid()
            End If
        End Sub
    Wie unser ForumsMGL Ralf mir in einem anderen Thread schon schrieb, ist CenterToScreen() protected...

    mein Ansatz war also in Form1 der Aufruf einer Public Sub die in Form2 steht
    ToMid()
    Inhalt ist einfach ein
    Code:
    me.CenterToScreen()
    leider reagiert er darauf mal überhaupt nicht....
    Ich hab keine Ahnung was ich tue aber ich will es lernen

  • #2
    Setz doch einfach die Location anstatt CenterToScreen zu verwenden. Dann erscheint das Fenster wieder auf dem Bildschirm. Warum schiebst Du das denn überhaupt aus dem sichtbaren Bereich?
    Man kann Fenster auch einfach zu machen (Close()) und danach wieder auf (Show()). Das Fenster wird im Speicher nicht freigegeben.

    Comment


    • #3
      Hi,

      ich selber verschiebe meine Fenster nicht, aber du weist wie normal User sind und bei unseren MA sind einige dabei....
      Ich will es nur vorher abfangen.
      Das Problem ist das die teilweise sehr viele Anwendungen offen haben und versuchen die zu plazieren und wenn die nicht aufpassen kann es durchaus passieren das die unter der z.bsp.: Taskleiste verschwinden. Sollte dieser Fall sein will ich das sie in der Steuerung einfach nochmal auf den Knopfdrücken das Form wird zentriert so das sie sich das ganze neu anordnen können.

      zu Location: Hast du ein kurzes beispiel wie ich die setze?

      close() nützt mir an der stelle also nicht wirklich viel.

      trotzdem danke für die Idee...

      Edith sagt: Ausserdem besteht die Gefahr das in der Form noch Daten sind die noch benötigt werden und beim "wieder sichtbar machen" nicht verloren gehen dürfen.
      Zuletzt editiert von Undeathly_Shadow; 10.07.2009, 11:44.
      Ich hab keine Ahnung was ich tue aber ich will es lernen

      Comment


      • #4
        Warum sollten die beim wieder sichtbar machen verlorgen gehen? In den OnShow EventHandler gehört nichts was die Daten im Fenster verändert.

        Code:
        this.Location = new Point(10,10);
        Das setzt das Fenster auf Bildschirmkoordinaten 10/10. Sollte also bei jedem im linken oberen Eck erscheinen.

        Comment


        • #5
          Ich hab mal die entscheidenden Teile aus CenterToScreen() geklaut )

          [Highlight=VB.NET]Dim point As New Point
          Dim screen As Screen = Screen.FromControl(Me)
          Dim workingArea As Rectangle = screen.WorkingArea
          point.X = Math.Max(workingArea.X, (workingArea.X + ((workingArea.Width - MyBase.Width) / 2)))
          point.Y = Math.Max(workingArea.Y, (workingArea.Y + ((workingArea.Height - MyBase.Height) / 2)))
          Me.Location = point
          [/Highlight]

          Comment


          • #6
            Ich Oute mich jetzt mal als völlig blöde...


            Eure Codes funktionieren alle perfekt...
            Aber leider nur solang wie ich sie aus dem Form2 direkt aufrufe

            da in meinem Scenario der MA das aber nicht mehr sieht scheidet das ja aus...

            pack ich das ganze in eine Funktion und rufe diese aus dem Form1 auf reagiert er überhaupt nicht...

            @Ralf:
            ich hab mittlerweile eine ähnliche Rechnung gehabt:
            Code:
            Form2.Left = (Screen.PrimaryScreen.WorkingArea.Width - Me.Width) / 2
            Form2.Top = (Screen.PrimaryScreen.WorkingArea.Height - Me.Height) / 2
            wo ist mein Denkfehler?
            ich weiß es nicht....
            für heute hab ich glaub ich genug von dem Wald in dem ich hier irre...
            ich brauch erstmal nen Kaffeeeeeeee..... sorry....
            Ich hab keine Ahnung was ich tue aber ich will es lernen

            Comment


            • #7
              wo ist mein Denkfehler?
              Du bist dir sicher das an der richtigen Instanz von Form2 auch aufzurufen?
              Und nicht zum Beispiel an einer die du dir grad mal erzeugt hast aber die gar nicht angezeigt wird?

              Comment


              • #8
                Originally posted by Ralf Jansen View Post
                Du bist dir sicher das an der richtigen Instanz von Form2 auch aufzurufen?
                Und nicht zum Beispiel an einer die du dir grad mal erzeugt hast aber die gar nicht angezeigt wird?

                Hi again.

                ja schon weil wenn ich es im Form2 ausführe geht es ja.

                Ich hab Heute sogar schon die Variante Module versucht.
                Alles was aus Form1 im Form2 ausgeführt werden soll aus einem Modul mit
                Code:
                Call Subname
                auszuführen....

                Die msgBox kommt nur das zentrieren macht er nicht. als wenn er es einfach übergeht...

                Sorry aber ich raf das nicht...
                Ich hab keine Ahnung was ich tue aber ich will es lernen

                Comment


                • #9
                  An der Stelle kommen wir nicht weiter, außer du zeigst uns deinen Code.

                  Comment


                  • #10
                    Hallo Ralf,

                    da hast du wohl recht.

                    so hier erstmal der Code so wie er in der AnfangsForm drin ist.

                    Code:
                    Public Class _0_StartForm
                    
                    
                    Public Function LoadedForm(ByVal sName As String) As Boolean
                            Dim ErgForm As Boolean = False
                            For Each Fenster As Form In Application.OpenForms
                                If Fenster.Name.ToLower = sName.ToLower Then
                                    ErgForm = True : Exit For
                                End If
                            Next
                    
                            Return (ErgForm)
                    End Function
                    
                    
                    Private Sub BtnOpenNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpenNew.Click
                            
                            If Not LoadedForm("_1_NewMask") Then
                                Dim Form As New _1_NewMask
                                Form.Show()
                            Else
                                MsgBox("Die Maske zur Neu ist bereits geladen!")
                                'Hier soll Form "_1_NewMask" auf dem Arbeitsbereichzentriert werden!
                                _1_NewMask.Location = New Point(10, 10)
                            End If
                    End Sub
                    in der _1_NewMask gibt es noch eine Sub auf die man zugreifen könnte um das ganze zu lösen

                    Code:
                    Sub toMid()
                            Me.Left = (Screen.PrimaryScreen.WorkingArea.Width - Me.Width) / 2
                            Me.Top = (Screen.PrimaryScreen.WorkingArea.Height - Me.Height) / 2
                    End Sub
                    Wie es gelöst wird ist mir grad sowas von egal hauptsache das Form wandert beim 2. betätigen des Btn in den Center....




                    ich könnte wetten ich stell mich grad einfach nur wieder zu doof an
                    Ich hab keine Ahnung was ich tue aber ich will es lernen

                    Comment


                    • #11
                      Hi,

                      ich arbeite jetzt noch nicht lange mit VB.net, aber sollte diese Zeile

                      Code:
                                  _1_NewMask.Location = New Point(10, 10)
                      nicht eher

                      Code:
                                  Form.Location = New Point(10, 10)
                      heißen?

                      Mit dem Dim Form as _1_New.... wird doch festgelegt das ein Object erstellt wird das mit Form. angesprochen wird. Müsste dann nicht auch der .Location an das Object Form gehen?

                      Gruß Womble

                      Comment


                      • #12
                        Ich kann da nur Womble zustimmen.

                        _1_NewMask ist doch eine Klasse oder? Und keine Variable die eine Instanz einer Form hält. Oder hast du uns den Code der die _1_NewMask Variable befüllt verschwiegen?

                        Comment


                        • #13
                          _1_NewMask ist eine Class

                          und wenn ich Form.Location mache kommt folgender Fehler:

                          Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.
                          Ich hab keine Ahnung was ich tue aber ich will es lernen

                          Comment


                          • #14
                            Dir ist der Unterschied zwischen eine Klasse und der Instanz einer Klasse bewußt oder? Für die Location Property brauchst du die Instanz einer Form. Die Form Klasse reicht nicht davon könnte es ja mehrere Instanzen geben. Auf welche sollte dann das setzen einer Property wie zum Beispiel Location ziehen? Technisch gesprochen an einer KLasse kannst du direkt nur shared Methoden,Properties aufrufen für alle anderen brauchst du eine Instanz.


                            Wie auch immer du brauchst die _1_NewMask Instanz die angezeigt wird.
                            Da du schon eine LoadedForm Methode hast die prüft ob eine bestimmte Form instanziiert and angezeigt wird sollte du eine entsprechende Methode schreiben die dir dann die Instanz der Form aus der Application.OpenForms Collection liefert und darauf deine Methode zum Positionieren aufrufen.

                            Comment


                            • #15
                              So ganz hab ich es noch nicht kapiert warum VB das Objekt "Form1" nicht als zu steuerndes Objekt erkennt aber hier erstmal kurz ein Feedback wie es gelöst ist.

                              Aufruf des ganzen sieht jetzt so aus:

                              Code:
                              Sub toMid()
                                      _1_NewMask.Left = (Screen.PrimaryScreen.WorkingArea.Width - _1_NewMask.Width) / 2
                                      _1_NewMask.Top = (Screen.PrimaryScreen.WorkingArea.Height - _1_NewMask.Height) / 2
                              End Sub
                                  ''' <summary>
                                  ''' Prüft, ob eine bestimmte Form bereits geladen ist 
                                  ''' und gibt im Erfolgsfall True zurück
                                  ''' </summary>
                                  ''' <param name="sName">Name des Form-Objekts</param>
                              Public Function FormIsLoaded(ByVal sName As String) As Boolean
                                      Dim ErgFenster As Boolean = False
                              
                                      ' alle geöffneten Forms durchlaufen
                                      For Each Fenster As Form In Application.OpenForms
                                          If Fenster.Name.ToLower = sName.ToLower Then
                                              'MsgBox(Application.OpenForms.
                                              ErgFenster = True : Exit For
                                          End If
                                      Next
                              
                                      Return (ErgFenster)
                              End Function
                              dazu kommt der Öffnenknopf:

                              Code:
                              Private Sub BtnOpenNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpenNew.Click
                                      'Dim Form1 As New _1_NewMask
                                      
                              ' Prüfen, ob 2. Form bereits geladen, falls nicht, jetzt laden und anzeigen
                                      If Not FormIsLoaded("_1_NewMask") Then
                                          'Dim Form As New _1_NewMask
                                          _1_NewMask.Show()
                                      Else
                                          MsgBox("Die Maske zur Neuanlage ist bereits geladen!")
                                          toMid()
                                      End If
                              End Sub
                              Dann machen wir es ebend so...
                              Ich hab keine Ahnung was ich tue aber ich will es lernen

                              Comment

                              Working...
                              X