Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeitet.. (https://www.delphipraxis.net/108776-%5Btjvdesktopalert%5D-sichtbar-erst-wenn-nichts-mehr-arbeitet.html)

calculon 19. Feb 2008 14:20


[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:
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;
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:

Delphi-Quellcode:
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;
Kann mir da jemand weiterhelfen?

Gruß

Calculon
--

calculon 20. Feb 2008 16:54

Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
 
Ich push' mal...

bluesbear 20. Feb 2008 17:27

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:

Desweiteren besitzt die Komponente das Ereignis OnShown
Du könntest das PostMessage alternativ auch in OnShown einbauen, wenn das alles nix hilft.

calculon 24. Feb 2008 23:04

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... http://www.cosgan.de/images/smilie/konfus/a050.gif

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
--

bluesbear 25. Feb 2008 18:37

Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
 
Zitat:

Zitat von calculon
Gibt's hierfür nicht eine anständige oder von mir aus auch eine Mega-Dirty-Lösung, die funktioniert?

Viel mehr als Dein Ergebnis reproduzieren konnte ich leider auch nicht. Selbst ein Sleep(2000) nach dem Execute sorgt dafür, daß die Meldung 2s später angezeigt wird. Ich verstehe das merkwürdige Verhalten von dem Ding nicht.
Vielleicht solltest Du was anderes nehmen? Ich bin beim suchen über das hier gestolpert:
http://www.delphipraxis.net/internal...=517040#517040

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:
JvDesktopAlert1.Execute;
for i := 0 to 100 do Application.ProcessMessages;
Sleep(2000);
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:

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?

calculon 25. Feb 2008 21:09

Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
 
Hi bluesbear,

erstmal danke für deine Mühen :thumb:

Zitat:

Zitat von bluesbear
[..] Ich verstehe das merkwürdige Verhalten von dem Ding nicht.
Vielleicht solltest Du was anderes nehmen? [..]

Würd' ich ja gerne, aber ich finde diese Komponente einfach zu totschick, um sie abzuschreiben.

Zitat:

Zitat von bluesbear
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?

Ich wollte, dass es läuft und folgende Feststellung (siehe erster Post) hatte ich ja schon gemacht:

Delphi-Quellcode:
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;
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 http://www.cosgan.de/images/smilie/konfus/a050.gif

Gruß

Calculon
--

bluesbear 25. Feb 2008 21:38

Re: [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeit
 
Zitat:

Zitat von calculon
erstmal danke für deine Mühen

Das ist wirklich eine sehr nette Komponente, und ich werde sie wahrscheinlich auch mal selber benutzen. Aber erst, wenn ich sie verstanden habe :stupid:
Zitat:

Also nur einen Timer zu setzen und nach dem Ablauf des Timer-Intervalls den nachfolgenden Code auszuführen, hatte bei mir auch nicht geholfen
Das Timerintervall muß natürlich länger sein als die Einblendzeit des DesktopAlerts, mit besser reichlich Reserve. Folgendes geht bei mir reproduzierbar:
Delphi-Quellcode:
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;
Der Timer ist auf 500ms eingestellt. Da hast Du eine halbe Sekunde Pause vor der Sprachausgabe, aber ich denke, das ist gut genug?

calculon 25. Feb 2008 21:55

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