![]() |
[TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeitet..
Hallo,
ich habe gerade folgendes Problem: Wenn ich beispielsweise einen TJvDesktopAlert (JVCL) ausführe und danach irgendwelche weiteren Rechnungen stattfinden, der DesktopAlert erst ganz zum Schluss aufgezeigt wird:
Delphi-Quellcode:
Was ich schon probiert habe: application.processmessages, sogar die Rechnungen in einen Thread auszulagern hat nichts gebracht :shock:, wobei beim echten Programm mit der Speech-API hantiert wird und nicht mit zwei Schliefen (sollte nur als Beispiel gelten). Desweiteren besitzt die Komponente das Ereignis OnShown:
procedure TForm12.Button1Click(Sender: TObject);
var i, j: integer; c: integer; begin JvDesktopAlert1.Execute; // danach folgt irgendeine längere Rechnung c := 0; for i := 0 to 10000000 do for j := 0 to 10000000 do c := i + j; // sichtbar wird das Alarm-Fenster erst hier end;
Delphi-Quellcode:
Kann mir da jemand weiterhelfen?
procedure TForm12.Alert1Shown(Sender: TObject);
begin // wenn ich hier ShowMessage('irgendwas'); einfüge, dann wird // das Alarm-Fenster sofort sichtbar; dummerweise nicht nur die... end; Gruß Calculon -- |
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Ich push' mal...
|
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Probier mal das hier, vielleicht klappt das ja:
Delphi-Quellcode:
procedure TForm12.Button1Click(Sender: TObject);
var i, j: integer; c: integer; begin JvDesktopAlert1.Execute; PostMessage(Handle, wm_User+11, 0, 0); // irgendeine eigene Message halt end; // Der Handler für wm_User+11 procedure TForm12.wmUserPlusElf(...) begin // danach folgt irgendeine längere Rechnung c := 0; for i := 0 to 10000000 do for j := 0 to 10000000 do c := i + j; end; Zitat:
|
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Hi nochmals,
sorry, dass ich erst jetzt schreibe, aber ich hab' erst heute deine Ideen ausprobiert. Hat leider für beide Fälle (weder im OnShown noch im direkten Anschluss) nicht funktioniert. Das DesktopAlert-Fenster wird immer erst zum Schluss angezeigt. Ich hab' in der Zwischenzeit auch probiert JvDesktopAlert1.Execute im Synchronize eines Threads aufzurufen und auch hier wurde das Fenster erst zum Schluss angezeigt... ![]() Gibt's hierfür nicht eine anständige oder von mir aus auch eine Mega-Dirty-Lösung, die funktioniert? [edit] Okay, hab' 'ne eigene Mega-Dirty-Lösung gefunden: Ich hab' eine dummy-Form hinzugefügt; deren AlphaBlend-Wert auf 0 gestellt; im Onshown des TJvDesktopAlerts einen Timer aktiviert und dummy.showmodal aufgerufen; wenn Timer-Intervall erreicht wurde, wird dummy.close ausgeführt und timer wieder disabled; zwar :wall: aber zum ersten mal nach unzähligen Versuchen klappt's wenigstens mal... [/edit] Gruß Calculon -- |
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Zitat:
Vielleicht solltest Du was anderes nehmen? Ich bin beim suchen über das hier gestolpert: ![]() EDIT: Ich Hirsch, Sleep blockiert scheinbar. Das kommt davon, wenn man sowas nie benutzt :oops: Ich hab da einfach mal ganz naiv weiter rumprobiert, und festgestellt:
Delphi-Quellcode:
Damit erscheint der DesktopAlert sofort. Das ist natürlich auch ein Workaround mit Risiken und Nebenwirkungen, den ich persönlich nur ungern einsetzen würde. :gruebel:
JvDesktopAlert1.Execute;
for i := 0 to 100 do Application.ProcessMessages; Sleep(2000); EDIT2: Das obige Experiment liefert lustige, nichtreproduzierbare Phänomene :mrgreen: Aber das Rätsel ist gelöst: Die Komponente benutzt Einblend-Effekte (TJvAlertStyle) und verwendet dafür einen Timer (die Zeiten kann man in Properties einstellen). Deine Idee, auch einen Timer zu verwenden, um abzuwarten, bis der DesktopAlert komplett sichtbar ist, ist also gar nicht so abwegig. Aber wieso benutzt Du dafür ein unsichtbares Form? |
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Hi bluesbear,
erstmal danke für deine Mühen :thumb: Zitat:
Zitat:
Delphi-Quellcode:
Also dachte ich, wenn ich statt ShowMessage ein modales unsichtbares Fenster anzeige, dann funktioniert das auch - was es auch tut: Der nachfolgende Code wird erst ausgeführt, wenn das modale Fenster nach dem Timer-Intervall geschlossen wird. Was wäre denn deine Idee? Also nur einen Timer zu setzen und nach dem Ablauf des Timer-Intervalls den nachfolgenden Code auszuführen, hatte bei mir auch nicht geholfen
procedure TForm12.Alert1Shown(Sender: TObject);
begin // wenn ich hier ShowMessage('irgendwas'); einfüge, dann wird // das Alarm-Fenster sofort sichtbar; dummerweise nicht nur die... end; ![]() Gruß Calculon -- |
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Zitat:
Zitat:
Delphi-Quellcode:
Der Timer ist auf 500ms eingestellt. Da hast Du eine halbe Sekunde Pause vor der Sprachausgabe, aber ich denke, das ist gut genug?
begin // Schnellstes einblenden wo einstellbar (ich mag das badische 'wo' <g>)
JvDesktopAlert1.StartInterval := 1; JvDesktopAlert1.StartSteps := 1; JvDesktopAlert1.EndInterval := 1; JvDesktopAlert1.EndSteps := 1; JvDesktopAlert1.Execute; Timer1.Enabled := True; end; procedure TForm12.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; ShowMessage('Jetzt aber!'); end; |
Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
Des passt jetzt so! Danke nochmals für deine Hilfe :)
Gruß Calculon -- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz