Hallo!
Ich habe folgendes Problem:
Ich habe ein Formular dass ein anderes aufruft um eingaben zu machen. Das erste MUSS aber „warten“ bis das zweite geschlossen ist (also entweder die eingaben fertig sind oder abgebrochen wurde)
Habe es mit schleifen versucht, aber die enden natürlich in einer Endlosschleife…
Das Problem erscheint bestimmt etwas einfach, aber da ich aus dem Pascal bereich komme, kenne ich mich leider nicht so mit der Syntax von VB aus.
Also hoffe ich mal dass du mir helfen kannst.
public sub form1\_load
'Hier findet das Ereignis statt, das das andere Formular aufruft
form2.show
me hide ' dadurch wird das erste Formular ausgeblendet
end sub
public sub form2\_unload
'eingabe fertig ?
form1.show
end sub
Wenn das zweite Fromular entladen wird, wird automatisch das erste Fromular wieder dargestellt.
Grüße
Gollum
HILFE BITTE
So sieht meine Situation vereinfacht aus:
Private Sub Befehl2_Click()
For i = 1 To 10
DoCmd.OpenForm „input1“
Debug.Print i
Next i
End Sub
Ich will dass wenn ich nach dem ersten befehl2_click ins Direktfenster gucke „nix“ steht. Dann beende ich „input1“. dann erst wird die „1“ ins Dfenster geschrieben und die for schleife geht weiter…
usw…
Aber das programm macht folgendes:
input1 geht auf, und im Dfenster steht 1 2 3 4 5 6 7 8 9 10!!!
warum???
Ich habe folgendes Problem:
Ich habe ein Formular dass ein anderes aufruft um eingaben zu
machen. Das erste MUSS aber „warten“ bis das zweite
geschlossen ist (also entweder die eingaben fertig sind oder
abgebrochen wurde)
Eigentlich ist das kein Problem.
Die Frage ist nur, an welches Event du den Aufruf der einzelnen Forms koppelst.
Im Normalfall ist das erste Formular das Start-Formular, d.h. bei Aufruf der .exe erscheint das erste Formular. Nun muss irgendwas passieren, damit das zweite Formular aufgerufen wird, z.B. der Maus-Klick auf einen Command-Button. In der entsprechenden Sub setzt du dann den Befehl zum Aufruf des zweiten Formulars ab. Dieses Formular muss modal aufgerufen werden, damit die Ausführung des Codes für das erste Formular unterbrochen wird.
Das wäre dann etwa so:
Name des Formulars 1 ist ANTON, Name des Formulars 2 ist BERTA
Auf ANTON befinden sich die Command-Buttons WEITER und ENDE
Auf BERTA befinden sich die Command-Buttons SPEICHERN und ENDE
ANTON ist Start-Formular
Code:
im Code für ANTON:
Private Sub Weiter_Click()
BERTA.Show vbModal
End Sub
Private Sub Ende_Click()
End
End Sub
im Code für BERTA:
Private Sub Ende_Click()
Unload BERTA
End Sub
Wenn du das laufen lässe, wird das Formular ANTON angezeigt. Erst durch Anklicken von WEITER erscheint BERTA. Wenn BERTA sichtbar ist, kannst du nicht an ANTON heran.
Alternativ wäre der Start des ersten Formulars mit sofortigem Aufruf des zweiten Formulars.
Code:
im Code für ANTON:
Private Sub ANTON_Load()
ANTON.Show
BERTA.Show vbModal
End Sub
Private Sub Weiter_Click()
BERTA.Show vbModal
End Sub
Private Sub Ende_Click()
End
End Sub
im Code für BERTA:
Private Sub Ende_Click()
Unload BERTA
End Sub
Das Formular ANTON wird geladen und noch vor Beendigung des Sub ANTON_Load auf dem Bildschirm angezeigt. Dann wird BERTA modal angezeigt, d.h. BERTA überlagert ANTON und ANTON kann nicht aktiv werden. Mit Mausklick auf ENDE auf dem Formular BERTA wird BERTA beendet und ANTON aktiv.
Sorry, aber das sieht mir aus, als ob du die Funktionsweise der Event-Programmierung nicht verstanden hast.
Mit dem Mausklick auf BEFEHL2 löst du ein Event aus, was zur Folge hat, dass der Code in BEFEHL2_CLICK ausgeführt wird. Und da sagst du, dass im Falle eines Maus-Klicks auf BEFEHL2 eine Schleife zehn Mal durchlaufen werden soll. Genau das zeigt dir das Debug-Fenster auch an. Erst mit dem Befehl END_SUB ist das Ende der Verarbeitung für das Event Maus-Klick auf BEFEHL2 erreicht.
Das Programm arbeitet absolut korrekt! Deine Denke ist falsch.
Grüße
Heinrich
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi!
Ganz einfach:
Wenn du das zweite Fenster aufrufst, schreibst du folgendes:
Form2.show vbmodal
Das bewirkt, dass du nur das aufgerufene Fenster steuern kannst. Das musst du beenden, damit du wieder im ursprünglichen Fenster eine Eingabe vornehmen kannst.
In die Form_Unload (nicht Terminate) des zweiten Fensters kanst du dann noch festlegen ob irgendwas als default übergeben wird, wenn der Anwedner auf abbrechen klikt (kann ja auch das x oben rechts sein).
Auf gar keinen Fall würde ich mit Warteschleifen arbeiten. Dazu bräuchtest du eine While-Schleife oder einen Sleep-Befehl oder du musst mit der Systemzeit arbeiten. Für dein Problem wäre das alles schlampig programmiert. Darum Finger weg davon!
Bist du sicher das „input1“ der Name des Formulars ist und nicht etwas die Caption? Du musst den Namen nehmen, der auch im Projektexplorer verwendet wird. Nach dem Punkt sollte automatisch eine Liste mit Eigenschaften und Methoden kommen. Wenn die nicht kommt, ist der Name falsch.
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Nur mal so aus Interesse: Welche Office-Anwendung war denn das??
Und wie bereits mehrfach erwähnt wurde ist die Verwendung einer Schleife mit DoEvents nicht nur unsauber, sondern frisst auch unnötige Rechenzeit. Aber wenn’s auf nix ankommt…
Halloo Männer,
Um die ewige Geschichte der Eingabe ein wenig zu kürzen hier ein kleiner Sample (VB6) für ein Eingabeformular:
‚‘##Dein Eingabeformular##’’
Option Explicit
Private RESULT As Boolean
Public Function GetWert(BeSchreibung As String, Optional vorgabe As String = „“)
Me.Label1.Caption = BeSchreibung
Me.Text1.Text = vorgabe
Text1.Top = Label1.Top + Label1.Height + 100
Me.Show vbModal
If RESULT = False Then
GetWert = „“
Else
GetWert = Text1.Text
End If
End Function
Private Sub Command1_Click() 'OK
RESULT = True
Text1.SetFocus
Hide
End Sub
Private Sub Command2_Click() 'Abbrechen
RESULT = False
Text1.SetFocus
Hide
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = vbFormControlMenu Then
RESULT = False
Text1.SetFocus
Cancel = True
Hide
End If
End Sub
‚‘##Dein anderes Formular aus dem du die Eingabe aufrufen willist##’’
…
…
Dim ERG as string
ERG=GetWert(„beschreibung“,„vorgabetext“)
…
…
‚‘##ENDE##’’
Du rufst nicht das Formular auf sondern die als public deklarierte Funktion, alles ander macht das Eingabeformular selbst!
Das Ergebnis der Eingabe wird in der variable ERG gespeichert.