Subversion Repositories winbugtracker

Rev

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