Subversion Repositories winbugtracker

Rev

Rev 4 | Rev 6 | 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,
24
  Dialogs, DBXpress, WideStrings, DB, SqlExpr, StdCtrls, ExtCtrls, DBCtrls,
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;
4 daniel-mar 87
    procedure Mitarbeiter1Click(Sender: TObject);
88
    procedure qryBugsAfterScroll(DataSet: TDataSet);
89
    procedure Module1Click(Sender: TObject);
90
    procedure Projekte1Click(Sender: TObject);
91
    procedure Versionen1Click(Sender: TObject);
92
    procedure TrackBar1Change(Sender: TObject);
93
    procedure Timer1Timer(Sender: TObject);
94
    procedure ComboBox1Change(Sender: TObject);
95
    procedure Projektwechseln1Click(Sender: TObject);
96
    procedure qryBugsAfterInsert(DataSet: TDataSet);
97
    procedure ber1Click(Sender: TObject);
98
    procedure btnFixedToggleClick(Sender: TObject);
99
    procedure qryBugsversion_releaseValidate(Sender: TField);
100
    procedure FormCreate(Sender: TObject);
101
    procedure qryVersionenAfterInsert(DataSet: TDataSet);
102
    procedure qryModuleAfterInsert(DataSet: TDataSet);
5 daniel-mar 103
    procedure btnBearbeitungsnotizClick(Sender: TObject);
4 daniel-mar 104
  public
105
    eingeloggtMitarbeiter: integer;
5 daniel-mar 106
    eingeloggtMitarbeiterName: string;
4 daniel-mar 107
    aktuellesProjekt: integer;
5 daniel-mar 108
    aktuellesProjektName: string;
4 daniel-mar 109
    procedure NeuFiltern;
5 daniel-mar 110
    procedure NotizHinzufuegen(color: TColor; bez: string);
4 daniel-mar 111
  end;
112
 
113
var
114
  frmBugtracker: TfrmBugtracker;
115
 
116
implementation
117
 
118
uses Mitarbeiter, Module, Versionen, Projekte, Login, About, inifiles;
119
 
120
{$R *.dfm}
121
 
122
procedure TfrmBugtracker.qryBugsAfterInsert(DataSet: TDataSet);
123
begin
124
  // Standardwerte für einen neuen Bug
125
  qryBugs.FieldByName('wichtigkeit').AsInteger := 5;
126
  // qryBugs.FieldByName('bearbeiter').AsInteger := eingeloggtMitarbeiter;
127
  qryBugs.FieldByName('projekt').AsInteger := aktuellesProjekt;
128
end;
129
 
130
procedure TfrmBugtracker.qryBugsAfterScroll(DataSet: TDataSet);
131
var
132
  bakEvent: TNotifyEvent;
133
begin
134
  bakEvent := TrackBar1.OnChange;
135
  TrackBar1.OnChange := nil;
136
  try
137
    TrackBar1.Position := qryBugs.FieldByName('wichtigkeit').AsInteger;
138
  finally
139
    TrackBar1.OnChange := bakEvent;
140
  end;
141
end;
142
 
143
procedure TfrmBugtracker.qryBugsversion_releaseValidate(Sender: TField);
144
begin
145
  if qryBugs.FieldByName('fixdatum').IsNull then
146
  begin
147
    raise Exception.Create('Vor einer Veröffentlichung muss der Bugfix erst als gefixt markiert werden.');
148
  end;
149
end;
150
 
151
procedure TfrmBugtracker.qryModuleAfterInsert(DataSet: TDataSet);
152
begin
153
  // Standardwerte für ein neues Modul
154
  qryModule.FieldByName('projekt').AsInteger := aktuellesProjekt;
155
end;
156
 
157
procedure TfrmBugtracker.qryVersionenAfterInsert(DataSet: TDataSet);
158
begin
159
  // Standardwerte für eine neue Version
160
  qryVersionen.FieldByName('projekt').AsInteger := aktuellesProjekt;
161
end;
162
 
163
procedure TfrmBugtracker.Timer1Timer(Sender: TObject);
164
begin
165
  Timer1.Enabled := false;
166
  if frmLogin.ShowModal = mrCancel then Close;
167
end;
168
 
169
procedure TfrmBugtracker.TrackBar1Change(Sender: TObject);
170
begin
171
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
172
  qryBugs.FieldByName('wichtigkeit').AsInteger := TrackBar1.Position;
173
end;
174
 
175
procedure TfrmBugtracker.Versionen1Click(Sender: TObject);
176
begin
177
  frmVersionen.ShowModal;
178
end;
179
 
180
procedure TfrmBugtracker.ber1Click(Sender: TObject);
181
begin
182
  AboutBox.ShowModal;
183
end;
184
 
5 daniel-mar 185
procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
186
begin
187
  NotizHinzufuegen(clRed, 'Notiz');
188
end;
189
 
4 daniel-mar 190
procedure TfrmBugtracker.btnFixedToggleClick(Sender: TObject);
191
begin
192
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
193
  if qryBugs.FieldByName('fixdatum').IsNull then
5 daniel-mar 194
  begin
195
    qryBugs.FieldByName('fixdatum').AsDateTime := Now;
196
    NotizHinzufuegen(clGreen, 'Gefixt');
197
  end
4 daniel-mar 198
  else
5 daniel-mar 199
  begin
4 daniel-mar 200
    qryBugs.FieldByName('fixdatum').Clear;
5 daniel-mar 201
    NotizHinzufuegen(clBlue, 'Neu eröffnet');
202
  end;
4 daniel-mar 203
end;
204
 
205
procedure TfrmBugtracker.ComboBox1Change(Sender: TObject);
206
begin
207
  case ComboBox1.ItemIndex of
208
    0:
209
      begin
210
        // Meine offenen Bugs (nach Wichtigkeit)
211
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NULL AND bearbeiter = '+IntToStr(eingeloggtMitarbeiter)+' ORDER BY wichtigkeit DESC';
212
      end;
213
    1:
214
      begin
215
        // Alle offenen Bugs (nach Wichtigkeit)
216
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NULL ORDER BY wichtigkeit DESC';
217
      end;
218
    2:
219
      begin
220
        // Gelöst ohne Veröffentlichung (nach Lösungsdatum)
221
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NOT NULL ORDER BY fixdatum DESC';
222
      end;
223
    3:
224
      begin
225
        // Gelöst und Veröffentlicht (nach Version und Lösungsdatum)
226
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND fixdatum IS NOT NULL ORDER BY version_release DESC, fixdatum DESC';
227
      end;
228
    4:
229
      begin
230
        // Alle Bugs (nach Eröffnungsdatum)
231
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' ORDER BY erstellt DESC';
232
      end;
233
  end;
234
  qryBugs.Active := true;
235
end;
236
 
237
procedure TfrmBugtracker.FormCreate(Sender: TObject);
238
var
239
  ini: TMemIniFile;
240
begin
241
  ini := TMemIniFile.Create('bugtracker.ini');
242
  try
243
    ADOConnection1.ConnectionString := ini.ReadString('Database', 'ConnectionString', '');
244
  finally
245
    ini.Free;
246
  end;
247
 
248
  ADOConnection1.Connected := true;
249
  qryBugs.Active := true;
250
  tblMitarbeiter.Active := true;
251
  qryVersionen.Active := true;
252
  tblProjekte.Active := true;
253
  qryModule.Active := true;
254
end;
255
 
256
procedure TfrmBugtracker.Mitarbeiter1Click(Sender: TObject);
257
begin
258
  frmMitarbeiter.ShowModal;
259
end;
260
 
261
procedure TfrmBugtracker.Module1Click(Sender: TObject);
262
begin
263
  frmModule.ShowModal;
264
end;
265
 
266
procedure TfrmBugtracker.NeuFiltern;
267
begin
268
  ComboBox1Change(ComboBox1);
269
 
270
  qryModule.SQL.Text := 'SELECT * FROM module WHERE projekt = ' + IntToStr(aktuellesProjekt);
271
  qryModule.Active := true;
272
 
273
  qryVersionen.SQL.Text := 'SELECT * FROM versionen WHERE projekt = ' + IntToStr(aktuellesProjekt);
274
  qryVersionen.Active := true;
275
end;
276
 
5 daniel-mar 277
procedure TfrmBugtracker.NotizHinzufuegen(color: TColor; bez: string);
278
var
279
  leerzeilen: integer;
280
  umbruch: string;
281
  prefix: string;
282
begin
283
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
284
 
285
  // Endet der Text mit zwei Zeilenabständen? Wenn nein, dann einfügen.
286
  leerzeilen := 0;
287
  if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-2, 2) = #13#10 then Inc(leerzeilen); // letzte Zeile
288
  if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-4, 2) = #13#10 then Inc(leerzeilen); // Vorletzte Zeile
289
  case leerzeilen of
290
    0: umbruch := #13#10#13#10;
291
    1: umbruch := #13#10;
292
    2: umbruch := '';
293
  end;
294
 
295
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
296
  DBRichEdit1.SelText := umbruch;
297
 
298
  DBRichEdit1.SelAttributes.Size := 13;
299
  DBRichEdit1.SelAttributes.Color := color;
300
  DBRichEdit1.SelAttributes.Style := [fsUnderline];
301
  if Trim(bez) <> '' then
302
    prefix := Trim(bez) + ' - '
303
  else
304
    prefix := '';
305
  DBRichEdit1.SelText := prefix + eingeloggtMitarbeiterName + ' ' + FormatDateTime('dd.mm.yyyy hh:nn', Now); // DateTimeToStr(Now);
306
 
307
  DBRichEdit1.SelAttributes.Size := 10;
308
  DBRichEdit1.SelAttributes.Color := clWindowText;
309
  DBRichEdit1.SelAttributes.Style := [];
310
  DBRichEdit1.SelText := #13#10 {+ '<Hier Text eingeben>'};
311
 
312
  // Ans Ende scrollen
313
  DBRichEdit1.SetFocus;
314
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
315
  DBRichEdit1.Perform(EM_SCROLLCARET, 0, 0);
316
end;
317
 
4 daniel-mar 318
procedure TfrmBugtracker.Projekte1Click(Sender: TObject);
319
begin
320
  frmProjekte.ShowModal;
321
end;
322
 
323
procedure TfrmBugtracker.Projektwechseln1Click(Sender: TObject);
324
begin
325
  frmLogin.ShowModal;
326
end;
327
 
328
end.