Besprechungs- und Workshop Timer

Sie betrachten gerade Besprechungs- und Workshop Timer

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.

wt_lz_projekt
Projektelemente in Lazarus

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.

Formulare
Formulare: MainForm und DurationSetupForm

 

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.

symbol_download

  Die Workshop Timer Anwendung und den Lazarus Quellcode können Sie aus meiner Dropbox herunterladen.

Hier erfahren Sie, wie Sie Lazarus installieren.

Dieser Beitrag hat 9 Kommentare

Kommentar verfassen