AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi [TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeitet..
Thema durchsuchen
Ansicht
Themen-Optionen

[TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeitet..

Ein Thema von calculon · begonnen am 19. Feb 2008 · letzter Beitrag vom 25. Feb 2008
Antwort Antwort
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#1

[TJvDesktopAlert] Sichtbar erst, wenn nichts mehr arbeitet..

  Alt 19. Feb 2008, 13:20
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 , 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
--
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#2

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

  Alt 20. Feb 2008, 15:54
Ich push' mal...
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#3

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

  Alt 20. Feb 2008, 16:27
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.
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#4

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

  Alt 24. Feb 2008, 22:04
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 aber zum ersten mal nach unzähligen Versuchen klappt's wenigstens mal...
[/edit]

Gruß

Calculon
--
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 25. Feb 2008, 17:37
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
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.

EDIT2: Das obige Experiment liefert lustige, nichtreproduzierbare Phänomene
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?
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#6

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

  Alt 25. Feb 2008, 20:09
Hi bluesbear,

erstmal danke für deine Mühen

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 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
--
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#7

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

  Alt 25. Feb 2008, 20:38
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
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?
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#8

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

  Alt 25. Feb 2008, 20:55
Des passt jetzt so! Danke nochmals für deine Hilfe

Gruß

Calculon
--
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz