Subversion Repositories winbugtracker

Rev

Rev 6 | Rev 8 | 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.  * NOT INCLUDED:
  20.  * - duplicate of
  21.  *
  22.  * FUTURE:
  23.  * - HS Info integration
  24.  *)
  25.  
  26. interface
  27.  
  28. uses
  29.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  30.   Dialogs, WideStrings, DB, SqlExpr, StdCtrls, ExtCtrls, DBCtrls,
  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;
  90.     LblAngemeldet: TLabel;
  91.     Label7: TLabel;
  92.     Label8: TLabel;
  93.     DBLookupComboBox4: TDBLookupComboBox;
  94.     qryBugserfasser: TIntegerField;
  95.     qryBugsversion_agenda: TIntegerField;
  96.     Label9: TLabel;
  97.     cbxErfasser: TDBLookupComboBox;
  98.     Label10: TLabel;
  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);
  115.     procedure btnBearbeitungsnotizClick(Sender: TObject);
  116.   public
  117.     eingeloggtMitarbeiter: integer;
  118.     eingeloggtMitarbeiterName: string;
  119.     aktuellesProjekt: integer;
  120.     aktuellesProjektName: string;
  121.     procedure NeuFiltern;
  122.     procedure NotizHinzufuegen(color: TColor; bez: string);
  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
  137.   qryBugs.FieldByName('wichtigkeit').AsInteger := 5; // Mitte
  138.   qryBugs.FieldByName('erstellt').AsDateTime := Now;
  139.   qryBugs.FieldByName('erfasser').AsInteger := eingeloggtMitarbeiter;
  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.  
  199. procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
  200. begin
  201.   NotizHinzufuegen(clRed, 'Notiz');
  202. end;
  203.  
  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
  208.   begin
  209.     qryBugs.FieldByName('fixdatum').AsDateTime := Now;
  210.     NotizHinzufuegen(clGreen, 'Gefixt');
  211.   end
  212.   else
  213.   begin
  214.     qryBugs.FieldByName('fixdatum').Clear;
  215.     NotizHinzufuegen(clBlue, 'Neu eröffnet');
  216.   end;
  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
  257.     ADOConnection1.Connected := false;
  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.  
  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.  
  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.
  344.