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 @@ TeeGrid_FMX_StringGrid.dpr + + 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;