Pause im Programm?

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.

Danke schon mal.

CU
Marco

Hallo Marco,

du musst das andere Formular modal starten, also z.B. mit

Form1.Show vbModal

dann wird an der Stelle erst weitergemacht, wenn Form1 fertig ist.

Gruß
Daniel

Hi Daniel, DANKE :smile:

Problem!
also das zweite Formular heißt „input1“
ich schreibe also:

input1.show vbmodal

VB meckert!

Laufzeitfehler „424“
Objekt erforderlich

Noch ein Problem!
Ich habe nun das Formular Input1 „Modal“ geschaltet (kann man in den EInstellungen machen)

Ich starte es ganz normal mit docmd.openform „input1“

ABER es das erste Formular unterbricht nicht und wartet sondern es macht einafch weiter…

anderer Lösungsansatz

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

Hm, da gibt es dann nur noch das Problem dass er mir bei „form1.show“ nicht das Formular öffnet sondern mir einen Fehler bringt…
„objekt erforderlich“


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???

Hilfe BITTE…

LÖSUNG FÜR ALLE DIE ES WISSEN WOLLEN :wink:
Vereinfacht:

(Qtext in Form1)

private sub Befehl1_click()
dim i as integer
public zurück as boolean

for i = 1 to 10
docmd.openform „Form2“
zurück = false
do until zurück
doevents
loop
next i
end sub

(Qtext in Form2)

private sub Befehl1_click()

zurück = true
docmd.close „form2“
end sub

Tja, selber machen is doch noch am besten :wink:
Nur leider raubt es einem den letzten Nerv :wink:

Hi!

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.

Das wär’s!

Grüße
Heinrich

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!

Christian

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.

Das ganze kannst Du noch belibig erweitern.

Ich hoffe es hilft! Bei mir klappt es sehr gut!

Bis dann Torsten