Subversion Repositories winbugtracker

Rev

Rev 4 | Rev 6 | 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, 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;
  84.     LblAngemeldet: TLabel;
  85.     Label7: TLabel;
  86.     Label8: TLabel;
  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);
  103.     procedure btnBearbeitungsnotizClick(Sender: TObject);
  104.   public
  105.     eingeloggtMitarbeiter: integer;
  106.     eingeloggtMitarbeiterName: string;
  107.     aktuellesProjekt: integer;
  108.     aktuellesProjektName: string;
  109.     procedure NeuFiltern;
  110.     procedure NotizHinzufuegen(color: TColor; bez: string);
  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.  
  185. procedure TfrmBugtracker.btnBearbeitungsnotizClick(Sender: TObject);
  186. begin
  187.   NotizHinzufuegen(clRed, 'Notiz');
  188. end;
  189.  
  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
  194.   begin
  195.     qryBugs.FieldByName('fixdatum').AsDateTime := Now;
  196.     NotizHinzufuegen(clGreen, 'Gefixt');
  197.   end
  198.   else
  199.   begin
  200.     qryBugs.FieldByName('fixdatum').Clear;
  201.     NotizHinzufuegen(clBlue, 'Neu eröffnet');
  202.   end;
  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.  
  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.  
  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.
  329.