messagebox / showmessage mit timeout ?

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

messagebox / showmessage mit timeout ?

Beitrag von wbeppler »

hi,

ich suche so was wie

showmessage(messagetext, timeout_in_ms)

gibt es so was ? (ja, ich weiss, ich kann mir so was proggen, will ich aber nicht wenns das ferig schon gibt)
gruss und dank
w. :-)

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: messagebox / showmessage mit timeout ?

Beitrag von Scotty »

Meines Wissens nach gibt es keinen TimeoutDialog. Vermutlich würden die meisten Experten so etwas auch als schlechtes Design bewerten. In meinem Fall brauche ich es jedoch für das Netzwerk: Die Teilnehmer an einem Spiel werden um Zustimmung gefragt, wollen aber nicht auf ewig geblockt werden, wenn jemand nicht reagiert. Ganz trivial ist die Sache auch wieder nicht, weil während einer Timeout-Abfrage weitere hinterher kommen können. Außerdem brauchst du ein Feedback für den Anwender. Und du solltest den Zustand der gesamten Anwendung beachten.

Code: Alles auswählen

var
  aDialog1,aDialog2:TForm;
 
function TimeoutMsg(const aMessage: string; const aTimeOut: word): TModalResult;
var
  aStart,aPast: longword;
  aBitmap: TCustomBitmap;
  x: integer;
  pDialog: ^TForm;
begin
  //close old dialog if a new one is opened
  if assigned(aDialog1) then
  begin
    aDialog1.ModalResult:=mrCancel;
    aDialog1.Hide;
    aDialog1:=nil;
    pDialog:=addr(aDialog2);
  end else
  begin
    if assigned(aDialog2) then
    begin
      aDialog2.ModalResult:=mrCancel;
      aDialog2.Hide;
      aDialog2:=nil;
    end;
    pDialog:=addr(aDialog1);
  end;
 
  //just cancel dlg
  if aTimeOut=0 then
    exit;
 
  pDialog^:=CreateMessageDialog(aMessage,mtConfirmation,[mbYes,mbNo]);
  with pDialog^ do
  try
    FormStyle:=fsStayOnTop;
    Position:=poMainFormCenter;
    Show;//not modal
    aStart:=GetTickCount;
    aBitmap:=GetDialogIcon(idDialogConfirm);
    aBitmap.Canvas.Brush.Style:=bsSolid;
    aBitmap.Canvas.Pen.Style:=psClear;
    aBitmap.Canvas.Brush.Color:=clBtnFace;
    x:=0;
    repeat
      aPast:=(GetTickCount-aStart) div 1000;
      if (aPast>0) and (aPast<>x) then
      begin
        Canvas.Brush.Color:=clGreen;
        Canvas.FillRect(Bounds(0,0,round(Width*aPast/aTimeOut),2));
        if aTimeOut-aPast<10 then
          Caption:=Language.Plural(rPoll_TimeOut,aTimeOut-aPast);
        x:=aPast;
      end;
      Enabled:=ModalResult<>mrCancel;
      try
        sleep(1);
        Application.ProcessMessages;
      except
        raise;
      end;
      if Application.Terminated then
        ModalResult:=mrCancel;
      if ModalResult<>mrNone then
        break;
      if (aPast>=aTimeOut) then
        ModalResult:=mrTimeout;
    until (ModalResult<>mrNone) or (Visible=false);
    Result:=ModalResult;
  finally
    aBitmap.Free;
    Free;
    pDialog^:=nil;
  end;
end;
 
...
if TimeoutMsg('Hello World',30)=mrYes then...
 

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: messagebox / showmessage mit timeout ?

Beitrag von wbeppler »

hi scotty,

suuuperdanke. ich werds zwar bissele umbauen aber hab eben grad einiges gelernt (modalresult und so....)
bei mir ist so, personen stempeln an ner zeiterfassung an (mit ihrem ausweis der ein primitiver barcode ist), nun gibt es spassvoegel die nehmen nen tetrapack und halten den barcode drunter. nun soll ne meldung kommen "ausweis unbekannt" und die soll nach 5 sekunden wieder weg gehen. so war das in meiner anwendung die ich vor 17 jahren in ms-visual-fox-pro geschrieben habe. nun will der kunde ein update und ich bin auf lazarus umgestiegen. vieles ist aehnlich, einiges ist besser, manches fehlt.


kirk an enterprice: "danke scotty"

gruss

w

ps: habe mal paar jahre an "scott-e" mitgearbeitete, siehe: www.electricsports.de , der name war wegen dem "beam me up"

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: messagebox / showmessage mit timeout ?

Beitrag von Scotty »

Dialogboxen sind einfach keine adäquaten Steuerelemente für Feedback. Ich würde einen statischen Text im Dialog empfehlen, vielleicht noch rot oder fett. Und der kann dann leicht nach einer Zeitspanne entfernt werden.

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: messagebox / showmessage mit timeout ?

Beitrag von wbeppler »

... so wer dich es wohl machen....

aber ob das ein adequates element ist oder nicht, die letzten 15 jahre waren alle zufrieden damit. ich versuch da so wenig wie moeglich zu andern. ich halte wenig davon die selben sachen wie sie immer funktioniert haben und sie jeder kennt, nun ganz anders zu machen, um alle user um viel zeit zu bringen ohne jeglichen nutzen.
was ich damit sagen will, ich versuch das gleich nachzubauen

die bisherige anwendung hatte eigentlich nur den fehler alles in DBF zu halten und das ist entweder fuer die stempeluhl lokal und schnell oder fuer die Adminseite lokal und schnell. ich hatte nach 5 jahren mal nachgebessert und die tabellen teils auf der stempeluhr, teils auf dem admin-pc abzulegen, doch client-server-loesung ist hier halt wesentlich besser

und weil der fox tot gesagt ist.....

aber danke fuer die tips, ich baus schon ein...

gruss

w

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: messagebox / showmessage mit timeout ?

Beitrag von ruewa »

wbeppler hat geschrieben:ich suche so was wie

showmessage(messagetext, timeout_in_ms)

gibt es so was ?


Hallo Wolfgang,

denk nicht so kompliziert! Die Sache ist viel einfacher:

Du erstellst eine eigene Form für Dein Message-Fenster. Da kommt ein TTimer drauf, dann Dein Text, Überschrift, Bildchen, was weiß ich. Angenommen, Du nennst die Form "TimedMsgForm", dann sieht die entsprechende Unit so aus:

Code: Alles auswählen

...
 
type
 
  { TTimedMsgForm }
 
  TTimedMsgForm = class(TForm)
    Timer1 : TTimer;
    procedure FormActivate(Sender : TObject);
    procedure Timer1Timer(Sender : TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  TimedMsgForm : TTimedMsgForm;
 
implementation
 
{$R *.lfm}
 
{ TTimedMsgForm }
 
procedure TTimedMsgForm.FormActivate(Sender : TObject);
begin
  Timer1.Enabled := true;
  Timer1.Interval := 5000;
end;
 
procedure TTimedMsgForm.Timer1Timer(Sender : TObject);
begin
  Timer1.Enabled := false;
  Close;
end;
 
end.

Also ganz primitiv: In TimedMsgForm.OnActivate startest Du den Timer mit sagen wir 5 Sekunden Intervall, und wenn er (via Timer1.OnTimer) triggert, schaltest Du den Timer ab und schließt die Form. Aus Deinem Hauptprogramm startest Du das Ganze mit

Code: Alles auswählen

  TimedMsgForm.ShowModal


Das war's schon. Grade mal 5 Zeilen zum Selberschreiben...

Gruß Rüdiger

wbeppler
Beiträge: 131
Registriert: So 20. Jul 2014, 10:27
OS, Lazarus, FPC: kubuntu, raspbian, laz 1.2 / 0.9 microcontroller
CPU-Target: 8-64 bit
Wohnort: bodensee
Kontaktdaten:

Re: messagebox / showmessage mit timeout ?

Beitrag von wbeppler »

jetzt bin ich froh, dass ich mit dem hund gassi war :-)

ich haette ja sonst....

gruss und dank

Antworten