Announcement

Collapse
No announcement yet.

Zeitgesteuerte MessageBox ???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeitgesteuerte MessageBox ???

    Hallo Entwickler!
    Ich benötige für mein Programm eine MessageBox, die sich nach einer vorgegebenen Zeit wieder automatisch schliesst. Gibt es eine Procedure/Funktion in Delphi 5 die dies ermöglicht?

    Gruß Andreas

  • #2
    Hi

    Versuch vor dem Aufruf einer normalen MessageBox() eine TTimer Komponente zu starten, z.b. 1000 ms. Im OnTimer Event schreibst Du

    <pre>

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    Wnd: hWnd;
    ClassName: String;
    begin
    <i>// deaktiviere Timer</i>
    Timer1.Enabled := False;
    <i>// hole das oberste Fenster unserer Anwendung</i>
    Wnd := GetLastActivePopup(Application.Handle);
    <i>// test ob fenster gültig und das es KEIN VCL-Control ist</i>
    if IsWindow(Wnd) and (FindControl(Wnd) = nil) then
    begin
    <i>// ermittle nun Fenster Klassennamen</i>
    SetLength(ClassName, 260);
    Setlength(ClassName, GetClassName(Wnd, PChar(ClassName), Length(ClassName)));
    <i>// Klassenamen für Standard Dialoge wie MessageBox();</i>
    if ClassName = '#32770' then
    <i>// schließe das Fenster</i>
    SendMessage(Wnd, wm_Close, 0, 0);
    end;
    end;<br>

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    <i>// aktiviere Timer zum Schließen der MsgBox</i>
    Timer1.Enabled := True;
    <i>//zeige MessageBox an, funktioniert auch mit Application.MessageBox</i>
    MessageBox(Handle, 'Test', 'Test', 0);
    <i>// deaktiviere Timer, WICHTIG !</i>
    Timer1.Enabled := False;
    end;

    </pre>

    Gruß hage

    Comment


    • #3
      Hallo Hagen Reddmann

      Danke für den Tipp. Ist genau was ich brauche.

      Frage noch dazu:
      Kann ich auch irgendwie den "OK" - Button noch wegbekommen?
      (Nicht unbedingt nötig aber wäre interessant.)

      Gruß Andreas Bergne

      Comment


      • #4
        Ähm, gute Frage ich meine aber das das nicht mit der API MessageBox() möglich ist. (ohne Tricks
        Ist ja auch logisch, vorrausgesetzt die MsgBox hat kein sysMenu und keine Fensterbutton, wie soll der Anwender das Ding dan schließen ?

        In Deinem Falle solltest Du Dir mit TForm eine eigene MsgBox() / InfoBox() basteln.

        Gruß hage

        Comment


        • #5
          Wie wäre es denn mit createMessageDlg?
          <code><br><pre>
          with CreateMessageDialog('Ich verschwinde ganz von alleine...', mtinformation,[]) do
          begin
          show;
          update;
          try
          sleep(5000);
          finally;
          release;
          end;
          end;
          </code></pre&gt

          Comment


          • #6
            Durch das Sleep(5000) wird der aufrufende Thread, im Normalfall die Anwendung, für 5 Sekunden UNBEDIENBAR. D.h. eine MessageBox mit Buttons wäre für den Anweder im Stillstand = Abgekackt !

            Fazit: die schlechteste Lösung.

            Gruß Hage

            Comment


            • #7
              Hallo,<br>
              ich dachte er möchte einfach eine Meldung ausgeben und dass keine Buttons vom Benutzer bedient werden sollen. Für sleep(5000) kann man dann auch ggf. eine andere Behandlung einfügen, z.B. eine Berechnung.
              Fazit: dann doch nicht so schlech

              Comment


              • #8
                Hi

                Um es deutlicher zu formulieren, das Sleep(5000) blockiert die Anwendung für volle 5 Sekunden VOLLSTÄNDIG. Es werden keine Messages mehr bearbeitet, die Anwendung ist nicht mehr aktivierbar/deaktivierbar, die Anwendung zeichnet sich NICHT neu, und noch viel schlimmer die Shell glaubt zu meinen das die Anwendung nicht mehr reagiert. Ich als User gehe dann in die Taskliste und schmeiß die Anwendung raus. Und das alles wegen des einen Sleep().

                Gruß Hage

                Comment


                • #9
                  Hallo Hagen, Hallo Axel

                  Ich werde auf jeden Fall mal beide möglichkeiten ausprobieren.
                  Was passiert eigentlich bei dem Befehl "Sleep()" genau? Wartet die Anwendung dann genau an der programmierten Stelle oder wird die laufende procedure noch fertig bearbeitet?
                  Ich benötige bei einer Schnittstellenabfrage eine Zeitverzögerung, habe jedoch keine vernünftige Komponente gefunden die das realisiert. Deshalb hab ich eine art AWL geschrieben die von einem Timer alle 200ms bearbeitet und immer um eine Zeile (Befehl) weiter getaktet wird.

                  Gruß Andrea

                  Comment


                  • #10
                    Hi

                    Sleep(x) kehrt erst nach X Millisekunden zum aufrufer zurück. Wie oben beschrieben, sollange Sleep() NICHT zurückkehrt ist die Anwendung blokiert, es wird keinerlei Code der Anwendung während Sleep() mehr ausgeführt. Alles setzt vorraus das Sleep() im primären = Main-Thread der Anwendung aufgerufen wird.

                    Grundsätzlich, Sleep(x) läßt den aufrufenden Thread für X Millisekunden stoppen.

                    Gruß Hage

                    Comment


                    • #11
                      Ähm wenn ich mal was sagen darf mittels APPLICATION.PROCESSMESSAGES wird das Programm fortgesetzt und nicht angehalten. Meiner Meinung nach oder funktioniert das hier nicht?

                      Gruss,

                      Ing

                      Comment

                      Working...
                      X