diff --git a/demos/Firemonkey/TStringGrid/TeeGrid_FMX_StringGrid.dproj b/demos/Firemonkey/TStringGrid/TeeGrid_FMX_StringGrid.dproj
index 6ca42d9..89b9609 100644
--- a/demos/Firemonkey/TStringGrid/TeeGrid_FMX_StringGrid.dproj
+++ b/demos/Firemonkey/TStringGrid/TeeGrid_FMX_StringGrid.dproj
@@ -83,6 +83,7 @@
true
+ c:\root\teebee\sources\grid\fmx;c:\root\teebee\sources\grid;$(DCC_UnitSearchPath)
true
true
true
@@ -282,6 +283,8 @@
true
+ 1033
+ true
true
true
false
@@ -332,6 +335,12 @@
+
+ Embarcadero C++Builder Office 2000 Servers Package
+ Embarcadero C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
@@ -360,12 +369,27 @@
true
-
+
+
+ 0
+ .dll;.bpl
+
1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
1
+ .dylib
+
+
+ 1
+ .dylib
@@ -744,27 +768,12 @@
1
-
-
- 0
- .dll;.bpl
-
+
1
- .dylib
-
-
- Contents\MacOS
- 1
- .dylib
1
- .dylib
-
-
- 1
- .dylib
diff --git a/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.fmx b/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.fmx
index 51dfd9a..4cb9d57 100644
--- a/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.fmx
+++ b/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.fmx
@@ -54,309 +54,309 @@ object StringGridForm: TStringGridForm
PNG = {
89504E470D0A1A0A0000000D4948445200000060000000600806000000E29877
38000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
- 25B049444154785EDD9D097C55D5B5FFD739774A42081050640C83611E151470
- 00B1328356C1A9B6B6EFFF57111C6BEBF4EFFBFF3FAD6DEDBFAD56ED736CAB55
- DFEBABC3B355C079009F5544661008242184248484CCF3CDBDE7BCF55BFBEC73
- CFBDB90973C0AE64DFBDCFDEFB4CDFB5F7DA7B9F611F834E475942E9C196603F
- B229DBB46904FBC3C9B007916DF58D1A660F9F65742593429CD3AF56A00859D4
- 1235ED3A9F6D55916196906D149041399641BBD8DF130E858BE935AA77F29F36
- 727A28E05C0A84CE080D347DF644CBB0A7F0419D13217B889FCC5E9C9AC6EE58
- 8FD366D7C8DA39E427239F17369AB6B1D68A1A9B5ACA5B0A6903B5AA6CA74E4E
- 9D0296902FD8181C62903D8339CD8E4669B2DF6FF6E5145DAA5DB16D9B49F21F
- 7C761D896118CAE18FFD24128944AC129F8FBEE2DCEFD964AC0EA785F3B97644
- 9DF44E95CE57C01CCA08FA8217B269591C31AD995CCA0772AC7B1C02DAB2C9B2
- 2D0118F005282DA50B75EFD28DBAA7F760BF3B65A475A5D4509AA461CDD6482B
- 35B534525D531D55D75753557D15D534D450437303B5465B4569A661B265528A
- F188CDB5A3D06F991FB3A97A3D1C0D7F46EF52AD93D629D2690A485F40BD5A8D
- C002C3A6EF51BD713EA58B691101200087A4A7A453FF5EFD69C4C09134266B0C
- 0D1F309CFA9F318032337A504A28957C5C74B93D104559521B9C1AE104A35C95
- 9A5B9AA9BAAE9A8A0F15D3EEA2DDB4BD601BEDDCBF938ACA8BA8BE593503A210
- 6F0DA9A7464AB7BFB40D7A2960B7AEAC5F49879C94932A275D01DDE6538F6623
- 70856D1B3773019CC451AE89895AAAD66776ED49E3068FA58BC74EA72923A7D0
- E03E8329352D955AAC30D5B7D4525DB88E1A5A1AA839D244E148985AAD568AF0
- BA58DF8263E569D3E4337CAAD604D22823A51BF548EDC12D7A57B25A2D2A3A58
- 44EB76ADA34FB7ADA1AD7BB752455D855AC764A5C624C21570BD61D8CFA5D8AD
- 7FAF5945554EFC499193A78025140C3607679951FB2E2E6E17730CDB0B55DA01
- 2E35984AA3B346D3BCF3E6D3A5E77C8B06F5C9A2A819A5CAA64AAA6207E06C12
- 286AC7208BB32C8E53BEC569D896CAC3F14E587CAC23EBD9AC1493BA84D2A977
- 7A6F1AD8238B7A8432A9BCA29C566F594DABD6ADA2AF0BB65353B84914E1A915
- ADBCF2A796CF782C9C127E9FDB88B0137F42E5A42820B82838DCB4E81E0E5EC3
- 2E03711A7C37B6E5178FB998AEBDE43A9A326A0AF9427E3AD45046154D15D4D4
- DAA4C069D802DA81C9E136E0755E518A271F7C4F3E842356C449B729956BC780
- EE6CE67A8FA2CC60266DCBDB46AFACFE2BADE19A81B623411168135EB14C7A24
- FC563847459D3839B10A9843A11433B0844CEB41AED8239D5839F1F4D474BA6C
- E265F483D9FF8B260C9B408D560395D61D6013532F7034705D9A014FE00B5095
- A69795AFF279A1C7AF1B1FA7B6C1CB4E7C241AE123B329338DCD5FBFF134E28C
- 9154585C482F7EF022BDBFF13DAA6FAA4F304DD19D6499BF6CB65A5FE386BAC5
- 893C6E39610A485D94DAD7B6220F7003FB2FBA8105189FE9A70B465F40B72DBA
- 8DA68C9E4AB5911A01DFC4F65CC3D30055D80BCFB38C30E29C7C5EDF05EF8DF3
- E673D6D761EF3EA46670C39D9ED295CE19702E4DEA3F99F20AF3E8C9B79EA47F
- 7CFD99A4A3C116510DF5F386E97FB8E9ADA61215797C724214903AD73FC9F619
- BFE1CD719F5E094E2EEBCC2C067F3B2D9EBE98C266988A6B8BC4CC081817AC02
- 15072F0EBA0226F034449DCF091F3178A43BF9DBE463D01156041AEE8BB3A7D3
- C4BEE7D0875F7D48FFF6D6EFA9E06041426DB0571B51FBC74DEF44D63B11C72C
- C7AB0023B820B8C0A4E8236C72B211015B8F8345E37AFFB5F753FF3EFD685FF5
- 3EAAE5DE8C7BC2F01DC8521A9DF81814C4ABB436A03C71023E214EE78BC53B71
- DEFCECBB4AD6F9655D6E2BD83421AE7F8FFE74C5F86F535723831E7DFD115AF9
- E54A898FB50DD13D5CBFEF09AF0CAFE405A72F7CF412D7FF3A2AE1916C6848E0
- 46E6FD0457510CA6E400333332E9FE6B1EA007AE7F90EC5094F2ABF2A9B1B551
- C190938EF90218CE8913581A545CBCC73F5C9A6C03A645399D5FF68B381E7AE9
- BC2A4DED4FE5E7B608CAE070457D05AD2BF8926C1E31DE74D9CDD43F73006DCE
- DF2C833B6592CC9EDCA05F1A18EE3B141D6F6DA31DC7A6846353C074F287CCD0
- 522E0BBF360DA327A2703223068CA0C76F7D82165CB480F6D5EDA532EEDDE893
- 124889C09C380195003E0E5492B8B6F99C7D38E93A4FFBE03D693ACE8957E996
- 7483734A7368C781ED347FF2429A357E968C1FCA6BCA44097CEE5D78643DC317
- F1D746FB4437D13E52A3C9A390A357004A3EE037DB0FF3904ABA9838E00B475F
- 484FDDFE340D1D3C947657E45043B8414E42439113F684E147BCCB3A8E15E682
- 4C886B5741DE782C3B7993E68393BCE89AC2C5E2DDFDB2736B039F43795D39AD
- CDFB9C86F51F41DFBFE407945B922BED82D338A718CD7491AF8BBF3A3A3EBAF1
- 686BC2D12AC080D941C9D7F07180F326CFA32796FF9E52325228AF32570DA09C
- 13724F589F1CFB1ABC5A564AB2BCE09D7CDAF7828F4B9378D41CDE8613AFC1B7
- C9E7C621AF931FFB74E3952FCAD671EC9449B264A0B66EEF5A4A4949A1DBE6DE
- 4625870ED0EEE2DDAA4DF053887F2FF045CCD2E86E6B8B903A42392A057083BB
- 50D97C657670F28BA62CA247973E462DFE666E6C0BD409382012C1C7FB892647
- F92E68F1510A7558F91A902E9DB2AEB34FC9E3B8B8922F6931457921BBFBF7C4
- 49BC27AC1D2EEC6DD9BF99BBD08D74D782BBA9BCAA4CAE31390D738A65D354FF
- 70FFAEE8EEE86E441C891CB102D2E607CE25DBFA83699A03B08C039A37793EC3
- FF1D77FD6B697FCD7E39519C503C44C767A7AA3BC0794EBC0D28F84E9C5E66A7
- F309C4F6C073B80D4851B42EF1B17C71CB1E17039FB00E3B9DB6A3F86BAA6EAA
- 6225DC4325E5C5945394136B13ACE8E4E030FFE7AD7BAC0302EE3072440AC020
- 2B6AD9CF19A6790E967110178EBE88CDCE13D4E46B54F071703831EDF432FBAA
- 743BE09DF838786E3CF7C5E1B36BAB2000017CE44D001F974F3905BEE33C12E7
- 28AC0D78BD7F4E5779E2D7DD59B2931A5A1B440939FB73626D826166466D6378
- 7064F0FD484EA44E0076208757C01C0AF9C9F8B9611A8B79C9C0CED1DB4183EB
- 4FF7D35EEE666A80024D8361DF05AFD39C78378F13AFE0C796759A8A5340DC7C
- ECE2DB104F989D379F565862AD806B13E7D4AAB6CE3183710E792DFABA683B05
- 03015A367B39ADDDB996CA9CDE115BA42C5E292532D4FA88723BBED1735805A4
- 0C0B5C478DC6BF5290822855BD327AD163DCD5CCCACAA29C43BBF840F8003504
- AFAF4124A4B9A6C493AE4BBD37AF5B32259F82D3A60427E453F10A0EC21D9578
- ED92D514E590AF3DF8BC5E147E8436176CA2217D86D2E2294BE8A34D1F51634B
- 23DA04831A8C31FEA0991FD9636D755026950E15109C1B1C6698D6D31432FB60
- 1937431EB8E6419A3B6D0E6D2FDBCABD9D16054D9F7C9CCF07C8BE06E3052F79
- 24CE097B40C5F2C56CB740F3AC87B00BD28D8FE58F8F4FE2380D7963701DA8EE
- FA116970312A0E475AE58E1B9C0A87714F53F2203FEE4FACDFBB9EE69FBB8086
- F719215754E5DE441097DFADD1E6D981F7A3B95175E32189B4AF80255CBB22BE
- 5FB04D9B85451CD8A22997D37DD7DE47BB2A77527D4B9D409213D5272BBE8A8B
- 956E0F3CC7574A704ED68973C173BC6C17699E749516BF8CB002199FDFAD153A
- 8E9D3E0EC479C1231E709B5B9B65EC52D75CCBAE4EEE9C35861BA939DC4C2DAD
- 2D023AC24AC1853BD9061F236E9D421AB8D4EF2CDE41B7CDBB832AAA2B6847E1
- D7BA3DE8C57521353221FA1E8F0F929AA27615101C1A9CCB038CFF873E2E7636
- A8F720FADDAD8F53BD594707EA4A62201C5F43734B387C4FD83D710EEBC19254
- 73278F404C001F07D2592F06D253829D6D248297FC5EC53A8A424906DCDAA61A
- AA6EA8A2EAC66A0E037C2D0D396328FD70D68F047C7E599E82A18756F0BD6178
- EC03F6C19A83D41269A1657396D39A2DABA98AB72BDDD316CA360DDFE6F6BAA6
- 491580DB8816998F91DF188E655C5C7BF0DA9FD0B9A3CFA11DE55FCB49B8E034
- 3467D985E1313971E005347C05D26BFF5D701E93A4B727F9D9C7FE62E0D5BEBD
- E0F5BEDCFC8EA25082EBB964573454D2A1FA72AA6AAC92BB6E80863CB8CD39BA
- CF187AEA8667E98A8957D285D917524EE92ECA2DCB25EE600A9764F055800B3B
- FFED3E9043E7679F4FE3074DA48FB93DC07D6B3548B3FB74C9B6DE6AD943CDCE
- 1AAE24AF01C302D7B3F69671C88793983E6E3ADD77DD7DB4B37207D58795E971
- 4FD405A4C26DC0B3D3BD21170CE7D1E0553E07640278B53EE795F562DB8B6D2B
- 219EE35C85721E988C06362587EA0FD1C1DA8354D958C98D64039B91880B0FE0
- A0C0D17DC7D093373C43E70D3E5FE2BBA775A769675F2050F30EE672AE782578
- E143B01DB41B795C6B96CD5E46B92579947F204F992232FA47C8CC8BEEB136A9
- DC3169A380F4397486E5F33FCA9567201A932EA95DE8E11FFC8A52BA85A8A07A
- 2FEF589FBC07823E71F60123CE0C3970759A5EC70B3E9657F9B28DC478C9EBD9
- 273B5DF2E1DC7DB26BE6525DC5B04B6B4AA9ACBE4C6C3AF2EA928A5F115E76E1
- 7F27065F8B56424EE96E56C21E5E4B292111BEF8EC001B17EA7A74E94E579C77
- 25BDF3D5DB52F3B830E31E679FD421D137C3B9D4A85652D24601C6F0C0B5BCC2
- CD1C3471320BCF5F44DF9FF77DDA5AB685AB6B330388872061766DAFE53817BA
- 240DBE1ED000563CF858BC93971DE262E388E4E045519EF8266E480FD5955349
- 7509553654B0229AA5A10474C38E41D77E47F0B528254C1325E47A9490085F44
- 7C9BF20FE6D3772EBE81AA6BAB687BC176324D1E1B10F58E1AE6EEC45A10AF80
- 3994E133FCBFE2B663084A7F465A06FDFC07BFA048A8958A6B71A9C103C2F15D
- B3C1CB0A340079969DB0F23DE0D979CD95375EE56F0B5E3B018FB093861E4C59
- 5D19155715896D6F8DAA07189241D7FE91C0D7E29AA35298A30425246C1BCAAE
- 6BACA35020448BA75E4DEFAC7B5B7A515CA84DDB36BA478746DFE0C1997B4FD9
- D99292A019BCC88CD07908E3C4668C9B4123878CA2BCCA3C812AA592ED277CF5
- 6C0E002A87F856F1E3F345385FAB1386ED55EB3A693A0FFB3A2D2E5E875DC7DD
- 401DCF0E2776B0EE20E596E7527175B1DCEE040831330960BC3ED605FCA78E00
- BE96AC5E59F4C4779FA4CBC6CC16E5CBF6DAD907B3A6B7D6BF49E95DBAD025E3
- 2F119610B005635970245603A693DF97E27B80AD151E9EA2503044FFE7BA9F50
- 20C3275739C56CB825D929859E65AF7D4E4C93D2EAE68363E04E7C629AAA3DF1
- 35C53B50D3AEBAA99A8AAAF673C92F5776167F1D9478EDC7E03F4B938F10BE16
- A909D9BA61E69A800636D9BED884E031493C7076D9B859F4F657ABF83C2DD00E
- F021B646FB4457EA9B376E0D08A6070773A69908E304C7648DA573469C4B7915
- B9BC1C2B7528D1F1CBB84CABC228C53A4D4692083B69DE3851802ED56E1A7C4F
- ED91E5D83664DB5CBBD07F2FAC2CA4FC437954C3FD786DE3938248F0B1AD312E
- 7CA9E8472D52136EE49A301635C1B901E6D98704F907C7B462FD5B947556168D
- 1B3C4E9842C018AC6581C55580615833FD8D663F09F3DFFCF3E7538BD1244FAA
- 6165178606E4050FE7845DF01EA787F5C9C0EB6DB9616F3AFB3A3FB651C10D6B
- 1E9B9B32363B30753852110F80F67C6C6F4CDFB16CF38F1DBE16AD8499A3BF15
- A704D91D7ED8A1475470702F6DDEB799169CBF509842C018AC65814529600905
- F97736A5133714B6DC589F3971A65CE94483A66DB60B59C3F1C4C5391D075FE7
- F3C6BBE124E0251E437E1D56B6BEA8BA880A2AF6CAE029AE1BE80DB7E3631B0A
- FE33C70D5F0B9470E3C5DF27BFE997E391DDE1C7BB5F3EFEB737AEA269A3A651
- CF8C9E9C8F239931A7CE76982B0584EA4203A296B2FDD0E8F8C1E3E9AC33CEA2
- A29A2206079B1B83819227CB7171508A2AE5B2ACD3929821159F1076D31DF3E6
- C461DFE8C3EFADC8E7A17EA92CC7957ACFC9B6E763BB029F0759270A3EA4B4BA
- 945E5FFBAA1CA708F699B07F3C28BC3EF72B32FD264D183AC1AD2D600DE6088B
- 024C9F7D8EDF54573C717ED3B9F753DB5A43752DB50E18B898C951705458F786
- 5C88EC7BCD905B43E03B613169CE725CED4A7030397B0FE58BAD871C73C907FC
- 412716FE3D2FDF452B36AC605C8C10FB4CB27F5C0BAAA8ADA02D055B68FAD819
- 6ED9016B3047180A302CB2A7221ED72EF00CE77923CEA3C29A7D0EC8045BEF00
- 73213B69DE38C9E7898FE5690B5E2DF37A4E3CE2B09D8375A5DCD8EE933E3EEC
- E7E906FF6FEBDE90E312E9E03850D8FEB1F3339A78F644EA9ADA95A324D1EF30
- E79662097561454D94FCDCA318D06B00F53BB33F9538573C01250EA8F69DB028
- C48973F379F33A0E977C759A6E43D4E55D278C3876E8521EA829A11276E8F59C
- BEF0C5781CF678D0186FE51AD02DBD1B0D3863A030860873666F069B82FD2311
- 7B0822D1D71F397014190143469428B1BAC46BA0DAD6EB785592DB825461F524
- 011AAA33D37BF331D9AA96607D6F5E277F0BC3C7800AA35A7DA0DF64F8F05180
- 4A2A7169A49246658D12C61030077B6C29DBDF2C6F238ACD1A3B682C55B754A9
- 67F53524F6DD912FE0495C420F06617759A5A1D4A70652E9EA09D7D23D33EEA5
- 7923177289F0B112C2F1EB727E5C162E61F8B886A34FE058E1E392F20987FFD2
- D1C3D761DCA6DC53B287C60C1A238C210EF36CD3B46924778D521189577BB2FB
- 67535903FAD90A52DB4116976AC44B4D704A3EE2B58FBC48E7B4147F0A5D35EE
- 6A9A3AE802CA48ED460B462FA4C5E39750C00C88A9D1EB84057E095573ADD307
- 7D3CF0270D9AEC241CBF00FE0F01FFABA3872FF69EFFD1FBC929DA4567F73D9B
- 027E795108DDD154B0C71687B133E4D2734A17EADBAB2F95CB339DAA14471D93
- E336A01C073FD134295FE501FC902F24B0A7644D93FD61FB785760EEA80574C3
- A41B5939A9922FDC1AA6D29A03DCD3A956072E79952FCBDE703B3EF63DF624C2
- FFFB71C0D7822BA467763F9319A70B0B16548561262F0DC21256E89EDE9D32BA
- 6438F63F0636CEDEC3866BA568F08E7274C90FFA825CF297D0B44117A2B1917D
- E91E03FAC67346CEA39BA62DA52E812E545A7B40AEEBE8833D26F8FD60F34F06
- FC3B8F1F3EFBB8A376A0F200850229F29AADA44B9A3DC8E44EA8F4FFA1951EE9
- 3D28100C48FF3F360083C9D1A55FB5036DC03BCBB0F901867F25C3BF68C87486
- 8F0357F061FBB412109E356236DD72E17231536A808563104F1DBC37DC8EAFE0
- 8F93CB0B2716FE0107FEDFF8888F0F3E04E75D5D5F250D7066D71EC25A25587D
- CCA86166228C48D18E613B2FCB3980057862A98F9578A508051FBD9D2BC72EA6
- E9436738F0D5CEF12F6128C151048E61F6C839F4ABCB7F4303BA0F749520079D
- 7002C9FC18FC674E027C989D13035FFB6888D1D6E16573AD00B0377D96912E4B
- 2C5DD332E426097A24802C5D4601ECC07760C735BCEC904FE08F5B4C33CFBE54
- 7A3A100D5F903BE0F1A704573189E68C9A478F5EF5380DE979366F9795D0CE09
- 78FD6F147C7638E7D6D6566A0A37CB4D2E2D600FF394E22C535A28554E4EF750
- 9409F2C097EEA5AE1531F8B0EBDF1E7B157D2B7B1699CEBB5431DCFCE781AF6A
- 0106282A0C9939FC527AE2EA2769E459A3544D4876228EFF4D832FC23E0A57B8
- B5855299B12BCC1E7B726FCAF8B91B2A0DA9D87ADCC9D235002647B7098E423C
- F0AF187325CD1A3E271E3EE0E21FA0F59F035C87314A441855F282B32FA227AF
- 7B8626F49FD8AE12BEA9F021B0FF6026F35BC4C4E7EC4D09F06083AE89F1828F
- 6B039443FC6C063F77E402E962AA6D784027C047AC380F7C89E7309EB6989C75
- 1E3D7DFD7374FEE0A96D94A0E1E336E289867FF749861F179720D8A3D3FA1197
- 685C5A55CFC900B452445BF0EE008C1D7A3DFA154E17284E45039630FFB2E31F
- 898FC1675F9C8A474D18D77F3C3DF39DE768FAB019AE125CF8DCD53CF704C23F
- E0C07FF364C367C179A290C26A78246A92157B5A0B53BEF8F840F03A7F0CB6E3
- 9CB0068F6528ECF52DAFD1AA1D2B049E862FB059146C051E31821D6140C7A31A
- 1CF62A043E6458EFE1F4D4F5CFD2ECD173E4805DF85972CBE28408E0A3ABD919
- F0D1E981A90E0582CCB849454298BD19356D771AAFDAA63AC9085871E0D929F0
- BA4D506928A1358DD5F4A72F9EA337B6BECE8AD3EFD12A981272E0E3D7852F71
- 4E9E84B09641BD06D313D73D45775E7A37FDDB779E3E49F0FF8E3DABC876E0C5
- F9EC8E053E0A272E41A40453A9AE31361D11D89B3EDBAAC4024E1E8305C3E6AA
- C24A701B6051423C78199C89CF4A60E8B86BF5C7CF9FA57FFFEA2589C3EC247A
- 9BEE9F005690015B03F78613052F4BFFF2AAFF7F422FAC09FC173B0FBE0A700F
- 339826CF0A6132297DAE60CF86D79477991089C468244A2901EE8E3A0A503D9F
- 04A795E1A4A126E0D1EE3F7DF107FAC3E7CFC813693E791A4CFD69C01AB8C426
- 84DB13E43951E2C25FDFB9F051033000C3B954D6C51400F62053803040543754
- 537D433D754FE9AE6A803807BA80575742E3E2C4B5129EEF690A37D2F3AC8427
- 563F2A233F34CEB23307B606EE0D7704FF44CAA9820F87ABA17D7AF4A1161E88
- D530639CB708B3C791E0B9751B20F01A7E6965A94C6C140798E1C6CC8F373EDE
- 34A126E009863FAF7D811E7EFF17722FD7E7F32BD85E257058BBCE9053095F84
- FD21670D9177C8F0E28773DE48DD6D5A06EDA47A92A619D773728B73A97FF701
- EA76A403DEEDF9087438073CA07BD39C91325EE37969ED9FE9272B1E941BEBB8
- 4CE12DF13ADC19723AC0C7F9E2C5C6BC923C612CC2CCC11E47B4279262C90475
- B05598E0AE6FD77EE437022E5834B8EAD6630C763C7895C71B0F13F6D7AFFE42
- F7BD710F1DAC2D1573A46B4067C9812AEEE79F62F8105C7EC8EE974DDB982D18
- 431CE67BCC706AB8C8EF37F21109383B0A7750AAD18532D37A48498E07EFB9F7
- EB8286CFA365EF32D7021917F0DF1B9BFE8BEE7EED0E2AAA2AEA349303395055
- C283AC3BE9AD530C1F9720FAF6EC4B995D3369C7BE1D6E010473B037E9356AE0
- 0DC833EB9857B3B07C3F55541DA2A13DB365CE872301EFA6B1A2D00EC80348CE
- 017099A7555B57D2EDFF79AB3CE3D31972BAC08780C5B8C1E3652EBAFDE585C2
- 1822CC993D8E8E7BFEC617EC475062EB7930B661F7061ADF0F17C5D405A4368E
- 21BBDD53F6752D017CA962090702AD7FB0E37D5AF61FB7C87B57275362F0DF3C
- E5F02130BD178DB98836E56D9227A69DB62FE23067F62C56D4D818B19CB90D78
- 036BB6AEA1613D8753462883213B5D51811CDF0DD54A400D904954931D88E363
- 70F7E9EE3574EBBFDF4CDB8A3B7C77F998E574838FC2886742C70D19CF4C57BB
- 2B813598232C47D9D2B565BFCF2499FF0CAFD36CC9DF4C2D0D2DF2D6A0BA39A3
- 4D8E82ED3547A825B2D9640792E043096BF3BFA0A52FDD441B0A8E7BBAB53839
- DDE0436011260D9BCCF92DDA9CB7D9BD5C0FD6608EB03A523529E97BDC35B2D0
- 50E279C6CFB67D4697645F2A1B6E63EB053C5EC270F69AEC4092F8281150C2A6
- 7D1B69E9CB37D1BAFC2F9DC4E39392AA62BAEBC53B4E2BF8103F8F81E69F379F
- 3EDFF1B930954E0833E6A4F7F444B0CED162C3E6C79134AB58C2FC8749EA46F5
- 1A4D7DBBF597DE503C784C152CAB253F9024BEEE7E210CBB88892E96BFBCF4B8
- 955054B19FEE78E1765AB1E1ADD30A3E180D3E6B304D183A9159AEE06C2A2318
- 83B52CB0B80A08D787F7B2F9910400DA56B095F6EEDF4BB347CC66F3C30AF034
- B2C7035FFBA2846256C24BC7AE84C243FBE8F61796D3AA4D2B4F2BF8109CF3C2
- 298BA8B0AC50E699C3F942C018AC6581C55500AD91AF50A062C8A818D7AD5F59
- F30A2B601EF54CEB25B383404E047CEDBB4A78F196A3564241F95EBAEDF965F4
- EEE677F9244E3FF8BDBBF79637635EFDF4AFB17B00600BC660ED484C012C612B
- FCDF969FD6210C389F6CF984EAAAEA69C1D8CB8FDBECB4E7A34DF8BAF86B5AF6
- E75BE8CBBCB54E42C79277308F96FFE956FA60EBFBB1917507FB707D76271B3E
- 041726174DBD5CAEAD7DB2F913B7F4832D18CB8223710AC0C70B0CC37E894311
- 3418B872F7F2872FCAC3B5BDBB9EC507E30CB0120F24897F24F075184AC03460
- CBFFBCF4B04AD853BA87E12FA58FB77FC4F0D58975B80FEDB3EB14F8CCE8ACCC
- 3E74DD8CEB98DD4B7285D9B902C04C996DC20722E215C01288B6AEE07D481F15
- 9A7B77FDBB5471A882AE9F7C833AA0C40349E21F0D7CED03A6D48417DA57424E
- C92E5AF6C75B68CD8ED5A7257C11CE73C3A5DFA5CAFA2A66F78E5BFA397A23D8
- CA82479CB38809E632F0679BE88ECE63E7C31B2A87B80BB57CEE6DF465C15A2A
- AB3DD8A1CD3D16F87A156C17DB5F97BB8E26644DA0FE99FD55020BE6E359F6FC
- 52FA3CE71FA72D7C745246658DA6FBAFB99F7EFDEAAF6857D12E1957B1E03B2A
- 3F6D7AC7FA8764F4481B0540D287590551C39C4A640C868DDDCF2DF9887EA368
- FA98E9F4E1CE0F6447EEE564CF011E0F7CBD2C4AA86125E4C594B07DFF36313B
- 6B77AF75073389DB49EAB3EB2CF8D80F6E39FEEC7B0F51FE817CFAE3BB7FF45C
- 7CB43F4DA1D69F1EF17435C8680EF75718CDB410F3DDE0DEC0EEFD39F42F97FE
- 6F6AB29A685BD156D5F8790EF044C0D779B06D5102D704DC65FBCD8A5FD3571C
- 16F84E1E918E7C769D66765870D1ED9AE9D7D2AC7367D3032FDCCF26A85229A0
- 99EAAC80F1A3C695D1A4D75F922A00121D1F2DF0DBBE2C2EE8E76043D8606D43
- 2DDD39FF2E5AB76FADCC10A5957022E18BB08F6D97D79649635B5255725AC387
- 45189D35861EBAF1217AEC6F8FCAC857DB7E26FC724B6AF8F7473D65195630CF
- F6E51846741619662F00D953B29B069F3184AE9C72157DBCF32399CED795C483
- F6FA09718783AF7D285E4C1D4A523B79DAF8EC3AB5E473AF07D7FA1FB9F911B9
- E2F9CCAA673CE6399A6359E6EDD137A3652AA2ADB4E9057925FC4E7837D9E6CF
- E5CB112CB814F1C87FFD968C66937E34FB5E79CE514A7FE2417BFD84B82385AF
- 7D09E227495A1B9F5D67C2C7B907FD41BAF7EAFBA4C43FF2FA6F85910898313B
- 61D881B45F031C890CB572FC21F34C2E8593B9441A185C6CCDDF4A4B672DA3D4
- 94D4D855CDC4834F7242FF4CF021A8A1B7CC5F4A7326CDA1BB9FBD9B0ACBF669
- D36353C0FE43B3D5FABBE39EB8151B088C0C6DB6A2F624DEDF20D54096C90DE6
- 7B16FE981A238DB46DFFD658B5832439A17F36F8303DD75D723DDD3CF7666974
- 37EC59EFDA7D6E8F3F35FDFEBB22AB22D512D1811C5E012C98033934CCDCC623
- E199DC1E644209982BB9B4F200DD7BF9FD54D35C2D83A8645D53F1124F107EB2
- 38C797207E92A4B5F1D99D0AF84B2EBA9A7E78E53DF4D05F7E461F6CFC20D6E8
- 5AD15C9F61DCDCB4B2E58866503F220540301BB8393C5080CF766096702801F3
- E7975795D3BD57DC2F3501979861174511C94E56FBC9E21C5F82F84992D6C667
- D7D9361F66E77A2EF97733FC875FF925AD58FB960B3F6ADB65DC5D5BDEBCAA75
- B5441C811CB10220D1DDD13DF8660A03C6D792527030983FBFA4BC847EB4E85E
- 99656BCBBECDD21021ED9F093E4A3D1ADCA50B96D24D6C761EFACB4F053E0AA2
- 23357CCA3F0EAF6C7DD5593E22392A0540F0C11A7C33059FED90494979AF983F
- 1F53B8DF36F776CAEE93CD0DF30699CE570EAEA393F6F812C44F92B4363EBBCE
- 848F7E3EBA9AFF7AFDFFA5D9E7CEA1FB9FBF9F3EDCE4313B3CD8B2FDC683DCDF
- FF1377DFD575FB2394A35600BE91820FD6E09B296C682EE09814DD26600AF7AB
- A65E2D1359EF2CD94107AB0F8A39F29AA464BE04F19324AD8DCFAEB3E0633F18
- E1628A81DFDEFC28F5CCE8453F7CF62EDA90BB21069F4BBEC0AF6B7996DEEEB8
- C7934C8E5E01907DDCD48C8F6EC437532C9BA6EA3601BD234CD98B59C46F9B7B
- 87BC968909EEF0945C9BDAE0F812C44F92B4363EBBCE828F528F6B3BD74EBF96
- 7EF6BD9FD3A6DC8DF4E00B0F506179619CCD87D991927F0CF0219EBEE3314992
- 0FB9A9CF172E9CB290EEFCF65D945BB1871E7FE777B4A36887ACE0BD922A1C92
- 8149E6B3EB0CF8B0F5C883AB9A775D79370DEB9B4D8FFFFD71B1F7780C07EF38
- 2839D51F727304B3820786FABE60AEC3581F83A4F1E53F3CE2B87ACB27347EE0
- 04BA75F632EA919E497B0FE653ADBC21C27AE77C72D8896092F9EC4E367CF470
- 00BF4F661F195CDDC7A3DBBC925CE9E37FB1F30BE954C039B9571B515ADAF2F6
- 91F776DA93E3AD01AEB4F7314F3C197DE1988BE8D605CBA8678F4C7A6DED2BF4
- E6FA37DDF6A13DD3E4FAEC4E267CD8786CBF778FDE74F9D42BE89A8BAFA18ABA
- 4A7A7AE553F4D9F6FF968711E41821A7EBC73C5D39CCE76CD183F8EEA5DFA5F4
- AE5DE99D4DAB645ECDBD07F74AB715B725A58425C03B19F051DA714C786E67F0
- 5943C45CCE3F6F813C96F9F2472FD37B1BDEFDE67DCED62B87FBA0F38C7197D0
- D5D3AFA6ACB306D1D6C22D32B5E386DCF574A8F690E44189939E93ACA8BC383F
- 591CBC0EF2A036A2B4036AAF6EBD6852F624F9E0E8F821E3695FD93E7A75CDAB
- B47AEB27DFF00F3A7BE5083E693E66F0585AC0256FDAE869E4F3FB68DBBEADF4
- D9AECFE4399A92CA6279CD09D02068BCB55292756B011FDBC6B2D873ACC76128
- 332D258DFA66F6956734F1C94599C9D68ED2E75F7F4EABD6AD94E7F6F1E84802
- F86FEE27CDBD72B88FFA0326268A1D3F64024D1F3B5D6617C4BC45F804486EE9
- 1EB9AF9A5F9A2FD79DAAEAABE5030C98F842BEE5E2F458D0338109C3ABA069A1
- 2E327F3FDEC98279C19B2978390253F1E009854DB99BE4433B78FEB5B2B69257
- 579FDFF5C83FC947FD13247D01F56A35020B0C9BBEC70DF5F9BAA1864889054C
- 16B41503CE1840A3068E960110A6F9C24C5329C114C98389FD9AC34D32D396BE
- F68E6E2F5E82C67BB8217F506E84E31B3065D565F2E14DCCE18F0FEBEC2FDF2F
- B61D22662E56DAC96960BFB40D7A2960B7AEAC5F49F2D6D0C9964E53802B7328
- 23E80B5E68DAB438625A33FD24DF22768F0325123326023600E1A60FA65243AD
- 4057B60766F54ACBA0D4509A3BFF1ADEBBC25BFEF8100F6A4915F762AAD9C7BD
- 0B0C02A16001CE55D06D5B94D811B20AFD96F9B165D0EBE168F8B3C4E7764EB6
- 74BE02B42C215FB0313884470D3398C36CB62893FD7EB32FA7B8264A0B00CA1F
- 7C761D0994260E7FDE121E9348246295F87CF415E77ECF266375382D9CCF36FE
- 9846B2C72BA74E015E399702A13342034D9F3DD132EC297C50E744C81EC2B503
- 533BC2541DEB71425B8D5CCA0FF9C9C8E7858DA66DACB5A2C6A696F29642DAC0
- 0DED2996D3430189B284D2832DC17E8C2F9B4DD508F68793610F62DBD4376A98
- 3D7C96D1953B4521CEA96B0B1E2C6E899A769DCFB6AAD8D694906D14F0D9E5B0
- 69D9C5FE9E70285CCCA55C3500A78D10FD0F91229AEED130398C000000004945
- 4E44AE426082}
+ 25AF49444154785EDD9D077C1DC5B5FFCFEE6D922CCBB66C635CE582DC7B019B
+ 666382BB0D019B161292F7FF03C6F490D0FE79FFFF272109F927810079D42410
+ E0BDBC501E092EF462F30818E36E635BB624CBB224CB9255ACAEAB7B77DFF99D
+ D9D9BBF7EA4AEEB2C991E6CEECCC6CFB9E9933335B660D3A136509A5079B837D
+ C9A66CD3A6E1EC0F23C31E48B6D5276A98DD7C96D1994C0A714EBF5A81226451
+ 73D4B46B7DB65545865942B6514006E55806ED627F4F38142EA6D7A9CEC97FC6
+ C899A180491408F50C0D307DF604CBB0A7F2414D8C903DD84F660F4E4D6377BC
+ C769B36B60ED1CF29391CF0B1B4DDB586B458D4DCDE5CD85B4815A54B6D327A7
+ 4F014BC8176C080E36C89EC19C6647A334C5EF37FB708A2ED5AED8B6CD24F90F
+ 3EBBF6C4300CE5F0C77E128944225689CF475F71EEF76C325687D3C2F95C3BA2
+ 4E7A874AC72B600E65047DC10BD9B42C8E98D64C2EE50338D63D0E016DD964D9
+ 96000CF8029496D289BA76EA425DD3BBB1DF9532D23A536A284DD2B0664BA485
+ 1A9B1BA8B6B196AAEBAAA9AAAE8A0ED71FA6FAA67A6A89B688D24CC364CBA414
+ E3119B6B47A1DF323F6653F546381AFE8CDEA51A27AD43A4C31490BE807AB418
+ 8105864DDFA35AE33CEA2CA6450480001C929E924EFD7AF4A3E10346D0E8ACD1
+ 34ACFF30EAD7B33F656674A394502AF9B8E8727B208AB2A4363835C20946B92A
+ 35353751756D35151F2AA6DD45BB697BC136DAB97F27159517515D936A064421
+ DE1A524B0DD4D9FED236E8E580DDB2B26E251D72524EA99C720574994FDD9A8C
+ C015B66DDCCC05703247B926266AA95A9FD9B93B8D1D34862E1E339DA68E984A
+ 837A0FA2D4B4546AB6C254D75C43B5E15AAA6FAEA7A648238523616AB15A28C2
+ EB627D0B8E95A74D93CFF0A95A1348A38C942ED42DB51BB7E89DC96AB1A8E860
+ 11ADDBB58E3EDDB686B6EEDD4A15B5156A1D93951A930857C0F586613F9F62B7
+ FCFDF02AAA72E24F899C3A052CA160B02938CB8CDA777371BB9863D85EA8D20E
+ 70A9C1541A95358AE69D3B9F2E9DF82D1AD83B8BA266942A1B2BA98A1D80B349
+ A0A81D832CCEB2384EF916A7615B2A0FC73B61F1B18EAC67B3524CEA144AA75E
+ E9BD6840B72CEA16CAA4F28A725ABD6535AD5AB78ABE2ED84E8DE1465184A756
+ B4F0CA9F5A3EE3F1704AF87D6E23C24EFC499553A280E0A2E030D3A27B39780D
+ BB0CC469F05DD8965F3CFA62BAF692EB68EAC8A9E40BF9E9507D195534565063
+ 4BA302A7610B680726875B81D77945299E7CF03DF9108E581127DDA654AE1DFD
+ BBB299EB3592328399B42D6F1BBDBAFAAFB4866B06DA8E0445A04D78D532E9D1
+ F0F2708E8A3A797272153087422966600999D6435CB14738B172E2E9A9E974D9
+ 84CBE807B3FF178D1F3A9E1AAC7A2AAD3DC026A64EE068E0BA34039EC017A02A
+ 4D2F2B5FE5F3428F5F373E4E6D83979DF84834C2476653661A9BBFBEE36878CF
+ 1154585C482F7DF012BDBFF13DAA6BAC4B304DD19D6499BF6CB25A5EE786BAD9
+ 893C6139690A485D94DAC7B6220F7203FB2FBA8105189FE9A70B465D40B72FBA
+ 9DA68E9A463591C302BE91EDB986A701AAB0179E671961C439F9BCBE0BDE1BE7
+ CDE7ACAFC3DE7D48CDE0863B3DA5334DEC3F8926F79B42798579F4D4F2A7E81F
+ 5F7F26E968B0455443FD8261FA1F695CDE58A2224F4C4E8A0252E7FA27DB3EE3
+ 37BC39EED32BC1C9659D95C5E0EFA0C5D31753D80C53714D91981901E38255A0
+ E2E0C54157C0049E86A8F339E1A3068F74277FAB7C0C3AC28A40C37D71F6749A
+ D067227DF8D587F46FCB7F4F05070B126A83BDDA88DA3F6E7C27B2DE89386E39
+ 510518C105C10526451F6593938D08D87A1C2C1AD707AE7D80FAF5EE4BFBAAF7
+ 510DF766DC1386EF4096D2E8C4C7A0205EA5B502E58913F009713A5F2CDE89F3
+ E667DF55B2CE2FEB725BC1A60971FDBAF5A32BC67D9B3A1B19F4D81B8FD2CA2F
+ 574A7CAC6D88EEE1FA7D6F786578252F387DE16397B8FED731098F6443830337
+ 32EF27B98A62302507989991490F5CF3203D78FD436487A2945F954F0D2D0D0A
+ 869C74CC17C0704E9CC0D2A0E2E23DFE91D2641B302DCAE9FCB25FC4F1D04BE7
+ 55696A7F2A3FB7455006872BEA2A685DC19764F388F1A6CB6EA67E99FD6973FE
+ 6619DC29936476E706FDD2C030DFA1E8386B1BED383E251C9F02A6933F648696
+ 7259F8B56918DD11859319DE7F383D71EB93B4E0A205B4AF762F9571EF469F94
+ 404A04E6C409A804F071A092C4B5CEE7ECC349D779DA06EF49D3714EBC4AB7A4
+ 1B9C539A433B0E6CA7F95316D2AC71B364FC507EB84C94C0E7DE8947D6337C11
+ 7F4DB4777413ED23359A3C06397605A0E4037E93FD080FA9A48B8903BE70D485
+ F4F41DCFD09041436877450ED587EBE524341439614F187EC4BBACE358612EC8
+ 84B83615E48DC7B29337693E38C98BAE295C2CDEDD2F3BB736F03994D796D3DA
+ BCCF6968BFE1F4FD4B7E40B925B9D22E388D738AD14417F93AF9ABA3E3A21B8F
+ B5261CAB020C981D947C0D1F07386FCA3C7AF2B6DF534A460AE555E6AA019473
+ 42EE09EB93635F8357CB4A499617BC934FFB5EF07169128F9AC3DB70E235F856
+ F9DC38E475F2639F6EBCF245D93A8E9D3249960CD4D6ED5D4B29292974FBDCDB
+ A9E4D001DA5DBC5BB5097E0AF1EF05BE88591ADD6D6D11524729C7A4006E7017
+ 2A9BAFCC0E4E7ED1D445F4D8D2C7A9D9DFC48D6D813A01074422F8783FD1E428
+ DF052D3E4AA10E2B5F03D2A553D675F629791C1757F2252DA6282F6477FF9E38
+ 89F784B5C385BD2DFB377317BA81EE5E700F955795C93526A7614EB16C9AE61F
+ E6DF15DD1DDD8D88A391A35640DAFCC024B2AD3F98A6D91FCB38A07953E633FC
+ DF519D5143FB0FEF9713C509C543747C76AABA039CE7C45B8182EFC4E965763A
+ 9F406C0B3C875B811445EB121FCB17B7EC7131F009EBB0D3693B8ABFA6EAC62A
+ 56C2BD54525E4C394539B136C18A4E090EF57FDEB2C73A20E08E2047A5000CB2
+ A296FDBC619A13B18C83B870D4456C769EA4465F83828F83C38969A797D957A5
+ DB01EFC4C7C173E3B92F0E9F5D6B050108E0236F02F8B87CCA29F0EDE7913847
+ 61ADC0EBFD73BACA13BFEECE929D54DF522F4AC8D99F136B130C33336A1BC382
+ 2382EF477222B502B01D39B202E650C84FC6CF0DD358CC4B06768EDE0E1A5C7F
+ BA9FF67237530314681A0CFB2E789DE6C4BB799C78053FB6ACD3549C02E2E663
+ 17DF8678C2ECBCF9B4C2126B055CAB38A756B5768E198C73C86BD1D745DB2918
+ 08D0B2D9B7D1DA9D6BA9CCE91DB145CAE295522243AC8F28B7FD1B3D475440CA
+ D0C075546FFC2B85288852D523A3073DCE5DCDACAC2CCA39B48B0F840F5043F0
+ FA1A44429A6B4A3CE9BAD47BF3BA2553F22938AD4A70423E15AFE020DC5E89D7
+ 2E594D510EF9DA82CFEB45E1476873C1261ADC7B082D9EBA843EDAF411353437
+ A04D30D82E8FE6BE7A7E648FB5D5419954DA5540706E70A8615ACF50C8EC8D65
+ DC0C79F09A8768EEF973687BD956EEED342B68FAE4E37C3E40F635182F78C923
+ 714ED8032A962F66BB059A673D845D906E7C2C7F7C7C12C769C81B83EB4075D7
+ 8F48838B517138D22277DCE054388C7B9A9207F9717F62FDDEF5347FD2021AD6
+ 7BB85C51957B13215C7EB74699E704DE8FE646D58D8724D2B6029670ED8AF87E
+ C1366D161671608BA65E4EF75F7B3FEDAADC4975CDB502494E549FACF82A2E56
+ BA3DF01C5F29C1395927CE05CFF1B25DA479D2555AFC32C20A647C7EB756E838
+ 76FA3810E7058F78C06D6A6992B14B6D530DBB5AB973D6106EA0A6701335B734
+ 0BE8082B0517EE641B7C8CB8750AA9E752BFB37807DD3EEF4EAAA8AEA01D855F
+ EBF6A007D785D4C8F8E87B3C3E486A8ADA54407048702E0F30FE1FFAB8D8D9C0
+ 5E03E977B73E4175662D1DA82D8981707C0DCD2DE1F03D61F7C439AC074B52CD
+ 9D3C0231017C1C4867BD18484F0976B691085EF27B15EB280A2519706B1A0F53
+ 757D155537547318E06B6870CF21F4C3593F12F0F965790A861E5AC1F786E1B1
+ 0FD8070F1FA4E648332D9B731BADD9B29AAA78BBD23D6DA66CD3F06D6EAB6B9A
+ 5401B88D6891F938F98D6158C6C5B587AEFD094D1A359176947F2D27E182D3D0
+ 9C651786C7E4C48117D0F01548AFFD77C1794C92DE9EE4671FFB8B8157FBF682
+ D7FB72F33B8A4209AEE3925D515F4987EACAA9AAA14AEEBA011AF2E036E7A8DE
+ A3E9E91B9EA32B265C4917665F4839A5BB28B72C97B883295C92C157012EECFC
+ B7FB400E9D977D1E8D1B38813EE6F600F7ADD520CDEEDD29DB5ADEBC879A9C35
+ 5C495E038606AE67ED2DE3900F27317DEC74BAFFBAFB6967E50EAA0B2BD3E39E
+ A80B48855B8167A77B432E18CEA3C1AB7C0EC804F06A7DCE2BEBC5B617DB5642
+ 3CC7B90AE53C3019F56C4A0ED51DA2833507A9B2A1921BC97A362311171EC041
+ 81A3FA8CA6A76E7896CE1D749EC4774DEB4AE79F738140CD3B98CBB9E295E085
+ 0FC176D06EE471AD59367B19E596E451FE813C658AC8E81721332FBAC7DAA472
+ C7A49502D2E7504FCBE77F8C2BCF0034269D523BD1233FF815A574095141F55E
+ DEB13E790F047DE2EC03469C1972E0EA34BD8E177C2CAFF2651B89F192D7B34F
+ 76BAE4C3B9FB64D7C4A5BA8A61971E2EA5B2BA32B1E9C8AB4B2A7E4578D985FF
+ 9D187C2D5A0939A5BB59097B782DA58444F8E2B3036C5CA8EBD6A92B5D71EE95
+ F4CE576F4BCDE3C28C7B9CBD530747DF0AE752835A49492B0518C302D7F20A37
+ 73D0C4C92C3C6F117D7FDEF7696BD916AEAE4D0C201E8284D9B5BE96E35CE892
+ 34F87A400358F1E063F14E5E76888B8D239283174579E21BB9213D545B4E25D5
+ 2554595FC18A68928612D00D3B065DFBEDC1D7A29470BE2821D7A38444F822E2
+ DB947F309FBE73F10D545D5345DB0BB69369F2D880A857D4307727D6827805CC
+ A10C9FE1FF15B71D8351FA33D232E8E73FF80545422D545C834B0D1E108EEF9A
+ 0D5E56A001C8B3EC8495EF01CFCE6BAEBCF12A7F6BF0DA0978849D34F460CA6A
+ CBA8B8AA486C7B4B543DC0900CBAF68F06BE16D71C95C21C25282161DB50766D
+ 432D8502215A3CED6A7A67DDDBD28BE2426DDAB6D1353A24FA260FCEDC7BCACE
+ 969404CDE0456684CE4518273663EC0C1A317824E555E6095429956C3FE1AB67
+ 73005039C4B7881F9F2FC2F95A9C306CAF5AD749D379D8D76971F13AEC3AEE06
+ EA787638B183B50729B73C978AAB8BE576274088994900E3F5B12EE03F7D14F0
+ B564F5C8A227BFFB145D367AB6285FB6D7C63E98352D5FFF16A577EA44978CBB
+ 445842C0168C65C191580D984E7E5F8AEF41B65678788A42C110FD9FEB7E4281
+ 0C9F5CE514B3E19664A7147A96BDF639314D4AAB9B0F8E813BF18969AAF6C4D7
+ 14EF404DBBEAC66A2AAADACF25BF5CD959FCB553E2B51F83FF1C4D394AF85AA4
+ 2664EB86996B021AD864FB621382C724F1C0D9656367D1DB5FADE2F3B4403BC0
+ 87D812ED1D5DA96FDEB83520981E1CC49966228C131C9D3586260E9F447915B9
+ BC1C2B7528D1F1CBB84CABC228C53A4D4692083B69DE3851802ED56E1A7C4FED
+ 91E5D83664DB5CBBD07F2FAC2CA4FC43797498FBF1DAC6270591E0635BA35DF8
+ 52D18F59A426DCC835610C6A827303CCB30F09F20F8E69C5FAE5947576168D1D
+ 34569842C018AC6581C55580615833FDF5665F09F3DFFCF3E653B3D1284FAA61
+ 65178606E4050FE7845DF01EA787F5C9C0EB6DB9616F3AFB3A3FB651C10D6B1E
+ 9B9B32363B30753852110F80B67C6C6F749F316CF38F1FBE16AD8499A3BE15A7
+ 04D91D7ED8A1475470702F6DDEB799169CB7509842C018AC65814529600905F9
+ 773675266E286CB9B13E73C24CB9D289064DDB6C17B286E3898B733A0EBECEE7
+ 8D77C349C04B3C86FC3AAC6C7D5175111554EC95C1535C37D01B6EC3C73614FC
+ 674F18BE1628E1C68BBF4F7ED32FC723BBC38F77BF7CFC6F6F5C45E78F3C9FBA
+ 6774E77C1C89574BC05A31570A08D586FA472D65FBA1D17183C6D1D93DCFA6A2
+ C3450C0E36370603254F96E3E2A01455CA6559A72531432A3E21ECA63BE6CD89
+ C3BED187DF5B91CF43FD52598E2BF59E936DCBC776053E0FB24E167C48697529
+ BDB1F635394E11EC3361FF7850787DEE5764FA4D1A3F64BC5B5BC01ACC111605
+ 983E7BA2DF54573C717ED3B9F753D372986A9B6B1C30703193A3E0A8B0EE0DB9
+ 10D9F79A21B786C077C262D29CE5B8DA95E06072F61ECA175B0F39EE920FF803
+ 4F2EFC7B5FB99B566C58C1B81821F69964FFB816545153415B0AB6D0F43133DC
+ B203D6608E30146058644F433CAE5DE019CE73879F4B8587F73920136CBD03CC
+ 85ECA479E3249F273E96A73578B5CCEB39F188C3760ED6967263BB4FFAF8B09F
+ 671AFCBFAD7B538E4BA49DE34061FBC7CECF68C23913A8736A678E9244BFC39C
+ 5B8A25D489153541F2738FA27F8FFED4F7AC7E54E25CF1049438A0DA77C2A210
+ 27CECDE7CDEB385CF2D569BA0D5197779D30E2D8A14B79E0700995B043AFE7CC
+ 852FC6E388C783C6782BD7802EE95DA87FCF01C21822CC99BD196C0CF68B44EC
+ C188445F7FC4809164040C1951A2C4EA12AF816A5BAFE355496E0D5285D59304
+ 68A8CE4AEFC5C764AB5A82F5BD799DFCCD0C1F032A8C6AF5817E93E1C347012A
+ A9C4A5914A1A9935521843C01CECB1A56C7FA3BC8D28366BCCC03154DD5CA59E
+ D5D790D87747BE802771093D1884DD659586529F1A48A5ABC75F4BF7CEB88FE6
+ 8D58C825C2C74A08C7AFCBF97159B884E1E31A8E3E81E3858F4BCA271DFECBC7
+ 0E5F87719B724FC91E1A3D70B4308638CCB34DD3A611DC354A45245EEDC9EE97
+ 4D65F5E8672B48AD07595CAA112F35C129F988D73EF2229DD352FC2974D5D8AB
+ 69DAC00B2823B50B2D18B590168F5B42013320A646AF1316F82554CDB54E1FF4
+ 89C09F3C708A9370E202F83F04FCAF8E1DBED87BFE47EF27A768179DD3E71C0A
+ F8E54521744753C11E5B1CCACE904BCF299DA84F8F3E542ECF74AA521C754C8E
+ DB80721CFC44D3A47C9507F043BE90C09E9A75BEEC0FDBC7BB0273472EA01B26
+ DFC8CA49957CE19630951E3EC03D9D6A75E09257F9B2EC0DB7E163DF634E21FC
+ BF9F007C2DB8427A56D7B39871BAB0604155186AF2D2402C6185AEE95D29A353
+ 8663FF6360E3EC3D6CB8568A06EF284797FCA02FC8257F099D3FF0423436B22F
+ DD6340DF78CE887974D3F94BA953A01395D61C90EB3AFA608F0B7E5FD8FC5301
+ FFAE1387CF3EEEA81DA83C40A1408ABC662BE992660F34B9132AFD7F68A55B7A
+ 370A0403D2FF8F0DC0607274E957ED402BF0CE326C7E80E15FC9F02F1A3C9DE1
+ E3C0157CD83EAD0484670D9F4DB75C789B982935C0C23188A70EDE1B6EC357F0
+ C7CAE585930BFF8003FF6F7CC427061F82F3AEAEAB920638B3733761AD12ACDE
+ 66D430331146A468C7B09D97E51CC0023CB1D4C74ABC5284828FDECE956316D3
+ F421331CF86AE7F8973094E02802C7307BC41CFAD5E5BFA1FE5D07B84A90834E
+ 3881647E0CFEB3A7003ECCCEC981AF7D34C468EBF0B2B95600D89B3ECB489725
+ 96CE69197293043D1240962EA30076E03BB0E31A5E76C827F0C72EA699E75C2A
+ 3D1D88862FC81DF0F85382AB98447346CEA3C7AE7A8206773F87B7CB4A68E304
+ BCFE370A3E3B9C734B4B0B35869BE4269716B087794A7196292D942A27A77B28
+ CA0479E04BF752D78A187CD8F56F8FB98ABE953D8B4CE75DAA186EFEF3C057B5
+ 0003141586CC1C76293D79F55334E2EC91AA26243B11C7FFA6C117611F852BDC
+ D24CA9CCD815668F3DB93765FCDC0D9586546C3DEE64E91A0093A3DB0447211E
+ F8578CBE92660D9B130F1F70F10FD0FACF01AEC31825228C2A79C13917D153D7
+ 3D4BE3FB4D685309DF54F810D87F3093F92D62E273F6A60478B041D7C478C1C7
+ B501CA217E36839F3B62817431D5363CA013E023569C07BEC473184F5B4CC93A
+ 979EB9FE793A6FD0B4564AD0F0711BF164C3BFE714C38F8B4B10ECD169FD884B
+ 342EADAAE764005A29A235787700C60EBD1EFD0AA70B14A7A2014B987FD9F18F
+ C4C7E0B32F4EC5A3268CED378E9EFDCEF3347DE80C57092E7CEE6A4E3A89F00F
+ 38F0DF3AD5F059709E28A4B01A1E899A64C59ED6C2942F3E3E10BCCE1F83ED38
+ 27ACC163190A7B63CBEBB46AC70A81A7E10B6C16055B81478C604718D0F1A806
+ 87BD0A810F19DA6B183D7DFD73347BD41C3960177E96DCB2382902F8E86A7604
+ 7C747A60AA438120336E549110666F464DDB9DC6ABA6B1563202561C78760ABC
+ 6E13541A4AE8E1866AFAD317CFD39B5BDF60C5E9F768154C0939F0F1EBC29738
+ 274F4258CBC01E83E8C9EB9EA6BB2EBD87FEED3BCF9C22F87FC79E55641BF0E2
+ 7C76C7031F851397205282A954DB109B8E08EC4D9F6D556201278FC182617355
+ 6125B80DB028211EBC0CCEC467253074DCB5FAE3E7CFD1BF7FF5B2C4617612BD
+ 4DF74F002BC880AD817BC3898297A57F79D5FF3FA917D604FE4B1D075F05B887
+ 194C9367853099943E57B067C36BCABB4C8844623412A5940077471D05A89E4F
+ 82D3CA70D25013F068F79FBEF803FDE1F367E589349F3C0DA6FE34600D5C6213
+ C26D09F29C2C71E1AFEF58F8A8011880E15C2A6B630A007B9029401820AAEBAB
+ A9AEBE8EBAA6745535409C035DC0AB2BA17171E25A08CFF734861BE80556C293
+ AB1F93911F1A67D999035B03F786DB837F32E574C187C3D5D0DEDD7A53330FC4
+ 0E33639CB708B3C791E0B9751B20F01A7E6965A94C6C140798E1C6CC8F373EDE
+ 34A126E009863FAF7D911E79FF17722FD7E7F32BD85E257058BB8E90D3095F84
+ FDC1670F9677C8F0E28773DE48DD6D5A06EDA45A92A619D773728B73A95FD7FE
+ EA76A403DEEDF9087438073CA07BD39C91325EE37979ED9FE9272B1E921BEBB8
+ 4CE12DF13ADC117226C0C7F9E2C5C6BC923C612CC2CCC11E47B427926AC90475
+ B05598E0AE4FE7BEE437022E5834B8EAD6630C763C7895C71B0F13F6D7AFFE42
+ F7BF792F1DAC291573A46B4047C9812AEEE79F66F8105C7EC8EE9B4DDB982D18
+ 431CE67BCC706AB8C8EF37F21109383B0A7750AAD18932D3BA49498E07EFB9F7
+ EB8286CFA365EF32D7021917F0DF9B9BFE8BEE79FD4E2AAA2AEA309303395055
+ C283ACBB68F969868F4B107DBAF7A1CCCE99B463DF0EB7008239D89BF43AD5F3
+ 06E49975CCAB5958BE9F2AAA0ED190EED932E7C3D18077D358516807E40124E7
+ 00B8CCD3AAAD2BE98EFFBC559EF1E9083953E043C062ECA0713217DDFEF24261
+ 0C11E6CC1E47C73D7FE30BF62328B1753C18DBB07B038DEB8B8B62EA02522BC7
+ 90DDEE29FBBA9600BE54B1840381D63FD8F13E2DFB8F5BE4BDAB532931F86F9D
+ 76F81098DE8B465F449BF236C913D34EDB177198337B162B6A6C8C58CEDC06BC
+ 81355BD7D0D0EEC3282394C1909DAEA8408EEF866A25A006C824AAC90EC4F131
+ B8FB74F71ABAF5DF6FA66DC5EDBEBB7CDC72A6C14761C433A163078F63A6ABDD
+ 95C01ACC1196A36CEEDCBCDF6792CC7F86D769B6E46FA6E6FA66796B50DD9CD1
+ 2647C1F69A23D412D96CB20349F0A184B5F95FD0D2976FA20D05273CDD5A9C9C
+ 69F021B00893874EE1FC166DCEDBEC5EAE076B3047581DA99A94F43DEE1A5968
+ 28F13CE367DB3EA34BB22F950DB7B2F5021E2F61387B4D7620497C94082861D3
+ BE8DB4F4959B685DFE974EE28949495531DDFDD29D67147C889FC740F3CF9D4F
+ 9FEFF85C984A27841973D27B7A2258E768B161F3E34827AB58C2FC8749EA46F6
+ 18457DBAF493DE503C784C152CAB253F9024BEEE7E210CBB88892E6E7B65E909
+ 2BA1A8623FDDF9E21DB462C3F2330A3E180D3A7B108D1F328159AEE06C2A2318
+ 83B52CB0B80A08D785F7B2F9910400DA56B095F6EEDF4BB387CF66F3C30AF034
+ B227025FFBA2846256C2CBC7AF84C243FBE88E176FA3559B569E51F02138E785
+ 5317516159A1CC3387F385803158CB028BAB005A235FA140C5905131AE5BBFBA
+ E65556C03CEA9ED6436607819C0CF8DA7795F0D22DC7AC8482F2BD74FB0BCBE8
+ DDCDEFF2499C79F07B75ED256FC6BCF6E95F63F700C0168CC1DA91980258C256
+ F8BF2D3FAD4318703ED9F209D556D5D18231979FB0D969CB479BF075F1D7B4EC
+ CFB7D097796B9D84F625EF601EDDF6A75BE983ADEFC746D6EDECC3F5D99D6AF8
+ 105C985C34ED72B9B6F6C9E64FDCD20FB6602C0B8EC429001F2F300CFB650E45
+ D060E0CADD2B1FBE240FD7F6EA7C361F8C33C04A3C9024FED1C0D7612801D380
+ DDF6E7A54754C29ED23D0C7F297DBCFD2386AF4EACDD7D689F5D87C067466767
+ F6A6EB665CC7EC5E962BCCCE150066CA6C133E1011AF009640B46505EF43FAA8
+ D0DCBBEBDFA58A431574FD941BD401251E4812FF58E06B1F30A526BCD8B61272
+ 4A76D1B23FDE426B76AC3E23E18B709E1B2EFD2E55D65531BB77DCD2CFD11BC1
+ 56163CE29C454C3097813FDB4477741E3B1FDE5039C45DA8DBE6DE4E5F16ACA5
+ B29A83EDDADCE381AF57C176B1FD75B9EB687CD678EA97D94F25B0603E9E652F
+ 2CA5CF73FE71C6C247276564D6287AE09A07E8D7AFFD8A7615ED9271150BBEA3
+ F2D3C677AC7F48468FB45200247DA8551035CC6944C620D8D8FDDC920FEF3B92
+ A68F9E4E1FEEFC4076E45E4EF61CE089C0D7CBA284C3AC84BC9812B6EFDF2666
+ 67EDEEB5EE6026713B497D761D051FFBC12DC79F7DEF61CA3F904F7F7CF78F9E
+ 8B8FF6A729D4F2D3A39EAE0619CD61FE0AA3891662BE1BDC1BD8BD3F87FEE5D2
+ FF4D8D56236D2BDAAA1A3FCF019E0CF83A0FB62D4AE09A80BB6CBF59F16BFA8A
+ C302DFC923D29ECFAEC3CC0E0B2EBA5D33FD5A9A3569363DF8E2036C822A9502
+ 9AA8D60A183F6A58194D7AFD25A90220D171D102BFEDCBE2823E111BC2066BEA
+ 6BE8AEF977D3BA7D6B658628AD8493095F847D6CBBBCA64C1ADB92AA92331A3E
+ 2CC2A8ACD1F4F08D0FD3E37F7B4C46BEDAF633E1579A53C3BF3FE629CBB08279
+ 8E2FC730A2B3C8307B00C89E92DD34A8E760BA72EA55F4F1CE8F643A5F57120F
+ DAEB27C41D09BEF6A178317528496DE469E5B3EBD092CFBD1E5CEB7FF4E647E5
+ 8AE7B3AB9EF598E7688E65997744DF8A96A988D6D2AA17E495F03BE1DD649B3F
+ 972F47B0E052C4A3FFF55B329A4CFAD1ECFBE4394729FD8907EDF513E28E16BE
+ F625889F2469AD7C761D091FE71EF407E9BEABEF9712FFE81BBF15462260C6EC
+ 84613BD2760D702432C4CAF1A7986771299CC225D2C0E0626BFE565A3A6B19A5
+ A6A4C6AE6A261E7C9213FA67820F410DBD65FE529A33790EDDF3DC3D5458B64F
+ 9B1ED68CFD8726ABE577273C712B36101811DA6C45EDC9BCBF81AA812C931BCC
+ F72EFC3135441A68DBFEADB16A07497242FF6CF0617AAEBBE47ABA79EECDD2E8
+ 6ED8B3DEB5FBDC1E7F6AFAFD77475645AA25A21D39B2025830077268A8B98D47
+ C233B93DC8841230577269E501BAEFF207E87053B50CA292754DC54B3C41F8C9
+ E21C5F82F84992D6CA67773AE02FB9E86AFAE195F7D2C37FF9197DB0F18358A3
+ 6B45737D867173E3CAE6A39A41FDA81400C16CE0E6B040013EDB8159C2A104CC
+ 9F5F5E554EF75DF180D4045C62865D1445243B59ED278B737C09E227495A2B9F
+ 5D47DB7C989DEBB9E4DFC3F01F79F597B462ED72177ED4B6CBB8BB765BD3AA96
+ D512711472D40A80447747F7E09B290C185F4B4AC1C160FEFC92F212FAD1A2FB
+ 6496AD2DFB364B4384B47F26F828F56870972E584A37B1D979F82F3F15F82888
+ 8E1CE653FE717865CB6BCEF251C9312900820FD6E09B29F86C874C4ACA7BC5FC
+ F998C2FDF6B9775076EF6C6E9837C874BE7270ED9DB4C797207E92A4B5F2D975
+ 247CF4F3D1D5FCD7EBFF2FCD9E34871E78E101FA7093C7ECF060CBF61B0F717F
+ FF4FDC7D57D7ED8F528E5901F8460A3E58836FA6B0A1B9806352749B8029DCAF
+ 9A76B54C64BDB364071DAC3E28E6C86B9292F912C44F92B4563EBB8E828FFD60
+ 848B29067E7BF363D43DA307FDF0B9BB6943EE86187C2EF902BFB6F9397ABBFD
+ 1E4F3239760540F67153332EBA11DF4CB16C9AA6DB04F48E30652F6611BF7DEE
+ 9DF25A2626B8C35372AD6A83E34B103F49D25AF9EC3A0A3E4A3DAEED5C3BFD5A
+ FAD9F77E4E9B7237D2432F3E4885E58571361F66474AFE71C08778FA8EC72549
+ 3EE4A63E5FB870EA42BAEBDB77536EC51E7AE29DDFD18EA21DB282F74AAA7048
+ 062699CFAE23E0C3D6230FAE6ADE7DE53D34B44F363DF1F727C4DEE3311CBCE3
+ A0E4747FC8CD11CC0A1E18E2FB82B90E657D0C94C697FFF088E3EA2D9FD0B801
+ E3E9D6D9CBA85B7A26ED3D984F35F28608EB9DF3C961278249E6B33BD5F0D1C3
+ 01FCDE99BD6570753F8F6EF34A72A58FFFC5CE2FA45301E7E45E6D446969F3DB
+ 47DFDB694B4EB406B8D2D6C73CF164F485A32FA25B172CA3EEDD32E9F5B5AFD2
+ 5BEBDF72DB87B64C93EBB33B95F061E3B1FD5EDD7AD1E5D3AEA06B2EBE862A6A
+ 2BE999954FD367DBFF5B1E469063849CA91FF374E5089FB3450FE2BB977E97D2
+ 3B77A67736AD927935F71EDC2BDD56DC9694129600EF54C04769C731E1B99D41
+ 670F167339FFDC05F258E62B1FBD42EF6D78F79BF7395BAF1CE983CE33C65E42
+ 574FBF9AB2CE1E485B0BB7C8D48E1B72D7D3A19A439207254E7A4EB2A2F2E2FC
+ 6471F0DAC983DA88D20EA83DBAF4A0C9D993E583A3E3068FA37D65FBE8B535AF
+ D1EAAD9F7CC33FE8EC95A3F8A4F9E84163680197BCF3479D4F3EBF8FB6EDDB4A
+ 9FEDFA4C9EA329A92C96D79C000D82C65B2B2559B716F0B16D2C8B3DC77A1C86
+ 32D352D2A84F661F7946139F5C94996CED287DFEF5E7B46ADD4A796E1F8F8E24
+ 80FFE67ED2DC2B47FAA83F6062A2D87183C7D3F431D3657641CC5B844F80E496
+ EE91FBAAF9A5F972DDA9AAAE5A3EC080892FE45B2E4E8F053D139830BC0A9A16
+ EA24F3F7E39D2C9817BC9982972330150F9E50D894BB493EB483E75F2B6B2A79
+ 75F5F95D8FFC937CD43F41D217508F1623B0C0B0E97BDC509FA71B6A889458C0
+ 64415BD1BF677F1A3960940C8030CD17669A4A09A6481E4CECD7146E9499B6F4
+ B577747BF11234DEC30DF98372231CDF8029AB2E930F6F620E7F7C58677FF97E
+ B1ED103173B1D2AE1BD82F6D835E0ED82D2BEB5692BC3574AAA5C314E0CA1CCA
+ 08FA82179A362D8E98D64C3FC9B788DDE34089C48C89800D40B8E983A9D4502B
+ D095ED8659BDD232283594E6CEBF86F7AEF0963F3EC4835A52C5BD986AF671EF
+ 028340285880731574DB16257684AC42BF657E6C19F446381AFE2CF1B99D532D
+ 1DAF002D4BC8176C080EE651C30CE6309B2DCA14BFDFECC329AE89D20280F207
+ 9F5D7B02A589C39FB784C724128958253E1F7DC5B9DFB3C9581D4E0BE7B38D3F
+ AE91EC89CAE9538057265120D43334C0F4D9132CC39ECA07353142F660AE1D98
+ DA11A6EA788F13DA6AE0527EC84F463E2F6C346D63AD15353635973717D2066E
+ 684FB39C190A489425941E6C0EF6657CD96CAA86B33F8C0C7B20DBA63E51C3EC
+ E6B30CCC411EE29CBAB6E0C1E2E6A869D7FA6CAB8A6D4D09D946019F5D0E9B96
+ 5DECEF0987C2C55CCA550370C608D1FF00F1619AEFE0F429150000000049454E
+ 44AE426082}
end>
Position.X = 416.000000000000000000
Position.Y = 8.000000000000000000
diff --git a/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.pas b/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.pas
index 80e42e8..9e95f44 100644
--- a/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.pas
+++ b/demos/Firemonkey/TStringGrid/Unit_FMX_StringGrid.pas
@@ -106,13 +106,13 @@ procedure TStringGridForm.FormCreate(Sender: TObject);
var t : Integer;
begin
// Create data
- Data:=TStringsData.Create;
+ Data:=TStringsData.Create(1000,100000,60);
// Initialize size
//Data.Columns:=1000;
//Data.Rows:=100000;
- Data.Resize(1000,100000);
+// Data.Resize(1000,100000);
// Set header texts
Data.Headers[0]:='A'#13#10'Text';
diff --git a/demos/Firemonkey/Ticker/TeeGrid_FMX_Ticker.dproj b/demos/Firemonkey/Ticker/TeeGrid_FMX_Ticker.dproj
index 3b12ca8..f68f7a0 100644
--- a/demos/Firemonkey/Ticker/TeeGrid_FMX_Ticker.dproj
+++ b/demos/Firemonkey/Ticker/TeeGrid_FMX_Ticker.dproj
@@ -365,14 +365,14 @@
true
-
+
+ Default-736h@3x.png
true
-
+
- Default-736h@3x.png
true
@@ -509,14 +509,14 @@
true
-
-
- classes.dex
+
+
true
-
-
+
+
+ classes.dex
true
@@ -531,7 +531,7 @@
true
-
+
true
diff --git a/demos/Firemonkey/Ticker/Unit_FMX_Ticker.pas b/demos/Firemonkey/Ticker/Unit_FMX_Ticker.pas
index 01c3740..5027fcc 100644
--- a/demos/Firemonkey/Ticker/Unit_FMX_Ticker.pas
+++ b/demos/Firemonkey/Ticker/Unit_FMX_Ticker.pas
@@ -137,7 +137,7 @@ procedure TTickerForm.Timer1Timer(Sender: TObject);
Data.SetValue(tmp,Row,IntToStr(OldValue+Random(100)-50));
// Update Ticker
- Ticker.Change(Data.IndexOf(tmp),Row,OldValue);
+ Ticker.Change(Col,Row,OldValue);
end;
// Just fill grid cells with random values
diff --git a/demos/VCL/TeeBI/Customer_Orders/Unit_Customer_Orders.pas b/demos/VCL/TeeBI/Customer_Orders/Unit_Customer_Orders.pas
index c5fa879..8976e9d 100644
--- a/demos/VCL/TeeBI/Customer_Orders/Unit_Customer_Orders.pas
+++ b/demos/VCL/TeeBI/Customer_Orders/Unit_Customer_Orders.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Master -> Detail sub-grid rows }
-{ Copyright (c) 2015-2016 by Steema Software }
+{ Copyright (c) 2015-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Unit_Customer_Orders;
@@ -60,6 +60,8 @@ implementation
{$R *.dfm}
uses
+ {System.}UITypes,
+
BI.DataSource, BI.Persist, BI.Grid.Data,
Tee.Grid.Header, Tee.Grid.Totals, Tee.Grid.Themes, Tee.Grid.Bands, Tee.Grid,
Tee.Format;
@@ -100,7 +102,7 @@ procedure TFormDetailRows.AddDetail(const AGroup:TRowGroup; const ADetail:TDataI
(AGroup.Data as TBIGridData).Detail:=ADetail;
// Set the "+/-" icon to a column to enable expand / collapse
- Expander:=TeeGrid1.NewExpander(AGroup);
+ Expander:=AGroup.NewExpander;
Expander.Style:=TExpanderStyle(CBExpander.ItemIndex);
@@ -121,8 +123,6 @@ procedure TFormDetailRows.NewOrderItemsDetail(const Sender,NewGroup:TRowGroup);
tmp.Calculation.Add(NewGroup.Columns['Quantity'],TColumnCalculation.Sum);
tmp.Format.Font.Style:=[fsBold];
-
-// TGridThemes.iOS.ApplyTo(NewGroup);
end;
// Optional event.
@@ -146,6 +146,7 @@ procedure TFormDetailRows.LoadSampleData;
OrderItems:=Demo['"Order Details"'];
end;
+// Return a new simple Title band
function TitleSample(const ACollection:TCollection):TTextBand;
begin
result:=TTextBand.Create(ACollection);
@@ -169,6 +170,7 @@ procedure TFormDetailRows.FormCreate(Sender: TObject);
AddMainTotals;
+ // Example, insert a subband at row position 10
TeeGrid1.Rows.SubBands.Row[10]:=TitleSample(TeeGrid1.Rows.SubBands);
end;
diff --git a/demos/VCL/Ticker/Unit_Ticker.dfm b/demos/VCL/Ticker/Unit_Ticker.dfm
index 5b4257c..11daa13 100644
--- a/demos/VCL/Ticker/Unit_Ticker.dfm
+++ b/demos/VCL/Ticker/Unit_Ticker.dfm
@@ -23,13 +23,18 @@ object TickerForm: TTickerForm
Width = 389
Height = 215
Columns = <>
- Footer = <>
ReadOnly = False
Align = alClient
UseDockManager = False
ParentBackground = False
ParentColor = False
TabOrder = 0
+ _Headers = (
+ 1
+ 'TColumnHeaderBand'
+ <
+ item
+ end>)
end
object PanelEditor: TPanel
Left = 0
diff --git a/demos/VCL/Ticker/Unit_Ticker.pas b/demos/VCL/Ticker/Unit_Ticker.pas
index 0209686..16df5ba 100644
--- a/demos/VCL/Ticker/Unit_Ticker.pas
+++ b/demos/VCL/Ticker/Unit_Ticker.pas
@@ -160,6 +160,7 @@ procedure TTickerForm.ColumnTextAlign;
begin
tmp:=TeeGrid1.Columns[Col];
+ tmp.ParentFormat:=False;
tmp.TextAlignment:=TColumnTextAlign.Custom;
tmp.TextAlign.Horizontal:=THorizontalAlign.Right;
end;
diff --git a/demos/VirtualData/Array/Unit_Array.pas b/demos/VirtualData/Array/Unit_Array.pas
index 86c1a5f..49d20e6 100644
--- a/demos/VirtualData/Array/Unit_Array.pas
+++ b/demos/VirtualData/Array/Unit_Array.pas
@@ -8,7 +8,8 @@ interface
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VCLTee.Control, VCLTee.Grid,
VCLTee.Editor.Grid, Vcl.StdCtrls, Vcl.ExtCtrls, System.UITypes,
- Tee.Renders, Tee.Grid.Columns, VCLTee.Editor.Render.Text, Tee.Grid.Rows;
+ Tee.Renders, Tee.Grid.Columns, VCLTee.Editor.Render.Text, Tee.Grid.Rows,
+ Tee.Grid.Bands;
type
TFormArray = class(TForm)
@@ -40,6 +41,8 @@ TFormArray = class(TForm)
private
{ Private declarations }
+ SampleHeader : TTextBand;
+
procedure AddSampleFooter;
procedure GDIPlusChanged(Sender: TObject);
procedure GridShowEditor(const Sender:TObject; const AEditor:TControl;
@@ -62,8 +65,7 @@ implementation
VCLTee.Painter.GdiPlus, VCLTee.Painter, Tee.Format,
- Tee.Grid.Totals, Tee.Grid.Bands, VCLTee.Editor.Grid.Bands,
- VCLTee.Editor.Painter.GDIPlus;
+ Tee.Grid.Totals, VCLTee.Editor.Grid.Bands, VCLTee.Editor.Painter.GDIPlus;
// Show the TeeGrid editor dialog
procedure TFormArray.Button1Click(Sender: TObject);
@@ -255,8 +257,14 @@ procedure TFormArray.BRecordClick(Sender: TObject);
// Add a simple Title band to footer
AddSampleFooter;
+ // Destroy the previously created SampleHeader, if any
+ SampleHeader.Free;
+
// Add a simple Title band to headers
- NewTitle(TeeGrid1.Headers,'Header Sample'#13#10'Text').Index:=0;
+ SampleHeader:=NewTitle(TeeGrid1.Headers,'Header Sample'#13#10'Text');
+
+ // Move it to top
+ SampleHeader.Index:=0;
// Use a TDateTimePicker as editor control for "BirthDate" column
TeeGrid1.Columns['BirthDate'].EditorClass:=TDateTimePicker;
diff --git a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.dfm b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.dfm
index 1cb38f8..17919fc 100644
--- a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.dfm
+++ b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.dfm
@@ -18,11 +18,6 @@ object SampleData: TSampleData
Left = 47
Top = 85
end
- object DataSource1: TDataSource
- DataSet = CustomersTable
- Left = 144
- Top = 85
- end
object OrdersTable: TFDQuery
Connection = Sqlite_demoConnection
SQL.Strings = (
@@ -37,7 +32,7 @@ object SampleData: TSampleData
end>
end
object FDStanStorageBinLink1: TFDStanStorageBinLink
- Left = 48
+ Left = 120
Top = 216
end
end
diff --git a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.pas b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.pas
index 40ece5a..d5f653e 100644
--- a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.pas
+++ b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Customer_Orders.pas
@@ -14,7 +14,6 @@ interface
TSampleData = class(TDataModule)
Sqlite_demoConnection: TFDConnection;
CustomersTable: TFDQuery;
- DataSource1: TDataSource;
OrdersTable: TFDQuery;
FDStanStorageBinLink1: TFDStanStorageBinLink;
private
diff --git a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Master_Detail_FireDAC.pas b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Master_Detail_FireDAC.pas
index 6506a9e..4a6f1ed 100644
--- a/demos/VirtualData/DataSet/Master_Detail_FireDAC/Master_Detail_FireDAC.pas
+++ b/demos/VirtualData/DataSet/Master_Detail_FireDAC/Master_Detail_FireDAC.pas
@@ -82,8 +82,10 @@ procedure TMasterDetail.CBEnabledChange(Sender: TObject);
end
else
begin
+ // Remove all detail grids
TeeGrid1.Rows.Children.Clear;
+ // Set first column render to default (no expander)
TeeGrid1.Columns[0].Render:=nil;
end;
end;
diff --git a/demos/VirtualData/DataSet/VCL/Unit_Dataset.dfm b/demos/VirtualData/DataSet/VCL/Unit_Dataset.dfm
index d83f0d9..107bdcc 100644
--- a/demos/VirtualData/DataSet/VCL/Unit_Dataset.dfm
+++ b/demos/VirtualData/DataSet/VCL/Unit_Dataset.dfm
@@ -1,7 +1,7 @@
object FormGridDataset: TFormGridDataset
Left = 0
Top = 0
- Caption = 'FormGridDataset'
+ Caption = 'TeeGrid - VCL TDataSet Example'
ClientHeight = 525
ClientWidth = 1114
Color = clBtnFace
diff --git a/demos/VirtualData/TList/TeeGrid_TList_Data.dproj b/demos/VirtualData/TList/TeeGrid_TList_Data.dproj
index 6c83563..db8b083 100644
--- a/demos/VirtualData/TList/TeeGrid_TList_Data.dproj
+++ b/demos/VirtualData/TList/TeeGrid_TList_Data.dproj
@@ -377,9 +377,9 @@
true
-
+
- Info.plist
+ TeeGrid_TList_Data.icns
true
@@ -416,18 +416,33 @@
true
-
+
- TeeGrid_TList_Data.icns
+ Info.plist
true
-
+
+
+ 0
+ .dll;.bpl
+
1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
1
+ .dylib
+
+
+ 1
+ .dylib
@@ -806,27 +821,12 @@
1
-
-
- 0
- .dll;.bpl
-
+
1
- .dylib
-
-
- Contents\MacOS
- 1
- .dylib
1
- .dylib
-
-
- 1
- .dylib
diff --git a/demos/VirtualData/TStringGrid/TeeGrid_as_TStringGrid.dproj b/demos/VirtualData/TStringGrid/TeeGrid_as_TStringGrid.dproj
index 76365a0..93aec4b 100644
--- a/demos/VirtualData/TStringGrid/TeeGrid_as_TStringGrid.dproj
+++ b/demos/VirtualData/TStringGrid/TeeGrid_as_TStringGrid.dproj
@@ -5,7 +5,7 @@
VCL
TeeGrid_as_TStringGrid.dpr
True
- Debug
+ Release
Win32
3
Application
@@ -168,12 +168,27 @@
true
-
+
+
+ 0
+ .dll;.bpl
+
1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
1
+ .dylib
+
+
+ 1
+ .dylib
@@ -552,27 +567,12 @@
1
-
-
- 0
- .dll;.bpl
-
+
1
- .dylib
-
-
- Contents\MacOS
- 1
- .dylib
1
- .dylib
-
-
- 1
- .dylib
diff --git a/demos/VirtualData/TStringGrid/Unit_StringGrid.pas b/demos/VirtualData/TStringGrid/Unit_StringGrid.pas
index df73f57..70ff705 100644
--- a/demos/VirtualData/TStringGrid/Unit_StringGrid.pas
+++ b/demos/VirtualData/TStringGrid/Unit_StringGrid.pas
@@ -147,7 +147,7 @@ procedure TStringGridForm.FormCreate(Sender: TObject);
// TeeGrid1.ScrollBars.Visible:=False;
// Create data
- Data:=TStringsData.Create(1000,100000,60); // speed tip: pass a default width (60)
+ Data:=TStringsData.Create(1000,100000 {,60}); // speed tip: pass a default pixel width (for example: 60)
// Other ways to initialize size:
// Data.Columns:=1000;
diff --git a/demos/VirtualData/Virtual Mode/Unit_VirtualMode.fmx b/demos/VirtualData/Virtual Mode/Unit_VirtualMode.fmx
index 91a52e0..7a1bdc6 100644
--- a/demos/VirtualData/Virtual Mode/Unit_VirtualMode.fmx
+++ b/demos/VirtualData/Virtual Mode/Unit_VirtualMode.fmx
@@ -1,11 +1,12 @@
object FormVirtualMode: TFormVirtualMode
Left = 0
Top = 0
- Caption = 'Form43'
+ Caption = 'TeeGrid - Virtual Mode Example'
ClientHeight = 480
ClientWidth = 640
Fill.Color = xFFE9E6D8
Fill.Kind = Solid
+ Position = OwnerFormCenter
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
diff --git a/demos/VirtualData/Virtual Mode/Unit_VirtualMode.pas b/demos/VirtualData/Virtual Mode/Unit_VirtualMode.pas
index ae3a37a..abeb655 100644
--- a/demos/VirtualData/Virtual Mode/Unit_VirtualMode.pas
+++ b/demos/VirtualData/Virtual Mode/Unit_VirtualMode.pas
@@ -1,7 +1,7 @@
unit Unit_VirtualMode;
{
- Example using TeeGrid in "Virtual Mode".
+ Example using TeeGrid in pure "Virtual Mode".
Data is supplied using OnGetValue and OnSetValue events
@@ -41,10 +41,10 @@ procedure TFormVirtualMode.FormCreate(Sender: TObject);
var t : Integer;
begin
// Important:
- // Passing a default column width (60) means the grid will not need
+ // Passing an optional default column width (60) means the grid will not need
// to calculate it, which is much faster.
- // Create data, with 10 columns, lots of rows, and a default column width = 60
+ // Create data, with 10 columns, lots of rows, (optionally: a default column width = 60)
Data:=TVirtualModeData.Create(10,20000,60);
// Column Headers
@@ -62,13 +62,19 @@ procedure TFormVirtualMode.FormCreate(Sender: TObject);
procedure TFormVirtualMode.GetCell(Sender: TObject; const AColumn:TColumn; const ARow: Integer;
var AValue: String);
begin
+ // Return AValue from your data
+
+ // In this example, its just a calculated string:
+
AValue:=IntToStr(Data.IndexOf(AColumn))+' x '+IntToStr(ARow);
end;
procedure TFormVirtualMode.SetCell(Sender: TObject; const AColumn:TColumn; const ARow: Integer;
var AValue: String);
begin
- // AValue:=AValue+' !';
+ // Called when the cell has been manually edited, or when a Data cell is changed.
+
+ // Store the new AValue in your real data
end;
end.
diff --git a/src/delphi/BI.Grid.Data.pas b/src/delphi/BI.Grid.Data.pas
index 5f7c270..5448058 100644
--- a/src/delphi/BI.Grid.Data.pas
+++ b/src/delphi/BI.Grid.Data.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TeeBI Virtual Data class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit BI.Grid.Data;
@@ -81,7 +81,7 @@ TBIGridData=class(TVirtualData)
class function IsNumeric(const AColumn:TColumn):Boolean; override;
function IsSorted(const AColumn:TColumn; out Ascending:Boolean):Boolean; override;
- procedure Load; override;
+ procedure Load(const AColumns:TColumns); override;
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); override;
procedure SortBy(const AColumn:TColumn); override;
diff --git a/src/delphi/FMX/FMXTee.Control.pas b/src/delphi/FMX/FMXTee.Control.pas
index 3ab657e..d94071f 100644
--- a/src/delphi/FMX/FMXTee.Control.pas
+++ b/src/delphi/FMX/FMXTee.Control.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ FMX TScrollable control }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Control;
diff --git a/src/delphi/FMX/FMXTee.Editor.Painter.Brush.fmx b/src/delphi/FMX/FMXTee.Editor.Painter.Brush.fmx
index b0e7bef..6a04ea4 100644
--- a/src/delphi/FMX/FMXTee.Editor.Painter.Brush.fmx
+++ b/src/delphi/FMX/FMXTee.Editor.Painter.Brush.fmx
@@ -8,16 +8,20 @@ object BrushEditor: TBrushEditor
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
+ OnCreate = FormCreate
DesignerMasterStyle = 0
object LayoutTop: TLayout
Align = Top
Size.Width = 273.000000000000000000
- Size.Height = 50.000000000000000000
+ Size.Height = 33.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object CBVisible: TCheckBox
Position.X = 16.000000000000000000
- Position.Y = 16.000000000000000000
+ Position.Y = 8.000000000000000000
+ Size.Width = 169.000000000000000000
+ Size.Height = 19.000000000000000000
+ Size.PlatformDefault = False
TabOrder = 0
Text = '&Visible'
OnChange = CBVisibleChange
@@ -26,18 +30,19 @@ object BrushEditor: TBrushEditor
object TabBrush: TTabControl
Align = Client
Size.Width = 273.000000000000000000
- Size.Height = 220.000000000000000000
+ Size.Height = 237.000000000000000000
Size.PlatformDefault = False
TabIndex = 0
TabOrder = 1
TabPosition = PlatformDefault
+ OnChange = TabBrushChange
Sizes = (
273s
- 194s
+ 211s
273s
- 194s
+ 211s
273s
- 194s)
+ 211s)
object TabColor: TTabItem
CustomIcon = <
item
@@ -55,7 +60,7 @@ object BrushEditor: TBrushEditor
Align = Client
Color = claWhite
Size.Width = 273.000000000000000000
- Size.Height = 194.000000000000000000
+ Size.Height = 211.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
OnChange = CBColorChange
diff --git a/src/delphi/FMX/FMXTee.Editor.Painter.Brush.pas b/src/delphi/FMX/FMXTee.Editor.Painter.Brush.pas
index 6ab499f..e8e6d06 100644
--- a/src/delphi/FMX/FMXTee.Editor.Painter.Brush.pas
+++ b/src/delphi/FMX/FMXTee.Editor.Painter.Brush.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TBrush Editor for Firemonkey }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Editor.Painter.Brush;
@@ -39,7 +39,9 @@ interface
FMX.Dialogs, Tee.Format,
FMX.Colors, FMX.TabControl,
- FMX.Layouts;
+ FMX.Layouts,
+
+ FMXTee.Editor.Painter.Gradient;
type
TBrushEditor = class(TForm)
@@ -52,10 +54,13 @@ TBrushEditor = class(TForm)
CBColor: TColorPanel;
procedure CBVisibleChange(Sender: TObject);
procedure CBColorChange(Sender: TObject);
+ procedure TabBrushChange(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
private
{ Private declarations }
IBrush : TBrush;
+ IGradient : TGradientEditor;
FOnColorChange : TNotifyEvent;
diff --git a/src/delphi/FMX/FMXTee.Editor.Painter.Stroke.pas b/src/delphi/FMX/FMXTee.Editor.Painter.Stroke.pas
index b8ac3da..3bad14c 100644
--- a/src/delphi/FMX/FMXTee.Editor.Painter.Stroke.pas
+++ b/src/delphi/FMX/FMXTee.Editor.Painter.Stroke.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TStroke Editor for Firemonkey }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Editor.Painter.Stroke;
diff --git a/src/delphi/FMX/FMXTee.Grid.pas b/src/delphi/FMX/FMXTee.Grid.pas
index d4dca31..3f9abe5 100644
--- a/src/delphi/FMX/FMXTee.Grid.pas
+++ b/src/delphi/FMX/FMXTee.Grid.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ FMX TeeGrid }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Grid;
@@ -24,6 +24,8 @@ interface
uses
System.Classes, System.Types, System.UITypes,
+ Tee.Grid.Data.DB, // <--- Forced always (so this unit is not needed at every project "uses")
+
FMX.Types, FMX.Controls,
{$IF CompilerVersion<=25}
@@ -51,6 +53,8 @@ TTeeGrid=class;
TFMXTeeGrid=class(TCustomTeeGrid)
private
+ FOnTyping : TNotifyEvent;
+
IEditor : TControl;
IGrid : TTeeGrid;
@@ -60,7 +64,9 @@ TFMXTeeGrid=class(TCustomTeeGrid)
procedure CreateEditor(const AColumn:TColumn);
procedure EditorKeyUp(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
function EditorShowing:Boolean;
+ procedure EditorTracking(Sender: TObject);
procedure TryChangeEditorData;
+ procedure TryPaste(const Value:String);
procedure TryShowEditor(const AColumn: TColumn; const ARow: Integer);
protected
procedure DataChanged; override;
@@ -68,7 +74,8 @@ TFMXTeeGrid=class(TCustomTeeGrid)
function HorizScrollBarHeight:Single; override;
procedure HorizScrollChanged; override;
- procedure StartEditor(const AColumn:TColumn; const ARow:Integer); override;
+ procedure StartEditor(const AColumn:TColumn; const ARow:Integer;
+ const AutoEdit:Boolean=False); override;
procedure StopEditor; override;
function VertScrollBarWidth:Single; override;
@@ -77,7 +84,10 @@ TFMXTeeGrid=class(TCustomTeeGrid)
procedure CopySelected; override;
function Height:Single; override;
function Painter:TPainter; override;
+ procedure PasteSelected; override;
function Width:Single; override;
+
+ property OnTyping:TNotifyEvent read FOnTyping write FOnTyping;
end;
TShowEditorEvent=procedure(const Sender:TObject; const AEditor:TControl;
@@ -99,6 +109,8 @@ TTeeGrid=class(TScrollableControl)
FOnColumnResized: TColumnEvent;
FOnShowEditor: TShowEditorEvent;
+ IDataSource : TComponent;
+
procedure ChangePainter(const APainter:TFMXPainter);
procedure ColumnResized(Sender:TObject);
function CurrentRows: TRows;
@@ -140,9 +152,11 @@ TTeeGrid=class(TScrollableControl)
procedure SetHeaders(const Value: TGridBands);
function GetDataSource: TComponent;
procedure SetDataSource(const Value: TComponent);
- protected
- procedure DblClick; override;
+ function MouseStateFrom(const Button: TMouseButton; const Shift: TShiftState;
+ const X,Y: Single; const AEvent:TGridMouseEvent):TMouseState;
+ procedure TryClearColumns;
+ protected
procedure DefineProperties(Filer: TFiler); override;
procedure DoMouseLeave; override;
@@ -205,7 +219,7 @@ TTeeGrid=class(TScrollableControl)
// NO: property Caption;
- property ClipChildren;
+ property ClipChildren default True;
property ClipParent;
property DragMode;
property EnableDragHighlight;
@@ -266,6 +280,10 @@ TTeeGrid=class(TScrollableControl)
property OnPainting;
property OnPaint;
property OnResize;
+
+ {$IFDEF D25}
+ property OnResized;
+ {$ENDIF}
end;
implementation
diff --git a/src/delphi/FMX/FMXTee.Painter.pas b/src/delphi/FMX/FMXTee.Painter.pas
index 2f3ec09..316e87b 100644
--- a/src/delphi/FMX/FMXTee.Painter.pas
+++ b/src/delphi/FMX/FMXTee.Painter.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ FMX Painter class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Painter;
diff --git a/src/delphi/FMX/FMXTee.Picture.pas b/src/delphi/FMX/FMXTee.Picture.pas
index 3c515f7..b5a081c 100644
--- a/src/delphi/FMX/FMXTee.Picture.pas
+++ b/src/delphi/FMX/FMXTee.Picture.pas
@@ -4,7 +4,7 @@
interface
uses
- FMX.Types,
+ FMX.Types, FMX.Controls,
{$IF CompilerVersion<=25}
{$DEFINE HASFMX20}
diff --git a/src/delphi/Packages/FMXTee.Grid.About.fmx b/src/delphi/Packages/FMXTee.Grid.About.fmx
index d8b5423..c607ef1 100644
--- a/src/delphi/Packages/FMXTee.Grid.About.fmx
+++ b/src/delphi/Packages/FMXTee.Grid.About.fmx
@@ -5,10 +5,9 @@ object FMXGridAbout: TFMXGridAbout
Caption = 'About TeeGrid'
ClientHeight = 327
ClientWidth = 355
- Position = OwnerFormCenter
FormFactor.Width = 320
FormFactor.Height = 480
- FormFactor.Devices = [Desktop]
+ FormFactor.Devices = [Desktop, iPhone, iPad]
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
@@ -19,37 +18,50 @@ object FMXGridAbout: TFMXGridAbout
Size.Width = 355.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
- TabOrder = 0
object Layout2: TLayout
Align = Right
- Position.X = 259.000000000000000000
- Size.Width = 96.000000000000000000
+ Position.X = 252.000000000000000000
+ Size.Width = 103.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
- TabOrder = 0
object Button1: TButton
Cancel = True
Default = True
ModalResult = 8
Position.X = 8.000000000000000000
Position.Y = 16.000000000000000000
+ Size.Width = 80.000000000000000000
+ Size.Height = 22.000000000000000000
+ Size.PlatformDefault = False
TabOrder = 0
Text = '&Close'
OnClick = Button1Click
end
end
+ object LVersion: TLabel
+ Position.X = 24.000000000000000000
+ Position.Y = 16.000000000000000000
+ Size.Width = 225.000000000000000000
+ Size.Height = 17.000000000000000000
+ Size.PlatformDefault = False
+ Text = 'TeeGrid v1.0 for Firemonkey'
+ end
end
object TeeGrid1: TTeeGrid
Columns = <>
- Footer = <>
ReadOnly = False
- Rows.Height.Automatic = False
Position.X = 16.000000000000000000
Position.Y = 16.000000000000000000
- Size.Width = 321.000000000000000000
- Size.Height = 249.000000000000000000
+ Size.Width = 324.000000000000000000
+ Size.Height = 250.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
+ _Headers = (
+ 1
+ 'TColumnHeaderBand'
+ <
+ item
+ end>)
end
object Timer1: TTimer
Interval = 150
diff --git a/src/delphi/Packages/FMXTee.Grid.About.pas b/src/delphi/Packages/FMXTee.Grid.About.pas
index 70d6f56..a517fc3 100644
--- a/src/delphi/Packages/FMXTee.Grid.About.pas
+++ b/src/delphi/Packages/FMXTee.Grid.About.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ FMX About TeeGrid... }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit FMXTee.Grid.About;
@@ -48,6 +48,7 @@ TFMXGridAbout = class(TForm)
Button1: TButton;
TeeGrid1: TTeeGrid;
Timer1: TTimer;
+ LVersion: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
@@ -70,7 +71,4 @@ TFMXGridAbout = class(TForm)
class procedure Show(const AOwner:TComponent); static;
end;
-var
- FMXGridAbout: TFMXGridAbout;
-
implementation
diff --git a/src/delphi/Packages/FMXTeeGrid.dpk b/src/delphi/Packages/FMXTeeGrid.dpk
index b4cdcde..35ae5e1 100644
--- a/src/delphi/Packages/FMXTeeGrid.dpk
+++ b/src/delphi/Packages/FMXTeeGrid.dpk
@@ -38,6 +38,8 @@ contains
FMXTee.Control in '..\FMX\FMXTee.Control.pas',
FMXTee.Grid in '..\FMX\FMXTee.Grid.pas',
FMXTee.Painter in '..\FMX\FMXTee.Painter.pas',
+ FMXTee.Picture in '..\FMX\FMXTee.Picture.pas',
+ FMXTee.Editor.Painter.Gradient in '..\FMX\FMXTee.Editor.Painter.Gradient.pas' {GradientEditor},
FMXTee.Editor.Painter.Brush in '..\FMX\FMXTee.Editor.Painter.Brush.pas' {BrushEditor},
FMXTee.Editor.Painter.Stroke in '..\FMX\FMXTee.Editor.Painter.Stroke.pas' {StrokeEditor};
diff --git a/src/delphi/Packages/TeeGrid.dpk b/src/delphi/Packages/TeeGrid.dpk
index f0be9ab..7165933 100644
--- a/src/delphi/Packages/TeeGrid.dpk
+++ b/src/delphi/Packages/TeeGrid.dpk
@@ -40,7 +40,7 @@ contains
Tee.Control in '..\Tee.Control.pas',
Tee.Grid.Data in '..\Tee.Grid.Data.pas',
Tee.Grid.Data.DB in '..\Tee.Grid.Data.DB.pas',
-// Tee.Grid.Data.Rtti in '..\Tee.Grid.Data.Rtti.pas',
+ Tee.Grid.Data.Rtti in '..\Tee.Grid.Data.Rtti.pas',
Tee.Grid.Data.Strings in '..\Tee.Grid.Data.Strings.pas',
Tee.Grid.Bands in '..\Tee.Grid.Bands.pas',
Tee.Grid.Columns in '..\Tee.Grid.Columns.pas',
diff --git a/src/delphi/Packages/TeeGrid_Lazarus.pas b/src/delphi/Packages/TeeGrid_Lazarus.pas
index d8c2c74..cca7a99 100644
--- a/src/delphi/Packages/TeeGrid_Lazarus.pas
+++ b/src/delphi/Packages/TeeGrid_Lazarus.pas
@@ -2,55 +2,3 @@
interface
procedure Register;
implementation
-uses
- Tee.Control,
- Tee.Format,
- Tee.Grid.Bands,
- Tee.Grid.Columns,
- Tee.Grid.CSV,
- Tee.Grid.Data.DB,
- Tee.Grid.Data,
- Tee.Grid.Data.Strings,
- Tee.Grid.Data.Tree,
- Tee.Grid.Header,
- Tee.Grid,
- Tee.Grid.RowGroup,
- Tee.Grid.Rows,
- Tee.Grid.Selection,
- Tee.Grid.Themes,
- Tee.Grid.Ticker,
- Tee.Grid.Totals,
- Tee.Painter,
- Tee.Renders,
- VCLTee.Control,
- VCLTee.Editor.Borders,
- VCLTee.Editor.Brush,
- VCLTee.Editor.Column,
- VCLTee.Editor.ColumnBand,
- VCLTee.Editor.Coordinate,
- VCLTee.Editor.Font,
- VCLTee.Editor.Format,
- VCLTee.Editor.Format.Text,
- VCLTee.Editor.Gradient,
- VCLTee.Editor.Grid.Band.Text,
- VCLTee.Editor.Grid.Band.Totals,
- VCLTee.Editor.Grid.Bands,
- VCLTee.Editor.Grid,
- VCLTee.Editor.Grid.Ticker,
- VCLTee.Editor.Header,
- VCLTee.Editor.Margins,
- VCLTee.Editor.Render.Text,
- VCLTee.Editor.Stroke,
- VCLTee.Editor.Text.Align,
- VCLTee.Grid,
- VCLTee.Painter,
- VCLTee.Picture,
- VCLTee.Grid.About,
- VCLTeeGridRegister;
-
-procedure Register;
-begin
- VCLTeeGridRegister.Register;
-end;
-
-end.
diff --git a/src/delphi/Packages/VCLTee.Grid.About.dfm b/src/delphi/Packages/VCLTee.Grid.About.dfm
index 5bdcb80..e15f0bb 100644
--- a/src/delphi/Packages/VCLTee.Grid.About.dfm
+++ b/src/delphi/Packages/VCLTee.Grid.About.dfm
@@ -27,7 +27,6 @@ object VCLGridAbout: TVCLGridAbout
Align = alBottom
BevelOuter = bvNone
TabOrder = 0
- ExplicitWidth = 339
object LVersion: TLabel
Left = 16
Top = 16
@@ -42,7 +41,6 @@ object VCLGridAbout: TVCLGridAbout
Align = alRight
BevelOuter = bvNone
TabOrder = 0
- ExplicitLeft = 218
object Button1: TButton
Left = 24
Top = 8
@@ -64,12 +62,17 @@ object VCLGridAbout: TVCLGridAbout
Back.Brush.Gradient.Visible = True
Back.Brush.Gradient.Inverted = True
Columns = <>
- Footer = <>
ReadOnly = False
UseDockManager = False
ParentBackground = False
ParentColor = False
TabOrder = 1
+ _Headers = (
+ 1
+ 'TColumnHeaderBand'
+ <
+ item
+ end>)
end
object Timer1: TTimer
Enabled = False
diff --git a/src/delphi/Packages/VCLTee.Grid.About.pas b/src/delphi/Packages/VCLTee.Grid.About.pas
index 4adf95b..efef908 100644
--- a/src/delphi/Packages/VCLTee.Grid.About.pas
+++ b/src/delphi/Packages/VCLTee.Grid.About.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL About TeeGrid... }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Grid.About;
@@ -10,7 +10,10 @@
interface
uses
- {Winapi.}Windows, {Winapi.}Messages, {System.}SysUtils, {System.}Variants,
+ {$IFDEF MSWINDOWS}
+ {Winapi.}Windows, {Winapi.}Messages,
+ {$ENDIF}
+ {System.}SysUtils, {System.}Variants,
{System.}Classes, {Vcl.}Graphics,
{Vcl.}Controls, {Vcl.}Forms, {Vcl.}Dialogs, {Vcl.}StdCtrls, {Vcl.}ExtCtrls,
VCLTee.Control, VCLTee.Grid,
@@ -46,8 +49,4 @@ TVCLGridAbout = class(TForm)
class procedure Show(const AOwner:TComponent); static;
end;
-const
- TeeGrid_Version='v0.4 beta';
- TeeGrid_Version_Numeric=004;
-
implementation
diff --git a/src/delphi/Packages/VCLTeeGrid.dpk b/src/delphi/Packages/VCLTeeGrid.dpk
index 5b1119a..a57777a 100644
--- a/src/delphi/Packages/VCLTeeGrid.dpk
+++ b/src/delphi/Packages/VCLTeeGrid.dpk
@@ -55,6 +55,7 @@ contains
VCLTee.Editor.Render.Text in '..\VCL\VCLTee.Editor.Render.Text.pas' {TextRenderEditor},
VCLTee.Editor.Header in '..\VCL\VCLTee.Editor.Header.pas' {HeaderEditor},
VCLTee.Editor.Margins in '..\VCL\VCLTee.Editor.Margins.pas' {MarginsEditor},
+ VCLTee.Editor.Selected in '..\VCL\VCLTee.Editor.Selected.pas' {SelectedEditor},
VCLTee.Editor.Text.Align in '..\VCL\VCLTee.Editor.Text.Align.pas' {TextAlignEditor},
VCLTee.Editor.Grid in '..\VCL\VCLTee.Editor.Grid.pas' {TeeGridEditor},
VCLTee.Editor.Grid.Bands in '..\VCL\VCLTee.Editor.Grid.Bands.pas' {GridBandsEditor},
diff --git a/src/delphi/Tee.Control.pas b/src/delphi/Tee.Control.pas
index 282366f..7c41b8f 100644
--- a/src/delphi/Tee.Control.pas
+++ b/src/delphi/Tee.Control.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Base abstract Control class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Control;
diff --git a/src/delphi/Tee.Format.pas b/src/delphi/Tee.Format.pas
index 3dc03f5..baf80f6 100644
--- a/src/delphi/Tee.Format.pas
+++ b/src/delphi/Tee.Format.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Abstract Formatting classes }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Format;
@@ -99,7 +99,7 @@ TVisiblePersistentChange=class(TPersistentChange)
end;
{$IFDEF FPC}
- TColor=Cardinal;
+ TColor=Graphics.TColor; // Graphics.TColor=TGraphicsColor (for design-time Inspector support)
{$ELSE}
{$IF CompilerVersion>22}
TColor=TAlphaColor;
@@ -136,22 +136,23 @@ TGradientColors=class(TCollectionChange)
property Items[const Index:Integer]:TGradientColor read Get write Put; default;
end;
- TAngle=Single;
+ TAngle=Single; // 0..360
TGradientDirection=(Vertical,Horizontal,Diagonal,BackDiagonal,Radial);
TGradient=class(TVisiblePersistentChange)
private
- FDirection: TGradientDirection;
- FColors: TGradientColors;
FAngle: TAngle;
+ FColors: TGradientColors;
+ FDirection: TGradientDirection;
FInverted: Boolean;
+ function IsAngleStored:Boolean;
+ function IsColorsStored: Boolean;
procedure SetAngle(const Value: TAngle);
procedure SetColors(const Value: TGradientColors);
procedure SetDirection(const Value: TGradientDirection);
procedure SetInverted(const Value: Boolean);
- function IsColorsStored: Boolean;
public
Constructor Create(const AChanged:TNotifyEvent); override;
@@ -163,7 +164,7 @@ TGradient=class(TVisiblePersistentChange)
procedure InitColors(const AColor0,AColor1:TColor);
published
- property Angle:TAngle read FAngle write SetAngle;
+ property Angle:TAngle read FAngle write SetAngle stored IsAngleStored;
property Colors:TGradientColors read FColors write SetColors stored IsColorsStored;
property Direction:TGradientDirection read FDirection write SetDirection
@@ -175,7 +176,9 @@ TGradient=class(TVisiblePersistentChange)
TPicture=class(TPersistentChange)
protected
Internal,
- Original,
+ Original : TObject;
+
+ {$IFDEF AUTOREFCOUNT}[weak]{$ENDIF}
TagObject : TObject;
procedure FreeInternal;
@@ -428,18 +431,36 @@ TTextFormat=class(TFormat)
{$IFDEF NOUITYPES}
TColors=record
public
- const
- Aqua=$FFFF00;
- Black=0;
- Cream=$F0FBFF;
- DkGray=$808080;
- DarkGray=DkGray;
- Green=$008000;
- LightGray=$D3D3D3;
- Navy=$800000;
- Red=$800000;
- SkyBlue=$87CEEB;
- White=$FFFFFF;
+ const
+ {$IFDEF FPC}
+ Aqua=clAqua;
+ Black=clBlack;
+ Cream=clCream;
+ DkGray=clDkGray;
+ DarkGray=DkGray;
+ Green=clGreen;
+ LightGray=clLtGray;
+ Lime=$00FF00;
+ Navy=clNavy;
+ Pink=$CBC0FF;
+ Red=clRed;
+ SkyBlue=clSkyBlue;
+ White=clWhite;
+ {$ELSE}
+ Aqua=$FFFF00;
+ Black=0;
+ Cream=$F0FBFF;
+ DkGray=$808080;
+ DarkGray=DkGray;
+ Green=$008000;
+ LightGray=$D3D3D3;
+ Lime=$00FF00;
+ Navy=$800000;
+ Pink=$CBC0FF;
+ Red=$800000;
+ SkyBlue=$87CEEB;
+ White=$FFFFFF;
+ {$ENDIF}
end;
{$ENDIF}
diff --git a/src/delphi/Tee.Grid.Bands.pas b/src/delphi/Tee.Grid.Bands.pas
index 9e740ca..577f29d 100644
--- a/src/delphi/Tee.Grid.Bands.pas
+++ b/src/delphi/Tee.Grid.Bands.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Basic Grid "Bands" }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Bands;
@@ -47,12 +47,15 @@ TMouseState=record
Button : TGridMouseButton;
Event : TGridMouseEvent;
Cursor : TMouseCursor;
+
+ function IsDoubleLeft:Boolean;
end;
TGridKeyEvent=(Down,Up);
TKeyState=record
Key : Word;
+ KeyChar : {Wide}Char;
Shift : TShiftState;
Event : TGridKeyEvent;
end;
diff --git a/src/delphi/Tee.Grid.CSV.pas b/src/delphi/Tee.Grid.CSV.pas
index 5ea4cf9..524fee7 100644
--- a/src/delphi/Tee.Grid.CSV.pas
+++ b/src/delphi/Tee.Grid.CSV.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ CSV Data Export }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.CSV;
diff --git a/src/delphi/Tee.Grid.Columns.pas b/src/delphi/Tee.Grid.Columns.pas
index 306cac5..ebafa91 100644
--- a/src/delphi/Tee.Grid.Columns.pas
+++ b/src/delphi/Tee.Grid.Columns.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Abstract Columns class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Columns;
@@ -130,6 +130,7 @@ TColumn=class(TVisibleRenderItem)
FOnPaint : TColumnPaintEvent;
FParentFormat: Boolean;
FReadOnly: Boolean;
+ FSelectable: Boolean;
FTextAlignment: TColumnTextAlign;
FWidth: TColumnWidth;
@@ -140,7 +141,9 @@ TColumn=class(TVisibleRenderItem)
function GetMargins: TMargins;
function GetParent: TColumn;
procedure GetTopParent;
+ function IsItemsStored: Boolean;
function MaxLevel:Integer;
+ procedure ReadLink(Reader: TReader);
procedure SetAlign(const Value: TTextAlign);
procedure SetDataFormat(const Value: TDataFormat);
@@ -152,11 +155,16 @@ TColumn=class(TVisibleRenderItem)
procedure SetParentFormat(const Value: Boolean);
procedure SetTextAlignment(const Value: TColumnTextAlign);
procedure SetWidth(const Value: TColumnWidth);
+ procedure WriteLink(Writer: TWriter);
protected
+ FLink : String;
+
ITopParent : TColumns;
function AutoWidth(const APainter:TPainter):Single; virtual;
+ procedure DefineProperties(Filer: TFiler); override;
procedure DoChanged; override;
+ procedure SetIndex(Value: Integer); override;
procedure SetRender(const Value: TRender); override;
property DefaultHorizAlign:THorizontalAlign read IHorizontal;
@@ -195,11 +203,12 @@ TColumn=class(TVisibleRenderItem)
property DataFormat:TDataFormat read FDataFormat write SetDataFormat;
property Expanded:Boolean read FExpanded write SetExpanded default True;
property Header:TColumnHeader read FHeader write SetHeader;
- property Items:TColumns read GetItems write SetItems;
+ property Items:TColumns read GetItems write SetItems stored IsItemsStored;
property Locked:TColumnLocked read FLocked write SetLocked default TColumnLocked.None;
property Margins:TMargins read GetMargins write SetMargins;
property ParentFormat:Boolean read FParentFormat write SetParentFormat default True;
property ReadOnly:Boolean read FReadOnly write FReadOnly default False;
+ property Selectable:Boolean read FSelectable write FSelectable default True;
property TextAlign:TTextAlign read GetAlign write SetAlign;
property TextAlignment:TColumnTextAlign read FTextAlignment
write SetTextAlignment default TColumnTextAlign.Automatic;
@@ -209,12 +218,14 @@ TColumn=class(TVisibleRenderItem)
end;
TColumnEvent=procedure(Sender:TObject; const AColumn:TColumn) of object;
+ TColumnMovedEvent=procedure(const AColumn:TColumn; const AOld,ANew:Integer) of object;
// Collection of TColumn,
// with a "Spacing" property that determines the horizontal separation
// between columns.
TColumns=class(TCollectionChange)
private
+ FOnMoved : TColumnMovedEvent;
FOnRemoved : TColumnEvent;
FSpacing : TCoordinate;
@@ -228,6 +239,7 @@ TColumns=class(TCollectionChange)
procedure SetSpacing(const Value: TCoordinate);
protected
procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
+ procedure Moved(const AColumn:TColumn; const AOld,ANew:Integer);
public
ValidWidth : Boolean;
@@ -266,6 +278,7 @@ TColumns=class(TCollectionChange)
{$ENDIF}
property Parent:TColumn read IParent;
+ property OnMoved:TColumnMovedEvent read FOnMoved write FOnMoved;
published
property Spacing: TCoordinate read GetSpacing write SetSpacing;
@@ -286,9 +299,11 @@ TVisibleColumns=class
procedure Add(const AColumns:TColumns); overload;
function AllSameFormat:Boolean;
function AnyLocked: Boolean;
+ function AtEdge(const X:Single; const AColumn:TColumn):TColumn;
procedure Clear; inline;
function Count:Integer; inline;
function First:TColumn;
+ function FirstSelectable:TColumn;
function IndexOf(const AColumn: TColumn): Integer;
function Last:TColumn;
function MaxRight:Single;
diff --git a/src/delphi/Tee.Grid.Data.DB.pas b/src/delphi/Tee.Grid.Data.DB.pas
index 6e8c55c..a4a0a4e 100644
--- a/src/delphi/Tee.Grid.Data.DB.pas
+++ b/src/delphi/Tee.Grid.Data.DB.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ DB TDataSet Virtual Data }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Data.DB;
@@ -57,6 +57,8 @@ TVirtualDBData=class(TVirtualData)
class function HorizAlignOf(const AField:TField):THorizontalAlign; static;
procedure RowChanged(const ARow:Integer); override;
public
+ OwnsData : Boolean;
+
Destructor Destroy; override;
procedure AddColumns(const AColumns:TColumns); override;
@@ -66,7 +68,7 @@ TVirtualDBData=class(TVirtualData)
class function From(const ASource:TComponent):TVirtualData; override;
- procedure Load; override;
+ procedure Load(const AColumns:TColumns); override;
function ReadOnly(const AColumn:TColumn):Boolean; override;
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); override;
end;
diff --git a/src/delphi/Tee.Grid.Data.Rtti.pas b/src/delphi/Tee.Grid.Data.Rtti.pas
index ca999ba..a333c4a 100644
--- a/src/delphi/Tee.Grid.Data.Rtti.pas
+++ b/src/delphi/Tee.Grid.Data.Rtti.pas
@@ -1,13 +1,17 @@
{*********************************************}
{ TeeGrid Software Library }
{ VirtualData from Records and Objects }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Data.Rtti;
interface
+{$IF CompilerVersion>22}
+{$DEFINE NEWRTTI}
+{$IFEND}
+
{
Several classes to automatically link a TeeGrid with records or classes,
or arrays of records or classes, or TList of records and classes.
@@ -51,7 +55,7 @@ TPerson=record ... end; // <-- or class
uses
Tee.Grid.Data, Tee.Grid.Columns, Tee.Painter,
- System.Generics.Collections, System.Rtti, System.TypInfo;
+ {System.}Generics.Collections, {System.}Rtti, {System.}TypInfo;
type
TVirtualDataRtti=class(TVirtualData)
@@ -91,13 +95,18 @@ TVirtualData=class(TVirtualDataRtti)
Context : TRttiContext;
var
+ FAncestor : Boolean;
FData : ^T;
FMembers : TRttiMembers;
FTypeInfo : PTypeInfo;
FVisibility : TVisibility;
IsDynArray : Boolean;
+
+ {$IFDEF NEWRTTI}
IItems : TRttiIndexedProperty;
+ {$ENDIF}
+
ICount : TRttiProperty;
IObject : TObject;
@@ -105,6 +114,7 @@ TVirtualData=class(TVirtualDataRtti)
procedure AddProperties(const AColumns:TColumns; const AType:TRttiType);
procedure DoAddColumns(const AColumns:TColumns; const AType:TRttiType);
+ procedure GuessArrayItems;
procedure InternalAddType(const AColumns:TColumns;
const AMember:TRttiMember;
@@ -123,13 +133,14 @@ TVirtualData=class(TVirtualDataRtti)
public
Constructor Create(var AData:T;
const AVisibility:TVisibility=[mvPublic,mvPublished];
- const AMembers:TRttiMembers=TRttiMembers.Both); overload;
+ const AMembers:TRttiMembers=TRttiMembers.Both;
+ const AAncestor:Boolean=False); overload;
procedure AddColumns(const AColumns:TColumns); override;
function AsString(const AColumn:TColumn; const ARow:Integer):String; override;
function AutoWidth(const APainter:TPainter; const AColumn:TColumn):Single; override;
function Count:Integer; override;
- procedure Load; override;
+ procedure Load(const AColumns:TColumns); override;
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); override;
end;
diff --git a/src/delphi/Tee.Grid.Data.Strings.pas b/src/delphi/Tee.Grid.Data.Strings.pas
index b80d07e..0e49736 100644
--- a/src/delphi/Tee.Grid.Data.Strings.pas
+++ b/src/delphi/Tee.Grid.Data.Strings.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TStringGrid emulation data class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Data.Strings;
@@ -96,14 +96,14 @@ TVirtualModeData=class(TVirtualData)
protected
procedure InternalResize; virtual;
public
- Constructor Create(const AColumns:Integer=0; const ARows:Integer=0; const DefaultWidth:Single=0);
+ Constructor Create(const AColumns:Integer=0; const ARows:Integer=0; const DefaultWidth:Single=0); virtual;
procedure AddColumns(const AColumns:TColumns); override;
function AsString(const AColumn:TColumn; const ARow:Integer):String; override;
function AutoWidth(const APainter:TPainter; const AColumn:TColumn):Single; override;
function Count:Integer; override;
function IndexOf(const AColumn: TColumn):Integer; inline;
- procedure Load; override;
+ procedure Load(const AColumns:TColumns); override;
procedure Resize(const AColumns,ARows:Integer);
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); override;
@@ -121,14 +121,15 @@ TVirtualModeData=class(TVirtualData)
{ TStringsData }
- TStringsData=class(TVirtualModeData)
- private
- IData : Array of TStringArray;
+ TStringArrays=Array of TStringArray;
- function GetCell(const AColumn,ARow: Integer): String;
- procedure SetCell(const AColumn,ARow: Integer; const Value: String);
+ TStringsData=class(TVirtualModeData)
protected
+ IData : TStringArrays;
+
+ function GetCell(const AColumn,ARow: Integer): String; virtual;
procedure InternalResize; override;
+ procedure SetCell(const AColumn,ARow: Integer; const Value: String); virtual;
public
function AsString(const AColumn:TColumn; const ARow:Integer):String; override;
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); override;
diff --git a/src/delphi/Tee.Grid.Data.Tree.pas b/src/delphi/Tee.Grid.Data.Tree.pas
index b09396c..e664266 100644
--- a/src/delphi/Tee.Grid.Data.Tree.pas
+++ b/src/delphi/Tee.Grid.Data.Tree.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Tree Emulation Virtual Data class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Data.Tree;
diff --git a/src/delphi/Tee.Grid.Data.pas b/src/delphi/Tee.Grid.Data.pas
index 6f92545..29effca 100644
--- a/src/delphi/Tee.Grid.Data.pas
+++ b/src/delphi/Tee.Grid.Data.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Abstract TVirtualData class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Data;
@@ -60,6 +60,7 @@ TVirtualData=class abstract
procedure AddColumns(const AColumns:TColumns); virtual; abstract;
function AsFloat(const AColumn:TColumn; const ARow:Integer):TFloat; virtual;
function AsString(const AColumn:TColumn; const ARow:Integer):String; virtual; abstract;
+ function AutoHeight(const APainter:TPainter; const AColumn:TColumn; const ARow:Integer; out AHeight:Single):Boolean; virtual;
function AutoWidth(const APainter:TPainter; const AColumn:TColumn):Single; virtual; abstract;
function Calculate(const AColumn:TColumn; const ACalculation:TColumnCalculation):TFloat;
function CanExpand(const Sender:TRender; const ARow:Integer):Boolean; virtual;
@@ -70,15 +71,17 @@ TVirtualData=class abstract
function HasDetail(const ARow:Integer):Boolean; virtual;
class function IsNumeric(const AColumn:TColumn):Boolean; overload; virtual;
function IsSorted(const AColumn:TColumn; out Ascending:Boolean):Boolean; virtual;
- procedure Load; virtual; abstract;
+ procedure Load(const AColumns:TColumns); virtual; abstract;
function LongestString(const APainter:TPainter; const AColumn:TColumn):Single;
function ReadOnly(const AColumn:TColumn):Boolean; virtual;
procedure SetValue(const AColumn:TColumn; const ARow:Integer; const AText:String); virtual; abstract;
procedure SortBy(const AColumn:TColumn); virtual;
+ procedure ToggleBoolean(const AColumn:TColumn; const ARow:Integer);
end;
TVirtualDataClass=class of TVirtualData;
+ // List of current registered VirtualData classes
TVirtualDataClasses=record
private
class var
diff --git a/src/delphi/Tee.Grid.Header.pas b/src/delphi/Tee.Grid.Header.pas
index 7921e6f..d22e7be 100644
--- a/src/delphi/Tee.Grid.Header.pas
+++ b/src/delphi/Tee.Grid.Header.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Grid Header class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Header;
@@ -19,6 +19,7 @@ interface
Provides:
Column mouse-dragging
+ Column mouse-resizing
Mouse-hover highlighting
Horizontal scrolling
@@ -49,39 +50,61 @@ interface
Tee.Grid.Columns, Tee.Grid.Bands, Tee.Grid.Data;
type
+ TSelectedRender=class(THover)
+ public
+ Constructor Create(const AChanged:TNotifyEvent); override;
+ end;
+
// Grid band with Columns
TColumnBand=class(TGridBandLines)
private
+ FAllowDrag : Boolean;
FAllowResize : Boolean;
FHover: THover;
FOnColumnResized: TNotifyEvent;
+ FSelected : TSelectedRender;
IDragging,
- IHighLight : TColumn;
+ IHighLight,
+ IResizing,
+ ISelected : TColumn;
+ MouseColumn : TColumn; // current column under mouse XY
+
+ NewDragX,
OldWidth,
OldX : Single;
+ IHeights : Array of Single;
+
+ function BoundsOf(const AColumn:TColumn):TRectF;
procedure ChangeDraggedWidth(const AValue:Single);
procedure DoChangedRepaint;
+ function DragHit(const ARect:TRectF; out HitRect:TRectF):TColumn;
+ function DragRectangle:TRectF;
function GetMargins: TMargins;
+ function HeaderRender(const AColumn:TColumn):TRender;
+ function MaxColumnHeight(const APainter:TPainter; const ATotal:Single):Single;
procedure PaintLines(var AData:TRenderData; const DrawFirst:Boolean);
procedure SetColumns(const Value: TColumns);
procedure SetHighLight(const Value: TColumn);
procedure SetHover(const Value: THover);
procedure SetMargins(const Value: TMargins);
+ procedure SetSelected(const Value: TSelectedRender);
+ procedure SetSelectedColumn(const Value: TColumn);
protected
IColumns : TColumns;
IData : TVirtualData;
IJustRepaint : Boolean;
IVisible : TVisibleColumns;
- function AdjustBounds(const AColumn:TColumn; const R:TRectF):TRectF; virtual;
+ ISingleRow : Boolean;
+
+ function AdjustBounds(const AColumn:TColumn; const R:TRectF):TRectF;
function AsString(const AColumn:TColumn):String; virtual; abstract;
+ function LevelTop(const ALevel:Integer):Single;
procedure DoClick; virtual;
public
- MouseColumn : TColumn; // current column under mouse XY
-
Width : Single;
// Temporary
@@ -98,24 +121,33 @@ TColumnBand=class(TGridBandLines)
procedure Assign(Source:TPersistent); override;
function CalcFont(const AColumn:TColumn; const AFont:TFont):TFont;
+ procedure CalcHeight(const APainter:TPainter; const ATotal:Single); override;
procedure InitFormat;
-
function Mouse(var AState:TMouseState; const AWidth,AHeight:Single):Boolean; override;
-
procedure Paint(var AData:TRenderData; const ARender:TRender); override;
+ function RowCount:Integer;
property Columns:TColumns read IColumns write SetColumns;
property Data:TVirtualData read IData write IData;
- // Current column being dragged or resized
- property Dragging:TColumn read IDragging write IDragging;
+ // Current column being dragged (moved)
+ property Dragging:TColumn read IDragging;
- // Current column to highlight
+ // Current column being resized
+ property Resizing:TColumn read IResizing;
+
+ // Current column to highlight (on mouse hover)
property HighLight:TColumn read IHighLight write SetHighLight;
+
+ // Current column to highlight (on selected cell)
+ property SelectedColumn:TColumn read ISelected write SetSelectedColumn;
published
+ property AllowDrag:Boolean read FAllowDrag write FAllowDrag default True;
property AllowResize:Boolean read FAllowResize write FAllowResize default True;
property Hover:THover read FHover write SetHover;
property Margins:TMargins read GetMargins write SetMargins;
+ property Selected:TSelectedRender read FSelected write SetSelected;
+
property OnColumnResized:TNotifyEvent read FOnColumnResized write FOnColumnResized;
end;
@@ -148,16 +180,10 @@ TColumnHeaderBand=class(TColumnBand)
FRowLines : TStroke;
FSortable: Boolean;
- IHeights : Array of Single;
-
- function HeaderRender(const AColumn:TColumn):TRender;
- function LevelTop(const ALevel:Integer):Single;
- function MaxColumnHeight(const APainter:TPainter; const ATotal:Single):Single;
procedure PaintRowLines(const APainter:TPainter; const AColumns:TColumns; const ALevel:Integer);
procedure SetRowLines(const Value: TStroke);
procedure SetSortable(const Value: Boolean);
protected
- function AdjustBounds(const AColumn:TColumn; const R:TRectF):TRectF; override;
function AsString(const AColumn:TColumn):String; override;
procedure DoClick; override;
public
@@ -171,13 +197,10 @@ TColumnHeaderBand=class(TColumnBand)
{$ENDIF}
function AutoWidth(const APainter:TPainter; const AColumn:TColumn):Single;
- procedure CalcHeight(const APainter:TPainter; const ATotal:Single); override;
function CanSort(const AColumn:TColumn):Boolean;
class function Description:String; override;
-
+ function Mouse(var AState:TMouseState; const AWidth,AHeight:Single):Boolean; override;
procedure Paint(var AData:TRenderData; const ARender:TRender); override;
-
- function RowCount:Integer;
published
property RowLines:TStroke read FRowLines write SetRowLines;
property Sortable:Boolean read FSortable write SetSortable default True;
diff --git a/src/delphi/Tee.Grid.RowGroup.pas b/src/delphi/Tee.Grid.RowGroup.pas
index e85b502..9de0885 100644
--- a/src/delphi/Tee.Grid.RowGroup.pas
+++ b/src/delphi/Tee.Grid.RowGroup.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TRowGroup class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.RowGroup;
@@ -54,11 +54,10 @@ TRowGroup=class(TGridBand)
FRows : TRows;
FSelected: TGridSelection;
- OwnsData : Boolean;
FCurrent: TRowGroup;
IBands : TGridBands;
- ISelectedDragging : Integer;
+ IParent : TRowGroup;
procedure AddedBand(Sender:TObject);
function CalcAutoWidth(const APainter:TPainter; const AColumn:TColumn;
@@ -81,6 +80,7 @@ TRowGroup=class(TGridBand)
procedure PaintRest(var AData: TRenderData);
function PositionOf(const AColumn:TColumn; const ARow:Integer):TPointF;
procedure RemovedColumn(Sender:TObject; const AColumn:TColumn);
+ procedure RemoveHighLights(const ABands:TGridBands);
procedure SetCells(const Value: TTextRender);
procedure SetCurrent(const Value: TRowGroup);
procedure SetFooter(const Value: TGridBands);
@@ -97,8 +97,9 @@ TRowGroup=class(TGridBand)
function WidthOf(const APainter:TPainter; const AColumns: TColumns;
const AWidth:Single): Single;
protected
- procedure Loaded;
+ OwnsData : Boolean;
+ procedure Loaded;
public
ParentColumn : TColumn;
IsFocused,
@@ -132,12 +133,17 @@ TRowGroup=class(TGridBand)
function Mouse(var AState:TMouseState; const AWidth,AHeight:Single): Boolean; override;
+ function NewExpander:TExpanderRender;
+
procedure Paint(var AData:TRenderData; const ARender:TRender); override;
procedure PrepareColumns(const APainter:TPainter; const ALeft,ARight:Single);
procedure RefreshData(const AData:TVirtualData);
function RenderHit(const AColumn:TColumn; const ARow:Integer; const X,Y:Single):Boolean;
+ function SelectedContains(const X,Y:Single):Boolean;
function ToggleDetail(const Sender:TRender; const ARow:Integer):Boolean;
+ procedure TryAutoScroll;
+ procedure TrySelectColumn;
property Columns:TColumns read FColumns;
property Current:TRowGroup read FCurrent write SetCurrent;
diff --git a/src/delphi/Tee.Grid.Rows.pas b/src/delphi/Tee.Grid.Rows.pas
index cf26d89..5f9182b 100644
--- a/src/delphi/Tee.Grid.Rows.pas
+++ b/src/delphi/Tee.Grid.Rows.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ TRows class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Rows;
@@ -51,10 +51,13 @@ TCellHover=class(TGridSelection)
TRowsBands=class(TGridBands)
private
+ procedure DeleteRow(const AItem: TCollectionItem);
function GetRow(const Index:Integer):TGridBand;
procedure SetRow(const Index:Integer; const ABand:TGridBand);
protected
Rows : Array of TGridBand;
+
+ procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
public
function Height(const ARow: Integer): Single;
function Hit(const X,Y:Single):TGridBand;
@@ -69,6 +72,7 @@ TRows=class(TGridBandLines)
private
FAlternate: TAlternateFormat;
FBack : TFormat;
+ FDefaultHeight : Single;
FHeight: TCoordinate;
FHover: TCellHover;
FRowLines: TStroke;
@@ -92,10 +96,10 @@ TRows=class(TGridBandLines)
procedure SetHover(const Value: TCellHover);
procedure SetSpacing(const Value: TCoordinate);
procedure SetRowLines(const Value: TStroke);
+ procedure SetDefaultHeight(const Value: Single);
protected
procedure PaintRow(var AData:TRenderData; const ARender: TRender);
public
- DefaultHeight : Single;
Painter : TPainter;
// Temporary:
@@ -117,8 +121,7 @@ TRows=class(TGridBandLines)
procedure CalcYSpacing(const AHeight:Single);
procedure Clear;
function Count:Integer;
- function DraggedColumn(const X:Single; const AColumn:TColumn):TColumn;
- function FirstVisible:Integer;
+ function FirstVisible(const AOffset:Single=0):Integer;
function FontOf(const AColumn:TColumn):TFont;
function HeightOf(const ARow:Integer):Single;
function IsChildrenVisible(const Sender:TRender; const ARow: Integer): Boolean;
@@ -135,6 +138,7 @@ TRows=class(TGridBandLines)
property Children:TRowsBands read FChildren;
property Data:TVirtualData read IData write IData;
+ property DefaultHeight:Single read FDefaultHeight write SetDefaultHeight;
property Heights[const Index:Integer]:Single read GetHeights write SetHeights;
property SubBands:TRowsBands read FSubBands;
property VisibleColumns:TVisibleColumns read FVisibleColumns;
diff --git a/src/delphi/Tee.Grid.Selection.pas b/src/delphi/Tee.Grid.Selection.pas
index 723adba..7e9ae0b 100644
--- a/src/delphi/Tee.Grid.Selection.pas
+++ b/src/delphi/Tee.Grid.Selection.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Grid Cells selection class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Selection;
@@ -17,9 +17,15 @@ interface
Examples:
+ // Single-cell selection:
+
TeeGrid1.Selected.Column:= TeeGrid1.Columns[3];
TeeGrid1.Selected.Row:= 42;
+ or:
+
+ TeeGrid1.Selected.Change( TeeGrid1.Columns[3], 42 );
+
// Multi-cell range:
TeeGrid1.Selected.Range.FromRow:= 10;
@@ -28,7 +34,14 @@ interface
TeeGrid1.Selected.Range.FromColumn:= TeeGrid1.Columns[3];
TeeGrid1.Selected.Range.ToColumn:= TeeGrid1.Columns[6];
- Needs: Tee.Painter, Tee.Format, Tee.Grid.Columns, Tee.Renders
+
+ Note:
+
+ Selection only applies to columns that have Selectable property = True
+
+ Needs units:
+
+ Tee.Painter, Tee.Format, Tee.Grid.Columns, Tee.Renders
}
@@ -55,12 +68,13 @@ TSelectionRange=class(TPersistentChange)
Constructor Create(const AChanged:TNotifyEvent); override;
procedure Assign(Source:TPersistent); override;
- published
- property Enabled:Boolean read FEnabled write SetEnabled default True;
+
property FromColumn:TColumn read FFromColumn write SetFromColumn;
property FromRow:Integer read FFromRow write SetFromRow default -1;
property ToColumn:TColumn read FToColumn write SetToColumn;
property ToRow:Integer read FToRow write SetToRow default -1;
+ published
+ property Enabled:Boolean read FEnabled write SetEnabled default True;
end;
TGridSelection=class(TVisibleTextRender)
@@ -71,6 +85,7 @@ TGridSelection=class(TVisibleTextRender)
FFull: Boolean;
FOnChange: TNotifyEvent;
FParentFont: Boolean;
+ FScrollToView: Boolean;
FUnFocused : TVisibleTextRender;
procedure ChangeColumn(const Value:TColumn);
@@ -81,10 +96,13 @@ TGridSelection=class(TVisibleTextRender)
procedure SetRow(const Value: Integer);
procedure SetFull(const Value: Boolean);
procedure SetParentFont(const Value: Boolean);
+ procedure SetScrollToView(const Value: Boolean);
procedure SetUnfocused(const Value: TVisibleTextRender);
protected
CheckScroll : Boolean;
public
+ Dragging : Integer;
+
Constructor Create(const AChanged:TNotifyEvent); override;
{$IFNDEF AUTOREFCOUNT}
@@ -100,14 +118,17 @@ TGridSelection=class(TVisibleTextRender)
function IsEmpty:Boolean;
procedure PaintColumn(var AData:TRenderData; const AColumn:TColumn; const AFont:TFont; const IsFocused:Boolean);
+ procedure TryRange(const AColumn:TColumn; const ARow:Integer; const Y:Single);
property OnChange:TNotifyEvent read FOnChange write FOnChange;
- published
+
property Column:TColumn read FColumn write SetColumn stored False;
- property FullRow:Boolean read FFull write SetFull default False;
- property ParentFont:Boolean read FParentFont write SetParentFont default True;
property Range:TSelectionRange read FRange write SetRange;
property Row:Integer read FRow write SetRow stored False;
+ published
+ property FullRow:Boolean read FFull write SetFull default False;
+ property ParentFont:Boolean read FParentFont write SetParentFont default True;
+ property ScrollToView:Boolean read FScrollToView write SetScrollToView default False;
property UnFocused:TVisibleTextRender read FUnfocused write SetUnfocused;
end;
diff --git a/src/delphi/Tee.Grid.Themes.pas b/src/delphi/Tee.Grid.Themes.pas
index b864c0e..af5d488 100644
--- a/src/delphi/Tee.Grid.Themes.pas
+++ b/src/delphi/Tee.Grid.Themes.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Themes }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Themes;
diff --git a/src/delphi/Tee.Grid.Ticker.pas b/src/delphi/Tee.Grid.Ticker.pas
index 398c82b..0c6c45f 100644
--- a/src/delphi/Tee.Grid.Ticker.pas
+++ b/src/delphi/Tee.Grid.Ticker.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Ticker Component }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Ticker;
diff --git a/src/delphi/Tee.Grid.Totals.pas b/src/delphi/Tee.Grid.Totals.pas
index 82cbe81..6189724 100644
--- a/src/delphi/Tee.Grid.Totals.pas
+++ b/src/delphi/Tee.Grid.Totals.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Grid Totals classes }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid.Totals;
diff --git a/src/delphi/Tee.Grid.pas b/src/delphi/Tee.Grid.pas
index 23bb42c..8c1ccad 100644
--- a/src/delphi/Tee.Grid.pas
+++ b/src/delphi/Tee.Grid.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Base abstract Grid class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Grid;
@@ -40,12 +40,17 @@ interface
Tee.Grid.Selection, Tee.Grid.Data, Tee.Grid.RowGroup;
type
+ TEditingEnter=(NextCell,NextRow,SameCell);
+
+ // Properties to control Grid Cell editing
TGridEditing=class(TPersistentChange)
private
FActive: Boolean;
FAlwaysVisible : Boolean;
+ FAutoEdit: Boolean;
FClass : TClass;
FDoubleClick : Boolean;
+ FEnterKey: TEditingEnter;
public
Constructor Create(const AChanged:TNotifyEvent); override;
@@ -53,15 +58,20 @@ TGridEditing=class(TPersistentChange)
function ClassOf(const AColumn:TColumn):TClass;
+ // True when there is a visible editor control to edit cell contents
property Active:Boolean read FActive write FActive default False;
- property EditorClass:TClass read FClass write FClass;
+
+ property EditorClass:TClass read FClass write FClass; // default = TEdit
published
property AlwaysVisible:Boolean read FAlwaysVisible write FAlwaysVisible default False;
+ property AutoEdit:Boolean read FAutoEdit write FAutoEdit default False;
property DoubleClick:Boolean read FDoubleClick write FDoubleClick default True;
+ property EnterKey:TEditingEnter read FEnterKey write FEnterKey default TEditingEnter.NextCell;
end;
TScroll=TPointF;
+ // Base-agnostic grid class
TCustomTeeGrid=class(TCustomTeeControl)
private
FData : TVirtualData;
@@ -111,6 +121,8 @@ TCustomTeeGrid=class(TCustomTeeControl)
procedure SetSelected(const Value: TGridSelection);
function GetMargins: TMargins;
protected
+ ILoading : Boolean;
+
procedure ChangeHorizScroll(const Value:Single);
procedure ChangeVertScroll(const Value:Single);
procedure DataChanged; virtual;
@@ -124,10 +136,11 @@ TCustomTeeGrid=class(TCustomTeeControl)
procedure ReadFooter(Reader: TReader);
procedure ReadHeaders(Reader: TReader);
property Root:TRowGroup read FRoot;
- procedure StartEditor(const AColumn:TColumn; const ARow:Integer); overload; virtual; abstract;
- procedure StartEditor; overload;
+ procedure StartEditor(const AColumn:TColumn; const ARow:Integer;
+ const AutoEdit:Boolean=False); overload; virtual; abstract;
+ procedure StartEditor(const AutoEdit:Boolean=False); overload;
procedure StopEditor; virtual;
- procedure TryStartEditor;
+ procedure TryStartEditor(const AutoEdit:Boolean=False);
function VertScrollBarWidth:Single; virtual; abstract;
procedure VertScrollChanged; virtual; abstract;
procedure WriteFooter(Writer: TWriter);
@@ -148,6 +161,7 @@ TCustomTeeGrid=class(TCustomTeeControl)
procedure Loaded; override;
procedure MouseLeave;
procedure Paint; override;
+ procedure PasteSelected; virtual; abstract;
procedure RefreshData;
// Focused rows group
diff --git a/src/delphi/Tee.Painter.pas b/src/delphi/Tee.Painter.pas
index f091fc0..bebfdcf 100644
--- a/src/delphi/Tee.Painter.pas
+++ b/src/delphi/Tee.Painter.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Base abstract Painter class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Painter;
diff --git a/src/delphi/Tee.Renders.pas b/src/delphi/Tee.Renders.pas
index e5cc95c..b569d62 100644
--- a/src/delphi/Tee.Renders.pas
+++ b/src/delphi/Tee.Renders.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Basic Render shapes }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit Tee.Renders;
@@ -306,15 +306,19 @@ TExpanderRender=class;
TExpanderEvent=function(const Sender:TRender; const ARow:Integer):Boolean of object;
+ TExpanderGetDataEvent=procedure(const Sender: TExpanderRender; const ARow:Integer; out AData:TObject) of object;
+
TExpanderStyle=(PlusMinus,Triangle,Arrow);
// Rectangle shape with Box to emulate a "+" "-" expander (also triangles or arrows)
TExpanderRender=class(TBoxRender)
private
+ FAlwaysExpand : Boolean;
FExpandFormat : TFormat;
FExpandLine: TStroke;
FOnCanExpand : TExpanderEvent;
FOnExpand : TExpanderEvent;
+ FOnGetData : TExpanderGetDataEvent;
FOnGetExpanded : TExpanderEvent;
FStyle : TExpanderStyle;
@@ -334,13 +338,16 @@ TExpanderRender=class(TBoxRender)
procedure Paint(var AData:TRenderData); override;
procedure PaintLines(var AData:TRenderData);
- property OnCanExpand:TExpanderEvent read FOnCanExpand write FOnCanExpand;
- property OnExpand:TExpanderEvent read FOnExpand write FOnExpand;
- property OnGetExpanded:TExpanderEvent read FOnGetExpanded write FOnGetExpanded;
published
+ property AlwaysExpand:Boolean read FAlwaysExpand write FAlwaysExpand;
property ExpandFormat:TFormat read FExpandFormat write SetExpandFormat;
property ExpandLine:TStroke read FExpandLine write SetExpandLine;
property Style:TExpanderStyle read FStyle write SetStyle default TExpanderStyle.PlusMinus;
+
+ property OnCanExpand:TExpanderEvent read FOnCanExpand write FOnCanExpand;
+ property OnExpand:TExpanderEvent read FOnExpand write FOnExpand;
+ property OnGetData:TExpanderGetDataEvent read FOnGetData write FOnGetData;
+ property OnGetExpanded:TExpanderEvent read FOnGetExpanded write FOnGetExpanded;
end;
TOrientation=(Horizontal,Vertical);
@@ -388,13 +395,16 @@ THover=class(TVisibleTextRender)
// Base class for TGridBand and TColumn
TVisibleRenderItem=class(TCollectionItem)
private
+ {$IFDEF AUTOREFCOUNT}[weak]{$ENDIF}
FTagObject : TObject;
+
+ FTag : Integer;
FVisible: Boolean;
function GetRender: TRender;
+ function IsFormatStored: Boolean;
procedure SetFormat(const Value: TTextFormat);
procedure SetVisible(const Value: Boolean);
- function IsFormatStored: Boolean;
protected
FRender: TRender;
@@ -414,9 +424,12 @@ TVisibleRenderItem=class(TCollectionItem)
procedure Changed(Sender:TObject);
function HasFormat:Boolean; inline;
function HasRender:Boolean; inline;
+ procedure Hide;
procedure Paint(var AData:TRenderData; const ARender:TRender); virtual;
+ procedure Show;
property Render:TRender read GetRender write SetRender;
+ property Tag:Integer read FTag write FTag;
property TagObject:TObject read FTagObject write FTagObject;
published
property Format:TTextFormat read GetFormat write SetFormat stored IsFormatStored;
diff --git a/src/delphi/VCL/VCLTee.Control.pas b/src/delphi/VCL/VCLTee.Control.pas
index a0b9178..f8619dc 100644
--- a/src/delphi/VCL/VCLTee.Control.pas
+++ b/src/delphi/VCL/VCLTee.Control.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TScrollableControl }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Control;
diff --git a/src/delphi/VCL/VCLTee.Editor.Borders.pas b/src/delphi/VCL/VCLTee.Editor.Borders.pas
index 33f1b57..aa18197 100644
--- a/src/delphi/VCL/VCLTee.Editor.Borders.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Borders.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TBorders Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Borders;
diff --git a/src/delphi/VCL/VCLTee.Editor.Brush.dfm b/src/delphi/VCL/VCLTee.Editor.Brush.dfm
index 5c68c77..de0d206 100644
--- a/src/delphi/VCL/VCLTee.Editor.Brush.dfm
+++ b/src/delphi/VCL/VCLTee.Editor.Brush.dfm
@@ -1,12 +1,12 @@
object BrushEditor: TBrushEditor
- Left = 0
- Top = 0
+ Left = 65
+ Top = 24
Caption = 'Brush Editor'
ClientHeight = 267
ClientWidth = 285
Color = clWhite
ParentFont = True
- OldCreateOrder = False
+ OldCreateOrder = True
Position = poOwnerFormCenter
OnShow = FormShow
PixelsPerInch = 96
@@ -16,22 +16,20 @@ object BrushEditor: TBrushEditor
Top = 41
Width = 285
Height = 226
- ActivePage = TabPicture
+ ActivePage = TabSolid
Align = alClient
TabOrder = 0
OnChange = PageBrushChange
object TabSolid: TTabSheet
Caption = 'Color'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Label1: TLabel
Left = 12
Top = 56
Width = 41
Height = 13
Caption = '&Opacity:'
+ Color = clWhite
+ ParentColor = False
end
object LOpacity: TLabel
Left = 155
@@ -39,6 +37,8 @@ object BrushEditor: TBrushEditor
Width = 29
Height = 13
Caption = '100%'
+ Color = clWhite
+ ParentColor = False
end
object CBColor: TColorBox
Left = 11
@@ -59,25 +59,16 @@ object BrushEditor: TBrushEditor
Frequency = 5
Position = 100
TabOrder = 1
- ThumbLength = 14
OnChange = TBOpacityChange
end
end
object TabGradient: TTabSheet
Caption = 'Gradient'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabPicture: TTabSheet
Caption = 'Picture'
ImageIndex = 2
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Image1: TImage
Left = 12
Top = 16
@@ -97,12 +88,16 @@ object BrushEditor: TBrushEditor
Top = 16
Width = 3
Height = 13
+ Color = clWhite
+ ParentColor = False
end
object LPictureType: TLabel
Left = 88
Top = 46
Width = 3
Height = 13
+ Color = clWhite
+ ParentColor = False
end
object BClearPicture: TButton
Left = 12
@@ -126,8 +121,8 @@ object BrushEditor: TBrushEditor
object CBStretch: TCheckBox
Left = 12
Top = 163
- Width = 97
- Height = 17
+ Width = 76
+ Height = 24
Caption = '&Stretch'
TabOrder = 2
OnClick = CBStretchClick
@@ -144,9 +139,9 @@ object BrushEditor: TBrushEditor
TabOrder = 1
object CBVisible: TCheckBox
Left = 16
- Top = 14
- Width = 97
- Height = 17
+ Top = 10
+ Width = 72
+ Height = 24
Caption = '&Visible'
TabOrder = 0
OnClick = CBVisibleClick
diff --git a/src/delphi/VCL/VCLTee.Editor.Brush.pas b/src/delphi/VCL/VCLTee.Editor.Brush.pas
index 15f43e8..367d495 100644
--- a/src/delphi/VCL/VCLTee.Editor.Brush.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Brush.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TBrush Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Brush;
diff --git a/src/delphi/VCL/VCLTee.Editor.Column.pas b/src/delphi/VCL/VCLTee.Editor.Column.pas
index 2f99345..ab53890 100644
--- a/src/delphi/VCL/VCLTee.Editor.Column.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Column.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TColumn Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Column;
diff --git a/src/delphi/VCL/VCLTee.Editor.ColumnBand.dfm b/src/delphi/VCL/VCLTee.Editor.ColumnBand.dfm
index e37e213..51b1aa5 100644
--- a/src/delphi/VCL/VCLTee.Editor.ColumnBand.dfm
+++ b/src/delphi/VCL/VCLTee.Editor.ColumnBand.dfm
@@ -20,7 +20,7 @@ object ColumnBandEditor: TColumnBandEditor
Top = 0
Width = 348
Height = 405
- ActivePage = TabFormat
+ ActivePage = TabMouse
Align = alClient
TabOrder = 0
OnChange = PageBandChange
@@ -65,5 +65,27 @@ object ColumnBandEditor: TColumnBandEditor
Caption = 'Lines'
ImageIndex = 3
end
+ object TabMouse: TTabSheet
+ Caption = 'Mouse'
+ ImageIndex = 4
+ object CBAllowResize: TCheckBox
+ Left = 16
+ Top = 8
+ Width = 97
+ Height = 17
+ Caption = 'Allow &Resize'
+ TabOrder = 0
+ OnClick = CBAllowResizeClick
+ end
+ object CBAllowDrag: TCheckBox
+ Left = 16
+ Top = 31
+ Width = 97
+ Height = 17
+ Caption = 'Allow &Drag'
+ TabOrder = 1
+ OnClick = CBAllowDragClick
+ end
+ end
end
end
diff --git a/src/delphi/VCL/VCLTee.Editor.ColumnBand.pas b/src/delphi/VCL/VCLTee.Editor.ColumnBand.pas
index 5767faa..3092a32 100644
--- a/src/delphi/VCL/VCLTee.Editor.ColumnBand.pas
+++ b/src/delphi/VCL/VCLTee.Editor.ColumnBand.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL THeader Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.ColumnBand;
@@ -31,9 +31,14 @@ TColumnBandEditor = class(TForm)
CBHoverVisible: TCheckBox;
CBHoverParentFont: TCheckBox;
TabLines: TTabSheet;
+ TabMouse: TTabSheet;
+ CBAllowResize: TCheckBox;
+ CBAllowDrag: TCheckBox;
procedure PageBandChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CBHoverVisibleClick(Sender: TObject);
+ procedure CBAllowResizeClick(Sender: TObject);
+ procedure CBAllowDragClick(Sender: TObject);
private
{ Private declarations }
diff --git a/src/delphi/VCL/VCLTee.Editor.Coordinate.pas b/src/delphi/VCL/VCLTee.Editor.Coordinate.pas
index d309e94..877512c 100644
--- a/src/delphi/VCL/VCLTee.Editor.Coordinate.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Coordinate.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TCoordinate Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Coordinate;
diff --git a/src/delphi/VCL/VCLTee.Editor.Format.Text.pas b/src/delphi/VCL/VCLTee.Editor.Format.Text.pas
index 1050b5f..a0a9119 100644
--- a/src/delphi/VCL/VCLTee.Editor.Format.Text.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Format.Text.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TTextFormat Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Format.Text;
diff --git a/src/delphi/VCL/VCLTee.Editor.Format.pas b/src/delphi/VCL/VCLTee.Editor.Format.pas
index 98f5bbb..bf38579 100644
--- a/src/delphi/VCL/VCLTee.Editor.Format.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Format.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TFormat Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Format;
diff --git a/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.dfm b/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.dfm
index f232f7f..6d36d1f 100644
--- a/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.dfm
+++ b/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.dfm
@@ -24,14 +24,8 @@ object GridTickerEditor: TGridTickerEditor
Align = alClient
TabOrder = 0
OnChange = PageTickerChange
- ExplicitLeft = 8
- ExplicitTop = 112
- ExplicitWidth = 289
- ExplicitHeight = 193
object TabOptions: TTabSheet
Caption = 'Options'
- ExplicitWidth = 281
- ExplicitHeight = 165
object Label2: TLabel
Left = 8
Top = 67
@@ -87,14 +81,10 @@ object GridTickerEditor: TGridTickerEditor
object TabHigher: TTabSheet
Caption = 'Higher'
ImageIndex = 1
- ExplicitWidth = 281
- ExplicitHeight = 165
end
object TabLower: TTabSheet
Caption = 'Lower'
ImageIndex = 2
- ExplicitWidth = 281
- ExplicitHeight = 165
end
end
end
diff --git a/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.pas b/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.pas
index a87f536..05306f3 100644
--- a/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Grid.Ticker.pas
@@ -3,7 +3,10 @@
interface
uses
- {Winapi.}Windows, {Winapi.}Messages, {System.}SysUtils, {System.}Classes,
+ {$IFDEF MSWINDOWS}
+ {Winapi.}Windows, {Winapi.}Messages,
+ {$ENDIF}
+ {System.}SysUtils, {System.}Classes,
{Vcl.}Graphics, {Vcl.}Controls, {Vcl.}Forms, {Vcl.}Dialogs, {Vcl.}ComCtrls,
{Vcl.}StdCtrls, {Vcl.}ExtCtrls,
diff --git a/src/delphi/VCL/VCLTee.Editor.Grid.dfm b/src/delphi/VCL/VCLTee.Editor.Grid.dfm
index 0274a08..fd2cf4c 100644
--- a/src/delphi/VCL/VCLTee.Editor.Grid.dfm
+++ b/src/delphi/VCL/VCLTee.Editor.Grid.dfm
@@ -26,10 +26,6 @@ object TeeGridEditor: TTeeGridEditor
OnChange = PageGridChange
object TabColumns: TTabSheet
Caption = 'Columns'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Splitter1: TSplitter
Left = 124
Top = 41
@@ -48,9 +44,12 @@ object TeeGridEditor: TTeeGridEditor
HideSelection = False
HotTrack = True
Indent = 19
+ MultiSelect = True
TabOrder = 0
OnChange = TreeColumnsChange
+ OnDeletion = TreeColumnsDeletion
OnEdited = TreeColumnsEdited
+ OnKeyUp = TreeColumnsKeyUp
end
object Panel5: TPanel
Left = 0
@@ -137,10 +136,6 @@ object TeeGridEditor: TTeeGridEditor
object TabBands: TTabSheet
Caption = 'Bands'
ImageIndex = 2
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object PageBands: TPageControl
Left = 0
Top = 0
@@ -152,43 +147,27 @@ object TeeGridEditor: TTeeGridEditor
OnChange = PageBandsChange
object TabHeaders: TTabSheet
Caption = 'Headers'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabFooter: TTabSheet
Caption = 'Footer'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
end
end
object TabOptions: TTabSheet
Caption = 'Options'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object PageOptions: TPageControl
Left = 0
Top = 0
Width = 486
Height = 396
- ActivePage = TabScrollBars
+ ActivePage = TabSelection
Align = alClient
TabOrder = 0
OnChange = PageOptionsChange
object TabIndicator: TTabSheet
Caption = 'Indicator'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Panel3: TPanel
Left = 0
Top = 0
@@ -220,112 +199,36 @@ object TeeGridEditor: TTeeGridEditor
OnChange = PageIndicatorChange
object TabIndicatorFormat: TTabSheet
Caption = 'Format'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabIndicatorWidth: TTabSheet
Caption = 'Width'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
end
end
object TabBack: TTabSheet
Caption = 'Back'
ImageIndex = 3
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabMargins: TTabSheet
Caption = 'Margins'
ImageIndex = 4
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabSelection: TTabSheet
Caption = 'Selected'
ImageIndex = 5
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
- object Panel2: TPanel
- Left = 0
- Top = 0
- Width = 478
- Height = 65
- Align = alTop
- BevelOuter = bvNone
- TabOrder = 0
- object CBFullRow: TCheckBox
- Left = 9
- Top = 13
- Width = 112
- Height = 17
- Caption = '&Full Row Select'
- TabOrder = 0
- OnClick = CBFullRowClick
- end
- object CBSelectedParentFont: TCheckBox
- Left = 137
- Top = 12
- Width = 112
- Height = 17
- Caption = '&Parent Font'
- TabOrder = 1
- OnClick = CBSelectedParentFontClick
- end
- object CBSelectedRange: TCheckBox
- Left = 9
- Top = 36
- Width = 97
- Height = 17
- Caption = '&Range'
- TabOrder = 2
- OnClick = CBSelectedRangeClick
- end
- end
- object PageSelected: TPageControl
- Left = 0
- Top = 65
- Width = 478
- Height = 303
- ActivePage = TabSelectedFocused
- Align = alClient
- TabOrder = 1
- object TabSelectedFocused: TTabSheet
- Caption = 'Focused'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
- end
- object TabSelectedUnfocused: TTabSheet
- Caption = 'Unfocused'
- ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
- end
- end
end
object TabEditing: TTabSheet
Caption = 'Editing'
ImageIndex = 5
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
+ object Label6: TLabel
+ Left = 16
+ Top = 112
+ Width = 51
+ Height = 13
+ Caption = '&Enter Key:'
+ FocusControl = CBEnterKey
+ end
object CBDoubleClick: TCheckBox
Left = 16
Top = 55
@@ -357,64 +260,92 @@ object TeeGridEditor: TTeeGridEditor
TabOrder = 2
OnClick = CBReadOnlyClick
end
- end
- object TabScrollBars: TTabSheet
- Caption = 'Scroll Bars'
- ImageIndex = 5
- ExplicitLeft = 0
- ExplicitTop = 26
- ExplicitWidth = 0
- ExplicitHeight = 0
- object Label2: TLabel
+ object CBEnterKey: TComboBox
Left = 16
- Top = 48
- Width = 52
- Height = 13
- Caption = '&Horizontal:'
- FocusControl = CBHorizScrollBar
- end
- object Label5: TLabel
- Left = 16
- Top = 96
- Width = 39
- Height = 13
- Caption = '&Vertical:'
- FocusControl = CBVertScrollBar
- end
- object CBScrollBars: TCheckBox
- Left = 16
- Top = 16
- Width = 97
- Height = 17
- Caption = '&Visible'
- TabOrder = 0
- OnClick = CBScrollBarsClick
- end
- object CBHorizScrollBar: TComboBox
- Left = 16
- Top = 67
- Width = 113
+ Top = 131
+ Width = 145
Height = 21
Style = csDropDownList
- TabOrder = 1
- OnChange = CBHorizScrollBarChange
+ ItemIndex = 0
+ TabOrder = 3
+ Text = 'Next Cell'
+ OnChange = CBEnterKeyChange
Items.Strings = (
- 'Automatic'
- 'Show'
- 'Hide')
+ 'Next Cell'
+ 'Next Row'
+ 'Same Cell')
end
- object CBVertScrollBar: TComboBox
+ object CBAutoEdit: TCheckBox
Left = 16
- Top = 115
- Width = 113
- Height = 21
- Style = csDropDownList
- TabOrder = 2
- OnChange = CBVertScrollBarChange
- Items.Strings = (
- 'Automatic'
- 'Show'
- 'Hide')
+ Top = 168
+ Width = 145
+ Height = 17
+ Caption = 'A&uto Edit'
+ TabOrder = 4
+ OnClick = CBAutoEditClick
+ end
+ end
+ object TabScrollBars: TTabSheet
+ Caption = 'Scrolling'
+ ImageIndex = 5
+ object GroupBox1: TGroupBox
+ Left = 11
+ Top = 11
+ Width = 150
+ Height = 161
+ Caption = 'Scroll Bars:'
+ TabOrder = 0
+ object Label2: TLabel
+ Left = 16
+ Top = 48
+ Width = 52
+ Height = 13
+ Caption = '&Horizontal:'
+ FocusControl = CBHorizScrollBar
+ end
+ object Label5: TLabel
+ Left = 16
+ Top = 96
+ Width = 39
+ Height = 13
+ Caption = '&Vertical:'
+ FocusControl = CBVertScrollBar
+ end
+ object CBScrollBars: TCheckBox
+ Left = 16
+ Top = 25
+ Width = 97
+ Height = 17
+ Caption = '&Visible'
+ TabOrder = 0
+ OnClick = CBScrollBarsClick
+ end
+ object CBHorizScrollBar: TComboBox
+ Left = 16
+ Top = 67
+ Width = 113
+ Height = 21
+ Style = csDropDownList
+ TabOrder = 1
+ OnChange = CBHorizScrollBarChange
+ Items.Strings = (
+ 'Automatic'
+ 'Show'
+ 'Hide')
+ end
+ object CBVertScrollBar: TComboBox
+ Left = 16
+ Top = 115
+ Width = 113
+ Height = 21
+ Style = csDropDownList
+ TabOrder = 2
+ OnChange = CBVertScrollBarChange
+ Items.Strings = (
+ 'Automatic'
+ 'Show'
+ 'Hide')
+ end
end
end
end
@@ -422,10 +353,6 @@ object TeeGridEditor: TTeeGridEditor
object TabCells: TTabSheet
Caption = 'Cells'
ImageIndex = 3
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object PageCells: TPageControl
Left = 0
Top = 0
@@ -437,36 +364,20 @@ object TeeGridEditor: TTeeGridEditor
OnChange = PageCellsChange
object TabCellsFormat: TTabSheet
Caption = 'Format'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabCellsHover: TTabSheet
Caption = 'Hover'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabColumnLines: TTabSheet
Caption = 'Column Lines'
ImageIndex = 2
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
end
end
object TabRows: TTabSheet
Caption = 'Rows'
ImageIndex = 4
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object PageRows: TPageControl
Left = 0
Top = 0
@@ -479,10 +390,6 @@ object TeeGridEditor: TTeeGridEditor
object TabRowsGeneral: TTabSheet
Caption = 'General'
ImageIndex = 2
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Label1: TLabel
Left = 9
Top = 15
@@ -547,18 +454,10 @@ object TeeGridEditor: TTeeGridEditor
end
object TabRowLines: TTabSheet
Caption = 'Lines'
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabRowAlternate: TTabSheet
Caption = 'Alternate'
ImageIndex = 1
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object Panel4: TPanel
Left = 0
Top = 0
@@ -583,28 +482,16 @@ object TeeGridEditor: TTeeGridEditor
object TabRowsBack: TTabSheet
Caption = 'Back'
ImageIndex = 3
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
object TabSubBands: TTabSheet
Caption = 'Bands'
ImageIndex = 4
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
end
end
end
object TabTheme: TTabSheet
Caption = 'Theme'
ImageIndex = 5
- ExplicitLeft = 0
- ExplicitTop = 0
- ExplicitWidth = 0
- ExplicitHeight = 0
object LBThemes: TListBox
Left = 16
Top = 16
diff --git a/src/delphi/VCL/VCLTee.Editor.Grid.pas b/src/delphi/VCL/VCLTee.Editor.Grid.pas
index f9c2bb2..54058a4 100644
--- a/src/delphi/VCL/VCLTee.Editor.Grid.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Grid.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TTeeGrid Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Grid;
@@ -20,13 +20,13 @@ interface
{Vcl.}Controls, {Vcl.}Forms, {Vcl.}Dialogs, {Vcl.}ComCtrls, {Vcl.}StdCtrls, {Vcl.}ExtCtrls,
{Vcl.}Buttons,
- Tee.Renders, Tee.Grid.Columns, Tee.Grid.Selection,
+ Tee.Renders, Tee.Grid.Columns, Tee.Grid.Selection, Tee.Grid,
VCLTee.Grid, VCLTee.Control,
VCLTee.Editor.Format, VCLTee.Editor.Stroke, VCLTee.Editor.Column,
VCLTee.Editor.Coordinate, VCLTee.Editor.Margins,
- VCLTee.Editor.Render.Text, VCLTee.Editor.Grid.Bands;
+ VCLTee.Editor.Render.Text, VCLTee.Editor.Grid.Bands, VCLTee.Editor.Selected;
type
TTeeGridEditor = class(TForm)
@@ -66,9 +66,6 @@ TTeeGridEditor = class(TForm)
TabTheme: TTabSheet;
LBThemes: TListBox;
TabSelection: TTabSheet;
- Panel2: TPanel;
- CBFullRow: TCheckBox;
- CBSelectedParentFont: TCheckBox;
Panel4: TPanel;
CBAlternateVisible: TCheckBox;
PageIndicator: TPageControl;
@@ -82,28 +79,27 @@ TTeeGridEditor = class(TForm)
Label4: TLabel;
TBVertSpacing: TTrackBar;
LVertSpacing: TLabel;
- CBSelectedRange: TCheckBox;
- PageSelected: TPageControl;
- TabSelectedFocused: TTabSheet;
- TabSelectedUnfocused: TTabSheet;
Label3: TLabel;
TBHorizSpacing: TTrackBar;
LHorizSpacing: TLabel;
RGPainter: TRadioGroup;
TabScrollBars: TTabSheet;
- CBScrollBars: TCheckBox;
PageBands: TPageControl;
TabHeaders: TTabSheet;
TabFooter: TTabSheet;
TabRowsBack: TTabSheet;
SBAdd: TSpeedButton;
TabSubBands: TTabSheet;
+ Label6: TLabel;
+ CBEnterKey: TComboBox;
+ CBAutoEdit: TCheckBox;
+ GroupBox1: TGroupBox;
Label2: TLabel;
- CBHorizScrollBar: TComboBox;
Label5: TLabel;
+ CBScrollBars: TCheckBox;
+ CBHorizScrollBar: TComboBox;
CBVertScrollBar: TComboBox;
procedure TreeColumnsChange(Sender: TObject; Node: TTreeNode);
- procedure CBFullRowClick(Sender: TObject);
procedure SBDeleteColumnClick(Sender: TObject);
procedure PageGridChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
@@ -118,34 +114,37 @@ TTeeGridEditor = class(TForm)
procedure PageRowsChange(Sender: TObject);
procedure PageCellsChange(Sender: TObject);
procedure LBThemesClick(Sender: TObject);
- procedure CBSelectedParentFontClick(Sender: TObject);
procedure CBAlternateVisibleClick(Sender: TObject);
procedure TBHorizSpacingChange(Sender: TObject);
procedure TBVertSpacingChange(Sender: TObject);
procedure PageIndicatorChange(Sender: TObject);
procedure CBDoubleClickClick(Sender: TObject);
procedure CBEditingAlwaysClick(Sender: TObject);
- procedure CBSelectedRangeClick(Sender: TObject);
procedure RGPainterClick(Sender: TObject);
procedure CBScrollBarsClick(Sender: TObject);
procedure PageBandsChange(Sender: TObject);
procedure SBAddClick(Sender: TObject);
procedure CBHorizScrollBarChange(Sender: TObject);
procedure CBVertScrollBarChange(Sender: TObject);
+ procedure CBEnterKeyChange(Sender: TObject);
+ procedure CBAutoEditClick(Sender: TObject);
+ procedure TreeColumnsDeletion(Sender: TObject; Node: TTreeNode);
+ procedure TreeColumnsKeyUp(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
private
{ Private declarations }
Grid : TTeeGrid;
ICells,
- ICellsHover,
- ISelectedFocused,
- ISelectedUnfocused : TTextRenderEditor;
+ ICellsHover : TTextRenderEditor;
ISubBands,
IFooters,
IHeaders : TGridBandsEditor;
+ ISelected : TSelectedEditor;
+
IRowAlternate,
IRowsBack,
IIndicatorFormat : TFormatEditor;
@@ -168,9 +167,9 @@ TTeeGridEditor = class(TForm)
procedure EnableUpDown;
procedure FillThemes;
procedure MoveColumn(const Delta:Integer);
- procedure RefreshScrollSettings;
+ procedure RefreshEditingSettings(const AEditing:TGridEditing);
procedure RefreshMargins(const AMargins:TMargins);
- procedure RefreshSelected(const ASelected:TGridSelection);
+ procedure RefreshScrollSettings;
procedure SetSpacingSettings;
procedure ShowColumns(const ATree:TTreeView; const AColumns:TColumns);
public
diff --git a/src/delphi/VCL/VCLTee.Editor.Header.dfm b/src/delphi/VCL/VCLTee.Editor.Header.dfm
index f8ac729..3212f00 100644
--- a/src/delphi/VCL/VCLTee.Editor.Header.dfm
+++ b/src/delphi/VCL/VCLTee.Editor.Header.dfm
@@ -26,35 +26,26 @@ object HeaderEditor: THeaderEditor
OnChange = PageHeaderChange
object TabFormat: TTabSheet
Caption = 'Options'
- object Panel1: TPanel
- Left = 0
- Top = 0
- Width = 340
- Height = 41
- Align = alTop
- BevelOuter = bvNone
- TabOrder = 0
- ExplicitLeft = 80
- ExplicitTop = 168
- ExplicitWidth = 185
- object CBAllowResize: TCheckBox
- Left = 16
- Top = 8
- Width = 97
- Height = 17
- Caption = 'Allow Resize'
- TabOrder = 0
- OnClick = CBAllowResizeClick
- end
- end
+ ExplicitLeft = 0
+ ExplicitTop = 0
+ ExplicitWidth = 0
+ ExplicitHeight = 0
end
object TabRowLines: TTabSheet
Caption = 'Row Lines'
ImageIndex = 3
+ ExplicitLeft = 0
+ ExplicitTop = 0
+ ExplicitWidth = 0
+ ExplicitHeight = 0
end
object TabMargins: TTabSheet
Caption = 'Margins'
ImageIndex = 2
+ ExplicitLeft = 0
+ ExplicitTop = 0
+ ExplicitWidth = 0
+ ExplicitHeight = 0
end
end
end
diff --git a/src/delphi/VCL/VCLTee.Editor.Header.pas b/src/delphi/VCL/VCLTee.Editor.Header.pas
index 6b33821..90e5e54 100644
--- a/src/delphi/VCL/VCLTee.Editor.Header.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Header.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL THeader Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Header;
@@ -27,11 +27,8 @@ THeaderEditor = class(TForm)
TabFormat: TTabSheet;
TabRowLines: TTabSheet;
TabMargins: TTabSheet;
- Panel1: TPanel;
- CBAllowResize: TCheckBox;
procedure PageHeaderChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
- procedure CBAllowResizeClick(Sender: TObject);
private
{ Private declarations }
diff --git a/src/delphi/VCL/VCLTee.Editor.Margins.pas b/src/delphi/VCL/VCLTee.Editor.Margins.pas
index b90303e..de1a0b5 100644
--- a/src/delphi/VCL/VCLTee.Editor.Margins.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Margins.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TMargins Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Margins;
diff --git a/src/delphi/VCL/VCLTee.Editor.Render.Text.pas b/src/delphi/VCL/VCLTee.Editor.Render.Text.pas
index 37d6230..3b47218 100644
--- a/src/delphi/VCL/VCLTee.Editor.Render.Text.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Render.Text.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TTextRender Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Render.Text;
diff --git a/src/delphi/VCL/VCLTee.Editor.Stroke.pas b/src/delphi/VCL/VCLTee.Editor.Stroke.pas
index 9f0b4f9..c801192 100644
--- a/src/delphi/VCL/VCLTee.Editor.Stroke.pas
+++ b/src/delphi/VCL/VCLTee.Editor.Stroke.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TStroke Editor }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Editor.Stroke;
diff --git a/src/delphi/VCL/VCLTee.Grid.pas b/src/delphi/VCL/VCLTee.Grid.pas
index e8777b7..887c27e 100644
--- a/src/delphi/VCL/VCLTee.Grid.pas
+++ b/src/delphi/VCL/VCLTee.Grid.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ VCL TeeGrid }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Grid;
@@ -15,6 +15,8 @@ interface
{System.}Types,
{$ENDIF}
+ Tee.Grid.Data.DB, // <--- Forced always (so this unit is not needed at every project "uses")
+
{$IFDEF MSWINDOWS}
Windows, Messages,
{$ENDIF}
@@ -45,6 +47,7 @@ TVCLTeeGrid=class(TCustomTeeGrid)
procedure EditorKeyUp(Sender: TObject; var AKey: Word; Shift: TShiftState);
function EditorShowing:Boolean;
procedure TryChangeEditorData;
+ procedure TryPaste(const Value:String);
procedure TryShowEditor(const AColumn:TColumn; const ARow:Integer);
protected
procedure DataChanged; override;
@@ -52,7 +55,8 @@ TVCLTeeGrid=class(TCustomTeeGrid)
function HorizScrollBarHeight:Single; override;
procedure HorizScrollChanged; override;
- procedure StartEditor(const AColumn:TColumn; const ARow:Integer); override;
+ procedure StartEditor(const AColumn:TColumn; const ARow:Integer;
+ const AutoEdit:Boolean=False); override;
procedure StopEditor; override;
function VertScrollBarWidth:Single; override;
@@ -61,6 +65,7 @@ TVCLTeeGrid=class(TCustomTeeGrid)
procedure CopySelected; override;
function Height:Single; override;
function Painter:TPainter; override;
+ procedure PasteSelected; override;
function Width:Single; override;
end;
@@ -86,6 +91,7 @@ TTeeGrid=class(TScrollableControl)
{$ENDIF}
ICanvas : TControlCanvas;
+ IDataSource : TComponent;
procedure ChangePainter(const Value: TPainter);
procedure ColumnResized(Sender:TObject);
@@ -141,6 +147,8 @@ TTeeGrid=class(TScrollableControl)
function GetDataSource: TComponent;
procedure SetDataSource(const Value: TComponent);
+ procedure TryClearColumns;
+
procedure ReadPainter(Reader: TReader);
procedure WritePainter(Writer: TWriter);
protected
@@ -186,7 +194,6 @@ TTeeGrid=class(TScrollableControl)
procedure Assign(Source: TPersistent); override;
procedure DoChanged(Sender:TObject);
- function NewExpander(const AGroup:TRowGroup):TExpanderRender;
property Canvas:TControlCanvas read ICanvas;
property Data:TVirtualData read GetData write SetData;
diff --git a/src/delphi/VCL/VCLTee.Painter.GdiPlus.pas b/src/delphi/VCL/VCLTee.Painter.GdiPlus.pas
index 9acaf78..626e62d 100644
--- a/src/delphi/VCL/VCLTee.Painter.GdiPlus.pas
+++ b/src/delphi/VCL/VCLTee.Painter.GdiPlus.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Windows GDI+ Plus Painter class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Painter.GdiPlus;
diff --git a/src/delphi/VCL/VCLTee.Painter.pas b/src/delphi/VCL/VCLTee.Painter.pas
index dc61b21..d94baf2 100644
--- a/src/delphi/VCL/VCLTee.Painter.pas
+++ b/src/delphi/VCL/VCLTee.Painter.pas
@@ -1,7 +1,7 @@
{*********************************************}
{ TeeGrid Software Library }
{ Abstract Painter class }
-{ Copyright (c) 2016 by Steema Software }
+{ Copyright (c) 2016-2017 by Steema Software }
{ All Rights Reserved }
{*********************************************}
unit VCLTee.Painter;