Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Sanduhr mit C#

Empfohlene Antworten

Veröffentlicht

Ich möchte eine Sanduhr in eine Form einbauen, etwa so mache ich es


MyForm.ActiveForm.Cursor = Cursors.WaitCursor;
for(...)
{
tue was
}
MyForm.ActiveForm.Cursor = Cursors.Default;
[/PHP]

Es wird aber leider nichts eingezeigt :(

Hat jemand eine Idee warum?, bzw. was ist daran falsch?

Die Eigenschaft Cursor bezieht sich auch nur auf das entsprechende Form-Objekt. Die Sanduhr wird dementsprechend auch nur dann angezeigt, wenn du mit der Maus über diesem Objekt hoverest. Alle anderen Steuerelemente verwenden weiterhin den Standardcursor.

  • Autor
Die Eigenschaft Cursor bezieht sich auch nur auf das entsprechende Form-Objekt. Die Sanduhr wird dementsprechend auch nur dann angezeigt, wenn du mit der Maus über diesem Objekt hoverest. Alle anderen Steuerelemente verwenden weiterhin den Standardcursor.

Das weis ich deswegen benutze ich den Cursor von dem Formular.

nein, aber was hätte es mit dem Cursor zu tun?

Hätt ja sein können du hättest nen modalen Dialog aufgerufen, da geht das ganze nämlich solange nicht, bis du den beendest.

Also ich kann in deinem Code nix falsches feststellen.

Hast du denn in der for-Schleife überhaupt genügend drin, dass die Sanduhr Zeit hat, angezeigt zu werden?

Hallo BigPoint,

ich habe mit VB mal folgendes ausprobiert:

Formular mit zwei Buttons unter denen dieser Code liegt


Private Sub btnHourGlass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHourGlass.Click


        Me.Cursor = Cursors.WaitCursor


End Sub


Private Sub btnDefault_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDefault.Click


        Me.Cursor = Cursors.Default


End Sub

Es hat normal funktioniert. Dann in C# nochmal das selbe:

         private void btnHourGlass_Click(object sender, EventArgs e)

        {

            this.Cursor = Cursors.WaitCursor;

        }


        private void btnDefault_Click(object sender, EventArgs e)

        {

            this.Cursor = Cursors.Default;

        }

Auch ordnungsgemäß funktioniert.

Also ist wirklich entweder die Schleife so schnell durch, dass er gar nicht zum Anzeigen des WaitCursor kommt oder Deine Referenz

"MyForm.ActiveForm"

zeigt gar nicht auf die Form von der Du glaubst, dass sie die gerade aktiv ist.

Aus der MSDN-Onlinehilfe

Form.ActiveForm

Ruft das momentan aktive Formular für diese Anwendung ab.

Ist inzwischen ein anderes Fenster in Deiner Form aktiv geworden (in der Schleife oder aus sonst einem Grund)?

Edit: Ganz simpler Gedanke - innerhalb welchen Kontexts rufst Du den Code bei Dir auf?

Aus einer Klasse heraus, der die Form als "MyForm" bekannt ist (z.B. eine andere Form)?

Oder aus der Klassendefinition von "MyForm" selbst?

Wenn Du innerhalb der "MyForm"-Klasse arbeitest, einfach mit this.Cursor arbeiten, wie in meinem Beispiel oben.

Wenn Du sonstwo eine Instanz der Form namens "MyForm" ansprichst und möchstest, dass auf dieser Instanz der Cursor wechselt, dann benutze

MyForm.Cursor = Cursor.[Welcher es denn sein soll]

Gruß,

Das Füchslein

Also ein Funktionsaufruf ist ja bekanntlich syncron.

Wenn du zu beginn den Cursor auf wait stellst und in deiner Methode noch was machst, dann wieder auf normal schaltest kann der Thread in dem du ausgeführt wirst doch garnich den Cursor ändern.

Will heißen das du den cursor oder die berechnung (schleife) in einem anderen thread-context ausführen solltest.

Also ein Funktionsaufruf ist ja bekanntlich syncron.

Wenn du zu beginn den Cursor auf wait stellst und in deiner Methode noch was machst, dann wieder auf normal schaltest kann der Thread in dem du ausgeführt wirst doch garnich den Cursor ändern.

Will heißen das du den cursor oder die berechnung (schleife) in einem anderen thread-context ausführen solltest.

Das wäre mir aber neu. Habe es gerade auch mal ausprobiert:


this.Cursor = Cursor.WaitCursor;


{ Some really nasty calculations }


this.Cursor = Cursor.Default;

Der Cursor wurde ordnungsgemäß auf Sanduhr gestellt und hat sich nachher zurückgesetzt, ohne, dass ich einen neuen Thread dafür erzeugen musste. Anderes hätte mich jetzt auch sehr gewundert, obwohl Du prinzipiell Recht hast, dass bei aufwändigen Arbeiten ein separater Thread sinnvoll ist!

Bei der Gelegenheit habe ich gleich mal ausprobiert, was passiert, wenn die Berechnung zwischen dem Umschalten sehr kurzweilig ist. Es kann tatsächlich sein, dass in dem Fall der Cursorwechsel gar nicht zu sehen ist!

ich denke es kommt drauf an wo man die Berechnungen ausführt...

(Also ich hab es jetzt alles nicht getestet, ist nur so aus der Luft gegriffen)

Also wenn man die "Krasse berechnung" im ButtonClick oä ausführt kann ich mir gut vorstellen das es nicht hinhaut mit dem wait cursor...

  • Autor

Vielen Dank für die Antworten.

Ich habe gestern ein wenig geschlafen, und den Cursor innerhalb einen try … catch block aufgerufen, sobald ich aus dem block ihn rausnehme funktioniert alles prima

Danke bigpoint

Hi BigPoint,

schön, dass es funktioniert. Das würde dann aber auch bedeuten, dass bevor Du im Code zum Cursorsetzen kommst, im TRY-CATCH block was in die Hose geht und eine Exception schmeißt.

Ansonsten sollte es jedenfalls keinen Unterschied machen, ob das innerhalb oder außerhalb eines solchen Blocks steht.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.