Mit diesem Tool visualisieren Sie ganz einfach Ihre Besprechungszeiten oder stellen die Restdauer einer Workshop-Aufgabe dar. In diesem Artikel erfahren Sie, wie der Workshop Timer erstellt wurde und wie Sie ihn weiterentwickeln können.
Der Workshop Timer entstand, um Rede- und Aufgabezeiten für Workshop-Teilnehmer an einem Beamer anzuzeigen. Er lässt sich aber hervorragend auch für die Visualisierung einer Besprechungsdauer verwenden. Schauen Sie sich am besten den Artikel Besprechungszeit visualisieren an. Hier erfahren Sie auch die Funktionsweise der Anwendung.
Aufbau
Die Software wurde mit Lazarus entwickelt. Das Projekt besteht aus den beiden Formularen in main.pas und durationform.pas und der Standard-Projektdatei wstimer.lpr.
Auf dem Hauptformular MainForm in main.pas befinden sich nur wenige Komponenten: 2 Timer, ein Popup-Menü und eine zugehörige Imagelist. Der Rest passiert im Quellcode von main.pas. Im Formular DurationSetupForm sind die Einstellmöglichkeiten hinterlegt. Das reicht von der Countdown Dauer, über die Farbwechselzeitpunkte bis zu den Besprechungskosten.
Zeichnen des Kreises
Die Hauptaufgabe des Tools ist die Visualisierung der restlichen Zeitdauer. Das passiert über ein Kuchendiagramm, dass immer kleiner wird.
Das Zeichnen erfolgt, gesteuert über einen Timer, im Intervall von einer Sekunde in der Prozedur PaintPie.
Da das Formular eine freie Größenänderung zulässt, muss aus der aktuellen Höhe und Breite die richtige Größe des Kreises bestimmt werden. Dieser soll quadratisch sein.
//Quadratische Größe wählen if MainForm.ClientWidth>MainForm.ClientHeight then R:=Rect(0,0,MainForm.ClientHeight,MainForm.ClientHeight) else R:=Rect(0,0,MainForm.ClientWidth,MainForm.ClientWidth);
Um flackern zu vermeiden, wird alles erst auf eine temporäre Bitmap gezeichnet und am Ende auf die Zeichenfläche des Formulars kopiert.
Bitmap:=TBitmap.Create; Bitmap.Width:=R.Width; Bitmap.Height:=R.Height; with Bitmap.Canvas do begin //Hintergrund löschen Brush.Color:=MainForm.Color; FillRect(ClipRect); Pen.Style:=psClear; Brush.Color:=MainForm.Color; Ellipse(R.Left,R.Top,R.Right,R.Bottom); if CirclePosition>0 then begin //aktuelle Position zeichnen P1:=AnglePosition(R,0,Duration,0); P2:=AnglePosition(R,0,Duration,CirclePosition); Brush.Color:=CircleColor; Pie(R.Left,R.Top,R.Right,R.Bottom,P2.X,P2.Y,P1.X,P1.Y); //Inneren Kreis zeichnen Brush.Color:=MainForm.Color; Ellipse( R.Left+(100-InnerSize)*(R.Right-R.Left) div 200, R.Top+(100-InnerSize)*(R.Bottom-R.Top) div 200, R.Right-(100-InnerSize)*(R.Right-R.Left) div 200, R.Bottom-(100-InnerSize)*(R.Bottom-R.Top) div 200); end; //Beschriftung anzeigen if Tick>Duration then s:='+'+SecondsToTimeStr(Tick-Duration) else s:=SecondsToTimeStr(Duration-Tick);
Für eine klare Schrift wird im Fenstermodus das Antialiasing der Texte eingeschaltet. Im transparenten Modus stört es und wird ausgeschaltet.
if MenuItemMakeTransparent.Checked=true then Font.Quality:=fqNonAntialiased else Font.Quality:=fqAntialiased; Font.Size:=Round(R.Width/9); Font.Style:=[fsBold]; Font.Color:=CircleColor; Brush.Style:=bsClear; y:=Round((R.Top+(R.Bottom-R.Top-TextHeight(s)) div 2)*0.97); TextOut(R.Left+(R.Right-R.Left-TextWidth(s)) div 2,y,s); y:=y+TextHeight(s); if ShowCosts=true then begin s:=FormatFloat('0.00',Persons*CostPerHour/3600*Tick)+' €'; Font.Size:=Round(R.Width/22); Font.Style:=[]; TextOut(R.Left+(R.Right-R.Left-TextWidth(s)) div 2,y,s); end; //Buffer kopieren auf Formular SetStretchBltMode(Handle,COLORONCOLOR); SetBrushOrgEx(Handle,0,0,nil); MainForm.Canvas.CopyRect(Rect( (MainForm.ClientWidth-Bitmap.Width) div 2, (MainForm.ClientHeight-Bitmap.Height) div 2, (MainForm.ClientWidth-Bitmap.Width) div 2+Bitmap.Width, (MainForm.ClientHeight-Bitmap.Height) div 2+Bitmap.Height), Bitmap.Canvas,Rect(0,0,Bitmap.Width,Bitmap.Height)); end; Bitmap.Free;
Farbanpassungen
Bei jedem Timer-Ereignis wird geprüft, ob ein Farbwechsel erforderlich ist. Die Werte wann kommen über die Einstellungen in den entsprechenden Variablen.
procedure TMainForm.StartValues; begin Tick:=0; //Start bei 0 Sekunden CircleColor:=$00E2A366; //Blau //Umrechnen des Startpunkts für Orange und Rot in Sekunden StartOrange:=Round(Duration*(100-PercentOrange)/100); StartRed:=Round(Duration*(100-PercentRed)/100); end;
Im Timer-Ereignis wird sekündlich die Zeit gezählt und geprüft, ob die Enddauer schon abgelaufen ist oder ein Farbwechsel erfolgen muss. Ist die Enddauer erreicht, wird ein zweiter Timer aktiviert. Er ist auch für den Blink-Effekt verantwortlich.
procedure TMainForm.Timer1Timer(Sender: TObject); begin //Timer Tick:=Tick+1; //+1 Sekunde if Tick>=Duration then begin Timer1.Enabled:=false; Timer2.Enabled:=true; end; if Tick=StartOrange then CircleColor:=$00409FFF; //orange Phase hat begonnen if Tick=StartRed then CircleColor:=clRed; //rote Phase hat begonnen //Position des Kreises umrechnen CirclePosition:=Duration-Tick; //Kreis zeichnen PaintPie; end;
Transparenz
Um Fenster unter Windows transparent erscheinen zu lassen, müssen die Layer-Attribute entsprechend eingestellt werden. Zur Vereinfachung können Sie diese Prozedur verwenden.
procedure SetTransparentMode(hWnd: Longint; Color: Longint; nTrans: Integer;flag : integer); begin //Formular Transparenz ein- oder ausschalten SetWindowLongA(hWnd,GWL_EXSTYLE,GetWindowLongA(hWnd,GWL_EXSTYLE) Or WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd,Color,nTrans,flag); end;
Mit dem Aufruf SetTransparentMode(MainForm.Handle,MainForm.Color,0,1) schalten Sie die Transparent für die Farbe MainForm.Color ein.
Zum Ausschalten verwenden Sie SetTransparentMode(MainForm.Handle,clNone,255,0).
Fenster verschieben ohne Titelleiste
Um dem Benutzer, auch im transparenten Zustand, die Möglichkeit zu geben das Formular zu verschieben, benötigen Sie das MouseMove-Ereignis des Formulars:
procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin //Beim Anklicken des Formulars mit linker Maustaste das Fenster verschieben if (ssLeft in Shift) then begin ReleaseCapture; SendMessage(Self.Handle,WM_SYSCOMMAND,SC_MOVE+1,0); end; end;
Download
Jetzt wird es für Sie Zeit und Ihre Erweiterungen.
Die Workshop Timer Anwendung und den Lazarus Quellcode können Sie aus meiner Dropbox herunterladen.
Hier erfahren Sie, wie Sie Lazarus installieren.
Pingback: Besprechungszeit visualisieren – Mein Techblog
Pingback: Schnelle Ideen in Workshops – Mein Techblog
Pingback: Workshop-Timer Sprachausgabe Upgrade – Mein Techblog
Pingback: Schnelle Ideen in Workshops – Tech+Code
Pingback: Besprechungszeit visualisieren – Tech+Code
Pingback: Workshop-Timer Sprachausgabe Upgrade – Tech+Code
Pingback: Schnelle Ideen in Workshops – Tech+Code
Pingback: Besprechungszeit visualisieren - Tech+Code
Pingback: Komponente TPieProgress - Tech+Code