messagebox / showmessage mit timeout ?
-
- 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 ?
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.
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.
-
- 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 ?
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...
-
- 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 ?
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"
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"
-
- 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 ?
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.
-
- 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 ?
... 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
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
Re: messagebox / showmessage mit timeout ?
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
-
- 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 ?
jetzt bin ich froh, dass ich mit dem hund gassi war
ich haette ja sonst....
gruss und dank
ich haette ja sonst....
gruss und dank