LazStats: Use new ChartFrame in DistribUnit.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7647 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-09-06 16:03:58 +00:00
parent 51bbe3ba02
commit 8c869228e7
5 changed files with 620 additions and 562 deletions

View File

@ -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

View File

@ -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
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 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
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 PrintDialog: TPrintDialog
Left = 160
Top = 130
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
object ChartToolset: TChartToolset
Left = 319
Top = 209
object ZoomDragTool: TZoomDragTool
Shift = [ssLeft]
LimitToExtent = [zdDown]
Brush.Style = bsClear
end
object PanDragTool: TPanDragTool
Shift = [ssRight]
LimitToExtent = [pdDown]
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

View File

@ -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('<b>Normal Distribution</b>');
Chart.Title.Text.Add(Format('&alpha; = %.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 (&alpha;=%s, x<sub>crit</sub>=%.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('<b>Chi-Squared Distribution</b>');
Chart.Title.Text.Add(Format('&alpha; = %.3g / Degrees of freedom = %d', [alpha, DF1]));
Chart.Title.Text.Add(Format('Critical value = %.3f', [Chi2Crit]));
Chart.Title.Visible := true;
Chart.BottomAxis.Title.Caption := '&chi;<sup>2</sup>';
FuncSeries.Extent.XMin := 0;
FuncSeries.Extent.XMax := chi2Max;
FuncSeries.Extent.UseXMin := true;
FuncSeries.Extent.UseXMax := true;
title := Format('Chi-sq (&alpha=%s; DF=%d; x<sub>crit</sub>=%.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('<b>F Distribution</b>');
Chart.Title.Text.Add(Format('&alpha; = %.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 (&alpha;=%s; DF1=%d, DF2=%d, x<sub>crit</sub>=%.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('<b>Student t Distribution</b>');
Chart.Title.Text.Add(Format('&alpha; = %.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 (&alpha;=%s; DF=%d; x<sub>crit</sub>=%.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.

View File

@ -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

View File

@ -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;