Subversion Repositories winbugtracker

Rev

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

Rev Author Line No. Line
4 daniel-mar 1
unit BugtrackerMain;
2
 
3
(*
4
 * TODO:
5
 * - abfragen ob speichern wenn fenster geschlossen wird
5 daniel-mar 6
 * - Spezielle Filter
7
 *   ... Auflisten nach Modul
8
 *   ... Anzeigen der Agenda
4 daniel-mar 9
 * - verbinden mit ticketsystem von HS
10
 * - rtf controls?
5 daniel-mar 11
 * - Neue Felder:
12
 *   ... Erfasser
13
 *   ... Agenda
14
 *   ... Status = Offen, gefixt, Abgelehnt, Veröffentlicht
15
 *   ... RTF Feld als BIGTEXT definieren
16
 * - Neue Aufteilung der States
17
 *   ... Open, Fixed, Published, Wontfix/Rejected, Planned(Agenda)
4 daniel-mar 18
 *)
19
 
20
interface
21
 
22
uses
23
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
6 daniel-mar 24
  Dialogs, WideStrings, DB, SqlExpr, StdCtrls, ExtCtrls, DBCtrls,
4 daniel-mar 25
  ADODB, ComCtrls, Grids, DBGrids, Mask, Menus, XPMan;
26
 
27
type
28
  TfrmBugtracker = class(TForm)
29
    Panel1: TPanel;
30
    DBGrid1: TDBGrid;
31
    ComboBox1: TComboBox;
32
    DBNavigator2: TDBNavigator;
33
    Panel2: TPanel;
34
    Label1: TLabel;
35
    Label2: TLabel;
36
    Label3: TLabel;
37
    Label4: TLabel;
38
    Label5: TLabel;
39
    Label6: TLabel;
40
    DBNavigator1: TDBNavigator;
41
    DBRichEdit1: TDBRichEdit;
42
    DBEdit1: TDBEdit;
43
    DBLookupComboBox1: TDBLookupComboBox;
44
    DBEdit2: TDBEdit;
45
    DBEdit3: TDBEdit;
46
    DBLookupComboBox2: TDBLookupComboBox;
47
    DBLookupComboBox3: TDBLookupComboBox;
48
    TrackBar1: TTrackBar;
49
    ADOConnection1: TADOConnection;
50
    dsBugs: TDataSource;
51
    tblMitarbeiter: TADOTable;
52
    dsMitarbeiter: TDataSource;
53
    MainMenu1: TMainMenu;
54
    Stammdaten1: TMenuItem;
55
    Mitarbeiter1: TMenuItem;
56
    Projekte1: TMenuItem;
57
    Module1: TMenuItem;
58
    Versionen1: TMenuItem;
59
    Projektwechseln1: TMenuItem;
60
    XPManifest1: TXPManifest;
61
    qryBugs: TADOQuery;
62
    dsVersionen: TDataSource;
63
    tblProjekte: TADOTable;
64
    dsProjekte: TDataSource;
65
    dsModule: TDataSource;
66
    Timer1: TTimer;
67
    Splitter1: TSplitter;
68
    Hilfe1: TMenuItem;
69
    ber1: TMenuItem;
70
    btnFixedToggle: TButton;
71
    btnBearbeitungsnotiz: TButton;
72
    qryBugsid: TAutoIncField;
73
    qryBugstitel: TStringField;
74
    qryBugsbeschreibung: TMemoField;
75
    qryBugserstellt: TDateTimeField;
76
    qryBugswichtigkeit: TIntegerField;
77
    qryBugsbearbeiter: TIntegerField;
78
    qryBugsfixdatum: TDateTimeField;
79
    qryBugsversion_release: TIntegerField;
80
    qryBugsmodul: TIntegerField;
81
    qryBugsprojekt: TIntegerField;
82
    qryVersionen: TADOQuery;
83
    qryModule: TADOQuery;
5 daniel-mar 84
    LblAngemeldet: TLabel;
85
    Label7: TLabel;
86
    Label8: TLabel;
6 daniel-mar 87
    DBLookupComboBox4: TDBLookupComboBox;
88
    qryBugserfasser: TIntegerField;
89
    qryBugsversion_agenda: TIntegerField;
90
    Label9: TLabel;
91
    cbxErfasser: TDBLookupComboBox;
92
    Label10: TLabel;
4 daniel-mar 93
    procedure Mitarbeiter1Click(Sender: TObject);
94
    procedure qryBugsAfterScroll(DataSet: TDataSet);
95
    procedure Module1Click(Sender: TObject);
96
    procedure Projekte1Click(Sender: TObject);
97
    procedure Versionen1Click(Sender: TObject);
98
    procedure TrackBar1Change(Sender: TObject);
99
    procedure Timer1Timer(Sender: TObject);
100
    procedure ComboBox1Change(Sender: TObject);
101
    procedure Projektwechseln1Click(Sender: TObject);
102
    procedure qryBugsAfterInsert(DataSet: TDataSet);
103
    procedure ber1Click(Sender: TObject);
104
    procedure btnFixedToggleClick(Sender: TObject);
105
    procedure qryBugsversion_releaseValidate(Sender: TField);
106
    procedure FormCreate(Sender: TObject);
107
    procedure qryVersionenAfterInsert(DataSet: TDataSet);
108
    procedure qryModuleAfterInsert(DataSet: TDataSet);
5 daniel-mar 109
    procedure btnBearbeitungsnotizClick(Sender: TObject);
4 daniel-mar 110
  public
111
    eingeloggtMitarbeiter: integer;
5 daniel-mar 112
    eingeloggtMitarbeiterName: string;
4 daniel-mar 113
    aktuellesProjekt: integer;
5 daniel-mar 114
    aktuellesProjektName: string;
4 daniel-mar 115
    procedure NeuFiltern;
5 daniel-mar 116
    procedure NotizHinzufuegen(color: TColor; bez: string);
4 daniel-mar 117
  end;
118
 
119
var
120
  frmBugtracker: TfrmBugtracker;
121
 
122
implementation
123
 
124
uses Mitarbeiter, Module, Versionen, Projekte, Login, About, inifiles;
125
 
126
{$R *.dfm}
127
 
128
procedure TfrmBugtracker.qryBugsAfterInsert(DataSet: TDataSet);
129
begin
130
  // Standardwerte für einen neuen Bug
6 daniel-mar 131
  qryBugs.FieldByName('wichtigkeit').AsInteger := 5; // Mitte
132
  qryBugs.FieldByName('erstellt').AsDateTime := Now;
133
  qryBugs.FieldByName('erfasser').AsInteger := eingeloggtMitarbeiter;
4 daniel-mar 134
  // qryBugs.FieldByName('bearbeiter').AsInteger := eingeloggtMitarbeiter;
135
  qryBugs.FieldByName('projekt').AsInteger := aktuellesProjekt;
136
end;
137
 
138
procedure TfrmBugtracker.qryBugsAfterScroll(DataSet: TDataSet);
139
var
140
  bakEvent: TNotifyEvent;
141
begin
142
  bakEvent := TrackBar1.OnChange;
143
  TrackBar1.OnChange := nil;
144
  try
145
    TrackBar1.Position := qryBugs.FieldByName('wichtigkeit').AsInteger;
146
  finally
147
    TrackBar1.OnChange := bakEvent;
148
  end;
149
end;
150
 
151
procedure TfrmBugtracker.qryBugsversion_releaseValidate(Sender: TField);
152
begin
153
  if qryBugs.FieldByName('fixdatum').IsNull then
154
  begin
155
    raise Exception.Create('Vor einer Veröffentlichung muss der Bugfix erst als gefixt markiert werden.');
156
  end;
157
end;
158
 
159
procedure TfrmBugtracker.qryModuleAfterInsert(DataSet: TDataSet);
160
begin
161
  // Standardwerte für ein neues Modul
162
  qryModule.FieldByName('projekt').AsInteger := aktuellesProjekt;
163
end;
164
 
165
procedure TfrmBugtracker.qryVersionenAfterInsert(DataSet: TDataSet);
166
begin
167
  // Standardwerte für eine neue Version
168
  qryVersionen.FieldByName('projekt').AsInteger := aktuellesProjekt;
169
end;
170
 
171
procedure TfrmBugtracker.Timer1Timer(Sender: TObject);
172
begin
173
  Timer1.Enabled := false;
174
  if frmLogin.ShowModal = mrCancel then Close;
175
end;
176
 
177
procedure TfrmBugtracker.TrackBar1Change(Sender: TObject);
178
begin
179
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
180
  qryBugs.FieldByName('wichtigkeit').AsInteger := TrackBar1.Position;
181
end;
182
 
183
procedure TfrmBugtracker.Versionen1Click(Sender: TObject);
184
begin
185
  frmVersionen.ShowModal;
186
end;
187
 
188
procedure TfrmBugtracker.ber1Click(Sender: TObject);
189
begin
190
  AboutBox.ShowModal;
191
end;
192
 
5 daniel-mar 193
procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
194
begin
195
  NotizHinzufuegen(clRed, 'Notiz');
196
end;
197
 
4 daniel-mar 198
procedure TfrmBugtracker.btnFixedToggleClick(Sender: TObject);
199
begin
200
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
201
  if qryBugs.FieldByName('fixdatum').IsNull then
5 daniel-mar 202
  begin
203
    qryBugs.FieldByName('fixdatum').AsDateTime := Now;
204
    NotizHinzufuegen(clGreen, 'Gefixt');
205
  end
4 daniel-mar 206
  else
5 daniel-mar 207
  begin
4 daniel-mar 208
    qryBugs.FieldByName('fixdatum').Clear;
5 daniel-mar 209
    NotizHinzufuegen(clBlue, 'Neu eröffnet');
210
  end;
4 daniel-mar 211
end;
212
 
213
procedure TfrmBugtracker.ComboBox1Change(Sender: TObject);
214
begin
215
  case ComboBox1.ItemIndex of
216
    0:
217
      begin
218
        // Meine offenen Bugs (nach Wichtigkeit)
219
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NULL AND bearbeiter = '+IntToStr(eingeloggtMitarbeiter)+' ORDER BY wichtigkeit DESC';
220
      end;
221
    1:
222
      begin
223
        // Alle offenen Bugs (nach Wichtigkeit)
224
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NULL ORDER BY wichtigkeit DESC';
225
      end;
226
    2:
227
      begin
228
        // Gelöst ohne Veröffentlichung (nach Lösungsdatum)
229
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NOT NULL ORDER BY fixdatum DESC';
230
      end;
231
    3:
232
      begin
233
        // Gelöst und Veröffentlicht (nach Version und Lösungsdatum)
234
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NOT NULL ORDER BY version_release DESC, fixdatum DESC';
235
      end;
236
    4:
237
      begin
238
        // Alle Bugs (nach Eröffnungsdatum)
239
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' ORDER BY erstellt DESC';
240
      end;
241
  end;
242
  qryBugs.Active := true;
243
end;
244
 
245
procedure TfrmBugtracker.FormCreate(Sender: TObject);
246
var
247
  ini: TMemIniFile;
248
begin
249
  ini := TMemIniFile.Create('bugtracker.ini');
250
  try
6 daniel-mar 251
    ADOConnection1.Connected := false;
4 daniel-mar 252
    ADOConnection1.ConnectionString := ini.ReadString('Database', 'ConnectionString', '');
253
  finally
254
    ini.Free;
255
  end;
256
 
257
  ADOConnection1.Connected := true;
258
  qryBugs.Active := true;
259
  tblMitarbeiter.Active := true;
260
  qryVersionen.Active := true;
261
  tblProjekte.Active := true;
262
  qryModule.Active := true;
263
end;
264
 
265
procedure TfrmBugtracker.Mitarbeiter1Click(Sender: TObject);
266
begin
267
  frmMitarbeiter.ShowModal;
268
end;
269
 
270
procedure TfrmBugtracker.Module1Click(Sender: TObject);
271
begin
272
  frmModule.ShowModal;
273
end;
274
 
275
procedure TfrmBugtracker.NeuFiltern;
276
begin
277
  ComboBox1Change(ComboBox1);
278
 
279
  qryModule.SQL.Text := 'SELECT * FROM module WHERE projekt = ' + IntToStr(aktuellesProjekt);
280
  qryModule.Active := true;
281
 
282
  qryVersionen.SQL.Text := 'SELECT * FROM versionen WHERE projekt = ' + IntToStr(aktuellesProjekt);
283
  qryVersionen.Active := true;
284
end;
285
 
5 daniel-mar 286
procedure TfrmBugtracker.NotizHinzufuegen(color: TColor; bez: string);
287
var
288
  leerzeilen: integer;
289
  umbruch: string;
290
  prefix: string;
291
begin
292
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
293
 
294
  // Endet der Text mit zwei Zeilenabständen? Wenn nein, dann einfügen.
295
  leerzeilen := 0;
296
  if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-2, 2) = #13#10 then Inc(leerzeilen); // letzte Zeile
297
  if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-4, 2) = #13#10 then Inc(leerzeilen); // Vorletzte Zeile
298
  case leerzeilen of
299
    0: umbruch := #13#10#13#10;
300
    1: umbruch := #13#10;
301
    2: umbruch := '';
302
  end;
303
 
304
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
305
  DBRichEdit1.SelText := umbruch;
306
 
307
  DBRichEdit1.SelAttributes.Size := 13;
308
  DBRichEdit1.SelAttributes.Color := color;
309
  DBRichEdit1.SelAttributes.Style := [fsUnderline];
310
  if Trim(bez) <> '' then
311
    prefix := Trim(bez) + ' - '
312
  else
313
    prefix := '';
314
  DBRichEdit1.SelText := prefix + eingeloggtMitarbeiterName + ' ' + FormatDateTime('dd.mm.yyyy hh:nn', Now); // DateTimeToStr(Now);
315
 
316
  DBRichEdit1.SelAttributes.Size := 10;
317
  DBRichEdit1.SelAttributes.Color := clWindowText;
318
  DBRichEdit1.SelAttributes.Style := [];
319
  DBRichEdit1.SelText := #13#10 {+ '<Hier Text eingeben>'};
320
 
321
  // Ans Ende scrollen
322
  DBRichEdit1.SetFocus;
323
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
324
  DBRichEdit1.Perform(EM_SCROLLCARET, 0, 0);
325
end;
326
 
4 daniel-mar 327
procedure TfrmBugtracker.Projekte1Click(Sender: TObject);
328
begin
329
  frmProjekte.ShowModal;
330
end;
331
 
332
procedure TfrmBugtracker.Projektwechseln1Click(Sender: TObject);
333
begin
334
  frmLogin.ShowModal;
335
end;
336
 
337
end.