Subversion Repositories delphiutils

Rev

Rev 80 | Rev 83 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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