| |
Visual-Basic EinsteigerResize-Ereignis mit Frame | | | Autor: Sophus | Datum: 15.09.13 21:47 |
| Hallo Leute,
bestimmt denke ich an dieser Stelle etwas kompliziert und bestimmt lächeln hier einige.
Nun, folgender Sachverhalt. Wie ich ListView oder Frame an sich im Resize-Ereignis dazu bringe, dass sie sich immer an die Größe der Form anpassen, habe ich verstanden. Nun aber habe ich nicht nur das Steuerelement Frame auf meine Form platziert, sondern ich benutze das Frame als eine Art Container. Das heißt, ich habe einige Steuerelemente direkt aus der Werkzeugkiste - zum Beispiel Label, Textboxen und Command-Button - in den Frame hinzugefügt, und zwar auf den Plätzen, wo sie zur Laufzeit auch bleiben sollen. Beim Resize-Ereignis bewegt sich das Steuerelement Frame und mein Listview entsprechend der Form mit, aber alle anderen Steuerelemente im Frame bleiben reglos. Im Internet fand ich einige Code-Beispiel, in welcher man zum Beispiel mit Klassen oder umfangreichen Modulen arbeitet. Ist es wirklich so umständlich?
Danke.
Sophus
Beitrag wurde zuletzt am 15.09.13 um 21:53:19 editiert. | |
Re: Resize-Ereignis mit Frame | | | Autor: Zardoz | Datum: 15.09.13 22:12 |
| Hallo Sophus,
was willst du denn erreichen, dass sich die Steuerelemente mit
dem Frame mitbewegen, oder das sich die Controls der Grösse
des Frames anpassen?
Gruss,
Zardoz | |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 15.09.13 22:28 |
| Hallo Zardoz,
die Form habe ich in der IDE auf "Änderbar" eingestellt. Der Anwender kann also zur Laufzeit die Formgröße beliebig ändern. Ohne das Resize-Ereignis würden die Steuerlemente einfach auf ihren Plätzen "sitzen bleiben", während der Anwender die Formgröße ändert. Aus diesem Grund sollen sich alle Steuerelemente der Form mitbewegen. ListView1 und das Steuerelement Frame1 bewegt sich ja auch mit, nur nicht die Steuerelemente, die ich in den Frame1 reingepackt habe, und zwar Label, TextBoxen und Command-Button. | |
Re: Resize-Ereignis mit Frame | | | Autor: Zardoz | Datum: 15.09.13 23:00 |
| Hallo Sophus,
wenn die Controls das Frame-Control als Container haben, bewegen sie
sich auch mit. Bewegen sich die Controls mit, wenn du zur [u]Entwurfszeit
das Frame-Control bewegst? Wenn nicht, befinden sie sich auf der
Form. Du kannst Controls zur Laufzeit auf einen Container setzen mit
Set Label1.Container = Frame1
Label1.Move Xpos, Ypos Oder zur Entwurfszeit, indem du sie auf den Container zeichnest.
Du kannst auch zur Entwurfszeit ein Control ausschneiden, Container
anklicken und einfügen.
Gruss,
Zardoz | |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 15.09.13 23:28 |
| Hallo Zardoz,
so einfach geht es leider nicht. Ich habe zur Entwurfszeit (IDE) zum Beispiel das Steuerelement Label1 auf das das Steuerelement Frame1 gezeichnet. Dies lässt sich ja ganz einfach überprüfen, in dem ich das Steuerelement Label1 zur Entwurfzeit hin und her ziehe, am besten über die Breite und Höhe des Frame1 hinaus. An dieser Stelle sieht man ja dann, wie das Steuerelement "abgeschnitten" dargestellt wird. Und die im Frame1 befindlichen Steuerelemente bewegen sich nicht mit. | |
Re: Resize-Ereignis mit Frame | | | Autor: Manfred X | Datum: 15.09.13 23:52 |
| Doch, das geht gaaanz einfach.
Per Designer:
Frame auf die Form ziehen.
Frame anklicken und dadurch aktivieren
Steuerelement (z.B. Command) auf das Frame ziehen.
Beim Resize-Event muß eventuell die Position der Steuerelemente
innerhalb des Frame angepaßt werden.
Private Sub Form_Resize()
Frame1.Width = Me.Width - Frame1.Left - 200
Command1.Left = Frame1.Width - Command1.Width - 100
End Sub
Beitrag wurde zuletzt am 15.09.13 um 23:54:49 editiert. | |
Re: Resize-Ereignis mit Frame | | | Autor: Zardoz | Datum: 15.09.13 23:56 |
| Hallo Sophus,
probier' mal dies:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Activate()
Dim i&, C1 As Control, C2 As Control, C3 As Control
Me.ScaleMode = vbPixels
Me.WindowState = vbMaximized
Set C2 = Me.Controls.Add("VB.Frame", "Frm1")
C2.Caption = "Frame"
C2.BackColor = vbGreen
C2.Move 10, 10, 300, 200
C2.Visible = True
Set C1 = Me.Controls.Add("VB.Label", "Lbl1")
Set C1.Container = C2
C1.Move 20 * 15, 20 * 15
C1.Visible = True
C1.BackColor = vbBlue
Set C3 = Me.Controls.Add("VB.CommandButton", "Btt1")
Set C3.Container = C2
C3.Move 20 * 15, 70 * 15
C3.Caption = "Commandbutton"
C3.Visible = True
For i = Me.ScaleWidth To 0 Step -1
C2.Left = i
DoEvents
Call Sleep(12)
Next i
End Sub Bewegen sich die Controls mit dem Frame?
Gruss,
Zardoz | |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 16.09.13 00:24 |
| Ich glaube, wir bewegen uns im Kreis, ich habe für euch ein Screenshot hochgeladen, damit ihr erstmal seht, wie ich es mir in Etwa vorstelle.
Mein bisheriger Code sieht folgendermaßen aus:
Private Sub Form_Resize()
On Error Resume Next
ListView1.Height = Me.ScaleHeight - (ListView1.Top * 1) - StatusBar1.Height
ListView1.Width = Me.ScaleWidth - (ListView1.Left * 2)
Frame1.Height = Me.ScaleHeight - (Frame1.Top * 1) - ListView1.Height - _
StatusBar1.Height
Frame1.Width = Me.ScaleWidth - (Frame1.Left * 2)
End Sub Bis hier ist ja auch alles in Ordnung, aber die Labels, Textboxen und der eine Command-Button, die wurden zur Entwurfzeit so platziert, wie sie auch zur Laufzeit angezeigt werden soll. Beim Verändern der Formgröße sollen sich diese Steuerelemente in Frame1 gleichzeitig (quasi parallel) mit bewegen. In meinem Screenshot sehen wir, dass meine Form1 nach rechts vergrößert wurde, und dass ListView1 und Frame1 sich der Form mitbewegt. Aber die Steuerelemente im Frame1 bleiben "einfach auf ihren Plätzen sitzen". Der Command-Button müsste quasi weit rechts sein. Text3 soll nahe am Command-Button bleiben, Text2 eher mittig, und Text1 weit links - tut es aber nicht. Und das ganze auch anders rum, wenn die Form1 von rechts nach links wieder verkleinert wird, dann sollen die Steuerelemente auf ihren Plätzen bleiben, aber beim Verkleinern der Form1 mitgehen.
Beitrag wurde zuletzt am 16.09.13 um 00:41:35 editiert. | |
Re: Resize-Ereignis mit Frame | | | Autor: Rippler | Datum: 16.09.13 01:21 |
|
Private Sub Form_Resize()
Frame1.Width = Me.ScaleWidth - Frame1.Left * 2
Label2.Left = (Frame1.Width - Text2.Width - Command1.Width) / 2 - 90
Text2.Left = Label2.Left
Command1.Left = Frame1.Width - Command1.Width - 180
Label3.Left = Command1.Left - Text3.Width - 180
Text3.Left = Label3.Left
End Sub | |
Re: Resize-Ereignis mit Frame | | | Autor: Zardoz | Datum: 16.09.13 01:22 |
| Hallo Sophus,
dafür gibt es keine Einstellungen. Das muss man
selbst programmieren. Hier mal ein Ansatz:
Private Breite!
Private Sub Form_Load()
Dim C As Control
Breite = Frame1.Width
For Each C In Me.Controls
If C.Container Is Frame1 Then C.Tag = CStr(C.Left)
Next C
End Sub
Private Sub Form_Resize()
Dim C As Control
' ...
Frame1.Width = Me.ScaleWidth - (Frame1.Left * 2)
For Each C In Me.Controls
If C.Container Is Frame1 Then C.Left = Frame1.Width / Breite * Val(C.Tag)
Next C
End Sub Gruss,
Zardoz | |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 16.09.13 01:26 |
| Hey Rippler,
zunächst gilt auch die ein Dankeschön. Ich habe dein Code-Beispiel noch nicht angewendet, aber ich habe vorab eine Frage. Was hat es mit den Zahlen 90 und 180 auf sich? Ich weiß nicht, wie man auf diese Zahlen kommt. | |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 16.09.13 01:44 |
| Hey Zardoz,
auch dir möchte ich danken, aber ich empfinde deinen Code einfach zu anspruchsvoll. Ich bin nur ein blutiger Anfänger, und habe deinen Code leider bis zur Hälfte verstanden. Dein Code sieht auch ziemlich kompliziert aus. Erfüllt dein Code-Beispiel den gleichen Zweck wie der von Rippler oder hast du einige Besonderheiten mit eingebaut? | |
Re: Resize-Ereignis mit Frame | | | Autor: Franki | Datum: 16.09.13 01:46 |
| Hallo Sophus,
Bewegen tut sich bei deinem Code gar nichts, die linke obere Ecke von Frame und ListView bleiben wo sie sind, es wird nur vergrößert.
Wenn du Steuerelemente verschieben möchtest mußt du das per Code machen. Beispiel für den Command Button.
Private Sub Form_Resize()
Frame1.Width = Me.ScaleWidth - (Frame1.Left * 2)
Command1.Left = Frame1.Width - Command1.Width - 200
End Sub Dadurch wird der Command Button nur neu positioniert und nicht in der Größe verändert. Er verschiebt sich aber immer mit einem Abstand von 200 Twip an den rechten Rand des Frames.
Und so musst du auch mit den Textboxen verfahren, also zur Verfügung stehenden Platz ermitteln, die Abstände berücksichtigen (z.B. 200) und dann aufteilen.
Noch zwei Bemerkungen:
Das On Error Resume next hat da nichts verloren, warum hast du das da drin?
Damit das Fenster minimiert werden kann? Das kann man drum herum mit Abfrage auf WindowState <> VbMinimized erledigen. Weiterhin solltest du eine Mindestgröße für die Form festlegen, damit auch alle Steuerelemente noch eine Vernünftige Breite haben.
Wenn sich die Position eines Steuerelementes nicht ändert brauchst du für nachfolgende Positionierungen auch nichts zu erledigen wenn das davon abhängig ist.
In deinem Code
Frame1.Height = Me.ScaleHeight - (Frame1.Top * 1) - ListView1.Height - _
StatusBar1.Height ist dieser Teil völlig überflüssig weil sich die Top Position des ListView ja nicht ändert. Das ListView bleibt links/oben wo es ist also bleibt auch das darüberliegende Frame in der Höhe immer gleich.
Gruß
Frank
| |
Re: Resize-Ereignis mit Frame | | | Autor: Manfred X | Datum: 16.09.13 09:14 |
| Hallo Sophus!
Der Nickname ist seit 8 Jahren hier registriert.
In den letzten Jahren sind ca. 24 Anfragen im Forum gestellt worden.
Aber: Nach wie vor fehlen die Grundkenntnisse.
Die Hinweise in den Antworten werden deshalb nicht verstanden.
Woher kommen die Zahlen im Beispielcode?
Das sind Distanzen auf dem Formular (= Angabe der Größe von Controls
bzw. Abstände zwischen den zu positionierenden Elementen).
Die in VB6 dafür vorgegebene Maßeinheit ist das "Twip".
[I]Eine bildschirmunabhängige Einheit, die verwendet wird, um dieselbe
Positionierung und dieselben Proportionen von Bildschirmelementen in Ihrer
Anwendung auf allen Anzeigesystemen sicherzustellen.
Ein Twip ist eine Bildschirm-Maßeinheit, die 1/20 eines auf einem Drucker
ausgegebenen Punktes entspricht. Ein logischer Zentimeter enthält ca. 567 Twips,
und ein logischer Zoll enthält ca. 1440 Twips
(bzw. die Länge eines Bildschirmelements, das einen Zentimeter oder einen Zoll
groß ist, wenn es auf dem Drucker ausgegeben wird).[/I](VB6-Doku).
| |
Re: Resize-Ereignis mit Frame | | | Autor: Sophus | Datum: 16.09.13 14:53 |
| Hey Mafred X,
vielen Dank. Ja, ich merke selbst, dass ich sehr große Lücken besitze. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|