Subversion Repositories winbugtracker

Rev

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

  1. unit BugtrackerMain;
  2.  
  3. (*
  4.  * TODO:
  5.  * - abfragen ob speichern wenn fenster geschlossen wird
  6.  * - Spezielle Filter
  7.  *   ... Auflisten nach Modul
  8.  *   ... Anzeigen der Agenda
  9.  * - verbinden mit ticketsystem von HS
  10.  * - rtf controls?
  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)
  18.  *)
  19.  
  20. interface
  21.  
  22. uses
  23.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  24.   Dialogs, 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;
  84.     LblAngemeldet: TLabel;
  85.     Label7: TLabel;
  86.     Label8: TLabel;
  87.     DBLookupComboBox4: TDBLookupComboBox;
  88.     qryBugserfasser: TIntegerField;
  89.     qryBugsversion_agenda: TIntegerField;
  90.     Label9: TLabel;
  91.     cbxErfasser: TDBLookupComboBox;
  92.     Label10: TLabel;
  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);
  109.     procedure btnBearbeitungsnotizClick(Sender: TObject);
  110.   public
  111.     eingeloggtMitarbeiter: integer;
  112.     eingeloggtMitarbeiterName: string;
  113.     aktuellesProjekt: integer;
  114.     aktuellesProjektName: string;
  115.     procedure NeuFiltern;
  116.     procedure NotizHinzufuegen(color: TColor; bez: string);
  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
  131.   qryBugs.FieldByName('wichtigkeit').AsInteger := 5; // Mitte
  132.   qryBugs.FieldByName('erstellt').AsDateTime := Now;
  133.   qryBugs.FieldByName('erfasser').AsInteger := eingeloggtMitarbeiter;
  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.  
  193. procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
  194. begin
  195.   NotizHinzufuegen(clRed, 'Notiz');
  196. end;
  197.  
  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
  202.   begin
  203.     qryBugs.FieldByName('fixdatum').AsDateTime := Now;
  204.     NotizHinzufuegen(clGreen, 'Gefixt');
  205.   end
  206.   else
  207.   begin
  208.     qryBugs.FieldByName('fixdatum').Clear;
  209.     NotizHinzufuegen(clBlue, 'Neu eröffnet');
  210.   end;
  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
  251.     ADOConnection1.Connected := false;
  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.  
  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.  
  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.
  338.