Skip to main navigation Skip to main content Skip to page footer
unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.WideStrUtils,
  System.DateUtils, System.UITypes, System.IOUtils, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  Vcl.ExtCtrls, DataModule, Data.DB, Vcl.Grids, Vcl.DBGrids, Vcl.GraphUtil, FlatDesignColorsFull, Vcl.Menus,
  Vcl.WinXCtrls, Data.Win.ADODB, Vcl.DBCtrls, Vcl.DBCGrids, DetailForm, Vcl.ComCtrls, TL.Components, RaboBrowser;

const
  wm_AppStarted = wm_User + 101;

type
  TfrmMain = class(TLForm)
    pnlButtons: TPanel;
    btnDecYear: TButton;
    btnIncYear: TButton;
    btnShowSubCat: TButton;
    lblYear: TLabel;
    pnlMain: TPanel;
    LDBGridCat: TLDBGrid;
    LDBGridSubCat: TLDBGrid;
    Splitter1: TSplitter;
    MainMenu: TMainMenu;
    Exit2: TMenuItem;
    Import1: TMenuItem;
    Import2: TMenuItem;
    Categorien1: TMenuItem;
    Categorien2: TMenuItem;
    Budget1: TMenuItem;
    AssigCategories1: TMenuItem;
    Mutaties1: TMenuItem;
    Aftrekpostenbelastingaangifte1: TMenuItem;
    FileOpenDialog: TFileOpenDialog;
    btnToonDetails: TButton;
    StatusBar1: TStatusBar;
    btnLeft: TButton;
    btnRight: TButton;
    pnlGrids: TPanel;
    RaboBank1: TMenuItem;
    btnShowBudgetPlan: TButton;
    Help1: TMenuItem;
    AboutFinAdm1: TMenuItem;
    procedure btnShowSubCatClick(Sender: TObject);
    procedure btnDecYearClick(Sender: TObject);
    procedure btnIncYearClick(Sender: TObject);
    procedure LDBGridCatDrawColumnCell(
      Sender: TObject;
      const Rect: TRect;
      DataCol: Integer;
      Column: TColumn;
      State: TGridDrawState);
    procedure FormCreate(Sender: TObject);
    procedure LDBGridSubCatDrawColumnCell(
      Sender: TObject;
      const Rect: TRect;
      DataCol: Integer;
      Column: TColumn;
      State: TGridDrawState);
    procedure Splitter1Moved(Sender: TObject);
    procedure Categorien1Click(Sender: TObject);
    procedure Budget1Click(Sender: TObject);
    procedure Import1Click(Sender: TObject);
    procedure AssigCategories1Click(Sender: TObject);
    procedure Mutaties1Click(Sender: TObject);
    procedure Aftrekpostenbelastingaangifte1Click(Sender: TObject);
    procedure btnToonDetailsClick(Sender: TObject);
    procedure AssignCategories;
    function Import(AFileName: string): boolean;
    procedure btnLeftClick(Sender: TObject);
    procedure btnRightClick(Sender: TObject);
    procedure FormKeyDown(
      Sender: TObject;
      var Key: Word;
      Shift: TShiftState);
    procedure LDBGridCatKeyDown(
      Sender: TObject;
      var Key: Word;
      Shift: TShiftState);
    procedure LDBGridSubCatColEnter(Sender: TObject);
    procedure RaboBank1Click(Sender: TObject);
    procedure btnShowBudgetPlanClick(Sender: TObject);
    procedure AboutFinAdm1Click(Sender: TObject);
  private
    ShowBudgetPlan: bool;
    { Private declarations }
    procedure Refresh(
      DataSet: TDataSet;
      Grid: TLDBGrid);
    procedure wmAppStarted(var Msg: tMessage); message wm_AppStarted;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

uses
  BudgetForm, MutatiesForm, CategoriesForm, ReportForm, LoginForm, MessageForm, ProgressForm, AboutForm;

function Locate(
  DataSet: TDataSet;
  FieldName: string;
  FieldValue: variant): boolean;
// var
// BM: TBookmark;
begin
  Result:= False;
  if DataSet.IsEmpty then
    Exit;
  // BM := DataSet.Bookmark;
  DataSet.DisableControls;
  try
    DataSet.First;
    while not DataSet.eof do
      begin
        if LowerCase(DataSet.FieldByname(FieldName).Value) = LowerCase(FieldValue) then
          begin
            Result:= True;
            Break;
          end;
        DataSet.Next;
      end;
    // if not Result then DataSet.Bookmark := BM;
  finally
    DataSet.EnableControls;
  end;
end;

function TfrmMain.Import(AFileName: string): boolean;
var
  FileNameFull, FileName: string;
  ImportPath: string;
begin
  Result:= False;
  if AFileName = '' then
    begin
      FileOpenDialog.DefaultFolder:= Folder.DownLoads;
      if FileOpenDialog.Execute then
        begin
          FileNameFull:= FileOpenDialog.FileName;
          FileName:= ExtractFileName(FileNameFull);
        end
      else
        Exit;
    end
  else
    begin
      FileNameFull:= AFileName;
      FileName:= ExtractFileName(FileNameFull);
    end;

  // Creates a new directory, including the creation of parent directories as needed
  ImportPath:= Folder.ProgramData + '\Langstraat\FinAdm\Import\';
  if not System.SysUtils.ForceDirectories(ImportPath) then
    raise Exception.Create(ImportPath);

  // Refresh
  dm.DataSetImportHistory.Close;
  dm.DataSetImportHistory.Open;

  if not Locate(dm.DataSetImportHistory, 'FileName', FileName) then
    begin
      dm.DataSetImportHistory.AppendRecord([nil, nil, nil, ExtractFileName(FileName)]);
      dm.CommandImport.CommandText:= WideStringReplace(
        dm.CommandImport.CommandText,
        'filename.csv',
        FileNameFull.Replace('\', '/'),
        [rfReplaceAll, rfIgnoreCase]);
      dm.CommandImport.Execute;

      TFile.Move(
        FileNameFull,
        ImportPath + FileName);
      MessageDlg(
        'Het bestand: ' + FileName + ' is succesvol geïmporteerd!',
        mtInformation,
        [mbOk],
        0,
        mbOk);
      Result:= True;
    end
  else
    MessageDlg(
      'Het bestand: ' + FileName + ' is al geïmporteerd!',
      mtInformation,
      [mbOk],
      0,
      mbOk);
end;

procedure TfrmMain.Import1Click(Sender: TObject);
begin
  if Self.Import('') then
    begin
      Self.AssignCategories;

      // Refresh
      frmMutaties.GridMutaties.DataSource.DataSet.Close;
      frmMutaties.GridMutaties.DataSource.DataSet.Open;
      frmMutaties.ToggleSwitchNotAssigned.State:= tssOn;
      frmMutaties.ShowModal;

      // Refresh
      Refresh(
        dm.DataSetReportCat,
        Self.LDBGridCat);
      Refresh(
        dm.DataSetReportSubCat,
        Self.LDBGridSubCat);
    end;
end;

procedure TfrmMain.RaboBank1Click(Sender: TObject);
begin
  frmRaboBrowser:= TfrmRaboBrowser.Create(Self);
  try
    frmRaboBrowser.LoadConfig;
    frmRaboBrowser.ShowModal;
    frmRaboBrowser.SaveConfig;
    if frmRaboBrowser.FResultFilePath <> '' then
      if Import(frmRaboBrowser.FResultFilePath) then
        begin
          frmMessage:= TfrmMessage.Create(nil);
          try
            frmMessage.Caption:= 'Processing...';
            frmMessage.Label1.Caption:= 'Automatic category assignment is performed, please wait...';
            frmMessage.Show;
            Application.ProcessMessages;
            Self.AssignCategories;
          finally
            frmMessage.Free;
          end;
          // Refresh
          frmMutaties.GridMutaties.DataSource.DataSet.Close;
          frmMutaties.GridMutaties.DataSource.DataSet.Open;
          frmMutaties.ToggleSwitchNotAssigned.State:= tssOn;
          frmMutaties.ShowModal;

          // Refresh
          Refresh(
            dm.DataSetReportCat,
            Self.LDBGridCat);
          Refresh(
            dm.DataSetReportSubCat,
            Self.LDBGridSubCat);
        end;

  finally
    frmRaboBrowser.Free;
  end;
end;

procedure TfrmMain.Refresh(
  DataSet: TDataSet;
  Grid: TLDBGrid);
begin
  DataSet.Active:= False;
  DataSet.Active:= True;
  Grid.SetColumnAttr;
  Self.LDBGridSubCat.Columns[0].Width:= Self.LDBGridCat.Columns[0].Width;
end;

procedure TfrmMain.Splitter1Moved(Sender: TObject);
begin
  Self.RegVars.Values['SubCatHeigth']:= IntToStr(Self.LDBGridSubCat.Height);
end;

procedure TfrmMain.AboutFinAdm1Click(Sender: TObject);
begin
  frmAbout.Execute;
end;

procedure TfrmMain.Aftrekpostenbelastingaangifte1Click(Sender: TObject);
begin
  frmReport.RLReport1.PreviewModal;
end;

procedure TfrmMain.AssignCategories;
var
  Splitted: TArray<string>;
  i: Integer;
var
  AdoQuery: TADOQuery;
  S: string;
  ADOCommand: TADOCommand;
  RecCount: Integer;
begin
  AdoQuery:= TADOQuery.Create(nil);
  try
    AdoQuery.Connection:= dm.Connection;
    AdoQuery.SQL.Add('SELECT * FROM AutoAssignCategorie');
    AdoQuery.Open;

    frmProgress.Show;
    RecCount:= 0;
    while not AdoQuery.eof do
      begin
        Inc(RecCount);
        frmProgress.ProgressBar.Position:= Round(RecCount / (AdoQuery.RecordCount) * 100);
        Application.ProcessMessages;
        S:= AdoQuery.FieldByname('Zoekstring').AsString;
        Splitted:= S.Split([';']);
        for i:= 0 to Length(Splitted) - 1 do
          begin
            ADOCommand:= TADOCommand.Create(nil);
            try
              ADOCommand.Connection:= dm.Connection;
              ADOCommand.Parameters.Clear;
              ADOCommand.CommandText:=
                'UPDATE Mutaties SET Categorie=:Cat, Subcategorie=:Subcat WHERE `Categorie` = 0 AND (`Naam_tegenpartij` LIKE :Zoekstr1 OR `Omschrijving_1` LIKE :Zoekstr2)';
              ADOCommand.ParamCheck:= False;
              ADOCommand.Parameters.ParamByName('Cat').Value:= AdoQuery.FieldByname('CategorieID').AsString;
              ADOCommand.Parameters.ParamByName('Subcat').Value:= AdoQuery.FieldByname('SubcategorieID').AsString;
              ADOCommand.Parameters.ParamByName('Zoekstr1').Value:= Splitted[i];
              ADOCommand.Parameters.ParamByName('Zoekstr2').Value:= Splitted[i];
              ADOCommand.Execute;
            finally
              ADOCommand.Free;
            end;
          end;
        AdoQuery.Next;
      end;
  finally
    AdoQuery.Free;
    frmProgress.hide;
  end;
  frmMutaties.GridMutaties.DataSource.DataSet.Close;
  frmMutaties.GridMutaties.DataSource.DataSet.Open;
end;

procedure TfrmMain.AssigCategories1Click(Sender: TObject);
begin
  AssignCategories;
  frmMutaties.ShowModal;
end;

procedure TfrmMain.btnDecYearClick(Sender: TObject);
var
  Jaar: Integer;
begin
  Jaar:= dm.DataSetReportCat.Parameters.ParamByName('Jaar').Value;
  Dec(Jaar);
  Self.lblYear.Caption:= Jaar.ToString;
  Self.RegVars.Values['CurrentYear']:= Jaar.ToString;

  for var i:= 0 to dm.DataSetReportCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportCat.Parameters[i].Name = 'CatInkomsten' then
        dm.DataSetReportCat.Parameters[i].Value:= 16;
    end;
  Refresh(
    dm.DataSetReportCat,
    LDBGridCat);

  for var i:= 0 to dm.DataSetReportSubCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportSubCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Cat' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('ID').AsInteger;
      if dm.DataSetReportSubCat.Parameters[i].Name = 'VasteKosten' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('VK').AsInteger;
    end;
  Refresh(
    dm.DataSetReportSubCat,
    LDBGridSubCat);
end;

procedure TfrmMain.btnIncYearClick(Sender: TObject);
var
  Jaar: Integer;
begin
  Jaar:= dm.DataSetReportCat.Parameters.ParamByName('Jaar').Value;
  Inc(Jaar);
  Self.lblYear.Caption:= Jaar.ToString;
  Self.RegVars.Values['CurrentYear']:= Jaar.ToString;

  for var i:= 0 to dm.DataSetReportCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportCat.Parameters[i].Name = 'CatInkomsten' then
        dm.DataSetReportCat.Parameters[i].Value:= 16;
    end;
  Refresh(
    dm.DataSetReportCat,
    LDBGridCat);

  for var i:= 0 to dm.DataSetReportSubCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportSubCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Cat' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('ID').AsInteger;
      if dm.DataSetReportSubCat.Parameters[i].Name = 'VasteKosten' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('VK').AsInteger;
    end;
  Refresh(
    dm.DataSetReportSubCat,
    LDBGridSubCat);
end;

procedure TfrmMain.btnLeftClick(Sender: TObject);
begin
  // Shift left
  for var i:= 1 to Self.LDBGridCat.Columns.Count - 2 do
    Self.LDBGridCat.Columns[i].Visible:= Self.LDBGridCat.Columns[i + 1].Visible;
  Self.LDBGridCat.Columns[Self.LDBGridCat.Columns.Count - 1].Visible:= True;
  // Sync SubCatGrid
  for var i:= 1 to Self.LDBGridCat.Columns.Count - 1 do
    Self.LDBGridSubCat.Columns[i].Visible:= Self.LDBGridCat.Columns[i].Visible;
end;

procedure TfrmMain.btnRightClick(Sender: TObject);
begin
  // Shift Right
  for var i:= Self.LDBGridCat.Columns.Count - 1 downto 2 do
    Self.LDBGridCat.Columns[i].Visible:= Self.LDBGridCat.Columns[i - 1].Visible;
  Self.LDBGridCat.Columns[1].Visible:= False;
  // Sync SubCatGrid
  for var i:= 1 to Self.LDBGridCat.Columns.Count - 1 do
    Self.LDBGridSubCat.Columns[i].Visible:= Self.LDBGridCat.Columns[i].Visible;
end;

procedure TfrmMain.btnShowSubCatClick(Sender: TObject);
begin
  if Self.LDBGridSubCat.Height = 0 then
    Self.LDBGridSubCat.Height:= 300;

  Self.LDBGridSubCat.Visible:= Self.LDBGridSubCat.Visible xor True;
  Self.btnToonDetails.Visible:= Self.LDBGridSubCat.Visible;
  Self.Splitter1.Visible:= Self.LDBGridSubCat.Visible;
  if Self.LDBGridSubCat.Visible then
    Self.btnShowSubCat.Caption:= 'Verberg Subcategoriën'
  else
    Self.btnShowSubCat.Caption:= 'Toon Subcategoriën';
  Self.RegVars.Values['SubCatVisible']:= BoolToStr(Self.LDBGridSubCat.Visible);
end;

procedure TfrmMain.Budget1Click(Sender: TObject);
begin
  frmBudget.ShowModal
end;

procedure TfrmMain.btnShowBudgetPlanClick(Sender: TObject);
begin
  if ShowBudgetPlan then
    begin
      Self.btnLeft.Visible:= True;
      Self.btnRight.Visible:= True;
      for var i:= 0 to Self.LDBGridCat.Columns.Count - 1 do
        begin
          if Self.LDBGridCat.Columns[i].Title.Caption[1] = 'P' then
            Self.LDBGridCat.Columns[i].Visible:= True;
          if Self.LDBGridSubCat.Columns[i].Title.Caption[1] = 'P' then
            Self.LDBGridSubCat.Columns[i].Visible:= True;
        end;
      Self.btnShowBudgetPlan.Caption:= 'Verberg budgetplan';
    end
  else
    begin
      Self.btnLeft.Visible:= False;
      Self.btnRight.Visible:= False;
      for var i:= 0 to Self.LDBGridCat.Columns.Count - 1 do
        begin
          if Self.LDBGridCat.Columns[i].Title.Caption[1] = 'P' then
            Self.LDBGridCat.Columns[i].Visible:= False;
          if Self.LDBGridSubCat.Columns[i].Title.Caption[1] = 'P' then
            Self.LDBGridSubCat.Columns[i].Visible:= False;
        end;
      Self.btnShowBudgetPlan.Caption:= 'Toon budgetplan';
    end;
  ShowBudgetPlan:= ShowBudgetPlan xor True;
  Self.RegVars.Values['ShowBudgetPlan']:= BoolToStr(ShowBudgetPlan);
  frmMain.SaveConfig;
end;

procedure TfrmMain.btnToonDetailsClick(Sender: TObject);
begin
  if frmDetail.Visible then
    begin
      btnToonDetails.Caption:= 'Toon details';
      frmDetail.Close;
    end
  else
    begin
      btnToonDetails.Caption:= 'Verberg details';
      frmDetail.Show;
    end;
end;

procedure TfrmMain.Categorien1Click(Sender: TObject);
begin
  frmCategories.Show;
end;

procedure TfrmMain.wmAppStarted(var Msg: tMessage);
begin
  for var i:= 0 to dm.DataSetReportCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportCat.Parameters[i].Name = 'CatInkomsten' then
        dm.DataSetReportCat.Parameters[i].Value:= 16;

      if dm.DataSetReportCat.Parameters[i].Name = 'BetaalRekening' then
        dm.DataSetReportCat.Parameters[i].Value:= Self.RegVars.Values['BetaalRekening'];
      if dm.DataSetReportCat.Parameters[i].Name = 'SpaarRekening' then
        dm.DataSetReportCat.Parameters[i].Value:= Self.RegVars.Values['SpaarRekening'];

    end;

  dm.DataSetReportCat.Active:= False;
  dm.DataSetReportCat.Active:= True;
  Self.LDBGridCat.SetColumnAttr;

  for var i:= 0 to dm.DataSetReportSubCat.Parameters.Count - 1 do
    begin
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Jaar' then
        dm.DataSetReportSubCat.Parameters[i].Value:= Self.RegVars.Values['CurrentYear'];
      if dm.DataSetReportSubCat.Parameters[i].Name = 'Cat' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('ID').AsInteger;
      if dm.DataSetReportSubCat.Parameters[i].Name = 'VasteKosten' then
        dm.DataSetReportSubCat.Parameters[i].Value:= dm.DataSetReportCat.FieldByname('VK').AsInteger;

      if dm.DataSetReportSubCat.Parameters[i].Name = 'BetaalRekening' then
        dm.DataSetReportSubCat.Parameters[i].Value:= Self.RegVars.Values['BetaalRekening'];
      if dm.DataSetReportSubCat.Parameters[i].Name = 'SpaarRekening' then
        dm.DataSetReportSubCat.Parameters[i].Value:= Self.RegVars.Values['SpaarRekening'];

    end;

  dm.DataSetReportSubCat.Active:= False;
  dm.DataSetReportSubCat.Active:= True;
  Self.LDBGridSubCat.SetColumnAttr;

  Self.lblYear.Caption:= Self.RegVars.Values['CurrentYear'];
  dm.DataSetBudgetJaar.Locate(
    'Jaar',
    Self.RegVars.Values['CurrentBudgetYear'],
    []);

  Self.LDBGridSubCat.Columns[0].Width:= Self.LDBGridCat.Columns[0].Width;
  Self.LDBGridCat.repaint;

  frmCategories.GridCategories.SetColumnAttr;

  frmCategories.GridSubcategories.SetColumnAttr;
  frmBudget.initGrids;
  Self.btnShowBudgetPlanClick(Self);
  Self.pnlMain.Visible:= True;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Self.StatusBar1.Panels[1].Text:= PixelsPerInch.ToString;
  Self.StatusBar1.Panels[3].Text:= Screen.Width.ToString;
  Self.StatusBar1.Panels[5].Text:= Screen.Height.ToString;
  Self.StatusBar1.Panels[7].Text:= (PixelsPerInch * 100 / 96).ToString + '%';

  Self.RegVars.Values['CurrentYear']:= IntToStr(CurrentYear);
  Self.RegVars.Values['SubCatVisible']:= BoolToStr(Self.LDBGridSubCat.Visible);
  Self.RegVars.Values['SubCatHeigth']:= IntToStr(Self.LDBGridSubCat.Height);
  Self.RegVars.Values['CurrentBudgetYear']:= IntToStr(CurrentYear);
  Self.RegVars.Values['ShowBudgetPlan']:= BoolToStr(False);
  Self.RegVars.Values['BetaalRekening']:= 'NL83RABO0146805151';
  Self.RegVars.Values['SpaarRekening']:= 'NL65RABO3582228673';

  Self.LoadConfig;

  if StrToBool(Self.RegVars.Values['ShowBudgetPlan']) then
    ShowBudgetPlan:= True
  else
    ShowBudgetPlan:= False;
  Self.btnShowBudgetPlanClick(Self);

  if StrToBool(Self.RegVars.Values['SubCatVisible']) then
    begin
      Self.LDBGridSubCat.Height:= StrToInt(Self.RegVars.Values['SubCatHeigth']);
      if Self.LDBGridSubCat.Height = 0 then
        Self.LDBGridSubCat.Height:= 300;
      Self.LDBGridSubCat.Visible:= True;
      Self.Splitter1.Visible:= True;
    end
  else
    begin
      Self.LDBGridSubCat.Visible:= False;
      Self.Splitter1.Visible:= False;
      repaint;
      Application.ProcessMessages;
    end;
  if Self.LDBGridSubCat.Visible then
    Self.btnShowSubCat.Caption:= 'Verberg Subcategoriën'
  else
    Self.btnShowSubCat.Caption:= 'Toon Subcategoriën';
  Self.btnToonDetails.Visible:= Self.LDBGridSubCat.Visible;

  frmMain.Caption:= 'Financiële Administratie - ' + TL.Components.Folder.AppVersion;
  PostMessage(
    handle,
    wm_AppStarted,
    0,
    0);
end;

procedure TfrmMain.FormKeyDown(
  Sender: TObject;
  var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN:
      ;
    VK_UP:
      ;
    VK_RIGHT:
      begin
        btnRightClick(Self);
        Key:= 0;
      end;
    VK_LEFT:
      begin
        btnLeftClick(Self);
        Key:= 0;
      end;
  end;
end;

procedure TfrmMain.LDBGridCatDrawColumnCell(
  Sender: TObject;
  const Rect: TRect;
  DataCol: Integer;
  Column: TColumn;
  State: TGridDrawState);
var
  Grid: TLDBGrid;
begin
  // Locale variables for coding convinience ;)
  Grid:= (Sender as TLDBGrid);
  Grid.SetStyle(
    DataCol,
    Grid,
    Column,
    State,
    Grid.DataSource.DataSet.FieldByname('SoortID').AsInteger,
    Grid.DataSource.DataSet.FieldByname('ID').AsInteger);
end;

procedure TfrmMain.LDBGridCatKeyDown(
  Sender: TObject;
  var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN:
      ;
    VK_UP:
      ;
    VK_RIGHT:
      btnRightClick(Self);
    VK_LEFT:
      btnLeftClick(Self);
  end;
end;

procedure TfrmMain.LDBGridSubCatColEnter(Sender: TObject);
begin
  var
  Field:= Self.LDBGridSubCat.SelectedField;
  var
  name:= Field.FieldName;
  if (name[1] = 'A') and (CharInSet(name[2], ['1' .. '9'])) then
    begin
      frmDetail.Maand:= name.Remove(0, 1).ToInteger;
      frmDetail.Jaar:= Self.RegVars.Values['CurrentYear'].ToInteger;
      frmDetail.Cat:= dm.DataSetReportSubCat.FindField('ID').AsInteger;
      frmDetail.SubCat:= dm.DataSetReportSubCat.FindField('SubID').AsInteger;
      frmDetail.Refresh;
    end
  else
    begin
      dm.DataSetReportDetail.Close;
      frmDetail.Caption:= ' Mutaties';
    end;
end;

procedure TfrmMain.LDBGridSubCatDrawColumnCell(
  Sender: TObject;
  const Rect: TRect;
  DataCol: Integer;
  Column: TColumn;
  State: TGridDrawState);
var
  Grid: TLDBGrid;
begin
  // Create some local variables to write more readable code
  Grid:= (Sender as TLDBGrid);
  Grid.SetStyle(
    DataCol,
    Grid,
    Column,
    State,
    Grid.DataSource.DataSet.FieldByname('SoortID').AsInteger,
    Grid.DataSource.DataSet.FieldByname('ID').AsInteger);
end;

procedure TfrmMain.Mutaties1Click(Sender: TObject);
begin
  frmMutaties.Show;
  // ververs de datasets, er kunnen categorien toegewezen zijn in frmMutaties.
  Refresh(
    dm.DataSetReportCat,
    Self.LDBGridCat);
  Refresh(
    dm.DataSetReportSubCat,
    Self.LDBGridSubCat);
end;

end.