Subversion Repositories delphiutils

Rev

Rev 79 | Rev 81 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit ZeiterfassungMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, DB, ADODB, Grids, Wwdbigrd, Wwdbgrid, ExtCtrls, DBCtrls, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ADOConnection1: TADOConnection;
  12.     wwDBGrid1: TwwDBGrid;
  13.     ADOTable1: TADOTable;
  14.     DataSource1: TDataSource;
  15.     ADOTable1TAG: TWideStringField;
  16.     ADOTable1KOMMEN: TWideStringField;
  17.     ADOTable1PAUSE_START: TWideStringField;
  18.     ADOTable1PAUSE_ENDE: TWideStringField;
  19.     ADOTable1GEHEN: TWideStringField;
  20.     ADOTable1SONSTIGER_ABZUG: TWideStringField;
  21.     ADOTable1ZUHAUSE: TWideStringField;
  22.     ADOTable1BERSTUNDEN_SALDO: TIntegerField;
  23.     ADOTable1BERSTUNDEN: TIntegerField;
  24.     ADOTable1FREIER_TAG: TBooleanField;
  25.     Panel1: TPanel;
  26.     Button1: TButton;
  27.     DBNavigator1: TDBNavigator;
  28.     ADOTable1WOCHENTAG: TStringField;
  29.     ADOTable1USERNAME: TStringField;
  30.     ComboBox1: TComboBox;
  31.     Label1: TLabel;
  32.     Label2: TLabel;
  33.     ADOTable1BEMERKUNG: TStringField;
  34.     procedure ADOTable1NewRecord(DataSet: TDataSet);
  35.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  36.     procedure ADOTable1BeforePost(DataSet: TDataSet);
  37.     procedure ADOTable1BERSTUNDEN_SALDOGetText(Sender: TField; var Text: string;
  38.       DisplayText: Boolean);
  39.     procedure ADOTable1BERSTUNDENGetText(Sender: TField; var Text: string;
  40.       DisplayText: Boolean);
  41.     procedure wwDBGrid1CalcCellColors(Sender: TObject; Field: TField;
  42.       State: TGridDrawState; Highlight: Boolean; AFont: TFont; ABrush: TBrush);
  43.     procedure ADOTable1AfterPost(DataSet: TDataSet);
  44.     procedure Button1Click(Sender: TObject);
  45.     procedure ADOTable1TAGChange(Sender: TField);
  46.     procedure ADOTable1SONSTIGER_ABZUGSetText(Sender: TField;
  47.       const Text: string);
  48.     procedure ADOTable1ZUHAUSESetText(Sender: TField; const Text: string);
  49.     procedure ADOTable1GEHENSetText(Sender: TField; const Text: string);
  50.     procedure ADOTable1PAUSE_ENDESetText(Sender: TField; const Text: string);
  51.     procedure ADOTable1PAUSE_STARTSetText(Sender: TField; const Text: string);
  52.     procedure ADOTable1KOMMENSetText(Sender: TField; const Text: string);
  53.     procedure FormShow(Sender: TObject);
  54.     procedure ADOTable1WOCHENTAGGetText(Sender: TField; var Text: string;
  55.       DisplayText: Boolean);
  56.     procedure ComboBox1Change(Sender: TObject);
  57.     procedure ADOTable1TAGSetText(Sender: TField; const Text: string);
  58.     procedure ADOTable1AfterDelete(DataSet: TDataSet);
  59.     procedure ADOTable1TAGGetText(Sender: TField; var Text: string;
  60.       DisplayText: Boolean);
  61.     procedure ADOTable1KOMMENGetText(Sender: TField; var Text: string;
  62.       DisplayText: Boolean);
  63.     procedure ADOTable1PAUSE_STARTGetText(Sender: TField; var Text: string;
  64.       DisplayText: Boolean);
  65.     procedure ADOTable1PAUSE_ENDEGetText(Sender: TField; var Text: string;
  66.       DisplayText: Boolean);
  67.     procedure ADOTable1GEHENGetText(Sender: TField; var Text: string;
  68.       DisplayText: Boolean);
  69.     procedure ADOTable1SONSTIGER_ABZUGGetText(Sender: TField; var Text: string;
  70.       DisplayText: Boolean);
  71.     procedure ADOTable1ZUHAUSEGetText(Sender: TField; var Text: string;
  72.       DisplayText: Boolean);
  73.   private
  74.     function GueltigeZeile: boolean;
  75.   protected
  76.     procedure ReorgDataSet;
  77.     procedure ReorgAll;
  78.     function RegelArbeitszeit: integer;
  79.   end;
  80.  
  81. var
  82.   Form1: TForm1;
  83.  
  84. implementation
  85.  
  86. {$R *.dfm}
  87.  
  88. // TODO: Trennstriche zwischen Wochen oder zwischen Urlauben
  89. // IDEE: Wochenend-Multiplikator
  90. // IDEE: Manche Tage nicht mitrechnen
  91.  
  92. uses
  93.   DateUtils, StrUtils, IniFiles;
  94.  
  95. {$REGION 'Hilfsfunktionen'}
  96.  
  97. function SQL_Escape(const s: string): string;
  98. begin
  99.   result := StringReplace(s, '''', '\''', [rfReplaceAll]);
  100. end;
  101.  
  102. function IstLeer(f: TField): boolean;
  103. begin
  104.   result := f.IsNull or (f.AsString = '') or (f.AsString = '00:00:00');
  105. end;
  106.  
  107. function Minuten(f: TField): integer;
  108. begin
  109.   if IstLeer(f) then
  110.   begin
  111.     result := 0;
  112.   end
  113.   else
  114.   begin
  115.     result := MinuteOfTheDay(f.AsDateTime);
  116.   end;
  117. end;
  118.  
  119. function MinutenZuHF_Int(min: integer): string;
  120. var
  121.   d: integer;
  122. begin
  123.   d := min;
  124.   if d < 0 then
  125.   begin
  126.     result := '-';
  127.     d := -d;
  128.   end
  129.   else
  130.   begin
  131.     result := '';
  132.   end;
  133.   result := result + Format('%.2d:%.2d', [d div 60, d mod 60]);
  134. end;
  135.  
  136. function MinutenZuHF(f: TField): string;
  137. begin
  138.   if IstLeer(f) then
  139.   begin
  140.     result := '';
  141.   end
  142.   else
  143.   begin
  144.     result := MinutenZuHF_Int(f.AsInteger);
  145.   end;
  146. end;
  147.  
  148. function EchtesDatum(f: TField): TDate;
  149. begin
  150.   if Copy(f.AsString, 5, 1) = '-' then
  151.   begin
  152.     result := EncodeDate(
  153.     StrtoInt(Copy(f.AsString, 1, 4)),
  154.     StrtoInt(Copy(f.AsString, 6, 2)),
  155.     StrtoInt(Copy(f.AsString, 9, 2))
  156.     );
  157.   end
  158.   else
  159.     result := StrToDate(f.AsString);
  160. end;
  161.  
  162. function WUserName: String;
  163. var
  164.   nSize: DWord;
  165. begin
  166.   nSize := 1024;
  167.   SetLength(Result, nSize);
  168.   if GetUserName(PChar(Result), nSize) then
  169.     SetLength(Result, nSize-1)
  170.   else
  171.     RaiseLastOSError;
  172. end;
  173.  
  174. {$ENDREGION}
  175.  
  176. function TForm1.RegelArbeitszeit: integer;
  177. var
  178.   test: TADOQuery;
  179. begin
  180.   test := TADOQuery.Create(nil);
  181.   try
  182.     test.Connection := ADOConnection1;
  183.     test.Close;
  184.     test.SQL.Text := 'select MINUTEN from REGELARBEITSZEIT where USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  185.     test.Open;
  186.     if test.RecordCount = 0 then
  187.     begin
  188.       result := 8 * 60;
  189.     end
  190.     else
  191.     begin
  192.       result := test.FieldByName('MINUTEN').AsInteger;
  193.     end;
  194.   finally
  195.     test.Free;
  196.   end;
  197. end;
  198.  
  199. procedure TForm1.ReorgAll;
  200. var
  201.   saldo: integer;
  202.   baks: string;
  203.   bakEv: TDataSetNotifyEvent;
  204.   dead: boolean;
  205. begin
  206.   if ADOTable1TAG.IsNull then
  207.   begin
  208.     baks := '';
  209.   end
  210.   else
  211.   begin
  212.     if Copy(ADOTable1TAG.AsString, 5, 1) = '-' then
  213.       baks := ADOTable1TAG.AsString
  214.     else
  215.       DateTimeToString(baks, 'YYYY-MM-DD', ADOTable1TAG.AsDateTime);
  216.   end;
  217.   ADOTable1.Requery();
  218.  
  219.   bakEv := ADOTable1.AfterPost;
  220.   ADOTable1.AfterPost := nil;
  221.   ADOTable1.DisableControls;
  222.   try
  223.     ADOTable1.First;
  224.     saldo := 0;
  225.     dead := false;
  226.     while not ADOTable1.Eof do
  227.     begin
  228.       ADOTable1.Edit;
  229.       if not dead then ReorgDataSet;
  230.       dead := dead or ADOTable1BERSTUNDEN.IsNull;
  231.       if dead then
  232.       begin
  233.         ADOTable1BERSTUNDEN_SALDO.Clear;
  234.       end
  235.       else
  236.       begin
  237.         saldo := saldo + ADOTable1BERSTUNDEN.AsInteger;
  238.         ADOTable1BERSTUNDEN_SALDO.AsInteger := saldo;
  239.         saldo := ADOTable1BERSTUNDEN_SALDO.AsInteger;
  240.       end;
  241.       ADOTable1.Post;
  242.       ADOTable1.Next;
  243.     end;
  244.   finally
  245.     if baks <> '' then ADOTable1.Locate('USERNAME;TAG', VarArrayOf([WUserName, baks]), []);
  246.     ADOTable1.AfterPost := bakEv;
  247.     ADOTable1.EnableControls;
  248.   end;
  249. end;
  250.  
  251. procedure TForm1.ADOTable1AfterDelete(DataSet: TDataSet);
  252. begin
  253.   ReorgAll;
  254. end;
  255.  
  256. procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
  257. begin
  258.   ReorgAll;
  259. end;
  260.  
  261. function TForm1.GueltigeZeile: boolean;
  262. begin
  263.   result := false;
  264.  
  265.   if IstLeer(ADOTable1KOMMEN) <> IstLeer(ADOTable1GEHEN) then exit;
  266.   if IstLeer(ADOTable1PAUSE_START) <> IstLeer(ADOTable1PAUSE_ENDE) then exit;
  267.   if not IstLeer(ADOTable1PAUSE_START) and (ADOTable1PAUSE_START.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit;
  268.   if not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1PAUSE_ENDE.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit;
  269.   if not IstLeer(ADOTable1GEHEN) and (ADOTable1GEHEN.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit;
  270.   if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_START) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit;
  271.   if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_ENDE.AsDateTime) then exit;
  272.  
  273.   result := true;
  274. end;
  275.  
  276. procedure TForm1.ReorgDataSet;
  277. var
  278.   m: integer;
  279. begin
  280.   if GueltigeZeile then
  281.   begin
  282.     m :=   (Minuten(ADOTable1GEHEN) - Minuten(ADOTable1KOMMEN))
  283.          - (Minuten(ADOTable1PAUSE_ENDE) - Minuten(ADOTable1PAUSE_START))
  284.          - Minuten(ADOTable1SONSTIGER_ABZUG)
  285.          + Minuten(ADOTable1ZUHAUSE);
  286.  
  287.     if not ADOTable1FREIER_TAG.AsBoolean then
  288.     begin
  289.       m := m - RegelArbeitszeit;
  290.     end;
  291.  
  292.     ADOTable1BERSTUNDEN.AsInteger := m;
  293.   end
  294.   else
  295.   begin
  296.     ADOTable1BERSTUNDEN.Clear;
  297.   end;
  298. end;
  299.  
  300. procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
  301. begin
  302.   if (ADOTable1.State = dsInsert) and ADOTable1TAG.IsNull then
  303.   begin
  304.     AdoTable1.Cancel;
  305.     Abort;
  306.   end;
  307.  
  308.   ReorgDataSet;
  309. end;
  310.  
  311. procedure TForm1.ADOTable1BERSTUNDENGetText(Sender: TField; var Text: string;
  312.   DisplayText: Boolean);
  313. begin
  314.   Text := MinutenZuHF(ADOTable1BERSTUNDEN);
  315. end;
  316.  
  317. procedure TForm1.ADOTable1BERSTUNDEN_SALDOGetText(Sender: TField;
  318.   var Text: string; DisplayText: Boolean);
  319. begin
  320.   Text := MinutenZuHF(ADOTable1BERSTUNDEN_SALDO);
  321. end;
  322.  
  323. procedure TForm1.ADOTable1GEHENGetText(Sender: TField; var Text: string;
  324.   DisplayText: Boolean);
  325. begin
  326.   Text := Copy(Sender.AsString, 1, 5);
  327. end;
  328.  
  329. procedure TForm1.ADOTable1GEHENSetText(Sender: TField; const Text: string);
  330. begin
  331.   if Text = '' then
  332.   begin
  333.     ADOTable1GEHEN.Clear;
  334.   end
  335.   else
  336.   begin
  337.     if Pos(':', Text) = 0 then
  338.       ADOTable1GEHEN.AsString := Text + ':00'
  339.     else
  340.       ADOTable1GEHEN.AsString := Text;
  341.   end;
  342. end;
  343.  
  344. procedure TForm1.ADOTable1KOMMENGetText(Sender: TField; var Text: string;
  345.   DisplayText: Boolean);
  346. begin
  347.   Text := Copy(Sender.AsString, 1, 5);
  348. end;
  349.  
  350. procedure TForm1.ADOTable1KOMMENSetText(Sender: TField; const Text: string);
  351. begin
  352.   if Text = '' then
  353.   begin
  354.     ADOTable1KOMMEN.Clear;
  355.   end
  356.   else
  357.   begin
  358.     if Pos(':', Text) = 0 then
  359.       ADOTable1KOMMEN.AsString := Text + ':00'
  360.     else
  361.       ADOTable1KOMMEN.AsString := Text;
  362.   end;
  363. end;
  364.  
  365. procedure TForm1.ADOTable1NewRecord(DataSet: TDataSet);
  366. var
  367.   test: TADOQuery;
  368. begin
  369.   ADOTable1FREIER_TAG.AsBoolean := false;
  370.   ADOTable1USERNAME.AsString := WUserName;
  371.   test := TADOQuery.Create(nil);
  372.   try
  373.     test.Connection := ADOConnection1;
  374.     test.Close;
  375.     test.SQL.Text := 'select * from TAGE where TAG = ''' + DateToStr(Date) + ''' and USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  376.     test.Open;
  377.     if test.RecordCount = 0 then
  378.     begin
  379.       ADOTable1TAG.AsDateTime := Date;
  380.       ADOTable1KOMMEN.AsString := TimeToStr(Time);
  381.       ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(Date) = 1{Sunday}) or
  382.                                        (DayOfWeek(Date) = 7{Saturday});
  383.     end;
  384.   finally
  385.     test.Free;
  386.   end;
  387.  
  388.   wwDBGrid1.SelectedField := ADOTable1TAG;
  389. end;
  390.  
  391. procedure TForm1.ADOTable1PAUSE_ENDEGetText(Sender: TField; var Text: string;
  392.   DisplayText: Boolean);
  393. begin
  394.   Text := Copy(Sender.AsString, 1, 5);
  395. end;
  396.  
  397. procedure TForm1.ADOTable1PAUSE_ENDESetText(Sender: TField; const Text: string);
  398. begin
  399.   if Text = '' then
  400.   begin
  401.     ADOTable1PAUSE_ENDE.Clear;
  402.   end
  403.   else
  404.   begin
  405.     if Pos(':', Text) = 0 then
  406.       ADOTable1PAUSE_ENDE.AsString := Text + ':00'
  407.     else
  408.       ADOTable1PAUSE_ENDE.AsString := Text;
  409.   end;
  410. end;
  411.  
  412. procedure TForm1.ADOTable1PAUSE_STARTGetText(Sender: TField; var Text: string;
  413.   DisplayText: Boolean);
  414. begin
  415.   Text := Copy(Sender.AsString, 1, 5);
  416. end;
  417.  
  418. procedure TForm1.ADOTable1PAUSE_STARTSetText(Sender: TField;
  419.   const Text: string);
  420. begin
  421.   if Text = '' then
  422.   begin
  423.     ADOTable1PAUSE_START.Clear;
  424.   end
  425.   else
  426.   begin
  427.     if Pos(':', Text) = 0 then
  428.       ADOTable1PAUSE_START.AsString := Text + ':00'
  429.     else
  430.       ADOTable1PAUSE_START.AsString := Text;
  431.   end;
  432. end;
  433.  
  434. procedure TForm1.ADOTable1SONSTIGER_ABZUGGetText(Sender: TField;
  435.   var Text: string; DisplayText: Boolean);
  436. begin
  437.   Text := Copy(Sender.AsString, 1, 5);
  438. end;
  439.  
  440. procedure TForm1.ADOTable1SONSTIGER_ABZUGSetText(Sender: TField;
  441.   const Text: string);
  442. begin
  443.   if Text = '' then
  444.   begin
  445.     ADOTable1SONSTIGER_ABZUG.Clear;
  446.   end
  447.   else
  448.   begin
  449.     if Pos(':', Text) = 0 then
  450.       ADOTable1SONSTIGER_ABZUG.AsString := Text + ':00'
  451.     else
  452.       ADOTable1SONSTIGER_ABZUG.AsString := Text;
  453.   end;
  454. end;
  455.  
  456. procedure TForm1.ADOTable1TAGChange(Sender: TField);
  457. begin
  458.   ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(ADOTable1TAG.AsDateTime) = 1{Sunday}) or
  459.                                    (DayOfWeek(ADOTable1TAG.AsDateTime) = 7{Saturday});
  460.   // TODO: "Wochentag" Feld aktualisieren
  461. end;
  462.  
  463. procedure TForm1.ADOTable1TAGGetText(Sender: TField; var Text: string;
  464.   DisplayText: Boolean);
  465. begin
  466.   if IstLeer(Sender) then
  467.     Text := Sender.AsString
  468.   else
  469.     Text := DateToStr(EchtesDatum(Sender));
  470. end;
  471.  
  472. procedure TForm1.ADOTable1TAGSetText(Sender: TField; const Text: string);
  473. var
  474.   i, punktCount: integer;
  475. begin
  476.   punktCount := 0;
  477.   for i := 1 to Length(Text) do
  478.   begin
  479.     if Text[i] = '.' then inc(punktCount);
  480.   end;
  481.  
  482.   if punktCount = 1 then
  483.   begin
  484.     ADOTable1TAG.AsString := Text + '.' + IntToStr(CurrentYear);
  485.   end
  486.   else if (PunktCount = 2) and EndsStr('.',Text) then
  487.   begin
  488.     ADOTable1TAG.AsString := Text + IntToStr(CurrentYear);
  489.   end
  490.   else
  491.   begin
  492.     ADOTable1TAG.AsString := Text;
  493.   end;
  494. end;
  495.  
  496. procedure TForm1.ADOTable1WOCHENTAGGetText(Sender: TField; var Text: string;
  497.   DisplayText: Boolean);
  498. begin
  499.   try
  500.     if ADOTable1TAG.AsString <> '' then
  501.       Text := ShortDayNames[DayOfWeek(EchtesDatum(ADOTable1TAG))]
  502.     else
  503.       Text := '';
  504.   except
  505.     Text := '??';
  506.   end;
  507. end;
  508.  
  509. procedure TForm1.ADOTable1ZUHAUSEGetText(Sender: TField; var Text: string;
  510.   DisplayText: Boolean);
  511. begin
  512.   Text := Copy(Sender.AsString, 1, 5);
  513. end;
  514.  
  515. procedure TForm1.ADOTable1ZUHAUSESetText(Sender: TField; const Text: string);
  516. begin
  517.   if Text = '' then
  518.   begin
  519.     ADOTable1ZUHAUSE.Clear;
  520.   end
  521.   else
  522.   begin
  523.     if Pos(':', Text) = 0 then
  524.       ADOTable1ZUHAUSE.AsString := Text + ':00'
  525.     else
  526.       ADOTable1ZUHAUSE.AsString := Text;
  527.   end;
  528. end;
  529.  
  530. procedure TForm1.Button1Click(Sender: TObject);
  531. begin
  532.   ReorgAll;
  533. end;
  534.  
  535. procedure TForm1.ComboBox1Change(Sender: TObject);
  536. begin
  537.   Label2.Caption := MinutenZuHF_Int(RegelArbeitszeit) + ' Std.';
  538.  
  539.   ADOTable1.DisableControls;
  540.  
  541.   ADOTable1.Active := false;
  542.   ADOTable1.ReadOnly := false;
  543.   ADOTable1.Filter := 'USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  544.   ADOTable1.Filtered := true;
  545.   ADOTable1.Active := true;
  546.  
  547.   ReorgAll;
  548.  
  549.   ADOTable1.Active := false;
  550.   ADOTable1.ReadOnly := ComboBox1.Text <> WUserName;
  551.   ADOTable1.Active := true;
  552.  
  553.   ADOTable1.Last;
  554.   Button1.Enabled := not ADOTable1.ReadOnly;
  555.  
  556.   ADOTable1.EnableControls;
  557. end;
  558.  
  559. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  560. begin
  561.   if ADOTable1.State in [dsEdit, dsInsert] then
  562.   begin
  563.     try
  564.       ADOTable1.Post;
  565.     except
  566.       on E: EAbort do
  567.       begin
  568.         exit;
  569.       end;
  570.     end;
  571.   end;
  572. end;
  573.  
  574. procedure TForm1.FormShow(Sender: TObject);
  575. var
  576.   test: TADOQuery;
  577.   ini: TMemIniFile;
  578. resourcestring
  579.   DefaultConnectionString = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Zeiterfassung;' +
  580.                             'Data Source=SHS\FiVe,49007;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=MARSCHALL;Use Encryption for Data=False;Tag with column collation when possible=False;';
  581. begin
  582.   ini := TMemIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + ChangeFileExt(ExtractFileName(ParamStr(0)), '.ini'));
  583.   try
  584.     ADOConnection1.ConnectionString := ini.ReadString('Connection', 'ConnectionString', DefaultConnectionString);
  585.   finally
  586.     ini.Free;
  587.   end;
  588.   ADOConnection1.Connected := true;
  589.  
  590.   {$REGION 'Username Combobox füllen'}
  591.   test := TADOQuery.Create(nil);
  592.   try
  593.     test.Connection := ADOConnection1;
  594.     test.Close;
  595.     test.SQL.Text := 'select distinct USERNAME from TAGE';
  596.     test.Open;
  597.     ComboBox1.Items.Clear;
  598.     while not test.EOF do
  599.     begin
  600.       ComboBox1.Items.Add(test.FieldByName('USERNAME').AsString);
  601.       test.Next;
  602.     end;
  603.   finally
  604.     test.Free;
  605.   end;
  606.  
  607.   if ComboBox1.Items.IndexOf(WUserName) = -1 then
  608.     ComboBox1.Items.Add(WUserName);
  609.  
  610.   ComboBox1.Sorted := true;
  611.  
  612.   ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(WUserName);
  613.  
  614.   ComboBox1Change(ComboBox1);
  615.   {$ENDREGION}
  616.  
  617.   if wwDBGrid1.CanFocus then wwDBGrid1.SetFocus;
  618.   wwDBGrid1.SelectedField := ADOTable1TAG;
  619. end;
  620.  
  621. procedure TForm1.wwDBGrid1CalcCellColors(Sender: TObject; Field: TField;
  622.   State: TGridDrawState; Highlight: Boolean; AFont: TFont; ABrush: TBrush);
  623. begin
  624.   if Highlight then exit;
  625.  
  626.   if (Field.FieldName = ADOTable1WOCHENTAG.FieldName) or
  627.      (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) or
  628.      (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then
  629.   begin
  630.     ABrush.Color := clBtnFace;
  631.   end;
  632.  
  633.   if (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) then
  634.   begin
  635.     if ADOTable1BERSTUNDEN.AsInteger < 0 then
  636.     begin
  637.       AFont.Color := clRed;
  638.     end;
  639.   end;
  640.  
  641.   if (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then
  642.   begin
  643.     if ADOTable1BERSTUNDEN_SALDO.AsInteger < 0 then
  644.     begin
  645.       AFont.Color := clRed;
  646.     end;
  647.   end;
  648. end;
  649.  
  650. end.
  651.