diff --git a/applications/lazstats/source/forms/maindm.lfm b/applications/lazstats/source/forms/maindm.lfm
index a745de4f7..f72c5f3dc 100644
--- a/applications/lazstats/source/forms/maindm.lfm
+++ b/applications/lazstats/source/forms/maindm.lfm
@@ -9,145 +9,286 @@ object MainDataModule: TMainDataModule
Left = 48
Top = 40
Bitmap = {
- 4C7A0400000010000000100000000D0300000000000078DAE557CF4B5451143E
- CBFE82205A040A06AD02772DA2CCDE731CCD852D6A292442EB6AA799953AE368
- BB88D1D4B1C84561524188598A8AE664691AE938E6731003FF89D377CE1D750C
- C679F72DF5C2C7DC77EFFBEEAF77BEEF9E6166E2630C7A52035C23EAAC228A85
- 18BF297DD6763FC0BBB14AA2B62BFC726B95297215638489BAAA0B203B87BC0B
- 6EB7B7C034DECBF4BA91A9F532535B39537B3E608EA82B6B1DA66805B7FE9965
- 9AEE619A8AF3AD8D19AEF366B96E732E3F3249AEDF5E64E10AEEA4C698E6C14F
- C6CDEF8F3EA685FEFC584C30FD1A0417E745542A6BADFFFD9E69057D23F7B17E
- 59A383B370F343B80FDC713D3F1DC3E1EBA961F05C33A63F14EF7D03798E8599
- 1E572CFAFF7635F45F9131CF9245E163AE9FA3A17F9F3AEFAC8A673D82763DC2
- 6A2E78837A04F46EE6D631DFAA9645D3F9F42E5E209E20DE008F50AFD81D03FA
- 152D8BA60FD53C3C41BC413C42BC423D43F51F325A164D1FA679F1841C8F50CF
- 107E63F9908E7198D6C50BC413C41BE011EA15B227A3B733BEF50E6F508F8057
- E8B3954F03772F3D558FC8E5DA9553D9B51C59FD1F28129751976DF6BB57DACA
- 38EE2D29A46EC547CC77AD25112FCF155A6FD77829CC8F55724B7A8E690231FB
- B9DB00F587D286BE82FC47EE3C45105F4388D5C95E83A166D636F4F9587F89B9
- CFCAF876E61BD3D7446EAC97F83E3FECF7E626349A1C3073DB9E3FFC24EC4D40
- B709A3C100FC8B1BD0F8CFA07C87CF6F7C84B70CECDEE996F1E370B1F78E6935
- 28DFE593DE1BA674403E382732AF98BC80FC083CF1EFA0412464CF6F763E51B4
- 921552B7E51315E5786791355F734B773FCFB4E5471D7EB6B3CD0DE9E5031E62
- 13FFAD5B29A651C45FD409C4BFB709EFF9D21F98DFE0CD43FFC1E7BFB18EFB76
- 6620B0FE4269E8772E38FFC2DA28D3F71781F57B6EED03F28280F18FFBFEF42A
- F4B79C3077BF5F7E67F5B4E60B234D4C4BF0FFA55E539735A0AFB0FF87B97665
- 986B77A6E03D3D0AA94B9BF4F958BFE619348639D7FB0CC69AF6FE97F8DC3FC6
- 406E34D96220F56CDE60A1DF52EA40AED211E6DC9CC3EAFEDED77FDEFBFB1F50
- EB76A4
+ 4C7A0700000010000000100000008D0600000000000078DAED586B509455183E
+ A596995D7E306010DA98E98CE644D865A64653D25D116F8D3AC9E85456282438
+ 54C82FB54D8A6597CB82C86597E5268462428C5A8A4241A8C86585954BB0FBA1
+ CB0EBB2A29E60DB351DEDEF75B16D16177BF6FF39776669EF96EE779DFF79CEF
+ 3CCF77760180C1230CA65A8658CA58E262C61202018F06FE9ABF2F04D8376111
+ 63F2F7A1B0A713986201C608622C69890B0CE6A0BEC8CD323503ABCA01F6E356
+ 60B1F380C9E7038B7304CCA19452AD654CB91062CF9C04765C0BEC98063E3F5B
+ 0BEB4C27615D77BD63981B20C4AA07E212A20C95C074C86FD0D88E4DB9C09AF3
+ 1C439F0FAC6D377271BE189B45B586FC710058073E2BFF06EBA71A25381752C7
+ 20EEB7D22A7EFEF81812586928439ED41653185E1E7A07749D1004ECFB857AE1
+ EF6E19BBAF51CC694C4483475C3F0F87FE05EA3C71B166D02398DD2344E5426F
+ E03D02F56ECBCDC7FC89D73269DA91DEC90BC813C81BD02378AFB0C740FD9296
+ 49D34E358F9E40DE401E415EC17B06AFFF409B9649D3CE344F9E30CC2378CF20
+ FED6F9A57C0C675A272F204F206F408FE0BD82C664D3DB24C17A476FE03D02BD
+ 82BF16E5D388CD73D3798F18CE15D75E18ACE5A1D5FF3D8DD6A5520A62C63BD4
+ E401A031B5F0A073517C5CF349C6065C2FD93CF8F3387EBDB8E6272C82ED5C3D
+ B06A5CB3BF66D980E731740F9FB9E47F27D53105AEAF525CAB35393694CA80BF
+ 87CF04D43FD5F63D0B802FCC8DC0EAF287AFF5A982E70FC71BDC8D1A6DD865CB
+ 2D76FED14F824CD5A8DB7C9B06DDE0CF398B1A3FED2E5F027E670FA1B7ECB27F
+ D345AE1F09BC6CDA0FACD35DBE143C4DFB80716EF29133D65C04CCE4265F819E
+ 786EB70D8A40F17C99A4822917010F3A17CB676CF230EF9C2C9ACFEF2DA577F7
+ 9962F94A0964F65A6103D77A8F878859FFB13D06604771FD29256EF1A3BBD17B
+ 7ECB739BBFC1A443FDBB9F7F75177E6F6B77B9ADBF400EF55BEF3EFF1DE35160
+ A70ADCD6EF74E341DC17B8B9FEF17BEFD389FA6BCDB77DFB85F213971CE7F70B
+ E5DB80B5A0FFB7E4D8CEA9067CE6DAFF8360454719ACE83D86DEA3E541E7748F
+ 9E09A89FDF67B04ACCD9956B43E5B6A1DF2502C78F31706F54B3DD063A1FDC37
+ 88D0EF2C168F7B95F82018BEE710F5FDBEAB7F87DFEFC290372038F89A68108F
+ E23D08FEC5BE3ED1F89FFFE0F8EEE241F37FA93CE21042F98EE23CC4FC55FF65
+ FE863763C6C66BC6B43018095CC6C69BC6D4D0B9CE7E1C513F47EDA695832E4D
+ E40D2E2334C015BFDF780C6EB41F1D025DF3F7F1B7339711DEEF4E7E7BA33E62
+ F30FAFE17E7E5A5ADAF8ACACACEB6AB51A84E6A7BEC8BB2E93C9C66B349AA5C5
+ C5C557AC56AB603EF545FE95A8A8A825D9D9D9B935353503269309B45A2D9494
+ 943805F5A1BEA5A5A503111111B9C8EF35180CD0D8D8086565657C6C67A03ED4
+ 57AFD7437878782F8D8580E3E08FE9E9E9A052A940A150404C4C0C6CD9B205A2
+ A3A321323212C2C2C260FDFAF5101A1ACA1F09C4A1B8F6A31D66B319388E83F6
+ F676686E6EE673DA413CFBD1CECBD2A85DE6B56353F8C6213ED54BFC2EF52610
+ DAA8AF9D9F9A9A0A168BC56D3ED51C1F1F2F9A6F1F8B7D1DD23D31B0F39EF844
+ 3D73DC67DA23A382938BD89A1DCF8AFD43642C72FD8B2EC1C498DF61F4EAE47A
+ B65CF5BC18FEA8E094DDBE31D5E05FD487316A866278442B9EF18A8A7FDA6580
+ 5571CF8D0E4E3EE18BF9ED31C6AC4D69F649CAD6F92AD549828AC07CF6187E05
+ E7C1575560995DDB01D3357B9A984CF6B8D01863D626EB7C558596803A237CD8
+ D4033EB35B6E7B2F3FDC3653A58DF39029BC9DD169BC135539BAF9F54658ABB7
+ C09405069836CF083B4D5720C3F427AC29AB30BF969C93322562C79323F169AE
+ 5E4AD024F9651537F9CE69B93D43C281B6E71A1CE8FB1BCAFFBA05FB2EF683BC
+ C372E7CDCC1F7413E529B39CFCA3FDD8A495156DC43D74F9169CEA1FE08F7917
+ AE83D27C19BE325C80D9A515E726AB720FFAC85347F4F2B7D20A8A291FE5A5FC
+ C48D47EE66AE173E6EB7C0C22613BC5E6B800989D98747E2FBA5E42834E64B50
+ D87B0332AD5741DEDD075F1B7BE1A3361BD7BF8E039F8327FEF18A4D0B1989EF
+ 2D53F96FA8D25DA57AB79EB908E19DE721B8B507169C3281DF4923F854B78157
+ 724E3D5BB577D4885380EFFCDDDC92D6481CEBA7ED56F8E0B419DE6B3C03AF52
+ CD556DE0995EC479C4EE9CEAEC7D4E5369D397377220C57ADFAEE7E095E31DE0
+ 59DE38E0999CA79FB03D6986ABE5E42D4BF098A2D96BA09C3E3FD7DDF1CCDCD3
+ 3941A9DEF9E297494F09D596B73C33D82B41BBDF539E1AEA2D938D1BA9CFBFAC
+ 55479B
}
BitmapAdv = {
- 4C69020000004C7A040000001800000018000000970600000000000078DAED99
- 7B4C935718C65F1CD3A2155A446E52EE549C779D9749E205F01215D4B839A7D3
- A813159DDB4459E6B2B87999D138279B13F88AB4459D22283A150A88329D0808
- 8ADCCA454296F9CF92FD339369CC647BF69E5216718BD93E8EFF719227EDD7D3
- 3E6F7B7A729EDF391F0042AF7AA552A5A5A5DD555BE95D7ABF3E8A9FBBFCA34F
- 85BA359DC687DE9BA950CAE2477CA521B9CD85B646678EBC6C7AE89D9900BEF6
- 90E6ACD3F8B1B739EC6A0612EE55604CDE0E7859D6C3CBAA525989E89FBAFC3E
- 857A4E24BD5B307D107B26BCE4F0E3F0EA1C4454656374630122ED051866B7A9
- 537331065FD80D0AD5CFE71A737467B7FF11783717549EC1323DA50C75AAC804
- E5260BFF85E4A37D95762DBA49D7BFECA03B4741B7B95F3CD664AA57AD0574EE
- C34E7F22773278C4D1CE05E554F50DA8D10C2AF884FBB7A9D777EC7D74D5030A
- D1CF61FF3E2C3D790F984D692BDAA83E0D94B912DC97CCF593546A0B7F7E15F5
- 730DFA7B6E12691D35F62DAEA2D4257FF275A098593D9096E5DA6DFE8BDF11E2
- B99466198F38C64D7EEBE3ACEDCBEA2BC370FAF4E92F54BD6B7CAF7AD5ABFFCC
- 3FEAE4E26026C14ECFE31FF54DE36026C14E82A1E4370FC14C829D044339B3A4
- B38579C6F44F5BFEBB6016D5BCC3AC249849B0936028478DAEDF11AA8F17AC22
- 98452DEF085612CC24D8493014B3D4437A3F468C95AF832104AB086651CB3BCF
- 30936029DD99ED8F98AD621CFE825504B3F484799E6627C15282A97CB4E3B9C6
- 02B2ACEE70304B4F984730936027C15082A504530946D0B846708DC41EB04E92
- 839504330976120C253847B048272FBCEC64919EB04E20A52D011D5CD24EBE03
- 1739D9C745E2FC7767664AE37158C9CFBD247B9393957C9D63F2522FFFF4EA45
- AB7B7AB86A69E9B8ED91D64D0F685B8CE5DF32A407FE2EF4E6D88F469EDBFFCB
- D6966AC494981FD2BB33D29FADA1D2DF85E645AC0938FBF9AF0B6E17415F720C
- 532B2F627231E754D28C6E39F5BFFD35AE3A5A3E215597B7E749F49D625011AF
- EDC5BCFE169B30A2FC3C8C57ADA0E45833E9DC7C55F9870D9A49A9CB9E04E7ED
- 8457DE2E44969F019564C0EBDA714416A722985F2365F5239A19B145AC932ABE
- 7F0467F3265E7F93875A3620BEA1047445C1D08A1CC417A580A20CE9DCBF99F4
- 6E93C59AA362FCFB3AD7ED40A33511718DEC5FAAC0782B0771C55FF1FE58B7CC
- 79C622CE715C7A307F7411EC3FCF7E19744DE10CCFC1BC2287FF4249F35317C6
- FEB3EDFC1FFFA020ACFA3466171D92EA1F62DD80187B21E8868290DBD988293C
- 28D53F88FDA735DB40371504D564635AE11752FD0DCC68512DF9CC480A0C774F
- 21AAF08038FF90E63FC4B20E935A2E826E2918527712930AF74BF5F763FFF1AD
- 17989F14F8D57F8BF1B67D52FD7D2C09187DEF3CB399029F8613186DDB2BD57F
- B0652D86DF3BC70CA960B0FD3886DBF648F5F762FFC8B63C509D02AF265E7F24
- FB7BB27F783BAF6F0D0A3C5B8E23DCB64BAABF87650D82DA734076051EAD5908
- B27D26D5DF9DFD037ECC0635A5C3BD2D0B01B64FA5FA6BAD6BE0F713FBB79AA0
- 6DCF825FE10EA9FE1AD38ADF74B58741D507A0A939045D5ED2630AF19C2FC95F
- 4B334277526CB89562C2B22896151D76803C34AF48F21767988215825921CE47
- 7F969B2CFF7E87163506981361C85C8F00F306B81F79ABF3EC5DD2F8845A3762
- 95BD12532A0A1057538AD88294CEB37749FFAFD1B2917DAFF01ECE04E3F55CC4
- 157E2D75FD375A38DF6BAF3818C85826FCE5E66F04FBCFADE57C2FE67C2FCBC1
- 5C5B8ADC7C67FF59B59CEF259CEF374F63964D72BE335F45D771BE5FE57CAFC8
- 46B44D72BEF39C9C5AC7F9FE3DE77B6536A61648CE77F37A4CA9E77CBF6E82A1
- EA14A614C8CD777FF33A4C68B8042A33C1BFFA2426E44BCE77F61FD7C8F97ED3
- 04BFDB27312E5F72BE9B1330CACEF95EC9F95E7302A3F2E5E6BB97792D86D939
- 7FAB387F6B4F6058BEDCFC1DC4FEC6A6B3BCFE2B1854771CC6FCDD52FDF5E677
- 10DA9CEBE01F7DFD3184E6EF949BBFEC6F68E17CBFABC0BDE1180CF972F35D6B
- E6FC6DE5FCADE3FCB573FE5E9290BFFEEEE329F1B5525A37F1C6808C95F06E3D
- 09AA3761409315DE173E066D9EDCE0E89F6058A36A7FE43B702CED7BA38CEE1C
- EEA07B166613DE9BDA4D9D6A35835A5847135A698CFFEB2AF777E2BE6A3CED5A
- 504E821D5A8E720D05D4CC751A5241A736FD4C237CD6F2FB06ABDA9F3E7D5F35
- FDED36AAE71A6D5CA3391D94CDDE9383B671BF77D73D4CD5E7035DF755F72C2C
- A7F2BD1D645AD5E6FCDEDE3D3A1F78F6BE6AA02E9EB9E7088DF45DEBE4155749
- F3B36BACDC9DDCE3F9ACF7F3FCFF022E5008124C7A0400000020000000200000
- 00040700000000000078DAED9B5D6C145514C74F425B9F082DA16BE2936F3E48
- 3460343128A4DF2D5F460CD16862D498F8608C0F901A0CB8B442B72D84446342
- EF6C13C02F444883A14029F4FB13289416E8872DD66E71B75BC18FF8664C8EE7
- 9C3BBBDBA5D4F070E7929899E49FB36766D2DFDD7B67A6F77FEE2C2202FAF2E5
- CBD743D0225B06D4AE3F050736F1095960775B027B0B1BE0780861FF7AE6E7D8
- 651734C0B1207E3C33865053C8FC8035F61E621F0FE2EBE3DD5839338250B906
- A12A1F21546050F49D6A4A90C6B751C63931DE7B8B3AA021886F4DF622B41EC4
- 2F6263B82936842FC76FE096F84D637A656E04B7FE3649FC12EEDBA5A44CA82D
- BB03A72AF09DA93E842E07A15391EAE6499913FFFDFE23D407C5CCCF2565436D
- 29AE1C6FC2472ED3FEFEB0C7AA47B8FA951E037D6DAD809DF9ED70B602E1DA21
- 84013AE7B2A3C59F4DEB0AF187D3F83C064FC1476B3BA06937C28DC30843F55A
- FC79E44BB31A25F6C47734FE65097E86F401C06A694333F5C31871C7692C3EE5
- 6B9FC6A9BAC49CE4DA2776B0A8DB1D7F7DEFCD6F431BB52172549F0F504A2A30
- AC75A427DDBE87856D58D701BD5508FB3630FF09B79F4C2AD765672C7806E936
- 3C0355A5B7E1C0669BCFBFF96D08483F00ACB2FCFC4F6C99A465F26CB0FFFFCF
- EAE6CF817CF9F2E5CB972FDFFF1BDEB2A486C0B58485734D1B5B8ED410B896C0
- 35053DB7B4B905B88620B584634194DAC2C23664C2FE8D7F882F616F6ED2EB73
- EDA0728DD412B8A6C0B505A931A4B7219BBD387B72F6E626BD3ED70EB886C0B5
- 04AE29486DA181DB90361601F1E2ECC993DEDF94EEA921D0DF971AC329F27755
- 25896B32207DCF9E9CBDB9C7FE9F6B0C5C6BE09A83EBC1349F3D397B732F3CFF
- FC7A02D718B8D6C0350780E5C2673FCC9E9CBDB969BF7F6F3D816B0CECB1B9E6
- 90F8FEFB36FE256DA82931EBF5B976C03504AE25704D816B0B9ABDDAF5B919AE
- C7639F99EF81CF2F9576702D816B0AE56BDBE7B197CCF39AD91E78FC80D40EB8
- 86C0B5843DC577C4D7A7B3BD7FFE710DA176FD9FF4F979D2A3969FC139EED83E
- 4B7ACCED6B9B5B963BB6D90F81EDFB7F5FBEFEAFEB73D5C527A1966BE314FF63
- 6EED015FAF917DB30BC7FEFE07392E32AFF582AFD9DFEEC2C6BBB3F878E70989
- 9C2FD606837C669F80A39FE0C1E82D84332A29C969FFFDDA60889F4973F4287C
- BF1BCB6F0DD11C8AE672E758611D2997FD741CAA8AD2DA60804FFE64C35D3819
- C2572706681E4FF3A8F361AD0BF5A9CFB45F8ED379102A3B93B8260DF0B3C543
- B28FE3EB7DCF8B78786E8A98D4F7171C8992D37E39CEE7E975EBA5C6F8A9F961
- 2984F2B1FED79F894D9EA24549949CF6BB6B4579EEDC7699217E963B8FD1F339
- E284EF10AF95F86D4AA2E49A9F582BCA49AC5B18BEFF02CC51CC6B237EBB92A8
- 52FC80C7F77F807DEDE77374BFB513BF4349949CFDAE25FEFEB909ED29BBB4C7
- 94DC22BF3A4E7EBA8BF8DD4AA2E416F915F1116213BF474994DC1ABF1077C6AF
- 23F411BBCF912879A8D01ABF3C4ECFDA7EFAFEFD4AA2E416F91FCE0E225C24FE
- 452551728BFCF763F49C1F20FE809228B945FEBBB14B0857887F454994DC22FF
- CD581FC255E25F551225B7C87F2DDA83708DF8D79444C9ADF18B704BB40B6148
- 252539EDB7C5DF1CEB40185649496E915F1A6B43B8A19292DC223F2F761EE1A6
- 4A4A726BFC625C133B8730529794E4A1626BFCE766CF228CD3771FAB9328B945
- FEAAF8698409FADFF3A32351725BFC9A325CF97B13C2CC1184C8118992D794D9
- E0E742B0B05B58A1929438E7FDA9F7A9BCE22F75DF9B5AF700EF5379C1CF7019
- B90FF83E95793EBFB7C93E87DF4DAD2ED491F3F4F739BDEB7F626D9F1AC56D13
- C3B89D2491726983F7FD9F0BD505188E4D2334D2BDDFA8244A5E5D8016AE3FF1
- 3FE159E29D66EFEF4894DC9AFF217E9C784DCAF5FE4AE716F975B19F884DFC66
- 47A2E416FDDF6731F27BCD75BA064051728BFE675F7422CDFF4B6E91BF374AF7
- 5B0BF15B9544C92DF283BF8CA4D51F24B7E8FF76DCBEAEBD7F872351728BF3EF
- 6DB787DCF565BD5E2DB945FE073383DAFB773B1225B7C87F6F66407BFF1E47A2
- E416F96FCF90DFEB257EAF2351728BFC3722BD69FE5B728BFE6B6BA41BE1924A
- 4A728BFEE3A508F9ADCB2A29C92DF2CB226DAEF7D792DC22BF20D2E27A7F2DC9
- 2DFAAF1723CD088374ED0F2A8992DBF45F11F21B438EEBFF1D9D5BE317E1AA69
- F25BC34E52927BD7FF59F20E03BF47C1EF7254E6E1CAE91F10AE3B49494EFBE5
- 389FA77F3761AAFEBE0C2A8B5BA03384307D94FC2679BED17AF2FD4E4A9CF37E
- 3ECEE7F1F9E6D61F784EFFB4FC26A57537C2E421F2DD61F2FD2A25CE793F1FE7
- F3F87C73EB2F19EEBC7E3594AFA53604356B9C98A34A476107518EEBF76B720D
- AE3FA5FF368719EDC49A22E664BD8EED69EC1586D7DFEEDF86CE0A84E8D72871
- 11B627EBAF8936ECC8EB11DFCF7111B667EBCF9AC56B6C2FB87185A5F5E77BEB
- 00CB17F3FD0FCAFF17E77E0F33
+ 4C69020000004C7A070000001800000018000000890C00000000000078DAED9B
+ 7954145716C61F6A0C260C02810614905D8D317189C6E83946516326711DE36E
+ 1CE3B80675D468C60533A08022FB6E37D08DCB28A22231B248105C5914646F69
+ 68098AE0BE0B3A6AF8E6BE9666404D80A6F827873AE73B5DD5D5F5BBAFEE7BFD
+ EE5755DD0018DAD52E0D959A9ADA587999A2D48A8261B4AEF5DA3E0DD468D1D3
+ 36662BC68899DF941ADAD266C22E5AEC7B8788BEBF48AA45110B41DB5D0523EB
+ 699B125B6A93128685A519E817F3230C658B6118A9A1762EC53B21B32B98B5C1
+ 60A6DFC592AD1C7DD03639F0A96D5634ECCE47E1A3A278F492C7A3B73C413315
+ 27C1E8C816306BFD7114E30BBD43EB7FB3C83D00961E469234509866CA88003B
+ B096F32731639D8FD9E6C969EC94CF0B76211C2C9BF6F3D79C08CD9527033BFC
+ C34B3E63BACCBCEB78E632319D9D0F022B9282C53BD1FE359AEB276287CF7BC0
+ ACF4BF207E07923E13BD3B96857EA36405A160117341FBD652FCD51A6A151D3F
+ 8FBDDDA947FDD8644C471563DB94F32C645A2D6D5BF091D50AE9903A351AFFFC
+ 3CAC0C66B0CFED835579137EE95017DB84D45908E0881123DA54ED737CBBDAD5
+ AE66FB1FCDA4A5F24CDC3BFD91FFD17CD1567926EE9DB887127EE9CA3D13F74E
+ DC43D5D592978B8DC1A87742673FE39E4563BF435E897B26EE9DB88752C5509F
+ 87B5FE04EE55B867D1D4EF70AFC43D13F74EDC439197AA66FF1CC57365A2F210
+ DCAB70CFA2A9DF79C533712FA577707D0D79AB512A3EF72ADCB3B4C6F334F44E
+ DC4B714F65AC3390624C64B26F5FA83C4B6B3C0FF74CDC3B710FC5BD14F754DC
+ 236877B2A3184B5BE17556ABBC12F74CDC3B710FC57D0EF7222FFDC25B755EA4
+ 355EC782854E03F39E56C64CFE32B9CEFB680938FE75C93385521EE6D2BAA1C0
+ 6C56E7954CEA72D2B1DDFFB4ABADD5B87A74D2613306ACEF15E9F880AD19257B
+ 530D69055F8B4DEFBFAEEF618F5BDF2BB2302A595ACD968DDCF16A0C0DF95AEC
+ 2BBBF96687DCEE4FCC3E06FDE45D189EF9338624519D5A3DB2519D6A315FBB93
+ 1E9B3D28442FC6F5B9C38524B06334B727D1FC9B24C107E9B1B04F89045B3B5A
+ CAF4BA9868C4B7796F0C0B99F5DC32C60586319BD12BFD205872180C4FEE46AF
+ A41058D27B4CFC6D0D1B63B78ACF931AB4DF8E6AB323CDBF6B7BCA9660426132
+ D871317A664463C2313FB061E63B68FF72A6DF65089F7334C87FE7BA79DBC23E
+ 7229C617113F550CFB73D1189FE44FD7C77AB3EAEEB1F0FB385AAD183F7A76C4
+ FF4AFE0BD84931D5F0687C754CC59F24D0F8D4B321FE5839F5F169316CB2F663
+ EC315F41F956914B304A9E0876460CABEC288C4AF41694DF83F89F152780A589
+ D123270A9F257A09CA37278F364C11471E490CF3DC7D1896E8C9EF7F08C6EF2E
+ 5B844F143F839D13A37BFE5E7C92E82128DF94F8034B8E907F12C3B4E03F1898
+ B04D50BEB16C213E2A8D256F268671E11E7C94E02E28DF48B6007D4A0F938714
+ C348BE1B7D125C05E51B12BF9732062C5F0CC38B34FF08CC3720BE6D19CD6F85
+ 62182876C33661B3A0FCAEB2F9E851160D2617A36BC94EF448701694AF4B7CB3
+ F228B08B3BA0ABDC09B3847F0BCAD7899C0FD32BC42F9140A76C274C137F1494
+ AF2DF9E6B15E5E20589627B4737CA117B3FA29B3321827105F878DB47661A36D
+ 23D9289B9D6C34C9C1C69375D57E5F203EBF87C9BD8225C9AAEEB51BA98B50FC
+ B77D2717994997C23C6231CCA44BA01B3CF3E5BD7781F2631DF91DE6C9333134
+ 231EE37352313ADEEFE5BD7781FAD75EF61D718FD3359C04F6A70E607C6280A0
+ F3BFBD8CEA7BDE719507B23FCBF9C2D65F3BE27F9947F53D89EAFBD9687C99E0
+ 276C7D27FEE77954DF93A9BEA7EDC7E70902D777F2570EF954DF53A8BE6744C1
+ 2141E0FA4E6372783ED5F71354DF33A3303C5EE0FA2E5D8CA10554DF4F49607E
+ 7E1F86C60B5BDFBB49176150E151B0B31274CBDA8B417102D777E20F28A2FA9E
+ 268169F65E0C8813B8BE4B17E24339D5F74CAAEF397BF0619CB0F5DD50BA00BD
+ E5547FCF53FDCDDB83DE71C2D6DFF7886F7FF110CDFF62BC97BF1BF6715B04E5
+ EB4BFF01EBE2032AFFA35FB00BD6712EC2D65FE29B2BA8BEE78AA15BB80BE671
+ C2D6771D29D5DF12AABFF9547FE5547F8F0A507FBBE90E644B3F4D658B069F79
+ 376C2E44257BC10A2478F76224444736802D1F52A8DA3FC87CBE46D747267FE9
+ CFB64D3DCB2E04BE60A532F226746D2A97BC5489144C410A5F58C2FA75FB5AC3
+ EB3BFE5C7502DB3C319D71EFA008A71862B0628A531802B6CFF13AFBC078017D
+ CE48A3EBD386CF5577CC51B2028AA1A418C53BC0A2883DA4C71ADA2F523FC3D4
+ F8FE80FAB9AAEBA47496EEFE8249E629EBDA2D6AD5FD81579FAB5AE84D20DF13
+ CCFA9A2CA8F32B9D041A9FEA5CE9D6F91E8357D97FC4DFB3F06370CD9CF94830
+ A9993CEE9F857FFBEE5DC1D4CE6FE7B7F31BF3DB427F467EFCF1A4664B537E73
+ 63B5F3DBF9F43AB52DF9AFC6107AFCBF69290D757C541ABC144D4919EAF8A434
+ 70C988963ECCE5C736677952A5C425C9CA6A65E81287B6E06B1A43CD7F7EBF0A
+ D5F25FDEA81AE5D9FA1835571594AB65352DE5D73EABC1B39B4A3CBB51FA9A9E
+ DFAF6C741EFC98B6C84F6BF87F941FB5F8679AE24B241217B1580CB59A931F95
+ 681FFF8C9ADF90111414E4A2E6474444280A0A0A505555A592A6F9511F9F9393
+ 034F4FCF62CE0E0909D10F0B0B7B7AF5EA55C1F8151515D8B871E3D355AB5619
+ 506EA6C5C4C43C50EF4B494941E66E2F551B5A227E0C3F56CDD9BE7DFB83458B
+ 164D95C9647BD2D2D26AD5EF474545A1B0B0B0FE73CD153F861FABDE8E8D8DAD
+ 5DB162C59EF0F0F05B252525AAF7CACACA20954AD13057CD55656525A8AD2A06
+ DFE6FDB97CF9F25B0DFB9C72D5680C50DF20202000DEDEDEF0F0F0809B9B1B5C
+ 5C5CE0E4E48475EBD661CD9A3558B972251C1D1DB178F162503EB064C912D5AB
+ 5A9CA36E43C3F55775E5CA1555DBF8B9CAE572E4E7E7E3C2850BC8CACA6A24CE
+ CCCECEAE5F6F0E9FE7ABBCBC1C4AA512C5C5C5AA5CE7E6E6BEC656331BAE37C5
+ E779BD7CF9322E5DBA04854281A2A222E4E5E5D5B7B1297E6868683D274C226E
+ 71BE5FD58A658E8DF8C1C1C1F5FC4BE21568EDC2190DF98181816DCAF7F7F7AF
+ EFC3B6E0FBF8F8C0CBCB4B956FA1F80DFBA3E13C2D14FFF7EA00DF27845E03CF
+ F21BDE7186DFA10ED37DBCD8245F3D417FB9466C9DC5BB6E5B6E4D87FE8AE817
+ 5A537DCAD9541F5BA1F01D67FA1FE4EC017BEFC2DEBF00463F1C4187693E1542
+ C5E830DDDB9BB79BB35531FC048E41F9D69AEE53CE99BF17C3C479ABA5C8D9FB
+ 247376EEA4510C62508CCB6F8AF1D61CEFEBA66E011596217B6B4C5DBCA7687C
+ 1E6F8861E7730EA6AEC10F071CCFC188B372986F0D3AD7AA5CCDF0B5D49AE6F3
+ 2B8F61EB7B0E665BC50F06A7E4E2AF39E5985A50018B6531773ADBA7CE68550C
+ 3A8FCE73BCAEF1760F49CDC5B8DCCB9855781563432EA3C35B85E8DAEF548D9D
+ 477099DDB6907DA24D9E9FB614CFFBB29B5BE0D5A127F23031EF0ABE29AAC4B8
+ B00A74EC5C88EE7D4BE05E7417926B0FB139FF12BED87DF876CF6D41D926EBBD
+ DE6F367FB3EF09BB1DFBAABFCC50602EB12784FF9FED75F13E76DD788C83B76B
+ 107BE7090EDD7E02DF924AF40B90DEB0720F72620C4DFF6E95C6A0E98F9E93CD
+ DD02D2AD96C5DCE439B1E85F023FC57D44DDAAC6D17B4F71FCC13324DD7F86C3
+ 146327C5F3AFB88F8987931F59B9079EEFEEEC61D6EC1FBDF64C9EADDFFF74CD
+ 4B760D12EEFD17698F5FE0ECA317AAF57D146F47D543785CB9870D976E61767A
+ 51AD8D57D83573D74069B7F5EEBD9A13A38F97B862CFCD6AFC7CF7294E3C7C8E
+ D3C44E24F67E8A1776ED11BC2AEEC1A9EC369697DC50E593F7D9A0C4CC5A0BBF
+ C85B265B7C039AE2F7F408557216E7F336FF44AF7B299E98FAD893D89B88BD82
+ D87F97576212B14766FF8A01994AF43898526BBCD96F4353FC5EDB433222AEDC
+ 55B597E74376FD31822B1F601BE564A3AADDD7EBD90EC41E486CDB33C510F944
+ 5C17396DB7698A6FEB1AE0B23A2DBF96E7228472ED4D7DB9A5FC0EFE45F9FE4E
+ 711D73EA723242D5EE5215DBE8683A4CB6F89F6ED678DDB475D0E83D3FDDF2A4
+ F6BA96DF55B57955E90D2CBC780D33E97BC7BF7FC3B3CAD02FA314D69C9D5200
+ D1D6901BC6CE5BAD9BF77D8EEE68BF3DB4928F8FD5A537B154F1321F53F22B30
+ 96E68DA1E72FA16F7A092C4F5F84516A218CFD23EF9838FBCD6DC977DACA3D60
+ D7D727736ABF9557617AC1558CA736F35C0FA65CF74E53C0EC14B18FE743E42B
+ BD6DECEABFAEA57306EFA7DE0191D7799EC75C28C7306A33CF07CFB5C949398C
+ 62CFFC66EC1E5C65EAE4F5374DA73D33B7C0C481C7CEFD36B0AECD163C1FB167
+ A8CDB21B22D78078D106B756FD6FA49BB397219FF72C624FC158127DD7D83DB0
+ CA644BC07E53278FDE42790163674F07919B7F90C9A6ED9FF571766ED6FF0BFF
+ 0753B3730B4C7A0700000020000000200000003E0F00000000000078DAED9C0B
+ 5455651680FFC64733AD69D28A7B1535ADA6554D8E19D5F4D4F2FDE8AD52963D
+ A6666A34A59CB17152402EA85C2E5C40251EE702A96552EA98E523B114104454
+ 1E8208978728EF8702EA059950DBB3F73EF72220A4C2B98756EB9EB5F6DA779F
+ 73D6F9F6BFFFFFFCE7DFFB1C0000010E7188431CD203D2C9D65BF84FDD2A829E
+ A313FA0A75B75E62F9F8CD62A31E84712AF1FBABCB1EB7597CE5058B4BCD200C
+ E389AF518DBD0CD91BBDE0B5BC24F029CD01E1F30408DFB120F4E314146C9361
+ 1260FF6EE37EB6F5F7F2090962B317FCB53019C49E70F8A4D20CCF5566C24BD5
+ D930ADFAA86232BD26075CEB0A913F89627B234A1FE13FE594D8EA0DEF1CDF0F
+ 22D10462AF8412D14A24E584AE9FB216633091F84E28FD84FF64189EB713AE3F
+ 84FB5322ED2C5120D23F97FB401E5BB70A8FB1F1E23B6F1087578348C5730E99
+ 64A1DF4A4B1AF2B3DAF0A90F4688FF8C4E103B7520B2D780C88C92857EE77CA6
+ ACE422BBE04BECFF29367E6F8E81102EECC32E8C8319B979D8174B69EC633FF9
+ 4D524E78EC23DB6B4292B5FFE57BAFB50F71E843498C7CBE109351C6292C4FA1
+ DC678DBDB8DC87A71244B22F888067887FB7354E4A8A9395DDFBB23948F6E141
+ E13BB94C043DAFE6FCD7DA070DC7418807549EFF6D5B1F949B786E50FFF9A7EA
+ E6580339C4210E7188431CE2C8FF15DEFA720D816A0997AF35D5D8FA730D816A
+ 09545390D7966A6E1AAA21702DE12B2FE0DAC2E53EF411C6674F735E42B9B992
+ B93ED50E7C9EE05A02D514A8B6C03586B63EF4A35C9C7272CACD95CCF5A97640
+ 3504AA25504D816B0B9BC987367DA1E15C9C72F296DC5F29695743C0EB738D61
+ 2BE677BE936C6352C3B1A79C9C72733BE7FF5463A05A03D51CAC3998CCA79C9C
+ 72737BE4FCADEB095463A05A03D51C84B899F9940F534E4EB9B9D2F97EFB7A02
+ D51828C7A69A83ADFD01CF5AD807C32465737DAA1D500D816A095453A0DA82CC
+ 76B1E6B9BDAD391EE59963ED90E74F663FA89640358585A3E35BB17BB5CA35FB
+ D921C7D770ED806A08544B5836F114E7F56DD9F69FFFA886E03FF50CFE7E0C45
+ ABF21CDCDFDAB70FA3385B63ADE6D6D7DAB7FD7A80EDC8FF1DE2905FEBFB39BF
+ 895B843FD5C651FFCCDADA0E7CF91DD9179E606EBE00A43B59D7DA832FB3D77B
+ C2B6DA2A18B677136BB23BF341413EB137899825105E710CC40EA945D8C6FD1D
+ F9A010BF0FAED12BC4061D2C3C96896B285CCBC59244CA1A6DDE8FC785EF8436
+ 3E28C0C7FCE4995AB1450FAF14A4E23A1ED751DF47CAF243D4A5DFB89F8FE379
+ 423F65876D4C2AC0EFC73924E57134DE978D823535C79189B1FFC1C49A6DDCCF
+ C7E93CF9BDF58D8AF12FAD0F270BFD58883A7902D99853EC9658B38DFBADEF8A
+ C658D7B63729C4EF6B5DC7C8EB39E4449E42DE1EE4C749ACD996F9B67745FD6D
+ EF2D14BEFF34C491881787FC7889B57489AFB1F3FDAFA1BC76550DDE6FF1C84F
+ 9058B34DF9AE4A7C634D819C5326CA3926DB2AF2FDAA319F4E447E92C49A6D15
+ F9DED539C846FE3E8935DBAAF1C78347F51110FB91BDDFC49A6DFD78D5F80BAB
+ 71AE4DC1F6A748ACD95691FF6155068803C83F20B1665B45FEDC4A9CE753919F
+ 2AB1665B45FEDF2B0F8248437E9AC49A6D15F96F56EE07918EFC748935DB2AF2
+ 6756EC037118F98725D66CABC69F00D32A1241644A2DC236EE578BFF7C650288
+ 2CA945D856913FB9320E44B6D4226CABC81F53F93D88A3528BB0AD1A7F223C51
+ 190B2227A245D8D64F548DFF97AAEF40E461DBCD11ACD95691FF40F5761005F8
+ ECC937B1665B2DBE610A0CAFDF09A2742D8892B5ACD9364C5183EF24BCC62731
+ 4B3FE992904DFB2F7D4F652FFE8DD6EFA69EBA8AEFA9ECC1EF6D65385DE5F754
+ CAF3E9BB4DCA73E8DB54BFF1B226BBEDF79CF68B3FB23E3A9E0B0B0AB2E02314
+ D668B30FF68FBF93F01B079195C520B6E1BDBF4D62CDB6DF385061FC71FE1359
+ 85BCED94FB9B58B3AD5AFE83FC6AE4ED94ACB9BF24DB2AF2232A8B908DFC5D26
+ D66CAB98FFADACC47C6F57845C0340CDB68AF94F4045419BFC9F6D15F9CB2BF0
+ 7EDB8DFC3D126BB655E47B95E7B4A93FB0AD62FEB7A8EC889CFB279858B3ADE2
+ FA7B4159A6F5FDB2FCBE9A6D15F96EA51972EE9F6462CDB68AFC7F94A6CAB9FF
+ 3E136BB655E4BF5D8AF95E32F2934DACD956913FAB24B94DFECDB68AF9976B49
+ 128883528BB0AD62FEF14209E65B87A416615B45FE9492386BEE2F0BDB2AF2C7
+ 95ECB6E6FEB2B0AD62FE35AA6417880C1CFB19126BB6D5CCBF4A30DFC83459F3
+ 7F936CABC69F000F1463BE95656A11B6ED17FFBEFC0D037D4741DF72F88C81E1
+ C5DF8038626A11B6713F1FA7F3E4BF9B50AAFE7E93F099B85BECD583288EC17C
+ 1373BEDC28CCFB4D97846CDA4FC7E93C3A5FB9F70FB4A6BF9FFF26658F0E44E1
+ 6ACCBB2331EF972E09D9B49F8ED37974BE72EF5F7A5BD7F52E62E168F4C14B66
+ E52133579235B3BD808FCBDFD73829F8FEA9EDDFE610231E59C791591825EBF8
+ 36EC5B157EFFD6B10F7BBD4154AC03D69DB0EDF2FED5E6C3A231FB38EF27DD09
+ DB6EEF9F6516BD637BD2AA6F55E9FD73FB3AC0CD9DE5FD57CB5FF7EE43609357
+ 5FB5D8555AB36CFE39F8BF1CFEA9BA3ABB8A83EFE03BF80EBE83FFCBE4AB290E
+ FE2F9BBF63F7AE2E8992FCAEF8E3E03BF80EBE837F0D7CD79EE477E6835AF36F
+ 675B41F85C4B41E81CE88A1486CF6D2A0899FD7477FE2E88AED3D5ADA9A2108E
+ 99E6371686CF1EDB137C257CE82EBFBB3EB4E7379D38048D39DFFFACD039EDB7
+ 736579381EE69DEB293E6D74AD9E88FFAF897F35F1EFAC1F7E0D7C7BC63F3A3A
+ FAC6C8C8C8064992C0264AF3E99A616161B072E54A080A0A6A30180C2DDF4AE1
+ 31D74D9B369DA9A8A8009B28CD6F7D6D93C974C6C3C36346ABF67F9D9292F293
+ 5AFCD8D85858BC78F1D7C4DEB06143AFA8A8A886A2A2A296E3A5A5A5E423B4EE
+ 8FEE085D8BAE69BB7E7E7E3EB8B9B935E874BADE787CCCFAF5EBDBC43E2B2B0B
+ 366EDCD8C6E7EE085D8BAED97A9FBBBBFB99D9B3673F8DE32E3C3E3EFE42EB63
+ 7171712C4AF13BBA5E4C4CCC85B973E7867DFAE9A7D566B3F98AFE76473A8A67
+ 464606CC9B37AFBAA3BE6ABF8FEE9B909010080E0E06A3D10878EF80AFAF2F2C
+ 5DBA14B00F01C7322C5AB408162E5C080B162C80F9F3E7D3B561CE9C39F0DE7B
+ EFB508C69BA5F53EBA7E6BBFDADB1D49595919141717038DD9828202C8CDCD85
+ A3478F723BA95DA9A9A91D0AF1D2D2D2DAD8D7CA6FCFA6BE23F69123477E96AD
+ 149FEEA313274E40616121E4E5E5414E4E0EB3333333213D3DDDAEFC8EE29E9D
+ 9DCDEC2BB5DDC66B6FB7E745462833D63A920FDE9F7D193F2222A2855D5E5E0E
+ C7A40FC05E1B5DBB3D9FEEAD9EE4878686F6289FFABA27F9B41EB0B1697CABCD
+ 5FB16205AD475AC6BABDF9EDEF89F66B317BF3AFB4EEA473EC299D825D839E12
+ 2F077988E9C6B7C48BC1FD54FD87AB335745F77E3DF4EC4D73632EF47D23DC22
+ 5C034F8A69FE4FA802C776F799156A19F9590DDC1B960FC37C93A1DFBC18B86E
+ 4660A39811F0B4DDF918F33F60BB89EDB2BEEE920F6E5FAAE303F677DF37C32D
+ 437DF7418FF84063CD35B0A69F5B0C5CAD0FCE8BFD5D9C3CF50F28E6038D3557
+ 6303B1AEE483C633E0B1014B029A06E882D2148D03B5EF0A3EF47DD3D8A45D62
+ 3C77CF960418E81DDC386091F14F6AF970DBB25840F6F9FBBE4D8451A945F0E7
+ CFBE6976D61957297F3F1A9FBCCE35D0D27A3C0C8F3603C6BB79C4D644783AED
+ 384CCD288667F69B61A057A065984EF75B7BFA3064D94E640737DFBF3D19C6A5
+ 1F87E70E97C02B47CAE0D5FDE570C3EDFB2FF4BAE540C9004FFDC38AFB817DC1
+ FDED15787E24B227A69F8017334BE0B5EC327823A50234F799712ECF861B06A5
+ 5FBCDB3FE2B4B3A7B179E8D295891A77C31B4AF8C2E3DC2BB0D105D993324EC0
+ B4AC5278E36839BC7DB002B42364F62DC3CCB0E4502D7C527E06C24AEB607E62
+ 063C1EBECE32C43BE8A4F39280B78580EBBAC2A6FB9BEE3197AD493019D9D391
+ FD26B2DF41F6801179CCBEF57633F8A4D682A9D2029F5537C097271B61E3A973
+ B0E1E439D01F2982FB83232D437D829306E90C83AF95EFB4D87F24DE5F69CEDE
+ 41E75CD66D6D9E71D00C7F3BD496BD3CAD16565759907B0EBEAE6D826D75FF63
+ D982BF695F74C55998F9CD9EE641DE8167077906BCDCA5387818EE76D605850C
+ D4059EA5B1466CA73BCCA0CFA887B5D8666AEFF6FAFFC1EE33CDB0E7CC79883D
+ FD23F3D7D7344224C66545D969F8302D0FEEF00B6D18AC0BDA78DBC7FA2EFD2F
+ F33FBAADBABED72D29E5BF1F9CFE936F7A1DB33721FBBBFA1F61AFE53C1C68B8
+ 080967CFC30EB4C9A7D5550D3C260C25F5E059740A3ECCAD8047D66E6EC27658
+ 9CBD03BD062DF2BDE59AC7A3BB61D6E8E88D6729E6D4C7D4EE78641E68BC0889
+ 960BB013DBFEDF534D3C16C230F601C8D61DAF858F0A6B608EB98AC7EE94E41C
+ B82722A671A017CEDF3EC171D4CF57CBD72E318C73095953FF05C696FA9B621D
+ 877C8A3DB57B93951D8E6C63693D7823FBDFC87E3FAF0ADECA2987193886692C
+ D3DC39725F2E0C0A5EFDA3D6C3DFED6AF903DD8D43872D5BD140638BFA781BB6
+ 9F6240BFBF3A29C73C14636E6B777BF6149C334723FBC1038570F7BE3CD0EA43
+ 4F6BDD0D8F5E7507E874BF71F60C685E5D5E0F1BB08FA99FC997CFB1CD34D656
+ 59FBDBEBF8298E7967EC7B903D78C741C079AD16AF794DFF9315DB7F74497A3E
+ 8FBF35553297DA1C547A1A9617D781078EB57F15D4C06C7325F7F7F45631B7B1
+ 87ECCD056DD817F81C0D5C76AD63708877E027B3B6265CA4F11562E5FA95D471
+ BC3F3E76123ECCAF8677732B61567639BC9455C2F3E693878AC025A580633E18
+ D99A6F93B1EDC6FAAEDC8B385E9E1DB9EAD3D3FE18675F6CAFF7895A585C7412
+ 1614C8F17E3BA70266E2F3E1797C4E8CC7E7C5E3878EC14864DF85EC417B73C0
+ 69772668978734E0DCFE7A57E681C1FF0CFADD202F63D3C7E6725884EDA57E76
+ CBAFE23653BCA9AF9F395C0C63F019FDE8C16330627F3EDC9984CFE90464C765
+ 832638BA119FE36BBAF35C1AEC13BCEDD9ED7B7F9A87ED7D0FFB99C6D84C7C1E
+ BF9029C79BC6D943D8D7F725E7C3ED8966D0261CC576678166D59A467C9E255E
+ EB98BB6C1EF2F09F78A77FF859E2BE8AB19E86FD3C15DB3C16DBFC9835DED4D7
+ B725E682533CB263D340EB17D680EDDE44F368F71706701D3E978AC6C6A670AC
+ C7E39A6494B5CDC3ADF176B6C5FBF3ED17B5BAC073F82CF5ECEAB3B8E3B9D87F
+ FA10BF30CB286CEF23070BE17E6B9B87629B35C875DAB01B34FA300BB253155F
+ A3DAE643EFA0A4BBD66D3B7F6F323EDFA8CDDB0F8066F5960B5A9FE0068D7750
+ BAC6C3304DC9365FF66C760F1CA2D5194F0F0C59DBA8C5B538B6B50AE7B4E86B
+ 79A6743B06EE8687B41E7EEF6A75FA3BBA7A8DFF03BD4F59DD
}
end
end
diff --git a/applications/lazstats/source/forms/simulations/distribunit.lfm b/applications/lazstats/source/forms/simulations/distribunit.lfm
index 312df149a..c85d086fe 100644
--- a/applications/lazstats/source/forms/simulations/distribunit.lfm
+++ b/applications/lazstats/source/forms/simulations/distribunit.lfm
@@ -1,217 +1,75 @@
object DistribFrm: TDistribFrm
- Left = 420
- Height = 432
+ Left = 338
+ Height = 428
Top = 215
- Width = 701
+ Width = 948
HelpType = htKeyword
HelpKeyword = 'html/DistributionPlotsandCriticalValu.htm'
Caption = 'Distributions'
- ClientHeight = 432
- ClientWidth = 701
+ ClientHeight = 428
+ ClientWidth = 948
OnActivate = FormActivate
+ OnCreate = FormCreate
OnShow = FormShow
Position = poMainFormCenter
+ ShowHint = True
LCLVersion = '2.1.0.0'
- object CloseBtn: TButton
- AnchorSideTop.Control = Bevel1
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = Owner
- AnchorSideRight.Side = asrBottom
+ object ChartPanel: TPanel
+ AnchorSideLeft.Control = ParameterPanel
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Owner
+ AnchorSideRight.Control = ToolBar1
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
- Left = 638
- Height = 25
- Top = 401
- Width = 55
- Anchors = [akRight, akBottom]
- AutoSize = True
- BorderSpacing.Top = 8
- BorderSpacing.Right = 8
- BorderSpacing.Bottom = 6
- Caption = 'Close'
- ModalResult = 11
- TabOrder = 2
- end
- object ComputeBtn: TButton
- AnchorSideTop.Control = CloseBtn
- AnchorSideRight.Control = CloseBtn
- Left = 554
- Height = 25
- Top = 401
- Width = 76
- Anchors = [akTop, akRight]
- AutoSize = True
- BorderSpacing.Left = 8
- BorderSpacing.Right = 8
- Caption = 'Compute'
- OnClick = ComputeBtnClick
- TabOrder = 1
- end
- object ResetBtn: TButton
- AnchorSideTop.Control = CloseBtn
- AnchorSideRight.Control = ComputeBtn
- Left = 492
- Height = 25
- Top = 401
- Width = 54
- Anchors = [akTop, akRight]
- AutoSize = True
- BorderSpacing.Left = 8
- BorderSpacing.Right = 8
- BorderSpacing.Bottom = 8
- Caption = 'Reset'
- OnClick = ResetBtnClick
- TabOrder = 0
- end
- object Bevel1: TBevel
- AnchorSideLeft.Control = Owner
- AnchorSideTop.Side = asrBottom
- AnchorSideRight.Control = Owner
- AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = CloseBtn
- Left = 0
- Height = 8
- Top = 385
- Width = 701
- Anchors = [akLeft, akRight, akBottom]
- Shape = bsBottomLine
- end
- object ChartPanel: TPanel
- AnchorSideLeft.Control = Owner
- AnchorSideTop.Control = Owner
- AnchorSideRight.Control = ParameterPanel
- AnchorSideBottom.Control = Bevel1
- Left = 8
- Height = 377
+ Left = 235
+ Height = 411
Top = 8
- Width = 454
+ Width = 677
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 8
BorderSpacing.Top = 8
- BorderSpacing.Right = 12
+ BorderSpacing.Right = 6
+ BorderSpacing.Bottom = 9
BevelOuter = bvNone
BorderStyle = bsSingle
- ClientHeight = 373
- ClientWidth = 450
Color = clWhite
ParentColor = False
- TabOrder = 3
- object Chart: TChart
- Left = 6
- Height = 361
- Top = 6
- Width = 438
- AxisList = <
- item
- Grid.Color = clSilver
- Grid.Visible = False
- Marks.LabelBrush.Style = bsClear
- Minors = <>
- Title.LabelFont.Orientation = 900
- Title.LabelFont.Style = [fsBold]
- Title.Visible = True
- Title.Caption = 'Probability Density'
- Title.LabelBrush.Style = bsClear
- end
- item
- Grid.Color = clSilver
- Grid.Visible = False
- Alignment = calBottom
- AxisPen.Visible = True
- Marks.LabelBrush.Style = bsClear
- Minors = <>
- Title.LabelFont.Style = [fsBold]
- Title.Visible = True
- Title.Caption = 'Value'
- Title.LabelBrush.Style = bsClear
- Title.TextFormat = tfHTML
- end>
- BackColor = clWhite
- Foot.Brush.Color = clBtnFace
- Foot.Font.Color = clBlue
- Margins.Bottom = 0
- Title.Brush.Color = clBtnFace
- Title.Brush.Style = bsClear
- Title.Font.Color = clBlue
- Title.Text.Strings = (
- 'TAChart'
- )
- Title.TextFormat = tfHTML
- Toolset = ChartToolset
- Align = alClient
- BorderSpacing.Around = 6
- Color = clWhite
- object FuncSeries: TFuncSeries
- ExtentAutoY = True
- end
- object VertLineSeries: TLineSeries
- Active = False
- LinePen.Color = clRed
- LinePen.Style = psDot
- end
- object HorLineSeries: TLineSeries
- LinePen.Color = clRed
- LinePen.Style = psDot
- end
- end
- end
- object SaveBtn: TButton
- AnchorSideLeft.Control = Owner
- AnchorSideTop.Control = CloseBtn
- Left = 8
- Height = 25
- Top = 401
- Width = 50
- AutoSize = True
- BorderSpacing.Left = 8
- Caption = 'Save'
- OnClick = SaveBtnClick
- TabOrder = 4
- end
- object PrintBtn: TButton
- AnchorSideLeft.Control = SaveBtn
- AnchorSideLeft.Side = asrBottom
- AnchorSideTop.Control = CloseBtn
- Left = 66
- Height = 25
- Top = 401
- Width = 51
- AutoSize = True
- BorderSpacing.Left = 8
- Caption = 'Print'
- OnClick = PrintBtnClick
- TabOrder = 5
+ TabOrder = 0
end
object ParameterPanel: TPanel
+ AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
- AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = Bevel1
- Left = 474
- Height = 377
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 0
+ Height = 420
Top = 8
- Width = 219
- Anchors = [akTop, akRight, akBottom]
+ Width = 227
+ Anchors = [akTop, akLeft, akBottom]
AutoSize = True
BorderSpacing.Top = 8
- BorderSpacing.Right = 8
BevelOuter = bvNone
- ClientHeight = 377
- ClientWidth = 219
- TabOrder = 6
+ ClientHeight = 420
+ ClientWidth = 227
+ TabOrder = 1
object GroupBox1: TGroupBox
AnchorSideLeft.Control = ParameterPanel
AnchorSideTop.Control = ParameterPanel
+ AnchorSideRight.Control = ParameterPanel
AnchorSideRight.Side = asrBottom
- Left = 0
+ Left = 8
Height = 175
Top = 0
Width = 219
+ Anchors = [akTop, akLeft, akRight]
AutoSize = True
+ BorderSpacing.Left = 8
Caption = 'Plot Distribution'
ChildSizing.LeftRightSpacing = 16
ChildSizing.TopBottomSpacing = 8
ChildSizing.VerticalSpacing = 8
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 1
@@ -255,6 +113,7 @@ object DistribFrm: TDistribFrm
TabOrder = 1
end
object Bevel2: TBevel
+ AnchorSideRight.Side = asrBottom
Left = 16
Height = 4
Top = 116
@@ -267,8 +126,8 @@ object DistribFrm: TDistribFrm
Height = 19
Top = 128
Width = 183
+ BorderSpacing.Top = 8
Caption = 'Cumulative'
- OnChange = CumulativeChkChange
TabOrder = 4
end
end
@@ -278,7 +137,7 @@ object DistribFrm: TDistribFrm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = GroupBox1
AnchorSideRight.Side = asrBottom
- Left = 0
+ Left = 8
Height = 107
Top = 191
Width = 219
@@ -382,36 +241,109 @@ object DistribFrm: TDistribFrm
AnchorSideLeft.Control = ParameterPanel
AnchorSideTop.Control = GroupBox2
AnchorSideTop.Side = asrBottom
- Left = 0
+ Left = 16
Height = 19
Top = 310
Width = 123
+ BorderSpacing.Left = 16
Caption = 'Show critical values'
Checked = True
+ OnChange = ShowCriticalValuesChkChange
State = cbChecked
TabOrder = 2
end
- end
- object SavePictureDialog: TSavePictureDialog
- Filter = 'Graphic (*.png;*.bmp;*.jpeg;*.jpg;*.jpe;*.jfif;*.svg)|*.png;*.bmp;*.jpeg;*.jpg;*.jpe;*.jfif;*.svg|Portable Network Graphic (*.png)|*.png|Bitmaps (*.bmp)|*.bmp|Joint Picture Expert Group (*.jpeg;*.jpg;*.jpe;*.jfif)|*.jpeg;*.jpg;*.jpe;*.jfif|Scaleable Vector Graphic (*.svg)|*.svg|All Files (*.*)|*.*'
- Left = 160
- Top = 72
- end
- object PrintDialog: TPrintDialog
- Left = 160
- Top = 130
- end
- object ChartToolset: TChartToolset
- Left = 319
- Top = 209
- object ZoomDragTool: TZoomDragTool
- Shift = [ssLeft]
- LimitToExtent = [zdDown]
- Brush.Style = bsClear
+ object CloseBtn: TButton
+ AnchorSideRight.Control = ParameterPanel
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = ParameterPanel
+ AnchorSideBottom.Side = asrBottom
+ Left = 172
+ Height = 25
+ Hint = 'Close the form'
+ Top = 387
+ Width = 55
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Top = 8
+ BorderSpacing.Bottom = 8
+ Caption = 'Close'
+ ModalResult = 11
+ TabOrder = 3
end
- object PanDragTool: TPanDragTool
- Shift = [ssRight]
- LimitToExtent = [pdDown]
+ object ComputeBtn: TButton
+ AnchorSideTop.Control = CloseBtn
+ AnchorSideRight.Control = CloseBtn
+ Left = 88
+ Height = 25
+ Hint = 'Perform the calculation'
+ Top = 387
+ Width = 76
+ Anchors = [akTop, akRight]
+ AutoSize = True
+ BorderSpacing.Left = 8
+ BorderSpacing.Right = 8
+ Caption = 'Compute'
+ OnClick = ComputeBtnClick
+ TabOrder = 4
+ end
+ object ResetBtn: TButton
+ AnchorSideTop.Control = CloseBtn
+ AnchorSideRight.Control = ComputeBtn
+ Left = 26
+ Height = 25
+ Hint = 'Reset all parameters to default'
+ Top = 387
+ Width = 54
+ Anchors = [akTop, akRight]
+ AutoSize = True
+ BorderSpacing.Left = 8
+ BorderSpacing.Right = 8
+ BorderSpacing.Bottom = 8
+ Caption = 'Reset'
+ OnClick = ResetBtnClick
+ TabOrder = 5
+ end
+ end
+ object ToolBar1: TToolBar
+ AnchorSideTop.Control = Owner
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 918
+ Height = 66
+ Top = 8
+ Width = 24
+ Align = alNone
+ Anchors = [akTop, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 8
+ BorderSpacing.Right = 6
+ Caption = 'ToolBar1'
+ EdgeBorders = []
+ Images = MainDataModule.ImageList
+ TabOrder = 2
+ object tbSave: TToolButton
+ Left = 1
+ Hint = 'Save chart to file'
+ Top = 0
+ Caption = 'tbSave'
+ ImageIndex = 4
+ OnClick = tbSaveClick
+ end
+ object tbPrint: TToolButton
+ Left = 1
+ Hint = 'Print chart'
+ Top = 22
+ Caption = 'tbPrint'
+ ImageIndex = 5
+ OnClick = tbPrintClick
+ end
+ object tbErase: TToolButton
+ Left = 1
+ Hint = 'Erase chart'
+ Top = 44
+ Caption = 'tbErase'
+ ImageIndex = 6
+ OnClick = tbEraseClick
end
end
end
diff --git a/applications/lazstats/source/forms/simulations/distribunit.pas b/applications/lazstats/source/forms/simulations/distribunit.pas
index fb9b341ad..e5d6f6bcb 100644
--- a/applications/lazstats/source/forms/simulations/distribunit.pas
+++ b/applications/lazstats/source/forms/simulations/distribunit.pas
@@ -12,9 +12,12 @@ unit DistribUnit;
interface
uses
- Classes, SysUtils, FileUtil, TAGraph, TAFuncSeries, TASeries, TATools,
- PrintersDlgs, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
- Printers, ExtCtrls, ExtDlgs, Math, FunctionsLib, Globals;
+ Classes, SysUtils, FileUtil, TAFuncSeries, //TAGraph, TAFuncSeries, TASeries,
+ //PrintersDlgs, LResources,
+ Forms, Controls, Graphics, Dialogs, StdCtrls,
+ //Printers,
+ ExtCtrls, ExtDlgs, ComCtrls, Math,
+ Globals, FunctionsLib, ChartFrameUnit;
type
@@ -22,23 +25,15 @@ type
TDistribFrm = class(TForm)
AlphaEdit: TEdit;
- Bevel1: TBevel;
Bevel2: TBevel;
ShowCriticalValuesChk: TCheckBox;
- HorLineSeries: TLineSeries;
- ChartToolset: TChartToolset;
CumulativeChk: TCheckBox;
- PanDragTool: TPanDragTool;
tChk: TRadioButton;
- ZoomDragTool: TZoomDragTool;
- PrintDialog: TPrintDialog;
- SavePictureDialog: TSavePictureDialog;
- VertLineSeries: TLineSeries;
- FuncSeries: TFuncSeries;
+ ToolBar1: TToolBar;
+ tbSave: TToolButton;
+ tbPrint: TToolButton;
+ tbErase: TToolButton;
ParameterPanel: TPanel;
- SaveBtn: TButton;
- PrintBtn: TButton;
- Chart: TChart;
ChiChk: TRadioButton;
DF1Edit: TEdit;
DF2Edit: TEdit;
@@ -54,8 +49,8 @@ type
DF2Label: TLabel;
GroupBox1: TGroupBox;
procedure ComputeBtnClick(Sender: TObject);
- procedure CumulativeChkChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure CalcChi2(const AX: Double; out AY: Double);
procedure CalcChi2_Cumulative(const AX: Double; out AY: Double);
@@ -68,11 +63,18 @@ type
procedure DistributionClick(Sender: TObject);
procedure PrintBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
- procedure SaveBtnClick(Sender: TObject);
+ procedure ShowCriticalValuesChkChange(Sender: TObject);
+ procedure tbEraseClick(Sender: TObject);
+ procedure tbPrintClick(Sender: TObject);
+ procedure tbSaveClick(Sender: TObject);
private
{ private declarations }
+ ChartFrame: TChartFrame;
+ Alpha: Double;
DF1: Integer;
DF2: Integer;
+ procedure AddSeries(ATitle: string; XMin, XMax: Double;
+ xCrit, yCrit: Double; Cumulative: Boolean; ACalcFunc: TFuncCalculateEvent);
procedure NormalDistPlot;
procedure Chi2Plot;
procedure FPlot;
@@ -88,13 +90,97 @@ var
implementation
+{$R *.lfm}
+
uses
- TAChartUtils, TADrawerSVG, TAPrint,
+ TAChartUtils, TALegend, TASeries,
MathUnit;
+const
+ P_LIMIT = 0.9999;
{ TDistribFrm }
+procedure TDistribFrm.AddSeries(ATitle: string; XMin, XMax: Double;
+ xCrit, yCrit: Double; Cumulative: Boolean; ACalcFunc: TFuncCalculateEvent);
+var
+ funcSer: TFuncSeries;
+ vertSer, horSer: TLineSeries;
+ i: Integer;
+ ext: TDoubleRect;
+ allCumulative: Boolean;
+ allDensity: Boolean;
+begin
+ funcSer := TFuncSeries.Create(ChartFrame);
+ funcSer.OnCalculate := ACalcFunc;
+ funcSer.ExtentAutoY := true;
+ funcSer.Extent.XMin := XMin;
+ funcSer.Extent.XMax := XMax;
+ funcSer.Extent.UseXMin := true;
+ funcSer.Extent.UseXMax := true;
+ funcSer.Pen.Color := DATA_COLORS[(ChartFrame.Chart.SeriesCount div 3) mod Length(DATA_COLORS)];
+ funcSer.Title := ATitle;
+ if Cumulative then funcSer.Tag := 1;
+ if XMin = 0 then
+ funcSer.DomainExclusions.AddRange(-Infinity, 0, [ioOpenEnd]);
+ ChartFrame.Chart.AddSeries(funcSer);
+
+ if Cumulative then
+ yCrit := 1.0 - Alpha;
+
+ // vertical indicator
+ vertSer := TLineSeries.Create(ChartFrame);
+ vertSer.LinePen.Color := funcSer.Pen.Color;
+ vertSer.LinePen.Style := psDot;
+ vertser.Legend.Visible := false;
+ vertSer.AddXY(xCrit, yCrit);
+ vertSer.AddXY(xCrit, 0);
+ if Cumulative then vertSer.Tag := 1;
+ vertSer.Active := ShowCriticalValuesChk.Checked;
+ ChartFrame.Chart.AddSeries(vertSer);
+
+ // horizontal indicator
+ horSer := TLineSeries.Create(ChartFrame);
+ horSer.LinePen.Color := funcSer.Pen.Color;
+ horSer.LinePen.Style := psDot;
+ horSer.Legend.Visible := false;
+ horSer.AddXY(0, yCrit);
+ horSer.AddXY(xCrit, yCrit);
+ if Cumulative then horSer.Tag := 1;
+ horSer.Active := ShowCriticalValuesChk.Checked and Cumulative;
+ ChartFrame.Chart.AddSeries(horSer);
+
+ ext := ChartFrame.Chart.GetFullExtent();
+ i := 2;
+ while i < ChartFrame.Chart.SeriesCount do
+ begin
+ (ChartFrame.Chart.Series[i] as TLineSeries).XValue[0] := ext.a.x;
+ inc(i, 3);
+ end;
+
+ allCumulative := true;
+ allDensity := true;
+ i := 0;
+ while i < ChartFrame.Chart.SeriesCount-1 do
+ begin
+ case ChartFrame.Chart.Series[i].Tag of
+ 0: allCumulative := false;
+ 1: allDensity := false;
+ end;
+ inc(i);
+ end;
+ if allCumulative then
+ ChartFrame.SetYTitle('Cumulative Probability')
+ else
+ if allDensity then
+ ChartFrame.SetYTitle('Probability Density')
+ else
+ ChartFrame.SetYTitle('Probability Density, Cumulative Probability');
+ ChartFrame.SetXTitle('x Value');
+ ChartFrame.Chart.Legend.Visible := true;
+end;
+
+
procedure TDistribFrm.ResetBtnClick(Sender: TObject);
begin
NDChk.Checked := false;
@@ -105,26 +191,20 @@ begin
DF1Edit.Text := '';
DF2Edit.Text := '';
GroupBox2.Enabled := false;
- FuncSeries.OnCalculate := nil;
- VertLineSeries.Active := false;
- Chart.Title.Visible := false;
- Chart.BottomAxis.Title.Caption := 'Scale';
+ ChartFrame.Clear;
end;
-procedure TDistribFrm.SaveBtnClick(Sender: TObject);
+procedure TDistribFrm.ShowCriticalValuesChkChange(Sender: TObject);
var
- ext: String;
+ i: Integer;
begin
- if SavePictureDialog.Execute then
+ i := 1;
+ while i < ChartFrame.Chart.SeriesCount do
begin
- ext := Lowercase(ExtractFileExt(SavePictureDialog.FileName));
- case ext of
- '.bmp': Chart.SaveToFile(TBitmap, SavePictureDialog.Filename);
- '.png': Chart.SaveToFile(TPortableNetworkGraphic, SavePictureDialog.FileName);
- '.jpg', '.jpeg', '.jpe', '.jfif': Chart.SaveToFile(TJpegImage, SavePictureDialog.FileName);
- '.svg': Chart.SaveToSVGFile(SavePictureDialog.FileName);
- end;
+ ChartFrame.Chart.Series[i].Active := ShowCriticalValuesChk.Checked;
+ ChartFrame.Chart.Series[i+1].Active := ShowCriticalValuesChk.Checked;
+ inc(i, 3);
end;
end;
@@ -209,31 +289,8 @@ end;
procedure TDistribFrm.PrintBtnClick(Sender: TObject);
-const
- MARGIN = 10;
-var
- R: TRect;
- d: Integer;
begin
- if not PrintDialog.Execute then
- exit;
-
- Printer.BeginDoc;
- try
- R := Rect(0, 0, Printer.PageWidth, Printer.PageHeight div 2);
-
- d := R.Right - R.Left;
- R.Left += d div MARGIN;
- R.Right -= d div MARGIN;
-
- d := R.Bottom - R.Top;
- R.Top += d div MARGIN;
- R.Bottom -= d div MARGIN;
-
- Chart.Draw(TPrinterDrawer.Create(Printer, true), R);
- finally
- Printer.EndDoc;
- end;
+ ChartFrame.Print;
end;
@@ -279,193 +336,82 @@ begin
MessageDlg('Please select a distribution.', mtError, [mbOK], 0);
end;
-procedure TDistribFrm.CumulativeChkChange(Sender: TObject);
-begin
- if CumulativeChk.Checked then
- Chart.LeftAxis.Title.Caption := 'Cumulative probability'
- else
- Chart.LeftAxis.Title.Caption := 'Probability density';
-end;
-
procedure TDistribFrm.NormalDistPlot;
var
- alpha: Double;
zMax, zMin, zCrit, pCrit: Double;
+ title: String;
+ func: TFuncCalculateEvent;
begin
- alpha := StrToFloat(AlphaEdit.Text);
- zMax := InverseZ(0.9999);
+ zMax := inverseZ(P_LIMIT);
zMin := -zMax;
- zCrit := inversez(1.0 - alpha);
+ zCrit := inversez(1.0 - Alpha);
CalcND(zCrit, pCrit);
- Chart.Title.Text.Clear;
- Chart.Title.Text.Add('Normal Distribution');
- Chart.Title.Text.Add(Format('α = %.3g', [alpha]));
- Chart.Title.Text.Add(Format('Critical value = %.3f', [zCrit]));
- Chart.Title.Visible := true;
- Chart.BottomAxis.Title.Caption := 'z';
- FuncSeries.Extent.XMin := zMin;
- FuncSeries.Extent.XMax := zMax;
- FuncSeries.Extent.UseXMin := true;
- FuncSeries.Extent.UseXMax := true;
+ title := Format('Normal (α=%s, xcrit=%.3f)', [AlphaEdit.Text, zCrit]);
if CumulativeChk.Checked then
- FuncSeries.OnCalculate := @CalcND_Cumulative
+ func := @CalcND_Cumulative
else
- FuncSeries.OnCalculate := @CalcND;
- FuncSeries.DomainExclusions.Clear;
-
- VertlineSeries.Clear;
- if CumulativeChk.Checked then
- begin
- HorLineSeries.Clear;
- HorLineSeries.AddXY(zMin, 1.0 - alpha);
- HorLineSeries.AddXY(zCrit, 1.0 - alpha);
- VertlineSeries.AddXY(zCrit, 1.0 - alpha);
- VertLineSeries.AddXY(zCrit, 0);
- end else
- begin
- VertLineSeries.AddXY(zCrit, 0);
- VertLineSeries.AddXY(zCrit, pCrit);
- end;
- HorLineSeries.Active := ShowCriticalValuesChk.Checked and CumulativeChk.Checked;
- VertLineSeries.Active := ShowCriticalValuesChk.Checked;
+ func := @CalcND;
+ AddSeries(title, zMin, zMax, zCrit, pCrit, CumulativeChk.Checked, func);
end;
procedure TDistribFrm.Chi2Plot;
var
- alpha: Double;
chi2Max, chi2Crit, pCrit: Double;
+ title: String;
+ func: TFuncCalculateEvent;
begin
- alpha := StrToFloat(AlphaEdit.Text);
- DF1 := StrToInt(DF1Edit.Text);
- chi2Max := InverseChi(0.9999, DF1);
- chi2Crit := InverseChi(1.0 - alpha, DF1);
+ chi2Max := InverseChi(P_LIMIT, DF1);
+ chi2Crit := InverseChi(1.0 - Alpha, DF1);
CalcChi2(chi2Crit, pCrit);
- Chart.Title.Text.Clear;
- Chart.Title.Text.Add('Chi-Squared Distribution');
- Chart.Title.Text.Add(Format('α = %.3g / Degrees of freedom = %d', [alpha, DF1]));
- Chart.Title.Text.Add(Format('Critical value = %.3f', [Chi2Crit]));
- Chart.Title.Visible := true;
- Chart.BottomAxis.Title.Caption := 'χ2';
- FuncSeries.Extent.XMin := 0;
- FuncSeries.Extent.XMax := chi2Max;
- FuncSeries.Extent.UseXMin := true;
- FuncSeries.Extent.UseXMax := true;
+ title := Format('Chi-sq (&alpha=%s; DF=%d; xcrit=%.3f)', [AlphaEdit.Text, DF1, Chi2Crit]);
if CumulativeChk.Checked then
- FuncSeries.OnCalculate := @CalcChi2_Cumulative
+ func := @CalcChi2_Cumulative
else
- FuncSeries.OnCalculate := @CalcChi2;
- FuncSeries.DomainExclusions.AddRange(-Infinity, 0, [ioOpenEnd]);
-
- VertLineSeries.Clear;
- if CumulativeChk.Checked then begin
- HorLineSeries.Clear;
- HorLineSeries.AddXY(0, 1.0 - alpha);
- HorLineSeries.AddXY(chi2Crit, 1.0 - alpha);
- VertlineSeries.AddXY(chi2Crit, 1.0 - alpha);
- VertLineSeries.AddXY(chi2Crit, 0);
- end else
- begin
- VertLineSeries.AddXY(chi2Crit, 0);
- VertLineSeries.AddXY(chi2Crit, pCrit);
- end;
- HorLineSeries.Active := ShowCriticalValuesChk.Checked and CumulativeChk.Checked;
- VertLineSeries.Active := ShowCriticalValuesChk.Checked;
+ func := @CalcChi2;
+ AddSeries(title, 0.0, chi2Max, chi2Crit, pCrit, CumulativeChk.Checked, func);
end;
procedure TDistribFrm.FPlot;
var
- alpha: Double;
FMax, FCrit, pCrit: Double;
+ title: String;
+ func: TFuncCalculateEvent;
begin
- alpha := StrToFloat(AlphaEdit.Text);
- DF1 := StrToInt(DF1Edit.Text);
- DF2 := StrToInt(DF2Edit.Text);
- FMax := FPercentPoint(0.999, DF1, DF2);
- FCrit := FPercentPoint(1.0 - alpha, DF1, DF2);
+ FMax := FPercentPoint(P_LIMIT, DF1, DF2);
+ FCrit := FPercentPoint(1.0 - Alpha, DF1, DF2);
CalcF(FCrit, pCrit);
- Chart.Title.Text.Clear;
- Chart.Title.Text.Add('F Distribution');
- Chart.Title.Text.Add(Format('α = %.3g / DF1 = %d, DF2 = %d', [alpha, DF1, DF2]));
- Chart.Title.Text.Add(Format('Critical value = %.3f', [FCrit]));
- Chart.Title.Visible := true;
- Chart.BottomAxis.Title.Caption := 'F';
- FuncSeries.Extent.XMin := 0;
- FuncSeries.Extent.XMax := FMax;
- FuncSeries.Extent.UseXMin := true;
- FuncSeries.Extent.UseXMax := true;
+ title := Format('F (α=%s; DF1=%d, DF2=%d, xcrit=%.3f)', [AlphaEdit.Text, DF1, DF2, FCrit]);
if CumulativeChk.Checked then
- FuncSeries.OnCalculate := @CalcF_Cumulative
+ func := @CalcF_Cumulative
else
- FuncSeries.OnCalculate := @CalcF;
- FuncSeries.DomainExclusions.AddRange(-Infinity, 0, [ioOpenEnd]);
-
- VertLineSeries.Clear;
- if CumulativeChk.Checked then
- begin
- HorLineSeries.Clear;
- HorLineSeries.AddXY(0, 1.0 - alpha);
- HorLineSeries.AddXY(FCrit, 1.0 - alpha);
- VertLineSeries.AddXY(FCrit, 1.0 - alpha);
- VertLineSeries.AddXY(FCrit, 0);
- end else
- begin
- VertLineSeries.AddXY(FCrit, 0);
- VertLineSeries.AddXY(FCrit, pCrit);
- end;
- HorLineSeries.Active := ShowCriticalValuesChk.Checked and CumulativeChk.Checked;
- VertLineSeries.Active := ShowCriticalValuesChk.Checked;
+ func := @CalcF;
+ AddSeries(title, 0.0, FMax, FCrit, pCrit, CumulativeChk.Checked, func);
end;
procedure TDistribFrm.tPlot;
var
- alpha: Double;
tMin, tMax, tCrit, pCrit: Double;
+ title: String;
+ func: TFuncCalculateEvent;
begin
- alpha := StrToFloat(AlphaEdit.Text);
- DF1 := StrToInt(DF1Edit.Text);
- tMax := Inverset(0.9999, DF1);
+ tMax := Inverset(P_LIMIT, DF1);
tMin := -tMax;
- tCrit := Inverset(1.0 - alpha, DF1);
+ tCrit := Inverset(1.0 - Alpha, DF1);
Calct(tCrit, pCrit);
- Chart.Title.Text.Clear;
- Chart.Title.Text.Add('Student t Distribution');
- Chart.Title.Text.Add(Format('α = %.3g / Degrees of freedom = %d', [alpha, DF1]));
- Chart.Title.Text.Add(Format('Critical value = %.3f', [tCrit]));
- Chart.Title.Visible := true;
- Chart.BottomAxis.Title.Caption := 't';
- FuncSeries.Extent.XMin := tMin;
- FuncSeries.Extent.XMax := tMax;
- FuncSeries.Extent.UseXMin := true;
- FuncSeries.Extent.UseXMax := true;
+ title := Format('t (α=%s; DF=%d; xcrit=%.3f)', [AlphaEdit.Text, DF1, tCrit]);
if CumulativeChk.Checked then
- FuncSeries.OnCalculate := @CalcT_Cumulative
+ func := @CalcT_Cumulative
else
- FuncSeries.OnCalculate := @CalcT;
- FuncSeries.DomainExclusions.Clear;
-
- VertLineSeries.Clear;
- if CumulativeChk.Checked then
- begin
- HorLineSeries.Clear;
- HorLineSeries.AddXY(tMin, 1.0 - alpha);
- HorLineSeries.AddXY(tCrit, 1.0 - alpha);
- VertLineSeries.AddXY(tCrit, 1.0 - alpha);
- VertLineSeries.AddXY(tCrit, 0);
- end else
- begin
- VertLineSeries.AddXY(tCrit, 0);
- VertLineSeries.AddXY(tCrit, pCrit);
- end;
- HorLineSeries.Active := ShowCriticalValuesChk.Checked and CumulativeChk.Checked;
- VertLineSeries.Active := ShowCriticalValuesChk.Checked;
+ func := @CalcT;
+ AddSeries(title, tMin, tMax, tCrit, pCrit, CumulativeChk.Checked, func);
end;
@@ -473,46 +419,80 @@ procedure TDistribFrm.FormActivate(Sender: TObject);
var
w: Integer;
begin
- w := MaxValue([SaveBtn.Width, PrintBtn.Width, ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]);
- SaveBtn.Constraints.MinWidth := w;
- PrintBtn.Constraints.MinWidth := w;
+ w := MaxValue([ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]);
ResetBtn.Constraints.MinWidth := w;
ComputeBtn.Constraints.MinWidth := w;
CloseBtn.Constraints.MinWidth := w;
+
+ Constraints.MinHeight :=
+ ShowCriticalValuesChk.Top + ShowCriticalValuesChk.Height + 16 +
+ CloseBtn.Height + CloseBtn.BorderSpacing.Bottom;
+ Constraints.MinWidth := ParameterPanel.Width * 2;
+end;
+
+procedure TDistribFrm.FormCreate(Sender: TObject);
+begin
+ ChartFrame := TChartFrame.Create(self);
+ ChartFrame.Parent := ChartPanel;
+ ChartFrame.Align := alClient;
+ ChartFrame.Chart.Legend.Alignment := laBottomCenter;
+ ChartFrame.Chart.Legend.ColumnCount := 3;
+ ChartFrame.Chart.Legend.TextFormat := tfHTML;
+ ChartFrame.Chart.BottomAxis.Intervals.MaxLength := 80;
+ ChartFrame.Chart.BottomAxis.Intervals.MinLength := 30;
+end;
+
+
+procedure TDistribFrm.tbEraseClick(Sender: TObject);
+begin
+ ChartFrame.Clear;
+end;
+
+
+procedure TDistribFrm.tbPrintClick(Sender: TObject);
+begin
+ ChartFrame.Print;
+end;
+
+
+procedure TDistribFrm.tbSaveClick(Sender: TObject);
+begin
+ ChartFrame.Save;
end;
function TDistribFrm.Validate(out AMsg: String; out AControl: TWinControl): boolean;
-var
- x: Double;
- n: Integer;
begin
Result := false;
if AlphaEdit.Text = '' then
begin
AMsg := 'Input required.';
AControl := AlphaEdit;
+ Alpha := NaN;
exit;
end;
- if not TryStrToFloat(AlphaEdit.Text, x) or (x <= 0) or (x >= 1.0) then
+ if not TryStrToFloat(AlphaEdit.Text, Alpha) or (Alpha <= 0) or (Alpha >= 1.0) then
begin
AMsg := 'Numerical value between 0 and 1 required.';
AControl := AlphaEdit;
+ Alpha := NaN;
exit;
end;
- if ChiChk.Checked or FChk.Checked then
+ if tChk.Checked or ChiChk.Checked or FChk.Checked then
begin
if DF1Edit.Text = '' then
begin
AMsg := 'Input required.';
AControl := DF1Edit;
+ DF1 := -1;
exit;
end;
- if not TryStrToInt(DF1Edit.Text, n) or (n <= 0) then
+ if not TryStrToInt(DF1Edit.Text, DF1) or (DF1 <= 0) then
begin
AMsg := 'Positive numerical value required.';
AControl := DF1Edit;
+ DF1 := -1;
exit;
end;
end;
@@ -523,36 +503,23 @@ begin
begin
AMsg := 'Input required.';
AControl := DF2Edit;
+ DF2 := -1;
exit;
end;
- if not TryStrToInt(DF2Edit.Text, n) or (n <= 0) then
+ if not TryStrToInt(DF2Edit.Text, DF2) or (DF2 <= 0) then
begin
AMsg := 'Positive numerical value required.';
AControl := DF2Edit;
+ DF2 := -1;
exit;
end;
end;
- (*
- if MeanEdit.Text = '' then
- begin
- AMsg := 'Input required.';
- AControl := MeanEdit;
- exit;
- end;
- if not TryStrToFloat(MeanEdit.Text, x) then
- begin
- AMsg := 'Numerical value required.';
- AControl := MeanEdit;
- exit;
- end;
- *)
-
Result := true;
end;
-initialization
- {$I distribunit.lrs}
+//initialization
+// {$I distribunit.lrs}
end.
diff --git a/applications/lazstats/source/frames/chartframeunit.lfm b/applications/lazstats/source/frames/chartframeunit.lfm
index a8187a005..546a629ec 100644
--- a/applications/lazstats/source/frames/chartframeunit.lfm
+++ b/applications/lazstats/source/frames/chartframeunit.lfm
@@ -41,6 +41,7 @@ object ChartFrame: TChartFrame
Title.Text.Strings = (
'TAChart'
)
+ Toolset = ChartToolset
Align = alClient
Color = clWhite
end
@@ -53,4 +54,17 @@ object ChartFrame: TChartFrame
Left = 279
Top = 184
end
+ object ChartToolset: TChartToolset
+ Left = 279
+ Top = 272
+ object ZoomDragTool: TZoomDragTool
+ Shift = [ssLeft]
+ LimitToExtent = [zdDown]
+ Brush.Style = bsClear
+ end
+ object PanDragTool: TPanDragTool
+ Shift = [ssRight]
+ LimitToExtent = [pdDown]
+ end
+ end
end
diff --git a/applications/lazstats/source/frames/chartframeunit.pas b/applications/lazstats/source/frames/chartframeunit.pas
index 9d0b542ed..ce0f1357c 100644
--- a/applications/lazstats/source/frames/chartframeunit.pas
+++ b/applications/lazstats/source/frames/chartframeunit.pas
@@ -6,7 +6,7 @@ interface
uses
Classes, SysUtils, Forms, Controls, Graphics, ExtDlgs, PrintersDlgs,
- TAGraph, TATypes, TACustomSeries, TASeries,
+ TAGraph, TATypes, TACustomSeries, TASeries, TATools,
Globals;
type
@@ -17,8 +17,11 @@ type
TChartFrame = class(TFrame)
Chart: TChart;
+ ChartToolset: TChartToolset;
+ PanDragTool: TPanDragTool;
PrintDialog: TPrintDialog;
SavePictureDialog: TSavePictureDialog;
+ ZoomDragTool: TZoomDragTool;
protected
procedure Constline(xy: Double; ADirection: TLineStyle; AColor: TColor;
@@ -57,6 +60,7 @@ begin
Chart.Foot.Text.Clear;
Chart.BottomAxis.Title.Caption := '';
Chart.LeftAxis.Title.Caption := '';
+ Chart.Legend.Visible := false;
end;