Anzeige einer Meldung bei Interop

Hallo zusammen,

ich erstelle per c#/Forms und Interop Sheets in Excel. Das läuft auch, wenn auch langsam. Daher sollte nun eine Meldung für den User her.

Die hab ich auch, allerdings wird die „nicht“ angezeigt. Nicht in „“ weil sie zwar da ist, aber nicht gemalt wird. Es ist also nichts erkennbar.

Dazu vier Fragen:

Welcher Event wird ausgelöst, wenn ich auf meine Anwendung wechsele (per Alt-Tab oder klick unten in der Leiste (hat die einen Namen?))

Wie kann ich das Zeichnen „forcieren“. Reicht da Refresh() oder gibts da noch was „fundamentaleres“.

Gibts gar für eine Form soetwas wie „wenn man mich wieder sehen kann mal ich mich neu?“

Mir scheint auch, dass meine „warte form“ nicht auf meiner eigentlichen Form liegen bleibt, also dahinter rutscht. Wie krieg ich die wieder nach vorne auf meine Form, aber nicht nach ganz vorne, also über andere Anwendungen?

Vielen Dank fürs Interesse und voreilend auch für die Antworten.

mfg

Dirk.Pegasus

Hi!

Zuerst das Einfache: Bei Dialogen kann man einen Owner angeben, damit der Dialog immer vor dem Owner angezeigt wird.

Jetzt das etwas Schwierigere (Da Du nicht schreibst, was Du genau machst, muss ich mal ein Szenario konstruieren):
1- Du holst Dir irgendwie das Excel-Objekt
2- Dann zeigst du den Warte-Dialog mit .Show() an
3- Dann machst Du irgendwas länger Dauerndes mit Excel im UI-Thread
4- Während dieser Zeit stellst Du fest, dass sich der Warte-Dialog nicht aktualisiert.

Korrekt soweit?

Wenn ja, dann liegt es schlichtweg daran, dass Zeichenanforderungen Deiner Dialoge auch über den UI-Thread abgewickelt werden. Der ist aber längere Zeit damit beschäftigt, irgendwelche Sheets in Excel zu bearbeiten.
Also: Lange dauernde Aktivitäten in einen eigenen Thread auslagern, damit der Haupt-UI-Thread weiter laufen kann und Deine Anwendung weiterhin reagiert.

Gruß,
Martin

hallo Martin,

Dank für die Antwort!

Zuerst das Einfache: Bei Dialogen kann man einen Owner
angeben, damit der Dialog immer vor dem Owner angezeigt wird.

Werd ich testen.

Jetzt das etwas Schwierigere (Da Du nicht schreibst, was Du
genau machst, muss ich mal ein Szenario konstruieren):
1- Du holst Dir irgendwie das Excel-Objekt
2- Dann zeigst du den Warte-Dialog mit .Show() an
3- Dann machst Du irgendwas länger Dauerndes mit Excel im
UI-Thread
4- Während dieser Zeit stellst Du fest, dass sich der
Warte-Dialog nicht aktualisiert.

Korrekt soweit?

Ja, genau so.

Wenn ja, dann liegt es schlichtweg daran, dass
Zeichenanforderungen Deiner Dialoge auch über den UI-Thread
abgewickelt werden. Der ist aber längere Zeit damit
beschäftigt, irgendwelche Sheets in Excel zu bearbeiten.
Also: Lange dauernde Aktivitäten in einen eigenen Thread
auslagern, damit der Haupt-UI-Thread weiter laufen kann und
Deine Anwendung weiterhin reagiert.

Also komme ich wohl um die Threads nicht herum. Ich hatte soetwas befürchtet…

Nochmals Danke!

Dirk.Pegasus

Nachtrag
Hallo Martin,

der Owner ist klasse, und ich schummel mich um den thread …

Immer wenn ich meinen „Progress“ ändere lasse ich auch die zugehörige Form und deren Owner Refesh() en. (Schreibt man das so …:wink:)

Ist zwar sicher nicht die performateste, aber es geht so leidlich.

mfg

Dirk.Pegasus

Hallo Martin,

der Owner ist klasse, und ich schummel mich um den thread …

Immer wenn ich meinen „Progress“ ändere lasse ich auch die
zugehörige Form und deren Owner Refesh() en. (Schreibt man das
so …:wink:)

Du kannst auch von Zeit zu Zeit ein Application.DoEvents(); einflechten. Ist zwar auch nicht ganz die feine Englische, aber gehen tut’s.

Ist zwar sicher nicht die performateste, aber es geht so
leidlich.

mfg

Dirk.Pegasus

Das mit dem Extra-Thread ist eigentlich wirklich nicht schwer und seit .NET 2.0 mit der BackgroundWorker -Klasse noch einfacher geworden.
Damit ist es ein Kinderspiel, arbeitsintensive Aufgaben in den Hintergrund zu verlagern und dennoch auf einfache Weise Statusupdates zu bekommen…

Hallo Martin,

nochmals Dank für den Tipp. 2.0 kommt die Tage, dann sehen wir weiter …

mfg

Dirk.Pegasus