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;