CommonDialog stoppt Anwendung

Guten Tag,

ich hab folgendes Problem:
So wie ich das sehe, wird ein CommonDialog immer modal geöffnet, das bedeutet, das die Anwendung im Hintergrund stoppt. Das ist für meine Anwendung allerdings tödlich.

Folgende Situation:
Ein Chatprogramm. Ein User möchte einem anderen eine Datei senden.
Dieser bekommt dazu eine Meldung (diese MessageBox stoppt die Anwendung bereits das erste Mal, aber nur kurz). Wenn er bestätigt, erscheint ein Save-Dialog. Hier kann je nach User schon einige Zeit vergehen (evtl. Dateinamen ändern und richtigen Pfad auswählen)
In dieser Zeit können natürlich weiterhin Daten beim Winsock Element auflaufen, die allerdings alle nicht bearbeitet werden können.

Die MessageBox und der Dialog müssten also im besten Fall nicht blocken.
Gibt es da eine Möglichkeit? Oder muss ich dafür extra eigene Formen erstellen? (das wäre natürlich die absolute Notlösung)

MfG Hendrik Hilleckes

Hallo,

etwas grundsätzliches zu VB6.

VB6.0 ist nicht Multithreadfähig!

Du hast also immer nur einen Programmzeiger, nur einen Code, der linear abgearbeitet wird.

Wenn Du den Code direkt beeinflussen kannst, kannst Du ein DoEvents einfügen, dann hat VB die Möglichkeit, an dieser Stelle den Ablauf zu unterbrechen, zwischendurch eine andere prozedur abzuarbeiten und danach zu dieser Stelle zurückzukehren.

Für Dein Programm bedeutet das, daß Dir selbst eine zusätzliche Form nicht hilft.

Du möchtest die eingehenden Daten lesen und verarbeiten, unabhängig davon, was sonst im Programm passiert. Wenn der Commondialog geöffnet ist, reagiert VB in dieser Zeit nicht auf andere Ereignisse, egal was Du da wie versuchst.

Es gibt eine recht komplizierte Möglichkeit, in VB6 einen weiteren Thread zu starten. Ich habe das noch nicht versucht, weiß aber, daß das etwas instabil ist, nicht sehr gut funktioniert.

Nach meiner ganz persönlichen Meinung verwendest Du das falsche Werkzeug, mit VB.NET oder C# ist Dein Vorhaben leichter zu realisieren, die sind Multithreadfähig. VB6 tut nur was Du da vor hast, wenn Du ganz schwere Geschütze auffährst und das äußerst ungern, dafür ist es nicht da.

Gruß Rainer

Hallo,

ich bin mit der Antwort nicht ganz zufrieden.

Folgendes funktioniert nämlich:
Ich habe mehrere Formulare, welche parallel geöffnet sind.
Jede repräsentiert einen Server, zu dem verbunden wurde. Es ist aber immer nur eine Formular sichtbar bzw aktiv.
Wenn ich nun Nachrichten bekomme, werden sie sofort in jedem Fenster dargestellt (erkennbar an der Zeit, die ich bei jeder Nachricht hinzufüge). Die jeweiligen Winsock-Elemente empfangen und verarbeiten also weiterhin Daten, obwohl die Form nicht aktiv ist.

Ein anderes Beispiel:
Die Daten werden sogar korrekt im Hintergrund dargestellt, wenn ich ein Info-Fenster geöffnet habe, welches die gesamte Anwendung blockiert (es ist also nichts anklickbar, bist das Info-Fenster geschlossen wird).

Das ist genau das Verhalten das ich möchte.
Die Anwendung wird geblockt, das Fenster ist im Vordergrund,
die Nachrichten, die im Hintergrund auflaufen, werden aber trotzdem dargestellt.
Ich finde es daher etwas komisch, das es mit Dialogen einfach nicht gehen soll. Das sind ja im Endeffekt auch nur Formulare oder nicht?

Ich bin mir ziemlich sicher, das es mit einem selbstgebauten Dialog funktionieren müsste.

MfG Hendrik Hilleckes

Hallo,

Ich bin mir ziemlich sicher, das es mit einem selbstgebauten
Dialog funktionieren müsste.

mit einem selbst gebauten Commondialog?
Ja das funktioniert.

Du hast für das Projekt einen Programmzeiger.

Wenn auf einem Formular ein Ereignis ausgelöst wird und VB hat gerade nichts anderes zu tun, wird dieses Ereignis verarbeitet. Dann wird die Kontrolle wieder an den Eventhandler zurückgegeben.

Daß das mit mehreren Winsock-Steuerelementen gleichzeitig funktioniert, liegt daran, daß die Verarbeitung schneller ist als die Daten eingehen.

Es geht also auf der einen form ein zeichen ein, das wird gelesen verarbeitet und die Steuerung an den Eventhandler zurückgegeben. Bevor das nächste Zeichen kommt, kann ohne weiteres ein Ereignis auf einer anderen Form verarbeitet werden.

Wenn Du statt mit dem Commondialog mit Drive, Data und File auf einer Form arbeitest, musst Du die Form ja nicht modal öffnen, dann geht das. Nur wenn Du dort den Commondialog verwendest, hast Du wieder das selbe Problem, daß der Eventhandler nicht reagieren kann.

Das war danmn ein Missverständnis, ich hatte verstanden, Du willst auf der neuen Form den Commondialog verwenden.

Gruß Rainer

Hallo nochmal,

ich habe das nun ausprobiert und es funktioniert.
Hier mal ungefähr meine Lösung:

(auf der Form, die eine Datei speichern soll)

Private Sub openHistory()
frmSave.Show 1 'Form modal öffnen
While frmSave.Visible = True 'solange die Form sichtbar ist
DoEvents 'im Hintergrund weiterarbeiten
Wend
If frmSave.bolOK = True Then 'wenn auf der Form OK gedrückt wurde
MsgBox frmSave.strPath 'Pfad ausgeben
Unload frmSave 'und Form entladen
End If
End Sub

(auf der Dialog Form)

Public strPath As String 'gibt später den Pfad an
Public bolOK As Boolean 'gibt an, ob OK gedrückt wurde

Private Sub cmdCancel_Click()
Me.Visible = False 'Form verstecken
bolOK = False 'und Kontrollvariable setzen
End Sub

Private Sub cmdOK_Click()
Me.Visible = False 'Form verstecken
bolOK = False 'und Kontrollvariable setzen
strPath = Dir1.Path 'Pfad speichern
End Sub

Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive 'Pfad ändern
End Sub

So klappt es erstmal wie ich das möchte.
Probleme kann es natürlich geben, wenn ich die Form mehrfach öffnen will, aber das kümmert mich erst später.
Mit einem Öffnen-Dialog würde ich ähnlich verfahren.

MfG Hendrik Hilleckes

Hallo

Ich hab vb5. Das kann ich z.B. multithreadingfähig machen.
Ich verwende dazu createthread mit Zeiger auf VB-Funktionen.
Mit 1000 Threads z.B… Hier muss ich dann allerdings den Stack verringern, was über einen modifizierten Linkeraufruf (oder war es der Linker selber?) geht.
Bei Dialogen gibt es die Möglichkeit, Windows Dialoge aufzurufen.
Geht ebenfalls über API-Aufrufe.
Ganz fortgeschrittene lassen Programme mit den Eingaben bei den Dialogen interagieren, währen sie aber noch gemacht werden(die Eingaben).
„VB ist nicht dafür vorgesehen“ ist eher Unsinn, weil z.B. große Teile des MSDN’s für diese Zwecke vorgesehen sind.
Übrigens komm ich persönlich mit dem VB.Net und bzw. dem C# weniger gut klar als mit VB5. VB5 ist mit der Hilfe und dem sensitvem Kontext wesentlich schneller. Nur einzelne Sachen kann ich mit VB5 nicht so gut machen. Ich kann davon aber das meiste mit API-Programmierung ausgleichen.

MfG
Matthias