If Form1.Hide = True Then

Hallo
gibt es sowas wie den obigen Befehl, wonach ein Programm erst weiterläuft, wenn die Form nicht mehr sichtbar ist und wirklich verborgen wurde???

Vielleicht auch mit

Do
If Form1.Hide=True then exit Do
Loop

???

BItte kein DoEvents vorschlagen. das gefiel mir nicht so, man kann währenddessen keine anderen Sprünge im Programm machen.

Wer kann helfen??

Mfg Werner

Hallo Werner,

Do
If Form1.Hide=True then exit Do
Loop

versuch’s mal mit Form1.visible
Das wird den Effekt haben, den Du suchst.

Private Sub Command1\_Click()
 If Form2.Visible = True Then Exit Sub
 'Dein Code
End Sub

Gruß, Rainer

Hallo
ne das klappt eben nicht, weil diese Form eine Optionsform ist.
Wenn ich da OK klicke, soll die Form verschwinden und dann!!! der Code weiterlaufen.
Dies funktioniert im Moment aber nicht sauber, weil der Code schneller weiterläuft als die Form verschwinden kann.
Daher ist sie noch solange sichtbar, bis der Code abgearbeitet wurde.

Daher muß ich das über Hide steuern können und nicht über visible.
Ich habe den Hintergrund deines Codes verstanden aber das geht hier nicht.

Das muß man doch steuern können, das erst wenn die Form sauber verborgen wurde, der Code weiterlaufen darf.

Mfg Werner

Hallo Werner,

ne das klappt eben nicht, weil diese Form eine Optionsform
ist.
Wenn ich da OK klicke, soll die Form verschwinden und dann!!!
der Code weiterlaufen.
Dies funktioniert im Moment aber nicht sauber, weil der Code
schneller weiterläuft als die Form verschwinden kann.
Daher ist sie noch solange sichtbar, bis der Code abgearbeitet
wurde.

Daher muß ich das über Hide steuern können und nicht über
visible.
Ich habe den Hintergrund deines Codes verstanden aber das geht
hier nicht.

Das muß man doch steuern können, das erst wenn die Form sauber
verborgen wurde, der Code weiterlaufen darf.

Wenn die Form ‚für das Programm‘ verborgen wurde, Windows die aber noch anzeigt, hilft Dir wirklich nur ‚Doevents‘. In wie fern Dich das behindert ist mir unklar. Es ermöglicht doch Windows nur, ‚zwischendurch‘ mal etwas anderes zu arbeiten, eben um solche Effekte (Fenster noch sichtbar) zu unterbinden. Auf den Rest Deines Codes hat es IMHO keinen Einfluß. Ich denke, die Stelle sollten wir diskutieren um Dein Problem zu lösen. Scheinbar liegt das Problem an einer Stelle, an der Du es nicht vermutest und bastelst an der falschen Stelle an den Symptomen herum, statt das Problem selbst zu lösen.

Gruß, Rainer

Hallo

Hallo Werner,

ich habe mir hier mal die Postings durchgelsen und mich selbst mal versucht :smile:

Also zu deinem Problem. Was verstehst du denn unter einer optionsform?
Ist es nur eine Form, wo du einstellungen vornimmst?
Wenn ja, dann mache es doch so :smile:
Aufruf der Form mit formname.show vbmodal . das bewirkt das die form aufgerufen wird und der Code dann erst fortgeset wird wenn diese geschlossen ist. Der nachteil daran ist, das du die dort vorgenommen eingaben erst in einer variable speichern musst und sie dann in der alten form wieder auslesen musst.

Wenn dir dies net zusagt, so kannst du mit der Variante Visible arbeiten. Diese packst du dazu in eine Do Loop Schleife! dazu musst du aber auch den Befehl DoEvents einbauen.

 Do
 DoEvents
 Loop Until Not Forname.Visible

Was spricht denn bei dir dagegen?
Auch wenn du das Fenster mit hide ausgeblendet hast, kannst du ueber die visible eigenschaft den status abfragen :wink:

MFG Alex

Hallo Werner,
gerade habe ich mal ein Beispielprogramm ‚gebastelt‘. :wink:

Form1:

Private Sub Command1\_Click()
 For i = 0 To 100000000
 Next
 Form2.Show (1)
 For i = 0 To 100000000
 Next
 Label1.Visible = True
End Sub

Form2:

Private Sub Form\_Activate()
 Form2.Refresh
 For i = 0 To 100000000
 Next
 Form2.Hide
End Sub

Bei diesem Beispiel tritt das Problem auf, das Du hast.

Andere ich aber

Form1:

Private Sub Command1\_Click()
 For i = 0 To 100000000
 Next
 Form2.Show (1)
 Form1.Refresh
 For i = 0 To 100000000
 Next
 Label1.Visible = True
End Sub

Form2:

Private Sub Form\_Activate()
 Form2.Refresh
 For i = 0 To 100000000
 Next
 Form2.Hide
 DoEvents
End Sub

sind alle Probleme mit der Anzeige beseitigt und das programm wird auch nicht irgendwie ‚behindert‘.

Gruß, Rainer

Hi Alex,
Werner hat das Problem schon länger.

Er ruft während einer Berechnung eine weitere Form auf (moidal hat er schon versucht) und schließt (versteckt) die Form dann wieder und die Berechnung wird von aufrufenden Programm fortgesetzt.
Dazwischen gibt es keine ‚Pausen‘, deshalb bleibt die geschlossene Form sichtbar.

Gruß, Rainer

Hallo Rainer,

also ich versuche mir das gerade vorzustellen, aber den sinn kann ich nicht erkennen! Du sagtest das er eine Berechnung anstellt dann eine Form aufruft und das dann diese Berechnung von einem ANDERN progg fortgesetzt wird?
Was soll das bringen, oder was möchte er machen?
Warum rechnet er denn net, speichert das ergebnis temp. in einem File oder in der registry, ruft dann die Form auf vbmodal macht da die einstellungen etc und ruft dann das andere progg auf was dann anhand des files die wert wieder ausliest und weiterrechnet. dann das ergebnis wieder temp. speichert sich schliesst und das alte program wird dann fortgesetzt und liest das ergebnis aus dem temp. gespeicherten file wieder aus und löscht es dann?

Mag zwar alles umstaendlich klingen aber rel. simple, sauber und schnell gelöst.
Ich denke mal das er sich kein Programmablaufplan erstellt hat und somit immer wieder auf probs stösst.
Irgendwann blickt man dann net mehr durch :frowning:
was ich auch nicht verstehe warum ihm doevents abschrekckt ? ohne dem sieht er in do loop schleifen sehr alt aus :frowning:

Wenn er mal seine ganze problematik schildern würde, koennte man ihm sicher expliziter helfen. So ist das doch nur morgserei was wir hier machen :frowning: und fuehrt zu allem anderen nur net zu erfolgen.

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex,

also ich versuche mir das gerade vorzustellen, aber den sinn
kann ich nicht erkennen! Du sagtest das er eine Berechnung
anstellt dann eine Form aufruft und das dann diese Berechnung
von einem ANDERN progg fortgesetzt wird?

Nich in einem anderen Programm, da habe ich mich wohl falsch ausgedrückt. Werner ruft während eine Prozedur läuft eine weitere Form auf, um die wann und warum auch immer, wieder zu schleißen. Dann wird die aufrufende Prozedur fortgesetzt und die Form, die wieder geschlossen wird bleibt sichtbar, wel das Programm keine Zeit bekommt, das Bild zu aktualisieren.

Was soll das bringen, oder was möchte er machen?

Das weiß ich nicht. :wink:

Warum rechnet er denn net, speichert das ergebnis temp. in
einem File oder in der registry, ruft dann die Form auf
vbmodal macht da die einstellungen etc und ruft dann das
andere progg auf was dann anhand des files die wert wieder
ausliest und weiterrechnet. dann das ergebnis wieder temp.
speichert sich schliesst und das alte program wird dann
fortgesetzt und liest das ergebnis aus dem temp. gespeicherten
file wieder aus und löscht es dann?

Weiß ich nicht. Ich könnte jetzt anfangen, herumzuraten…

Mag zwar alles umstaendlich klingen aber rel. simple, sauber
und schnell gelöst.
Ich denke mal das er sich kein Programmablaufplan erstellt hat
und somit immer wieder auf probs stösst.
Irgendwann blickt man dann net mehr durch :frowning:
was ich auch nicht verstehe warum ihm doevents abschrekckt ?

Das habe ich gerade gefragt. Irgendetwas muß faul sein, denn mir fällt nichts ein, wo Doevents Probleme auslösen könnte. (Davon, daß das Programm davon langsamer wird mal abgesehen. ,-))

ohne dem sieht er in do loop schleifen sehr alt aus :frowning:

Wenn er mal seine ganze problematik schildern würde, koennte
man ihm sicher expliziter helfen. So ist das doch nur
morgserei was wir hier machen :frowning: und fuehrt zu allem anderen
nur net zu erfolgen.

Bis neulich war es noch so, daß das Programm, das Problem selbst nicht im Vordergrund stand. Werner ist noch recht neu in VB und sucht oft noch nach den richtigen Befehlen, um zu bewirken was er möchte. Ein Quellcode, der sein vordergründiges Problem löst, den er aber nicht richtig versteht, weil er nicht weiß, was die Befehle tun, hilft da nicht wirklich weiter. Der Weg ist das Ziel! … oder war es neulich noch. Ob sich das geändert hat, kann ich nicht sagen.

Gruß, Rainer

Ich versuchs nochmal grafisch
Hallo
also ichs versuchs nochmal grafisch!!!
Wers jetzt noch nicht versteht, dem kann ich auch gerne den Code schicken. Ich habe damit kein Problem, ich will ja nur meine Wünsche umsetzen.
Also

Form1 sichtbar = Hauptform

Menüpunkt Punkte einlesen wird geklickt
Datei auswählen zum einlesen

–> Form2 wird modal sichtbar
hier wird festgelegt, in welche Datenbank die Punkte eingelesen werden sollen, hier die Einstellungen tätigen und OK klicken

–> Form2 wird verborgen, die Daten eingelesen
so wenn ich hier DOEvents einbaue, schliesst die Form sauber, ansonsten nicht!!!

–> Problem, es erfolgt beim Einlesen eine Prüfung, ob doppelte Punktnummern da sind, wenn ja geht eine Form3 auf
so, diese Form3 geht beim verwenden von DoEvents nicht!!! mehr auf,
weil solange DoEvents läuft keine verzweigungen möglich sind

Ich hoffe, das war nun verständlich.
Wenns nicht anders geht, muss ich es eben so lassen.

Trotzdem danke für eure Bemühungen.

Mfg Werner

Hallo,
das Problem liegt nicht beim „Form2“, sondern beim Hauptform.

Wenn Du z.B. ein kleines Hauptform in die linke obere Bildschirmecke und „Form2“ in die rechte untere Bildschirmecke plazierst, sodass sich die Fenster nicht überschneiden (die Fenster liegen nicht übereinander), dann wirst Du sehen, dass „Form2“ sehr wohl verschwindet.

Abhilfe schafft hier die Refresh() Methode.

Ein kleines Test-Programm soll verstehen helfen.
Du brauchst: Form1, Form2, einen Command-Button auf Form1

Private Sub Command1\_Click()
Dim x As Form2
Dim dat As Date

Set x = New Form2
Call Load(x)
Call x.Show(vbModal)
'Me.Refresh 'die Lösung!!

dat = Now
Do 'Coding das 5 Sekunden lange läuft
 If DateDiff("s", dat, Now) \> 5 Then Exit Do
Loop

Set x = Nothing
End Sub

greets from michL