fpspreadsheet: Add dataset example

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8097 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2021-09-24 21:30:14 +00:00
parent 7e742dbdaa
commit 37c1130a12
11 changed files with 959 additions and 0 deletions

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<Title Value="DatasetDemo"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="FCL"/>
</Item>
<Item>
<PackageName Value="laz_fpspreadsheet_dataset"/>
</Item>
<Item>
<PackageName Value="LCL"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="DatasetDemo.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="DatasetDemo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,25 @@
program DatasetDemo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
{$IFDEF HASAMIGA}
athreads,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, main
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -0,0 +1,451 @@
object MainForm: TMainForm
Left = 285
Height = 542
Top = 131
Width = 1068
Caption = 'fpsWorksheet Demo: Filtering, Searching, Sorting, Bookmarks'
ClientHeight = 542
ClientWidth = 1068
OnCreate = FormCreate
LCLVersion = '2.3.0.0'
object DBGrid: TDBGrid
Left = 0
Height = 482
Top = 60
Width = 1068
Align = alClient
AlternateColor = clBtnFace
Color = clWindow
Columns = <>
DataSource = DataSource
Options = [dgTitles, dgIndicator, dgColumnResize, dgColumnMove, dgColLines, dgRowLines, dgTabs, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgAnyButtonCanSelect, dgTruncCellHints, dgThumbTracking]
PopupMenu = DBGridPopupMenu
ShowHint = True
TabOrder = 0
TitleImageList = ImageList12
OnTitleClick = DBGridTitleClick
end
object ToolBar: TToolBar
Left = 0
Height = 26
Top = 34
Width = 1068
Caption = 'ToolBar'
Images = ImageList16
TabOrder = 1
object DBNavigator1: TDBNavigator
Left = 1
Height = 22
Top = 2
Width = 241
BevelOuter = bvNone
ChildSizing.EnlargeHorizontal = crsScaleChilds
ChildSizing.EnlargeVertical = crsScaleChilds
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 100
ClientHeight = 22
ClientWidth = 241
DataSource = DataSource
Options = []
TabOrder = 0
end
object Panel2: TPanel
Left = 242
Height = 22
Top = 2
Width = 326
BevelOuter = bvNone
ClientHeight = 22
ClientWidth = 326
TabOrder = 1
object Label1: TLabel
AnchorSideLeft.Control = Panel2
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
Left = 8
Height = 15
Top = 4
Width = 81
BorderSpacing.Left = 8
Caption = 'Filter countries:'
end
object cmbFilter: TComboBox
AnchorSideLeft.Control = Label1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel2
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Panel2
AnchorSideRight.Side = asrBottom
Left = 95
Height = 23
Top = 0
Width = 223
Anchors = [akTop, akLeft, akRight]
AutoComplete = True
AutoCompleteText = [cbactEnabled, cbactEndOfLineComplete, cbactSearchAscending]
BorderSpacing.Left = 6
BorderSpacing.Right = 8
DropDownCount = 40
ItemHeight = 15
OnEditingDone = cmbFilterEditingDone
TabOrder = 0
end
end
object ToolButton1: TToolButton
Left = 568
Top = 2
Action = acFilterByCountry
end
object ToolButton2: TToolButton
Left = 591
Top = 2
Action = acNoFilter
end
object ToolButton3: TToolButton
Left = 614
Height = 22
Top = 2
Caption = 'ToolButton3'
Style = tbsDivider
end
object ToolButton4: TToolButton
Left = 619
Top = 2
Action = acFindCity
end
object btnBookmark1: TToolButton
Tag = 1
Left = 647
Top = 2
Caption = 'btnBookmark1'
DropdownMenu = BookmarkDropdown
ImageIndex = 3
OnMouseMove = btnBookmark1MouseMove
Style = tbsButtonDrop
end
object ToolButton6: TToolButton
Left = 642
Height = 22
Top = 2
Caption = 'ToolButton6'
Style = tbsDivider
end
object btnBookmark2: TToolButton
Tag = 2
Left = 680
Top = 2
Caption = 'btnBookmark2'
DropdownMenu = BookmarkDropdown
ImageIndex = 4
OnMouseMove = btnBookmark1MouseMove
Style = tbsButtonDrop
end
object btnBookmark3: TToolButton
Tag = 3
Left = 713
Top = 2
Caption = 'btnBookmark3'
DropdownMenu = BookmarkDropdown
ImageIndex = 5
OnMouseMove = btnBookmark1MouseMove
Style = tbsButtonDrop
end
object ToolButton5: TToolButton
Left = 746
Height = 22
Top = 2
Caption = 'ToolButton5'
Style = tbsDivider
end
object ToolButton7: TToolButton
Left = 751
Top = 2
Action = acSortAsc
end
object ToolButton8: TToolButton
Left = 774
Top = 2
Action = acSortDesc
end
end
object Panel1: TPanel
Left = 0
Height = 34
Top = 0
Width = 1068
Align = alTop
BevelOuter = bvNone
Caption = 'Average Temperatures in European Cities'
Color = clWindowText
Font.Color = clWindow
Font.Height = -19
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
TabOrder = 2
end
object Dataset: TsWorksheetDataset
FieldDefs = <>
AfterOpen = DatasetAfterOpen
Left = 295
Top = 129
end
object DataSource: TDataSource
DataSet = Dataset
Left = 435
Top = 129
end
object DBGridPopupMenu: TPopupMenu
Images = ImageList16
OnPopup = DBGridPopupMenuPopup
Left = 296
Top = 208
object mnuSetBookmarkParent: TMenuItem
Caption = 'Set bookmarks'
object mnuSetBookmark1: TMenuItem
Tag = 1
Action = acSetBookmark
Caption = 'Bookmark 1'
ImageIndex = 3
ShortCut = 16433
end
object mnuSetBookmark2: TMenuItem
Tag = 2
Action = acSetBookmark
Caption = 'Bookmark 2'
ImageIndex = 4
ShortCut = 16434
end
object mnuSetBookmark3: TMenuItem
Tag = 3
Action = acSetBookmark
Caption = 'Bookmark 3'
ImageIndex = 5
ShortCut = 16435
end
end
object mnuGotoBookmarkParent: TMenuItem
Caption = 'Go to bookmarks'
object mnuGotoBookmark1: TMenuItem
Tag = 1
Action = acGotoBookmark
Caption = 'Bookmark 1'
ImageIndex = 3
ShortCut = 24625
end
object mnuGotoBookmark2: TMenuItem
Tag = 2
Action = acGotoBookmark
Caption = 'Bookmark 2'
ImageIndex = 4
ShortCut = 24626
end
object mnuGotoBookmark3: TMenuItem
Tag = 3
Action = acGotoBookmark
Caption = 'Bookmark 3'
ImageIndex = 5
ShortCut = 24627
end
end
object mnuClearBookmarkParent: TMenuItem
Caption = 'Clear bookmarks'
object mnuClearBookmark1: TMenuItem
Tag = 1
Action = acClearBookmark
Caption = 'Bookmark 1'
ImageIndex = 3
ShortCut = 49201
end
object mnuClearBookmark2: TMenuItem
Tag = 2
Action = acClearBookmark
Caption = 'Bookmark 2'
ImageIndex = 4
ShortCut = 49202
end
object mnuClearBookmark3: TMenuItem
Tag = 3
Action = acClearBookmark
Caption = 'Bookmark 3'
ImageIndex = 5
ShortCut = 49203
end
end
object MenuItem3: TMenuItem
Caption = '-'
end
object mnuSortASC: TMenuItem
Action = acSortAsc
Caption = 'Sort by clicked column (ascending)'
end
object mnuSortDESC: TMenuItem
Action = acSortDesc
Caption = 'Sort by clicked column (descending)'
end
object MenuItem1: TMenuItem
Caption = '-'
end
object mnuFilterByCountry: TMenuItem
Caption = 'Filter by Country...'
ImageIndex = 0
object mnuNoFilter: TMenuItem
Action = acNoFilter
end
object N1: TMenuItem
Caption = '-'
end
end
object MenuItem5: TMenuItem
Caption = '-'
end
object mnuFindCity: TMenuItem
Action = acFindCity
end
end
object ImageList12: TImageList
Height = 12
Width = 12
Left = 576
Top = 129
Bitmap = {
4C7A020000000C0000000C000000350100000000000078DA6360A03FD851E3EF
02C2C4A8DDDE10AC77A025E2E5BE96885720365E732BFC54F636863E7EBDA9ED
3F08EF6D0A7BB8BD2240019BDA6D959EA2BB1B43EEBD58DFFCFFC3F66E3006B1
773786DDDED1102A84AC7673832FD7EE86D04B4F56D6FD85A9856190D89EA6D0
73FB1B1C38406A5785863203CD3D706F69E54F74B5307C6F49C5CF3D0DA1BB1B
1A1A98B6D5F8776CAB0EF80574EB6B7C18A4666BA56F3BC328C00BB655FB4FDF
5113F0E3605BD40B7C18A4665B8DDFB4FF0C0C8CBB1A4236DE985FF215577C81
E4406A406AC171DC10CAB6B321F8C4FDA595BF30E2162806923B9396C68AE2AE
064FBEDD0DC1D79FAEAE87A721101B240692C3E6978D657E52C074F7F0E5FA96
FF20BCA731F401480C9FFF3797FBE8EF6D0A7FBAAF39FC09884D4C98EDACF273
25363F521B0000A4F50CFE
}
end
object ImageList16: TImageList
Left = 576
Top = 208
Bitmap = {
4C7A080000001000000010000000E00600000000000078DAED98094CD3571CC7
EB96399365993AA5B8796D3AA756C0A9E089E074EA747821A253173C824EE744
C503115A659924F3C01B10A55A0F2446D129010F8478206D055B5A74DE533715
01158BB4A2FDEEFDFE50A5E5DFF2AF336633BCE49BB6EFFF3EFFF73BDF4B2A12
FD37C6C2AC6BF831ED1226EC2FC0B09D5AF826E4A2EB3A25DC6372F0D57A153C
63D5E8C1E6FAC8CFC3678706B6FCFCAC6BA6463926785F04C26F03690F81D38F
815DC5C0F23BC0F43F81219701777539FAEED49A6CF90559D783C71FB96EE8A2
3363F64D606F09A032547EAEBC0B6E6EC425337A275D30F828B4C17C3E4C49BF
9232F0F89DF2C9D7017911A029030E3E00D6DD03E6DF02BE49BD69ECADD0A6DA
8B41C889EB0DC71DB870D75FFD886388273FE20B81E0DC87E8253F7FBF6782BE
B1A3387EBF5FEF352C49FF447ACDC4F99F510AACBF6542CF2D79653DE3F37A09
C9C5F05D9A8CFEBB2F3C0F3BF91742326FA3CF76DDF3EE71791942733972A76E
ACEFBE2BA5190FCD48BC0FF44DBE54EA197B2E50283F74BBA6533F85EE516669
651CBD1234A59EF14A89503E20595FDF3721AFE2D80333B6DC33A3CB7A7545DB
B597DF77A61E7DE59ADB7B6E3EC18A2B4FD03536F7B6B3F5EC2BD71E89D11623
4C5D8C6E7179E9CEF27DB7E64659EABFEB467594E82D1D9D569D8533B2E52531
39C6069965B5F6BD24BB0CB4B6267FD6BFFDBA73659DCF57D8ED7BBF820AB86D
C8354856E78CE3F341B24619D371ABCE30E9AAB946DF8732DE6B7B81A1135B63
370832BCD3718D2ACBE7C00DA36DDF0FFFFD86C97D9DEA4C4072F2BB8EE2E8B6
FC6423B7B5AA3BD3CE16992D7DBF38B7D8ECB15679AFDD0A751321B990ACCCF1
B08D37CD894498C3B4CA7A357E650AE3CBA7A56F5FE60B2B9850F559CFFAB710
DEEA1D6A7B6C2D3CEDABAA625595BF9DE205EF5FB35E85FBCF3F30AFE65AEE1D
F35E773F7A757387458EE61CF1FE81013578DBB9D7C9B379293DF3F6EEF142D5
6DB6C8665E6AEB1FED6151F5DF7CCFF8E253C707F0C6BDBA84F2F6EAB28E0F10
DC8BFFC771266A789B53CB862932A57E8547970C456AD890C294F983157BE70E
6C531B9B1D357C5076D430E3E9A57EC8920EC5B1F06F91BA70205242072039A4
BF71D7AC7E831CED4B6CF6323F9C920D81461E8EE7154F41637F880FF6CCF2C6
8E19DEC66DD37BF3DA4136D3BEC4E6CB1773AC7EDF6A8EDF3BB327764DEF8EED
C15E489CEAA5E0E3C95FB23973C9608E2D60ECA1D9BD383E29B80B14533A2331
C8035B823A17F2F1142BF2F7E8A201480BF5E1D8FD333C397E47900489133B20
614207C48FEFC85B3714678AD5A1D07E3818D207FB18BB67AA07C7CBC7B743C2
D836880B6C83D8C02F78F74F5930584171DEC76245FE92CDB42F8D84319F216E
742B6CF46F898DA35BF3FA4FF9A51C519C29569CBFCC661A1C3BAA05368C6C6E
DC30B285DD3AA0FC528EB838B35891BF6433ED4BECFA11CD07D55643945FCA51
028B33C58AFC259B1DED5B37DEAEFED72996E0A9E121577B26C3039C8E0D75AA
FF89556F9AC5F5E1C99869303E7EE054FF6784F5477A550F67FE3619C6D212A7
FB3F759E0F2E1CDECCCE12138EAF0876AAFFC966C3FD5B28BCA842CAFC414EF7
FFD3720394DB9672FDCFB14EF63FDFA8EBFFBAFEAFEB7FE7EE7FCBD0A66C7CE5
FB3F2D6A1CCA4B8B9DEA7FF2F7687410D7FF87656350FEA8D8A9FE3FB1F667B6
6709673BB187A326D6F5FF1B1A6AD927ED559162A8A4AE9B5E8567EC2F4C8F99
4A4EC85A37B0FAC7E2C48C2092DD7F3944A27A8CBBC63487DEA18E740D78F12C
63A60499330D9CD8773EFE5C44536FC63DD3C8C42E2AA97837FB7E8863D3277E
604A9BA4674295F43457C376A9388E314626B52AD2E516FBAC50CA9ABA96A604
2632C14689D5D9CBB3DABE4F3E33C5AA22C4C19C22C5C5EA0897B996354549DF
81C467BB52E6328AAD7F9A13F6E9C736F6E45B7EFF2DFF1AA457CDED8DD81E20
F13FCD6B2812E9C0237FCB8A3F62DC41E2E7E9FF496DD74AE93C99944C574522
8D8B65457E745B906AB754B78AA988B15F5AE557D60C24C7AC3E8CB1E54CBD6B
9CF18B3E02C93E9B3F81F1CFAAFB6C754687BC07123F5B308071158C8F6131F8
FCA528AE95E3F84F2290ECEC2DE38F7F7EF89BEB7EDD4D9EFD65C279ADDBCB1A
D02731FE11938730FFADECF881C9C4F61E283CFE2F58BFAA3C04399FFF821E8C
353045F09E2F0EEB4FDF9671254CA9D6F9175AFF5473BCFDB75B58FFFDDBFEAF
8A91AC796376E614AA23C5F1B6CF849C3FECBC9B5E75861A4E2D68F261F5678E
CEBF6AF7C729A668A62265842B974321E72F8DDCF066AD1867564788DD9452F1
66F63DC399F35F1DE91241673E53329392E979B6CCB5B5D0FB87DD1917D9B99F
5E657FB432527C8FDE29E4FE53C95CBDE8DE3D2B73ED582D16AB982ED3BD585B
6EE9FED12E6AD9C8AA226592FA34E788FF07815B405B
}
end
object ActionList: TActionList
Images = ImageList16
Left = 296
Top = 280
object acFindCity: TAction
Caption = 'Find city...'
Hint = 'Find a city'
ImageIndex = 2
OnExecute = acFindCityExecute
end
object acFilterByCountry: TAction
Caption = 'Filter by country'
Hint = 'Filter records by country'
ImageIndex = 0
OnExecute = acFilterByCountryExecute
end
object acNoFilter: TAction
Caption = 'All countries'
Hint = 'Remove filter'
ImageIndex = 1
OnExecute = acNoFilterExecute
end
object acSetBookmark: TAction
Caption = 'Set bookmark'
OnExecute = acSetBookmarkExecute
end
object acGotoBookmark: TAction
Caption = 'Go to bookmark'
OnExecute = acGotoBookmarkExecute
end
object acClearBookmark: TAction
Caption = 'Clear bookmark'
OnExecute = acClearBookmarkExecute
end
object acSortAsc: TAction
Caption = 'Sort ascending'
Hint = 'Sort by this column in ascending oder'
ImageIndex = 6
OnExecute = acSortAscExecute
end
object acSortDesc: TAction
Caption = 'Sort descending'
Hint = 'Sort by this column in descending order'
ImageIndex = 7
OnExecute = acSortDescExecute
end
end
object BookmarkDropdown: TPopupMenu
Images = ImageList16
OnPopup = BookmarkDropdownPopup
Left = 435
Top = 208
object mnuSetBookmark: TMenuItem
Action = acSetBookmark
end
object mnuGotoBookmark: TMenuItem
Action = acGotoBookmark
end
object mnuClearBookmark: TMenuItem
Action = acClearBookmark
end
end
end

View File

@ -0,0 +1,400 @@
unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, DBGrids, DBCtrls,
ExtCtrls, Menus, StdCtrls, Buttons, ActnList, ComCtrls, fpsDataset, Types;
type
{ TMainForm }
TMainForm = class(TForm)
acFindCity: TAction;
acFilterByCountry: TAction;
acNoFilter: TAction;
acSetBookmark: TAction;
acGotoBookmark: TAction;
acClearBookmark: TAction;
acSortAsc: TAction;
acSortDesc: TAction;
ActionList: TActionList;
cmbFilter: TComboBox;
DataSource: TDataSource;
DBGrid: TDBGrid;
Dataset: TsWorksheetDataset;
DBNavigator1: TDBNavigator;
ImageList16: TImageList;
ImageList12: TImageList;
Label1: TLabel;
MenuItem1: TMenuItem;
mnuClearBookmarkParent: TMenuItem;
MenuItem5: TMenuItem;
mnuSetBookmark: TMenuItem;
mnuGotoBookmark: TMenuItem;
mnuClearBookmark: TMenuItem;
mnuFindCity: TMenuItem;
mnuClearBookmark1: TMenuItem;
mnuClearBookmark2: TMenuItem;
mnuClearBookmark3: TMenuItem;
mnuSetBookmark3: TMenuItem;
mnuSetBookmark2: TMenuItem;
mnuSetBookmark1: TMenuItem;
mnuGotoBookmark3: TMenuItem;
mnuGotoBookmark2: TMenuItem;
mnuGotoBookmark1: TMenuItem;
mnuSetBookmarkParent: TMenuItem;
MenuItem3: TMenuItem;
mnuGotoBookmarkParent: TMenuItem;
N1: TMenuItem;
mnuNoFilter: TMenuItem;
mnuFilterByCountry: TMenuItem;
mnuSortASC: TMenuItem;
mnuSortDESC: TMenuItem;
DBGridPopupMenu: TPopupMenu;
Panel1: TPanel;
Panel2: TPanel;
BookmarkDropdown: TPopupMenu;
ToolBar: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
btnBookmark1: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
btnBookmark2: TToolButton;
btnBookmark3: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
procedure acClearBookmarkExecute(Sender: TObject);
procedure acFilterByCountryExecute(Sender: TObject);
procedure acFindCityExecute(Sender: TObject);
procedure acGotoBookmarkExecute(Sender: TObject);
procedure acNoFilterExecute(Sender: TObject);
procedure acSetBookmarkExecute(Sender: TObject);
procedure acSortAscExecute(Sender: TObject);
procedure acSortDescExecute(Sender: TObject);
procedure BookmarkDropdownPopup(Sender: TObject);
procedure btnBookmark1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure cmbFilterEditingDone(Sender: TObject);
procedure DatasetAfterOpen(ADataSet: TDataSet);
procedure DBGridTitleClick(Column: TColumn);
procedure FormCreate(Sender: TObject);
procedure DBGridPopupMenuPopup(Sender: TObject);
procedure mnuFindCityClick(Sender: TObject);
private
FBookmarks: array[1..3] of TBookmark;
FSortColumn: TColumn;
procedure GetUniqueFieldValues(AField: TField; AList: TStrings);
procedure mnuFilterHandler(Sender: TObject);
procedure PrepareFilter;
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
StrUtils, fpsTypes;
{ TMainForm }
procedure TMainForm.acFilterByCountryExecute(Sender: TObject);
begin
Dataset.Filtered := false;
if (cmbFilter.Text = '') or (cmbFilter.Text = 'all countries') then
cmbFilter.ItemIndex := 0
else
begin
Dataset.Filter := 'Country = "' + cmbFilter.Text + '"';
Dataset.Filtered := true;
end;
end;
procedure TMainForm.acClearBookmarkExecute(Sender: TObject);
var
ac: TAction;
mnu: TComponent;
idx: Integer;
begin
if not (Sender is TAction) then
exit;
mnu := TAction(Sender).ActionComponent;
idx := mnu.Tag;
if idx <= 0 then
exit;
if Dataset.BookmarkValid(FBookmarks[idx]) then
begin
Dataset.FreeBookmark(FBookmarks[idx]);
FBookmarks[idx] := nil;
end;
end;
procedure TMainForm.acFindCityExecute(Sender: TObject);
var
s: String;
begin
s := InputBox('Find city', 'City', '');
if s <> '' then
begin
if not Dataset.Locate('City', s, [loCaseInsensitive, loPartialKey]) then
ShowMessage('Not found.');
end;
end;
procedure TMainForm.acGotoBookmarkExecute(Sender: TObject);
var
ac: TAction;
mnu: TComponent;
idx: Integer;
begin
if not (Sender is TAction) then
exit;
mnu := TAction(Sender).ActionComponent;
idx := mnu.Tag;
if idx <= 0 then
exit;
if Dataset.BookmarkValid(FBookmarks[idx]) then
try
Dataset.GotoBookmark(FBookmarks[idx]);
except
MessageDlg('Bookmark not found (filtered?)', mtError, [mbOK], 0);
end;
end;
procedure TMainForm.acNoFilterExecute(Sender: TObject);
begin
cmbFilter.ItemIndex := 0;
Dataset.Filtered := false;
Dataset.Filter := '';
end;
procedure TMainForm.acSetBookmarkExecute(Sender: TObject);
var
ac: TAction;
mnu: TComponent;
idx: Integer;
begin
if not (Sender is TAction) then
exit;
mnu := TAction(Sender).ActionComponent;
idx := mnu.Tag;
if idx <= 0 then
exit;
FBookmarks[idx] := Dataset.Getbookmark;
end;
procedure TMainForm.acSortAscExecute(Sender: TObject);
begin
if FSortColumn <> nil then FSortColumn.Title.ImageIndex := -1;
FSortColumn := DBGrid.SelectedColumn;
FSortColumn.Title.ImageIndex := 0;
Dataset.SortOnField(FSortColumn.FieldName);
end;
procedure TMainForm.acSortDescExecute(Sender: TObject);
begin
if FSortColumn <> nil then FSortColumn.Title.ImageIndex := -1;
FSortColumn := DBGrid.SelectedColumn;
FSortColumn.Title.ImageIndex := 1;
Dataset.SortOnField(DBGrid.SelectedColumn.FieldName, [ssoDescending]);
end;
procedure TMainForm.BookmarkDropdownPopup(Sender: TObject);
var
idx: Integer;
dropdown: TPopupMenu;
btn: TToolButton;
begin
if not (Sender is TPopupMenu) then
exit;
dropdown := TPopupMenu(Sender);
idx := dropdown.Tag;
mnuSetBookmark.Tag := idx;
mnuGotoBookmark.Tag := idx;
mnuClearBookmark.Tag := idx;
acSetBookmark.Enabled := true;
acGotoBookmark.Enabled := Dataset.BookmarkValid(FBookmarks[idx]);
acClearBookmark.Enabled := Dataset.BookmarkValid(FBookmarks[idx]);
end;
procedure TMainForm.btnBookmark1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
with TToolButton(Sender) do
DropDownMenu.Tag := Tag;
end;
procedure TMainForm.cmbFilterEditingDone(Sender: TObject);
begin
acFilterByCountryExecute(nil);
end;
procedure TMainForm.FormCreate(Sender: TObject);
var
i: Integer;
begin
// Open spreadsheet file as dataset
Dataset.FileName := 'Temperatures.xlsx';
Dataset.Open;
// Tailor the columns of the DBGrid
DBGrid.Columns[0].Width := 100;
DBGrid.Columns[1].Width := 100;
for i := 2 to DBGrid.Columns.Count-1 do
with DBGrid.Columns[i] do begin
Width := 64;
DisplayFormat := '0.0'; // Avoid too many decimal places in floating point fields.
Title.Alignment := taCenter;
end;
// Prepare bookmarks
FBookmarks[1] := nil;
FBookmarks[2] := nil;
FBookmarks[3] := nil;
// Narrower input box
cInputQueryEditSizePercents := 0;
end;
procedure TMainForm.DBGridPopupMenuPopup(Sender: TObject);
begin
mnuGotoBookmark1.Enabled := Dataset.BookmarkValid(FBookmarks[1]);
mnuGotoBookmark2.Enabled := Dataset.BookmarkValid(FBookmarks[2]);
mnuGotoBookmark3.Enabled := Dataset.BookmarkValid(FBookmarks[3]);
mnuClearBookmark1.Enabled := Dataset.BookmarkValid(FBookmarks[1]);
mnuClearBookmark2.Enabled := Dataset.BookmarkValid(FBookmarks[2]);
mnuClearBookmark3.Enabled := Dataset.BookmarkValid(FBookmarks[3]);
end;
{ Sorts the grid (and worksheet) when a grid header is clicked. A sort indicator
image is displayed at the right of the column title. Requires an ImageList
assigned to the grid's TitleImageList having the image for ascending and
descending sorts at index 0 and 1, respectively. }
procedure TMainForm.DBGridTitleClick(Column: TColumn);
var
options: TsSortOptions;
begin
options := []; // [] --> ascending sort
if FSortColumn = Column then
// Previously selected sort column was clicked another time...
begin
// Toggle between ascending and descending sort images
FSortColumn.Title.ImageIndex := (FSortColumn.Title.ImageIndex + 1) mod 2;
if FSortColumn.Title.ImageIndex = 1 then
options := [ssoDescending];
end
else
// A previously unsorted column was clicked...
begin
// Remove sort image from old sort column
if FSortColumn <> nil then FSortColumn.Title.ImageIndex := -1;
// Store clicked column as new SortColumn
FSortColumn := Column;
// Set sort image index to "ascending sort"
FSortColumn.Title.ImageIndex := 0;
end;
// Execute the sorting operation.
Dataset.SortOnField(FSortColumn.Field.FieldName, options);
end;
procedure TMainForm.DatasetAfterOpen(ADataSet: TDataSet);
begin
PrepareFilter;
end;
procedure TMainForm.GetUniqueFieldValues(AField: TField; AList: TStrings);
var
bm: TBookmark;
L: TStringList;
begin
bm := Dataset.GetBookmark;
Dataset.DisableControls;
L := TStringList.Create;
try
L.Sorted := true;
L.Duplicates := dupIgnore;
Dataset.First;
while not Dataset.EOF do
begin
L.Add(AField.AsString);
Dataset.Next;
end;
AList.Assign(L);
finally
L.Free;
if Dataset.BookmarkValid(bm) then
begin
Dataset.GotoBookmark(bm);
Dataset.FreeBookmark(bm);
end;
Dataset.EnableControls;
end;
end;
procedure TMainForm.mnuFindCityClick(Sender: TObject);
var
s: String;
begin
s := InputBox('Find city', 'City', '');
if s <> '' then
begin
if not Dataset.Locate('City', s, [loCaseInsensitive, loPartialKey]) then
ShowMessage('Not found.');
end;
end;
procedure TMainForm.mnuFilterHandler(Sender: TObject);
begin
cmbFilter.Text := (Sender as TMenuItem).Caption;
Dataset.Filtered := false;
Dataset.Filter := 'Country = "' + (Sender as TMenuItem).Caption + '"';
Dataset.Filtered := true;
end;
procedure TMainForm.PrepareFilter;
var
L: TStrings;
mnu: TMenuItem;
i: Integer;
begin
L := TStringList.Create;
try
GetUniqueFieldValues(DBGrid.SelectedColumn.Field, L);
for i := 0 to L.Count-1 do begin
mnu := TMenuItem.Create(mnuFilterByCountry);
mnu.Caption := L[i];
mnu.OnClick := @mnuFilterHandler;
MnuFilterByCountry.Add(mnu);
end;
cmbFilter.Items.Assign(L);
cmbFilter.Items.Insert(0, 'all countries');
cmbFilter.ItemIndex := 0;
finally
L.Free;
end;
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B