Subversion Repositories winbugtracker

Rev

Rev 11 | Rev 13 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 11 Rev 12
1
unit BugtrackerMain;
1
unit BugtrackerMain;
2
 
2
 
3
(*
3
(*
4
 * TODO:
4
 * TODO:
5
 * - Spezielle Filter
5
 * - Spezielle Filter
6
 *   ... Auflisten nach Modul
6
 *   ... Auflisten nach Modul
7
 *   ... Anzeigen der Agenda
7
 *   ... Anzeigen der Agenda
8
 * - rtf control bar?
8
 * - rtf control bar?
9
 * - ein neu angelegter bug soll links aus der leiste verschwinden, wenn er nicht in das kriterium passt
9
 * - ein neu angelegter bug soll links aus der leiste verschwinden, wenn er nicht in das kriterium passt
10
 *
10
 *
11
 * NOT INCLUDED:
11
 * NOT INCLUDED:
12
 * - duplicate of
12
 * - duplicate of
13
 *
13
 *
14
 * FUTURE:
14
 * FUTURE:
15
 * - HS Info integration
15
 * - HS Info integration
16
 *)
16
 *)
17
 
17
 
18
interface
18
interface
19
 
19
 
20
uses
20
uses
21
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
21
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
22
  Dialogs, WideStrings, DB, SqlExpr, StdCtrls, ExtCtrls, DBCtrls,
22
  Dialogs, WideStrings, DB, SqlExpr, StdCtrls, ExtCtrls, DBCtrls,
23
  ADODB, ComCtrls, Grids, DBGrids, Mask, Menus, XPMan;
23
  ADODB, ComCtrls, Grids, DBGrids, Mask, Menus, XPMan;
24
 
24
 
25
type
25
type
26
  TfrmBugtracker = class(TForm)
26
  TfrmBugtracker = class(TForm)
27
    Panel1: TPanel;
27
    Panel1: TPanel;
28
    DBGrid1: TDBGrid;
28
    DBGrid1: TDBGrid;
29
    ComboBox1: TComboBox;
29
    ComboBox1: TComboBox;
30
    DBNavigator2: TDBNavigator;
30
    DBNavigator2: TDBNavigator;
31
    Panel2: TPanel;
31
    Panel2: TPanel;
32
    Label1: TLabel;
32
    Label1: TLabel;
33
    Label2: TLabel;
33
    Label2: TLabel;
34
    Label3: TLabel;
34
    Label3: TLabel;
35
    Label4: TLabel;
35
    Label4: TLabel;
36
    Label5: TLabel;
36
    Label5: TLabel;
37
    Label6: TLabel;
37
    Label6: TLabel;
38
    DBNavigator1: TDBNavigator;
38
    DBNavigator1: TDBNavigator;
39
    DBRichEdit1: TDBRichEdit;
39
    DBRichEdit1: TDBRichEdit;
40
    DBEdit1: TDBEdit;
40
    DBEdit1: TDBEdit;
41
    DBLookupComboBox1: TDBLookupComboBox;
41
    DBLookupComboBox1: TDBLookupComboBox;
42
    DBEdit2: TDBEdit;
42
    DBEdit2: TDBEdit;
43
    DBEdit3: TDBEdit;
43
    DBEdit3: TDBEdit;
44
    DBLookupComboBox2: TDBLookupComboBox;
44
    DBLookupComboBox2: TDBLookupComboBox;
45
    DBLookupComboBox3: TDBLookupComboBox;
45
    DBLookupComboBox3: TDBLookupComboBox;
46
    TrackBar1: TTrackBar;
46
    TrackBar1: TTrackBar;
47
    ADOConnection1: TADOConnection;
47
    ADOConnection1: TADOConnection;
48
    dsBugs: TDataSource;
48
    dsBugs: TDataSource;
49
    tblMitarbeiter: TADOTable;
49
    tblMitarbeiter: TADOTable;
50
    dsMitarbeiter: TDataSource;
50
    dsMitarbeiter: TDataSource;
51
    MainMenu1: TMainMenu;
51
    MainMenu1: TMainMenu;
52
    Stammdaten1: TMenuItem;
52
    Stammdaten1: TMenuItem;
53
    Mitarbeiter1: TMenuItem;
53
    Mitarbeiter1: TMenuItem;
54
    Projekte1: TMenuItem;
54
    Projekte1: TMenuItem;
55
    Module1: TMenuItem;
55
    Module1: TMenuItem;
56
    Versionen1: TMenuItem;
56
    Versionen1: TMenuItem;
57
    Projektwechseln1: TMenuItem;
57
    Projektwechseln1: TMenuItem;
58
    XPManifest1: TXPManifest;
58
    XPManifest1: TXPManifest;
59
    qryBugs: TADOQuery;
59
    qryBugs: TADOQuery;
60
    dsVersionen: TDataSource;
60
    dsVersionen: TDataSource;
61
    tblProjekte: TADOTable;
61
    tblProjekte: TADOTable;
62
    dsProjekte: TDataSource;
62
    dsProjekte: TDataSource;
63
    dsModule: TDataSource;
63
    dsModule: TDataSource;
64
    Timer1: TTimer;
64
    Timer1: TTimer;
65
    Splitter1: TSplitter;
65
    Splitter1: TSplitter;
66
    Hilfe1: TMenuItem;
66
    Hilfe1: TMenuItem;
67
    ber1: TMenuItem;
67
    ber1: TMenuItem;
68
    btnBearbeitungsnotiz: TButton;
68
    btnBearbeitungsnotiz: TButton;
69
    qryBugsid: TAutoIncField;
69
    qryBugsid: TAutoIncField;
70
    qryBugstitel: TStringField;
70
    qryBugstitel: TStringField;
71
    qryBugsbeschreibung: TMemoField;
71
    qryBugsbeschreibung: TMemoField;
72
    qryBugserstellt: TDateTimeField;
72
    qryBugserstellt: TDateTimeField;
73
    qryBugswichtigkeit: TIntegerField;
73
    qryBugswichtigkeit: TIntegerField;
74
    qryBugsbearbeiter: TIntegerField;
74
    qryBugsbearbeiter: TIntegerField;
75
    qryBugsversion_release: TIntegerField;
75
    qryBugsversion_release: TIntegerField;
76
    qryBugsmodul: TIntegerField;
76
    qryBugsmodul: TIntegerField;
77
    qryBugsprojekt: TIntegerField;
77
    qryBugsprojekt: TIntegerField;
78
    qryVersionen: TADOQuery;
78
    qryVersionen: TADOQuery;
79
    qryModule: TADOQuery;
79
    qryModule: TADOQuery;
80
    LblAngemeldet: TLabel;
80
    LblAngemeldet: TLabel;
81
    Label7: TLabel;
81
    Label7: TLabel;
82
    Label8: TLabel;
82
    Label8: TLabel;
83
    DBLookupComboBox4: TDBLookupComboBox;
83
    DBLookupComboBox4: TDBLookupComboBox;
84
    qryBugserfasser: TIntegerField;
84
    qryBugserfasser: TIntegerField;
85
    qryBugsversion_agenda: TIntegerField;
85
    qryBugsversion_agenda: TIntegerField;
86
    Label9: TLabel;
86
    Label9: TLabel;
87
    cbxErfasser: TDBLookupComboBox;
87
    cbxErfasser: TDBLookupComboBox;
88
    Label10: TLabel;
88
    Label10: TLabel;
89
    lkpStatus: TADOTable;
89
    lkpStatus: TADOTable;
90
    dsStatus: TDataSource;
90
    dsStatus: TDataSource;
91
    DBLookupComboBox5: TDBLookupComboBox;
91
    DBLookupComboBox5: TDBLookupComboBox;
92
    qryBugsstatus: TIntegerField;
92
    qryBugsstatus: TIntegerField;
93
    qryBugsstatus_geaendert: TDateTimeField;
93
    qryBugsstatus_geaendert: TDateTimeField;
-
 
94
    Bugs1: TMenuItem;
-
 
95
    Wechselnzu1: TMenuItem;
94
    procedure Mitarbeiter1Click(Sender: TObject);
96
    procedure Mitarbeiter1Click(Sender: TObject);
95
    procedure qryBugsAfterScroll(DataSet: TDataSet);
97
    procedure qryBugsAfterScroll(DataSet: TDataSet);
96
    procedure Module1Click(Sender: TObject);
98
    procedure Module1Click(Sender: TObject);
97
    procedure Projekte1Click(Sender: TObject);
99
    procedure Projekte1Click(Sender: TObject);
98
    procedure Versionen1Click(Sender: TObject);
100
    procedure Versionen1Click(Sender: TObject);
99
    procedure TrackBar1Change(Sender: TObject);
101
    procedure TrackBar1Change(Sender: TObject);
100
    procedure Timer1Timer(Sender: TObject);
102
    procedure Timer1Timer(Sender: TObject);
101
    procedure ComboBox1Change(Sender: TObject);
103
    procedure ComboBox1Change(Sender: TObject);
102
    procedure Projektwechseln1Click(Sender: TObject);
104
    procedure Projektwechseln1Click(Sender: TObject);
103
    procedure qryBugsAfterInsert(DataSet: TDataSet);
105
    procedure qryBugsAfterInsert(DataSet: TDataSet);
104
    procedure ber1Click(Sender: TObject);
106
    procedure ber1Click(Sender: TObject);
105
    procedure qryBugsversion_releaseValidate(Sender: TField);
107
    procedure qryBugsversion_releaseValidate(Sender: TField);
106
    procedure FormCreate(Sender: TObject);
108
    procedure FormCreate(Sender: TObject);
107
    procedure qryVersionenAfterInsert(DataSet: TDataSet);
109
    procedure qryVersionenAfterInsert(DataSet: TDataSet);
108
    procedure qryModuleAfterInsert(DataSet: TDataSet);
110
    procedure qryModuleAfterInsert(DataSet: TDataSet);
109
    procedure btnBearbeitungsnotizClick(Sender: TObject);
111
    procedure btnBearbeitungsnotizClick(Sender: TObject);
110
    procedure qryBugsBeforeCancel(DataSet: TDataSet);
112
    procedure qryBugsBeforeCancel(DataSet: TDataSet);
111
    procedure DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn);
113
    procedure DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn);
112
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
114
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
113
    procedure qryBugsstatusChange(Sender: TField);
115
    procedure qryBugsstatusChange(Sender: TField);
-
 
116
    procedure Wechselnzu1Click(Sender: TObject);
114
  public
117
  public
115
    eingeloggtMitarbeiter: integer;
118
    eingeloggtMitarbeiter: integer;
116
    eingeloggtMitarbeiterName: string;
119
    eingeloggtMitarbeiterName: string;
117
    aktuellesProjekt: integer;
120
    aktuellesProjekt: integer;
118
    aktuellesProjektName: string;
121
    aktuellesProjektName: string;
119
    procedure NeuFiltern;
122
    procedure NeuFiltern;
120
    procedure NotizHinzufuegen(color: TColor; bez: string);
123
    procedure NotizHinzufuegen(color: TColor; bez: string);
121
  end;
124
  end;
122
 
125
 
123
var
126
var
124
  frmBugtracker: TfrmBugtracker;
127
  frmBugtracker: TfrmBugtracker;
125
 
128
 
126
implementation
129
implementation
127
 
130
 
128
uses Mitarbeiter, Module, Versionen, Projekte, Login, About, inifiles;
131
uses Mitarbeiter, Module, Versionen, Projekte, Login, About, inifiles;
129
 
132
 
130
{$R *.dfm}
133
{$R *.dfm}
131
 
134
 
132
procedure TfrmBugtracker.qryBugsAfterInsert(DataSet: TDataSet);
135
procedure TfrmBugtracker.qryBugsAfterInsert(DataSet: TDataSet);
133
begin
136
begin
134
  // Standardwerte für einen neuen Bug
137
  // Standardwerte für einen neuen Bug
135
  qryBugs.FieldByName('wichtigkeit').AsInteger := 5; // Mitte
138
  qryBugs.FieldByName('wichtigkeit').AsInteger := 5; // Mitte
136
  qryBugs.FieldByName('erstellt').AsDateTime := Now;
139
  qryBugs.FieldByName('erstellt').AsDateTime := Now;
137
  qryBugs.FieldByName('erfasser').AsInteger := eingeloggtMitarbeiter;
140
  qryBugs.FieldByName('erfasser').AsInteger := eingeloggtMitarbeiter;
138
  qryBugs.FieldByName('projekt').AsInteger := aktuellesProjekt;
141
  qryBugs.FieldByName('projekt').AsInteger := aktuellesProjekt;
139
  qryBugs.FieldByName('status').AsInteger := 1; // Offen
142
  qryBugs.FieldByName('status').AsInteger := 1; // Offen
140
end;
143
end;
141
 
144
 
142
procedure TfrmBugtracker.qryBugsAfterScroll(DataSet: TDataSet);
145
procedure TfrmBugtracker.qryBugsAfterScroll(DataSet: TDataSet);
143
var
146
var
144
  bakEvent: TNotifyEvent;
147
  bakEvent: TNotifyEvent;
145
begin
148
begin
146
  bakEvent := TrackBar1.OnChange;
149
  bakEvent := TrackBar1.OnChange;
147
  TrackBar1.OnChange := nil;
150
  TrackBar1.OnChange := nil;
148
  try
151
  try
149
    TrackBar1.Position := qryBugs.FieldByName('wichtigkeit').AsInteger;
152
    TrackBar1.Position := qryBugs.FieldByName('wichtigkeit').AsInteger;
150
  finally
153
  finally
151
    TrackBar1.OnChange := bakEvent;
154
    TrackBar1.OnChange := bakEvent;
152
  end;
155
  end;
153
end;
156
end;
154
 
157
 
155
procedure TfrmBugtracker.qryBugsBeforeCancel(DataSet: TDataSet);
158
procedure TfrmBugtracker.qryBugsBeforeCancel(DataSet: TDataSet);
156
var
159
var
157
  abfrage: Integer;
160
  abfrage: Integer;
158
begin
161
begin
159
  // Tag 1 = Es wurde der "Abbrechen"-Knopf im DBNavigator gedrückt, also wollen wir keine unnötige Bestätigung
162
  // Tag 1 = Es wurde der "Abbrechen"-Knopf im DBNavigator gedrückt, also wollen wir keine unnötige Bestätigung
160
  // Alles andere = Irgendwas anderes (z.B. Scrolling oder versehentlich versucht das Fenster zu schließen)
163
  // Alles andere = Irgendwas anderes (z.B. Scrolling oder versehentlich versucht das Fenster zu schließen)
161
  if qryBugs.Tag = 1 then exit;
164
  if qryBugs.Tag = 1 then exit;
162
 
165
 
163
  abfrage := MessageDlg('Speichern?', mtConfirmation, mbYesNoCancel, 0);
166
  abfrage := MessageDlg('Speichern?', mtConfirmation, mbYesNoCancel, 0);
164
 
167
 
165
  if (abfrage = IDNo) or (abfrage = IDYes) or (abfrage = IDOK) then
168
  if (abfrage = IDNo) or (abfrage = IDYes) or (abfrage = IDOK) then
166
  begin
169
  begin
167
     if abfrage = IDYes then
170
     if abfrage = IDYes then
168
     begin
171
     begin
169
       if (qryBugs.state in [dsEdit, dsInsert]) then qryBugs.Post;
172
       if (qryBugs.state in [dsEdit, dsInsert]) then qryBugs.Post;
170
     end;
173
     end;
171
     if abfrage = IDNo then
174
     if abfrage = IDNo then
172
     begin
175
     begin
173
       // Wir befinden uns bereits in qryBugs.Cancel, daher auskommentiert.
176
       // Wir befinden uns bereits in qryBugs.Cancel, daher auskommentiert.
174
       // if (qryBugs.state in [dsEdit, dsInsert]) then qryBugs.Cancel;
177
       // if (qryBugs.state in [dsEdit, dsInsert]) then qryBugs.Cancel;
175
     end;
178
     end;
176
  end
179
  end
177
  else raise EAbort.Create('Abbruch durch Benutzer'); // Cancel geklickt
180
  else raise EAbort.Create('Abbruch durch Benutzer'); // Cancel geklickt
178
end;
181
end;
179
 
182
 
180
procedure TfrmBugtracker.qryBugsstatusChange(Sender: TField);
183
procedure TfrmBugtracker.qryBugsstatusChange(Sender: TField);
181
var
184
var
182
  col: TColor;
185
  col: TColor;
183
begin
186
begin
184
  qryBugsstatus_geaendert.AsDateTime := Now;
187
  qryBugsstatus_geaendert.AsDateTime := Now;
185
 
188
 
186
  DBLookupComboBox5.KeyValue := qryBugsstatus.AsVariant; // nur benötigt, daamit wir auf DBLookupComboBox5.Text zugreifen können
189
  DBLookupComboBox5.KeyValue := qryBugsstatus.AsVariant; // nur benötigt, daamit wir auf DBLookupComboBox5.Text zugreifen können
187
  case qryBugsstatus.AsInteger of
190
  case qryBugsstatus.AsInteger of
-
 
191
    // TODO: farben in db?
188
    1: col := clRed; // Offen
192
    1: col := clRed; // Offen
189
    2: col := clMaroon; // Abgelehnt
193
    2: col := clMaroon; // Abgelehnt
190
    3: col := clPurple; // In Bearbeitung
194
    3: col := clPurple; // In Bearbeitung
191
    4: col := clTeal; // Gefixt
195
    4: col := clTeal; // Gefixt
192
    5: col := clGreen; // Veröffentlicht
196
    5: col := clGreen; // Veröffentlicht
193
    else
197
    else
194
      col := clBlack; // sollte nicht passieren
198
      col := clBlack; // sollte nicht passieren
195
  end;
199
  end;
196
  NotizHinzufuegen(col, DBLookupComboBox5.Text);
200
  NotizHinzufuegen(col, DBLookupComboBox5.Text);
197
end;
201
end;
198
 
202
 
199
procedure TfrmBugtracker.qryBugsversion_releaseValidate(Sender: TField);
203
procedure TfrmBugtracker.qryBugsversion_releaseValidate(Sender: TField);
200
begin
204
begin
201
  if qryBugs.FieldByName('status').AsInteger <> 5 then
205
  if qryBugs.FieldByName('status').AsInteger <> 5 then
202
  begin
206
  begin
203
    // raise Exception.Create('Vor einer Veröffentlichung muss der Bugfix erst als "Veröffentlicht" markiert werden.');
207
    // raise Exception.Create('Vor einer Veröffentlichung muss der Bugfix erst als "Veröffentlicht" markiert werden.');
204
    qryBugs.FieldByName('status').AsInteger := 5;
208
    qryBugs.FieldByName('status').AsInteger := 5;
205
  end;
209
  end;
206
end;
210
end;
207
 
211
 
208
procedure TfrmBugtracker.qryModuleAfterInsert(DataSet: TDataSet);
212
procedure TfrmBugtracker.qryModuleAfterInsert(DataSet: TDataSet);
209
begin
213
begin
210
  // Standardwerte für ein neues Modul
214
  // Standardwerte für ein neues Modul
211
  qryModule.FieldByName('projekt').AsInteger := aktuellesProjekt;
215
  qryModule.FieldByName('projekt').AsInteger := aktuellesProjekt;
212
end;
216
end;
213
 
217
 
214
procedure TfrmBugtracker.qryVersionenAfterInsert(DataSet: TDataSet);
218
procedure TfrmBugtracker.qryVersionenAfterInsert(DataSet: TDataSet);
215
begin
219
begin
216
  // Standardwerte für eine neue Version
220
  // Standardwerte für eine neue Version
217
  qryVersionen.FieldByName('projekt').AsInteger := aktuellesProjekt;
221
  qryVersionen.FieldByName('projekt').AsInteger := aktuellesProjekt;
218
end;
222
end;
219
 
223
 
220
procedure TfrmBugtracker.Timer1Timer(Sender: TObject);
224
procedure TfrmBugtracker.Timer1Timer(Sender: TObject);
221
begin
225
begin
222
  Timer1.Enabled := false;
226
  Timer1.Enabled := false;
223
  if frmLogin.ShowModal = mrCancel then Close;
227
  if frmLogin.ShowModal = mrCancel then Close;
224
end;
228
end;
225
 
229
 
226
procedure TfrmBugtracker.TrackBar1Change(Sender: TObject);
230
procedure TfrmBugtracker.TrackBar1Change(Sender: TObject);
227
begin
231
begin
228
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
232
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
229
  qryBugs.FieldByName('wichtigkeit').AsInteger := TrackBar1.Position;
233
  qryBugs.FieldByName('wichtigkeit').AsInteger := TrackBar1.Position;
230
end;
234
end;
231
 
235
 
232
procedure TfrmBugtracker.Versionen1Click(Sender: TObject);
236
procedure TfrmBugtracker.Versionen1Click(Sender: TObject);
233
begin
237
begin
234
  frmVersionen.ShowModal;
238
  frmVersionen.ShowModal;
235
end;
239
end;
-
 
240
 
-
 
241
procedure TfrmBugtracker.Wechselnzu1Click(Sender: TObject);
-
 
242
var
-
 
243
  s: string;
-
 
244
  id, ec: integer;
-
 
245
begin
-
 
246
  s := Trim(InputBox('Wechseln zu Bug', 'ID des Bugs eingeben', '0'));
-
 
247
  if s = '' then exit;  
-
 
248
  Val(s, id, ec);
-
 
249
  if ec <> 0 then
-
 
250
  begin
-
 
251
    ShowMessageFmt('"%s" ist keine gültige Bug-ID-Nummer.', [id]);
-
 
252
    exit;
-
 
253
  end;
-
 
254
  qryBugs.Locate('id', id, []);
-
 
255
end;
236
 
256
 
237
procedure TfrmBugtracker.ber1Click(Sender: TObject);
257
procedure TfrmBugtracker.ber1Click(Sender: TObject);
238
begin
258
begin
239
  AboutBox.ShowModal;
259
  AboutBox.ShowModal;
240
end;
260
end;
241
 
261
 
242
procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
262
procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
243
begin
263
begin
244
  NotizHinzufuegen(clOlive, 'Notiz');
264
  NotizHinzufuegen(clOlive, 'Notiz');
245
end;
265
end;
246
 
266
 
247
procedure TfrmBugtracker.ComboBox1Change(Sender: TObject);
267
procedure TfrmBugtracker.ComboBox1Change(Sender: TObject);
248
begin
268
begin
249
  case ComboBox1.ItemIndex of
269
  case ComboBox1.ItemIndex of
250
    0:
270
    0:
251
      begin
271
      begin
252
        // Meine offenen Bugs (nach Wichtigkeit)
272
        // Meine offenen Bugs (nach Wichtigkeit)
253
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND (status = 1 OR status = 3) AND bearbeiter = '+IntToStr(eingeloggtMitarbeiter)+' ORDER BY wichtigkeit DESC';
273
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND (status = 1 OR status = 3) AND bearbeiter = '+IntToStr(eingeloggtMitarbeiter)+' ORDER BY wichtigkeit DESC';
254
      end;
274
      end;
255
    1:
275
    1:
256
      begin
276
      begin
257
        // Alle offenen Bugs (nach Wichtigkeit)
277
        // Alle offenen Bugs (nach Wichtigkeit)
258
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND (status = 1 OR status = 3) ORDER BY wichtigkeit DESC';
278
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND (status = 1 OR status = 3) ORDER BY wichtigkeit DESC';
259
      end;
279
      end;
260
    2:
280
    2:
261
      begin
281
      begin
262
        // Gelöst ohne Veröffentlichung (nach Lösungsdatum)
282
        // Gelöst ohne Veröffentlichung (nach Lösungsdatum)
263
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND status = 4 ORDER BY status_geaendert DESC';
283
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND status = 4 ORDER BY status_geaendert DESC';
264
      end;
284
      end;
265
    3:
285
    3:
266
      begin
286
      begin
267
        // Gelöst und Veröffentlicht (nach Version und Lösungsdatum)
287
        // Gelöst und Veröffentlicht (nach Version und Lösungsdatum)
268
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND status = 5 ORDER BY status_geaendert DESC';
288
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' AND status = 5 ORDER BY status_geaendert DESC';
269
      end;
289
      end;
270
    4:
290
    4:
271
      begin
291
      begin
272
        // Alle Bugs (nach Eröffnungsdatum)
292
        // Alle Bugs (nach Eröffnungsdatum)
273
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' ORDER BY erstellt DESC';
293
        qryBugs.SQL.Text := 'SELECT * FROM bugs WHERE projekt = '+IntToStr(aktuellesProjekt)+' ORDER BY erstellt DESC';
274
      end;
294
      end;
275
  end;
295
  end;
276
  qryBugs.Active := true;
296
  qryBugs.Active := true;
277
end;
297
end;
278
 
298
 
279
procedure TfrmBugtracker.DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn);
299
procedure TfrmBugtracker.DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn);
280
begin
300
begin
281
  if Button = nbCancel then
301
  if Button = nbCancel then
282
  begin
302
  begin
283
    if qryBugs.state  in [dsEdit,dsInsert] then
303
    if qryBugs.state  in [dsEdit,dsInsert] then
284
    begin
304
    begin
285
      // Tag=1 soll verhindern, dass nicht gefragt wird, ob man Speichern möchte.
305
      // Tag=1 soll verhindern, dass nicht gefragt wird, ob man Speichern möchte.
286
      // Ansonsten würde diese Meldung kommen, denn ".Cancel" wird automatisch
306
      // Ansonsten würde diese Meldung kommen, denn ".Cancel" wird automatisch
287
      // bei Ereignissen wie z.B. dem Scrolling aufgerufen (noch bevor
307
      // bei Ereignissen wie z.B. dem Scrolling aufgerufen (noch bevor
288
      // OnBeforeScroll aufgerufen wird), bei dem man einen MBOnCloseQuery wünscht.
308
      // OnBeforeScroll aufgerufen wird), bei dem man einen MBOnCloseQuery wünscht.
289
      qryBugs.Tag := 1;
309
      qryBugs.Tag := 1;
290
      qryBugs.Cancel;
310
      qryBugs.Cancel;
291
      qryBugs.Tag := 0;
311
      qryBugs.Tag := 0;
292
    end;
312
    end;
293
  end;
313
  end;
294
end;
314
end;
295
 
315
 
296
procedure TfrmBugtracker.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
316
procedure TfrmBugtracker.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
297
begin
317
begin
298
  qryBugs.Cancel;
318
  qryBugs.Cancel;
299
end;
319
end;
300
 
320
 
301
procedure TfrmBugtracker.FormCreate(Sender: TObject);
321
procedure TfrmBugtracker.FormCreate(Sender: TObject);
302
var
322
var
303
  ini: TMemIniFile;
323
  ini: TMemIniFile;
304
begin
324
begin
305
  ini := TMemIniFile.Create('bugtracker.ini');
325
  ini := TMemIniFile.Create('bugtracker.ini');
306
  try
326
  try
307
    ADOConnection1.Connected := false;
327
    ADOConnection1.Connected := false;
308
    ADOConnection1.ConnectionString := ini.ReadString('Database', 'ConnectionString', '');
328
    ADOConnection1.ConnectionString := ini.ReadString('Database', 'ConnectionString', '');
309
  finally
329
  finally
310
    ini.Free;
330
    ini.Free;
311
  end;
331
  end;
312
 
332
 
313
  ADOConnection1.Connected := true;
333
  ADOConnection1.Connected := true;
314
  qryBugs.Active := true;
334
  qryBugs.Active := true;
315
  tblMitarbeiter.Active := true;
335
  tblMitarbeiter.Active := true;
316
  qryVersionen.Active := true;
336
  qryVersionen.Active := true;
317
  tblProjekte.Active := true;
337
  tblProjekte.Active := true;
318
  qryModule.Active := true;
338
  qryModule.Active := true;
319
  lkpStatus.Active := true;
339
  lkpStatus.Active := true;
320
end;
340
end;
321
 
341
 
322
procedure TfrmBugtracker.Mitarbeiter1Click(Sender: TObject);
342
procedure TfrmBugtracker.Mitarbeiter1Click(Sender: TObject);
323
begin
343
begin
324
  frmMitarbeiter.ShowModal;
344
  frmMitarbeiter.ShowModal;
325
end;
345
end;
326
 
346
 
327
procedure TfrmBugtracker.Module1Click(Sender: TObject);
347
procedure TfrmBugtracker.Module1Click(Sender: TObject);
328
begin
348
begin
329
  frmModule.ShowModal;
349
  frmModule.ShowModal;
330
end;
350
end;
331
 
351
 
332
procedure TfrmBugtracker.NeuFiltern;
352
procedure TfrmBugtracker.NeuFiltern;
333
begin
353
begin
334
  ComboBox1Change(ComboBox1);
354
  ComboBox1Change(ComboBox1);
335
 
355
 
336
  qryModule.SQL.Text := 'SELECT * FROM module WHERE projekt = ' + IntToStr(aktuellesProjekt);
356
  qryModule.SQL.Text := 'SELECT * FROM module WHERE projekt = ' + IntToStr(aktuellesProjekt);
337
  qryModule.Active := true;
357
  qryModule.Active := true;
338
 
358
 
339
  qryVersionen.SQL.Text := 'SELECT * FROM versionen WHERE projekt = ' + IntToStr(aktuellesProjekt);
359
  qryVersionen.SQL.Text := 'SELECT * FROM versionen WHERE projekt = ' + IntToStr(aktuellesProjekt);
340
  qryVersionen.Active := true;
360
  qryVersionen.Active := true;
341
end;
361
end;
342
 
362
 
343
procedure TfrmBugtracker.NotizHinzufuegen(color: TColor; bez: string);
363
procedure TfrmBugtracker.NotizHinzufuegen(color: TColor; bez: string);
344
var
364
var
345
  leerzeilen: integer;
365
  leerzeilen: integer;
346
  umbruch: string;
366
  umbruch: string;
347
  prefix: string;
367
  prefix: string;
348
begin
368
begin
349
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
369
  if not (qryBugs.State in [dsEdit, dsInsert]) then qryBugs.Edit;
350
 
370
 
351
  // Endet der Text mit zwei Zeilenabständen? Wenn nein, dann einfügen.
371
  // Endet der Text mit zwei Zeilenabständen? Wenn nein, dann einfügen.
352
  if Trim(DBRichEdit1.Text) <> '' then
372
  if Trim(DBRichEdit1.Text) <> '' then
353
  begin
373
  begin
354
    leerzeilen := 0;
374
    leerzeilen := 0;
355
    if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-2, 2) = #13#10 then Inc(leerzeilen); // letzte Zeile
375
    if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-2, 2) = #13#10 then Inc(leerzeilen); // letzte Zeile
356
    if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-4, 2) = #13#10 then Inc(leerzeilen); // Vorletzte Zeile
376
    if Copy(DBRichEdit1.Text, 1+Length(DBRichEdit1.Text)-4, 2) = #13#10 then Inc(leerzeilen); // Vorletzte Zeile
357
    case leerzeilen of
377
    case leerzeilen of
358
      0: umbruch := #13#10#13#10;
378
      0: umbruch := #13#10#13#10;
359
      1: umbruch := #13#10;
379
      1: umbruch := #13#10;
360
      2: umbruch := '';
380
      2: umbruch := '';
361
    end;
381
    end;
362
  end
382
  end
363
  else
383
  else
364
  begin
384
  begin
365
    umbruch := '';
385
    umbruch := '';
366
  end;
386
  end;
367
 
387
 
368
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
388
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
369
  DBRichEdit1.SelText := umbruch;
389
  DBRichEdit1.SelText := umbruch;
370
 
390
 
371
  DBRichEdit1.SelAttributes.Size := 13;
391
  DBRichEdit1.SelAttributes.Size := 13;
372
  DBRichEdit1.SelAttributes.Color := color;
392
  DBRichEdit1.SelAttributes.Color := color;
373
  DBRichEdit1.SelAttributes.Style := [fsUnderline];
393
  DBRichEdit1.SelAttributes.Style := [fsUnderline];
374
  if Trim(bez) <> '' then
394
  if Trim(bez) <> '' then
375
    prefix := Trim(bez) + ' - '
395
    prefix := Trim(bez) + ' - '
376
  else
396
  else
377
    prefix := '';
397
    prefix := '';
378
  DBRichEdit1.SelText := prefix + eingeloggtMitarbeiterName + ' ' + FormatDateTime('dd.mm.yyyy hh:nn', Now); // DateTimeToStr(Now);
398
  DBRichEdit1.SelText := prefix + eingeloggtMitarbeiterName + ' ' + FormatDateTime('dd.mm.yyyy hh:nn', Now); // DateTimeToStr(Now);
379
 
399
 
380
  DBRichEdit1.SelAttributes.Size := 10;
400
  DBRichEdit1.SelAttributes.Size := 10;
381
  DBRichEdit1.SelAttributes.Color := clWindowText;
401
  DBRichEdit1.SelAttributes.Color := clWindowText;
382
  DBRichEdit1.SelAttributes.Style := [];
402
  DBRichEdit1.SelAttributes.Style := [];
383
  DBRichEdit1.SelText := #13#10 {+ '<Hier Text eingeben>'};
403
  DBRichEdit1.SelText := #13#10 {+ '<Hier Text eingeben>'};
384
 
404
 
385
  // Ans Ende scrollen
405
  // Ans Ende scrollen
386
  DBRichEdit1.SetFocus;
406
  DBRichEdit1.SetFocus;
387
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
407
  DBRichEdit1.SelStart := DBRichEdit1.GetTextLen;
388
  DBRichEdit1.Perform(EM_SCROLLCARET, 0, 0);
408
  DBRichEdit1.Perform(EM_SCROLLCARET, 0, 0);
389
end;
409
end;
390
 
410
 
391
procedure TfrmBugtracker.Projekte1Click(Sender: TObject);
411
procedure TfrmBugtracker.Projekte1Click(Sender: TObject);
392
begin
412
begin
393
  frmProjekte.ShowModal;
413
  frmProjekte.ShowModal;
394
end;
414
end;
395
 
415
 
396
procedure TfrmBugtracker.Projektwechseln1Click(Sender: TObject);
416
procedure TfrmBugtracker.Projektwechseln1Click(Sender: TObject);
397
begin
417
begin
398
  frmLogin.ShowModal;
418
  frmLogin.ShowModal;
399
end;
419
end;
400
 
420
 
401
end.
421
end.
402
 
422