Search Results for

    Show / Hide Table of Contents

    CalcWheel (FireMonkey Mobile)

    Note

    This demo is available in your FlexCel installation at <FlexCel Install Folder>\Demo\FireMonkey Mobile\Modules\60.CalcWheel and also at https:​//​github.​com/​tmssoftware/​TMS-​FlexCel.​VCL-​demos/​tree/​master/​Fire​Monkey Mobile/​Modules/​60.​Calc​Wheel

    Overview

    This is a simple calculator using the FlexCel engine to do the calculations.

    Concepts

    • In this demo we have many dynamic templates that are used to calculate different stuff. You can add new templates just by copying them to the "Library" folder.

    • CalcWheel will Show the string in the sheet "Data", cell A1, and ask for the value of "Data!B1". It will then recalculate the sheet, and display the value of the cell in "Result" A1 and B1.

    Files

    UCalcWheel.pas

    unit UCalcWheel;
    
    interface
    
    {$if CompilerVersion < 30.0}
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FlexCel.FMXSupport, FlexCel.Core, FlexCel.XlsAdapter,
      FMX.Edit, FMX.Objects, FMX.Platform, FMX.Layouts, FMX.ListBox, FMX.Ani,
      FMX.Controls.Presentation, FMX.TabControl, FMX.ListView.Types, FMX.ListView;
    {$else}
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FlexCel.FMXSupport, FlexCel.Core, FlexCel.XlsAdapter,
      FMX.Edit, FMX.Objects, FMX.Platform, FMX.Layouts, FMX.ListBox, FMX.Ani,
      FMX.Controls.Presentation, FMX.TabControl, FMX.ListView.Types, FMX.ListView,
      FMX.ListView.Appearances, FMX.ListView.Adapters.Base;
    {$endif}
    
    type
      TWheelForm = class(TForm)
        ToolBar1: TToolBar;
        btnCalc: TSpeedButton;
        Wheel: TImage;
        lblCurrent: TLabel;
        ColorKeyAnimation1: TColorKeyAnimation;
        Pages: TTabControl;
        TabData: TTabItem;
        TabConfig: TTabItem;
        edEntry: TEdit;
        edResult: TEdit;
        lblEntry: TLabel;
        lblResult: TLabel;
        TemplateSelect: TListView;
        procedure btnCalcClick(Sender: TObject);
        procedure WheelClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure TemplateSelectItemClick(const Sender: TObject;
          const AItem: TListViewItem);
        procedure PagesChange(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        Workbook: TXlsFile;
    
        procedure LoadConfig;
        procedure CreateConfig;
        function GetCell(const sheet: string; const r, c: integer): string;
        function ConfigFile: string;
        function DocFolder: string;
        procedure Calc;
        procedure RefreshTemplates;
      public
        { Public declarations }
      end;
    
    var
      WheelForm: TWheelForm;
    
    implementation
    uses IOUtils;
    
    {$R *.fmx}
    
    function TWheelForm.GetCell(const sheet: string; const r, c: integer): string;
    var
      ResultIndex: integer;
    begin
      Result := '*Error*';
      ResultIndex := Workbook.GetSheetIndex(sheet, false);
      if (ResultIndex < 1) then
      begin
        exit;
      end;
      Workbook.ActiveSheet := ResultIndex;
      Result := Workbook.GetStringFromCell(r, c);
    end;
    
    function TWheelForm.ConfigFile: string;
    begin
      Result := TPath.GetDocumentsPath + '/Preferences/config.txt';
    end;
    
    function TWheelForm.DocFolder: string;
    begin
      Result := TPath.GetDocumentsPath + '/';
    end;
    
    procedure TWheelForm.LoadConfig;
    var
      sr: TStreamReader;
      fn: string;
    begin
      FreeAndNil(Workbook);
      sr := nil;
      try
        try
          if (TFile.Exists(ConfigFile)) then
          begin
            sr := TStreamReader.Create(ConfigFile);
            fn := sr.ReadLine;
          end else
          begin
            fn := DocFolder + 'default.xls';
          end;
          if fn = '' then Workbook := TXlsFile.Create(1, true) else Workbook := TXlsFile.Create(fn, true);
        except on ex: Exception do
          begin
            Workbook := TXlsFile.Create(1, true);
          end;
        end;
      finally
        sr.Free;
      end;
    
      lblCurrent.Text := TPath.GetFileNameWithoutExtension(Workbook.ActiveFileName);
      lblEntry.Text := GetCell('Data', 1, 1);
      Calc;
    end;
    
    procedure TWheelForm.RefreshTemplates;
    var
      fn: string;
      files: TStringDynArray;
      li: TListViewItem;
    begin
      TemplateSelect.BeginUpdate;
      try
        TemplateSelect.Items.Clear;
        files := TDirectory.GetFiles(DocFolder, '*.xls');
        for fn in files do
        begin
          li := TemplateSelect.Items.Add;
          li.Text :=  TPath.GetFileNameWithoutExtension(fn);
        end;
      finally
        TemplateSelect.EndUpdate;
      end;
    end;
    
    procedure TWheelForm.PagesChange(Sender: TObject);
    begin
      if (Pages.ActiveTab = TabConfig) then RefreshTemplates;
    
    end;
    
    procedure TWheelForm.TemplateSelectItemClick(const Sender: TObject;
      const AItem: TListViewItem);
    begin
      if (AItem <> nil) then
      begin
        try
          Workbook.Open(DocFolder + AItem.Text + '.xls');
        except
          ShowMessage('Invalid file: ' + AItem.Text);
          Workbook.NewFile(1, TExcelFileFormat.v2019);
        end;
    
        CreateConfig;
        LoadConfig;
      end;
      Pages.ActiveTab := TabData;
    
    end;
    
    procedure TWheelForm.CreateConfig;
    var
      sw: TStreamWriter;
    begin
         TDirectory.CreateDirectory(TPath.GetDirectoryName(ConfigFile));
         sw := TStreamWriter.Create(ConfigFile);
         try
           sw.WriteLine(Workbook.ActiveFileName);
         finally
           sw.Free;
         end;
    end;
    
    procedure TWheelForm.Calc;
    var
      DataIndex, ResultIndex: integer;
    begin
      DataIndex := Workbook.GetSheetIndex('Data', false);
      if (DataIndex < 1) then
      begin
        ShowMessage('Can''t find the sheet "Data"');
        exit;
      end;
    
      Workbook.ActiveSheet := DataIndex;
      Workbook.SetCellFromString(1, 2, edEntry.Text);
    
      ResultIndex := Workbook.GetSheetIndex('Result', false);
      if (ResultIndex < 1) then
      begin
        ShowMessage('Can''t find the sheet "Result"');
        exit;
      end;
    
      Workbook.Recalc;
    
      Workbook.ActiveSheet := ResultIndex;
      lblResult.Text := Workbook.GetStringFromCell(1,1);
      edResult.Text := Workbook.GetStringFromCell(1,2);
    end;
    
    procedure TWheelForm.btnCalcClick(Sender: TObject);
    begin
      Calc;
    end;
    
    procedure TWheelForm.FormCreate(Sender: TObject);
    begin
      LoadConfig;
    end;
    
    procedure TWheelForm.FormDestroy(Sender: TObject);
    begin
      Workbook.Free;
    end;
    
    procedure TWheelForm.WheelClick(Sender: TObject);
    begin
      Pages.ActiveTab := TabConfig;
    end;
    
    end.
    
    In This Article
    Back to top FlexCel Studio for VCL and FireMonkey v7.24
    © 2002 - 2025 tmssoftware.com