From 977021871df3c747dd1ec1482a250727c1ef4462 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Mon, 27 Apr 2020 20:51:12 +0000 Subject: [PATCH] LazStats: Improved layout of LogLinScreenUnit. Pdf to Chm (partially because calculation crashes). git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7412 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../lazstats/docs/HelpNDoc/LazStats.hnd | Bin 9080832 -> 9109504 bytes .../cross-classification/loglinscreenunit.lfm | 370 ++++++---------- .../cross-classification/loglinscreenunit.pas | 410 ++++++++---------- 3 files changed, 319 insertions(+), 461 deletions(-) diff --git a/applications/lazstats/docs/HelpNDoc/LazStats.hnd b/applications/lazstats/docs/HelpNDoc/LazStats.hnd index 0bca474f6ee684b5afd8ff20adae21397f083acd..2e9e588fdf5e43b274026b19ab805eafd23c086e 100644 GIT binary patch delta 16205 zcmc(mbzGF)_UMO>AtXmZ1O%kJI~8eZq`N~vIvzwR=^Sa4?sj0LL{U=EAp{BO5)c@= z?!)_@bARXj?z!jv-Ov5weE58sJ^P8h_I~zWdp&Ed2`i|;4hyToPNKyjfk5!Yj~-UClm#z0^RVC_J!Pb>}RMI1|GabMvAWOa@dh_IFWL=k#cyEa`>-Z=s@m(&?63x7|6f6c-Z`QWQ|QuOz@PFC=hZKwdyZT;aa30Kd4%eE|_+xV9@M zBYgPyHXa;<8=E1@xcD9jD+n71I|v5|CkPh^HwX_1F9;t9KZpQ`Aczo%Fo+0a7nqO>TsTwbiw{PzWf1w;iz#RWz9@57TPl{Ih#`NS|(5s^0}EeWE`Xe2?T5N0&er9BwhaGamg zCYVqixaCjjhlq-w(y#C^DB$wsDhvplHR&BpHWn-m%)e+v2t$W;;QyN4D zL>5F2L>@!|L=i*@Oy0~WsVh&;fVhLgeVhv&gVhdsiVh`c~;t1jd;*7Ys=Yn?&lL8lx+jWZ# zt__obAzZ5&g)tGJ3c$tY4hdIavA$Z>rcaox7@VEeQC^7Is zxrqN#F)IEc6#2DK|13i4`yoc0q-O+B4TR@B(FG>raduSciyOpXuQ4#KAedJ8Rp3gi zLXi2s)W+oaK^o4Fr}3=$_Fs+yVz*EPN`#PO$F;|}*8G)`e9@77F#uSsMSfH#F{0{r z{MouMh?7g*cJA26zR5``h+`2LJcefQR3JqMD_<0vv$JR>@s1?-A0M0619#XJO(9cy z?Xi8+Q7jjyq4#{+(?9DMDz62>nAu*5F|c<{?8^B`Mub<^J`zhPyi$Gi1X}Y2%EA3& zh|EaHM{KRpB8-&>fNUi_4+|7};p^zn6FB!4Iom&R@2gslLhDcXpl~E}!V+E|J_k1& zhi($J1Zz|bU2D|o))P6fWqwgfNhvAHr~7NpXsOaiPgDb_Zr)ZlbHmS~VOH>$S9|^i zDqzZjy?!Vi5)ot$?`!z-%p<#CO)P&-6 zH>VqrcJgy0d>gHTcHU+R&FrsU6zqp^q?I9*HGIkel>(nlLcQd@>H{vE*gZO>d+RxMNbk_W4_0UX# z)56*}9y}^H09cssdf~HB1tl-*S2Mbqbd@f#dZo0DJp}<)ZQUQLF>FaZF^tmY`=VaD zN%tFTrYlGRgmU9IU`Z+#SEmy@?MLRQ#vG0@PJ#;J*MSo@x$|2#ADVY5FZ^9<Nx=`nI(XDJn>ML2{nQ;%2%|NLtH8Va6C$CJ-lIB_b3tZC4y!87e0e` zG_>~>1EHnN;d`m-NxJjX6qV*M)GbRL@W{-2FowRr^IuEE%N1 z{^xlvDs)!>Ww^7=3-{m-{(^?kwG=*`&=6hG(2~px+$dk$5mm!KZl61AFH}xc%{_ZY z8q6RD7>a(lTl8cG>2ow2w8JWUqN1BNz|F;F8ob+6Qc4$mV+5)rqZD)`U4LC(LlL&vy>tF$r|ow)lvOLww6OSN#QM6^ z0_JI?Fwd(z*OaP8mkAzJs{Gl}4t!%AZTqMWIA8aC7E9KflAN4;w$phv?LBPP8G50{ z+m7yKN|ZWXD@^Qp_}VtY&?024jmU^j(>CKV2AU5X)}=SGJV^96HTvM+@-a{?*$edA z+8PVobni7YIaf{RW#GO5M9u*m%bO}h&MW%fJlO_w5S%w@I zCPJ(wBV;gHZ#UrYF4~EBai{oAcbNsiM_Q1>yDBwI)Q5S|a-_;rNnblz-paop>#8_( z$1h+0BTj+ahtyQX#?}R9D~$F&-eon-fR0~TmpQs@dhZ0~u5g`wKeXIt7;GRVKGNQ2 z^2Bg7u?vRkBl2WaH3TR;tOxa;& z#?Zg{R-$ZxB8KTT=jawp_d`^cRFg<*G<3}eYG!?JBD4QEV`_qNluA_`VBjnGELOAW zpNT}&4?i^co*Yzm7&dh&XDSD1y=$o)RFW*nQ=@Ces(cMwBd%EQ8c^QW{H?~aZeYmP zee<)n@c>49%wCPq9>~yUZ z77d=4nA08CQLdfI{z{VGC1UJuE?0_soT-z|yT(c1(oS4slqj4z8Vc&)uJ9I6xpRTn zK)S5|?J^qF)snVD8ff+(-8*I|fE5KtA8rR(pB>PrCQz_yVzXp=4{#%XO*IdoZAUII z&JgZ1&Vd4KMwfqIC-<+{i7{-1LZphV@dhO9o}(Gi@kED-7}Di+mxn(W_-Gh+`4W9!2{ zF`bn1|F-L6&NoWI9<+aws*OZeFEt#Csk*s43i#i&^K@?mK-(1~a~E9GeVs7JF>^?K z@SI=H21O;*eI%Xnlx!q381VP8bmcNSoPW)Dfsh5&>aEY9WSk4V$xPSnO!!>r$eg4o z`s*ub8{T_k$hCm8_OMuoAXSl`fro+CJYYFpbk=_{*KamJDK(*h?2Y&^FRK755 zPbrwXQQ;>&?rAzv9$#9vyP;Mmmacm2hQCg8XB+;5?s|1tn0^*Ta3y5qc%|-WNJL~d zP|Qx1@fx)VI45M&Ns0=I7H^y0SZtk%x)-J4IZg%xAO*u8YuU@P>3v+we6eRDZ>i1w zwyZkuiLRfy)vi4<-CBVDnw#(u2LiDK?F|To`j4W#shpOPk+wY}1foHd)9F3MYi@tK zF>|rJR~<2&d8Yu&FKrvS{;6%fk46T64TqinP5W8i_t1;aMT;L}DCAXEro9HZ-}!C{ z0MfUbfUC=D6GT=X5n%=}EZPw;_I5x+Te{Rg>~9m_HXcerK~W-`?fdJy6|#;TR51jg z0#mGR;<1I>(iy`H9&uJfr{6&!Aqz_OnN)J5On+Mq|FAIrEXo19d$h_fq;G0=1`_&@ zySf1XW9GFgZD_4)W|lC^q_Qa_>~bMvK(m}uDr|~3{aiu(;z zA#v4r6HkYP$`7q!2`)RiPEROKI)#^bt)3U*Ehuz_U?el-aQ|1HYK>SqJk+(}Rpqbs z)HZMhhjlDc_SeAa>4sMO?IzMNa>1(sIeMLV!qA#W3|w4@`PZ)}7t%U5t$np3f?yDc z^x(j%ca3hp!!FO~INBc}Wn!f}KGXb?Lav03iJ;O7QSJ`6U`vBWnEDShWh8f;DBPwQ z7$P}Pv%Z!qzdV$#I~lkL&g-fZ;8w3XuhDd9NsqDj1MY40F^5I&t`;%y85e2*Qt7&sP%3@^*hpMGtVPe7ONrRhEwfa$(Uj7 z2@f;2Vq#K@lX+kY36xie-vp2~I}5ZsFl#S@rry+?mXb*ChC-Hj!C zDjCte$J@oR4BulZm9nUDek~Eh*LA|kXarhD>@JQ811!!uY^PF)u$44o+ zN^Au4=aZU0mh_8@FNxS!7keMalK}b$iZ)^juYQXHm!Cz?fA-j{2LGHp_n*1-*&^WN zfVhOFT(HHe_o=Yackf3N@10-Nx&1tzFMm!OX)Ev3-jJ+nE~a zq%^)3`F>u${V}-#UohS#7iDpSq4)#V$d7LNN8=O2Y@Xw8ZuF2!ttSfKe#r`c+t6*t z)o$mo!sRkBHubl;c$Xh?m>(KEwN8IIxHU23J7<^Qdf{;-gFXbZWeFlXLKl?J=-W2m zX-U`D9X73Y9%V5e7EZVgVX=~cS02G(*xs4;Z27$Q%s1X7CJOyEriJa_nV@g z2wj(PnX_N@tN8%nIUgqo9Hvx;o;L1;hHmc+^7)io&zzV%7^b-#nco@g*!$#C>V;)5 zH>9vTzi9J5#@_OGx3ywORSnaN^oySnsZ7o9ZrIa@1`m9IDy~pA){AzFz&E)4H*7`O zbd2*trE@jAeZ8vt(6qu9D3QMn?xuowdtQ&V0iPF;Ywc?L;n!}&3pXmNeC;-D$Vka? zd%T$nk&~zV`OgseP{=^gK|I3TqVw{gariQQOSElu?(*IHftr(Mt+_)Ji<8ZPoy&0- zkNn+>i#ZvQW3v5lTs%@-4OB(I<7U29YoDdv-3|N=WV1UTerE@;hQt|5n;D^n%fO#U zm3jfEr#-~9gA=!>azk??7ToYwYjh3QmSxkm7f^;1&^DyceGkg@9u7p zo@GjRl<>FeF}Sw#w8kVATjynnsC zaKPn-%eL%=I~w3)$H?PmULH;Y*r!$bZBl^$ubts``(HVnGE#hXpM>t_^yda{R?|!G z^>$u%DqFPt{6?R@yN{&gbolL-8I{}#nfI7I7?<3fJsa3T z{=_Ps4cuoPmfasG%?k>;$oxDTvM%YODY$4=Tpla%JPI-G>pxBjfsB+JEGk%T^@#!# zox+`$&5NzmU7HT=XU!;JdrR2im6ego#@Wl%l4Y4=8deCz3}t?8`&K4hkm-V-e=~vq z!5aQ=#SK5$`GQ>uDFjk*tq?c=?}iib_ZPQ+wx|B6jm=mHhtIX}?_}mtpA>%uHJt@= zX-r<(bfF+^H~tfUk!;AWGn4|+YuB}LH|WJzS3{FGA(3We)gzLQu5)_I9hO%rlDH3g zZAX<{bzR_jvkkv`%`Vy=d5*d;@*EeZ>>xKR0NoMtQa(Xh-6!f6eyt5+p>9rpDnmzh z8198u0?mnOfO)p(`KaSmmW*tbC5xEmqV`nf0pclI81Tap=P{0`S;RFu>H!BJANc({omn@R6Ec!)%(XvY_bQd@#|9Y-dqn5R$Yo*dn zLLl^d<5Z{o?Z8+Tq0+(4GD+1Hv75lmdp+amrDvn%!nYreT^dVvk8d?Mx6e>c93F0L z*O*h>sbsRwk3G%AwPuQ`t8$lr>g1O5MBD}y$D=N$vsaZp^w7nqW-3i!kQ%0LJR;oG z2i-t(R8{)eRqvNMyXf@0@87E|^0eh09cmMdFkQr$97qh@R{#Cd^g>DB9KQxo)?@Nm z_!y$BI?x=_wr`hYSnjkDzV`I%ux)Lor}V)tX(AQ7q(gAhZSjix4L^EEZRfO!a|7vL zCi1e_^KuT5xZi^s_0{u9i5Qa35S*v%Y|N;c*^>D2`8dWF;UtSRpJJ8&8nnyhZVQ$% zta0hA-P%I7y!BA)@Zu5@w0>xh{|!yKU}UN}IwH0p-^BCa~${%6F8^iVRr+fP{FJ27*HE(B;5Yc^ZQ`B(C&*wwWxuD zn&+d3o>eqRUqd{x_RWueaTUi5CzL1eU$d)pA2;Y`C+Z)=9Akbt=*0AG17#dnC1<8B zCgpuG-VmmCTrM z5^1JRMC4XnnLf2DiLGc=TBTC9co+|D$X}b{XEy1-&2eC^$D!{Lmpnw3vsBqqN=VL} zNO8E9!=_uU%~W|YiWbp{ebf&Jo#5Xvqj|WWyHZV3$DHAxK5~OS0^UVWvFrGLIcAvD z&s_=f>OMX#d3qray~5q@|ai0E|2s=&MJhq2DdKWFz369F*b7u35 z+&ZO1PCS^n6+z&_;=2Y~TuEc|PedhzO%D^i5>7kU-JXs5joAbgek>Qh^Kfhu;U1QR zkxWZYUe+!xHtnuwc%=K~olSo1r_7hftONFB!tjT8+;-Ce!w1BF_aA@?HWp5Q04eV_1wF~Hf z$Rvlg+omV_}5NTyWj%*HfvRkf=)6p&Oi(!&DHTu)c-_41Tnx_z^pT} zu>ovaTU#Ha@E{>^Ef6k)Vx3!ee#lh4a{&ErP|6j;`*v-CV zec$pgA1NL9kJ=9>s|TaKtgT?{cnzO29?SOV4~x1zb5n#rcRMku-*fpI-2!QHd3#go zdH?rv#Z(Dyy-(MX2Qai0_0oHh<91wpJfM;@g2n0mp|$@`I?Vn^&+CI?#SJ5Yjgz&| z>bzYkEmd``yWsvX=aQJ|b-Po~;&EW}B^qZtW=zHG(f~c1tzar=aWXa0ad=P*%%Hib zLUy`eFVw|grC_eCpwkKL{Jp$feSLZ0v^00d4LO*(<1`Z1+X}uZe7}vsbqm}afIoJJ zHH`$O*gNGGjc@Nfwzw1n0|xz|SK!{gd;QDBSCcE((HC#s6&l5q`7H^ivZgw-OV-Tr zrm*Gt7I$IZ7tLwz^b_h#t;m9;;lz#0sh)`Mj#=&xU&rQX3LBqfz^hVIRF`tGHQ`^_56i1Mo;%f%~4+} zryiKfWq>|R>FW^8g$ncCX}`G;FftRk*T)KH^5| zs}Xd%Db$hrN2d49-Y{@m-YRRmVVYQ$he9p~RR0>M=?R%j{^o@S(nLL*bl6K@IuN$% zbad40?iJ=qQncNjFt>S^%jJJFF!+RXv*;b|3Cr9V^k;wgr@Lw`zZ(=z;sa(TZ3oMG z+AHLz_9i?WO8IohC%Xp*2FZEkt9}}ff}T{C&57EpK?j-rbuHjjmtTiXW-mFh>T#pJ zySpZm#po5BJH5USu-3$jte@G)zzI?OkkSAB^~?(Lg|jXnf&3~??(MK*)&P0Y2sQgB zIR$&kG>Y1+jg09W>JIwf93vWPx|V`lw@dKL6N`AIT!w-UJ|MfeDT~}wV^q^CG{-eO zv6_uGYG2;py^jwwCnlZ{4fsP|?WsLccLzhwCr@+D;j@4OXDhY-M;zNhQXM);-(O8A zP00&1YA$$RV?UgS_6ObU99twSX{O8=RT*(SQOyo+M%E}vg&m_*dAh_*j#KRtf8}HU5TOSyX5|EHMMWeLT zO#Oeq#{;8U-@vF&;^{Po1e`WP>5{h`njA@baB`7gci~0>^4GtL!fII5yHFhtv2El1$+JN zjIEe7i<5psW}e{R&*|eFaPl6;s4vE(wa2mQVBYe+IGA9y$AQSPf=*P<)m%T|&SMM+ zG6B>*3QJ^U^NS2AN_o^6kjLQr@l?^9?u<#5{q{ax(&fY7BW#ch@Vq8FU+1X6th5uB zd#~@1TS;IPSnLkrb4A&m*(<%=4i>cbb&hp@Tvi-GBV2aVG~lLSz#9P>KH=bK3kL<5 zQRgjwetxUdXNQkFZ^?sxf;FJBrH<+7kpd*imM;&g6W&jp&Yynm;mtDWc$jIH;!}ha z_-7Y!KCcd@SuwrV4BPIl@vc3I8#-+b zyp3)}Vg52!12xYD!77Xbts7uOuG~Qfh)k@cmh}3eFYqulQW%290|R>! zkv=o18VrVa*Wo0G!9@ZrwcVWFM5^!?vl)ylYL^yRlJG@gn8s zb)RWV9=(*q2Au>o2+u?3n;7sXN%wES89v=2L74HsEF^&kk_Y^eX;y{6;8(sPf&ctX zc>$gefgqlJR1U;Pbgkk(z{Ze=&%7jHf@|K^$A#CD8WF(-vn=1<1^;_Pp2CwhOsU{i`4;$4SBMkD9jvv2c)>m25>dg6Y$(a$_G^l_F+AY!jV-9) zDV#3U@O%U=5&T;m0X6*55CI{aMnHoQ{-u=x7k*}>O9D?K4abImBD`@2P7Y&afG0#T z;lrygVU+M2yf6~D2+2zlI0@Dbe0b6_H6>j0EfFr0BiNwtA5A-eV%>$8nO^BEf&S-Iq8G+3Z9fS{$lfZt!^jAqX(tN>ifG~mq!O0$d8w2r%4SO8}LCh6> zfCXA3h+Ogj8VtDR;tNMax%^8#O!~hN0CA%D5=sQHf77Fg8Z|vw6s3L4O!ShvXIw}o z)F|aCwW-Q5JfOgvKy`PiXq~LA8+{WR8$oaNGZ9v*B6e>lyt4i|ML z95a37CZ)6E@%j=|rCGaF)2)0d1YKO}Nmob%WW2Uo#M)xyfea{UZoN53LylOAe~0!# zbyAPNs$mkNwDl_Za`jaTsrr!$ItO~_5`2B9elB%=j?#9Y4=-vg^_GiR;R0U4Niu5g zWq2;+pWsx&)!R{`~T+nMiP8nXl^s|FysI@oQK`k(@AB8g7` z1s^@D?;8axNn$$suD8NSK&4g8+8onr#n<+kN9^-JIg-2HUNF3^fP>1cwx=|;SHReM zh%7H7_M@&AorwBYhDd{(MEn$;h0EIm<7t^b>SpFo3+9~b@|tHM2Un3FORd#g>YvSm zL7|L1y%G7%Fo_oi^*r`MBDX;>1e57$tp-jOtqm{^-;IFns& z?Fk55_xJ9~Bd65vJZ6sD5o>;X_R~X`z@)Zki(+CUrA$ZggR|Qm!0kEkJP`ho0JF%-#ADAiQ;34DH%}|aS z&@_7UIljgzIM|Sy`@2ZMEx}jLri2{$z`8rG(eAY;`tcQ+N+V zeMQoUi%R;gy#?ihXBiJ^9y)x&np%LX?q=V9mZxM2;W}*o6i3{oWI=iJVEX4Khukn2 znv|0Wp_hld_*`ryY->>)abyI+)L|p_zh=P*W@V19R1!7lDTlO-k%7+n?_~eVYyN+6 zn*ZTpzwhAre!zn$J|kGyu{iJJ_@^~6bZh5x1IEm`6ms!M_`pt9QBH$}#DjgHQ zT89Bix)qxM4J}`4U3RYCq3n;yp~MLRT~~Sx?$q7` zJa-{zPVe6sb-%#G2{lv4(~~NDEEI1A!J8~xJtw2D%FqwnrZY;eHW^+L&(=IKs(75D zm>_EE3*FYd56aX?^I+{f1w2|}nl^5CO!L-WAtk*!a&!&ZT5e)Mx&%zn)d`xfe+Hg7 z&ulG^O#+Oru8$@e&rN_>#WYoz)yfEf&=jH56`T-7QpiCda+MOtcZ-qja``))8`RHx z(=k8q9wdED(Iu%7en|QIg9%;bs3B)KnP>$qY-2|wdauGyMpb=25ZrACoa>KxiehGi zL04i|JG6^%y~6Zh1151meD1TuV!7fpl>8rGWY zMoel8>6(#cyUo$4Mre<{iAT9XD_IOhZw^Z$6wLT|ce+tYAM}eKWwA(Uzf{04tJ|Bt zR}WyN(Y)HD{AI7K@_AS7VA)&|2;z#hTFn@f_%aNinL7Q%I?*o=*nOOnDfdFpvG|`A z)zBQ6NCot3W_a_LCP%Q1a{htHa0J5ySBB^Jy+V=_Z;L zQ>Q%~bK10rcOmT_1d9sI4JYTTvH+M&lJ!k!;}>&2{TO%2m>|`Rw!l_7@}a6N_KYvB zi*fqY0DF43jt?&DSmrvaR%j4f=q)t#USXJ5;ApAmku`;@ycq1Y1v4tCvv~|~k{O!f zG|B(*MmXrqcDtl9c}gi3IMZ8k)Ugt&@e9r}{^mF)Y8V)|rp}Fy%j!Ja6=fEIBkiJ9 z=d_u06WRp0s<`F!T&=QV6FAh^7B|Tckf-{GgVFOhReiP(IDhcv9`B7F40Kiy$@xCz z=8-!5ZUg4oHIMSkdu%?IPe=pu7LhAC-;Q#`fC#M1*~G!x6yl0Z5qkf$xfKkm1+VYY8kVjL6;HGY z+^o+w2CloKwz=|SwU-@1Zop;LuHUYp{UySL`O=&@(ZDS4aIPGe8yMnu;)(g8RP?KC zH@B#U&*@6t^rFI9zuILRNmqXIgRz!ldDOo_Bn9Vb>C>pnxw-~oR1CM)#VqI5h7+VW zuBImfe69-4uyUKC5|wh-yMv7CbXYFjBh6W?3c~)Cof}Iig!zas6i56`pV0<{W%Wsk zkszzm`*lr*oI-UmAV=#MA^**qS)DIE(9EBtx&+=NF;v3dTwWpIy4lHA-5Jtgd%8p3 z7Bb(3M5<9mHk-{>#((1*x>q=sQ99#Sq3zfO@Fh2K|P!-Tr!D`_Oalogo!Yj0Quu<^!r8 zW}EDP%~;6Q*;xI)ZJM=J7CX9Nu<xjer-EwdhCt0cN(R%QUUG}Q2@)VVlV z<;#nW1RFr-7S7O23}U6Ppf0m{YT7wj=Dm{hxidx6;616Bss;_+1f-Y0yFsn*n;wKm z-xuhztt6}dqs5E~6ZQNTrKT*7Pevr@J*s zjb(mALTokR9zJOjD}b|F4%HHb!$EXNE1_t^a}>DJ@L(uQ9G#56y{7*71(HJ6(R^qC ztzpG6fKAbA=Ob)9WLJo6q0Pa4V8CjZRkCH+d?i|A3~$;y^jU1FXpB_m$C z^MTITOT)vv>yRWyu(4hUiEt)Jae6> z1!gh*SEAN`D{jQ570>zip}~`tT54QE{pKTh&29R@v+jbv%=g1W-~ni83Bk4L0sPNw z4_OqpW%A+H4+rGw*SBsz)D6kU+b!z1V~+KeA+fAcUqJT?3S~iZN6N8U#OUbq12Q}B zCOCxu&bX;+S&xC%0LcC5^{)#o`s~jIl*fzht*6oslbQU??Z#_>*{1Dik4*EqdNAv) zE?i`;?MU2iq8UXIOF|_57*$5NTfroGFcrhQ+|hhHfDP*8W%pJcOc{WTVAZrAPECI; zyzs^hUHUQ{>WSh}kuQ-&1gw5>KB~wV;|9~*Mt(R~za?e`=1!%&rig}ub&t?!^omRE zWYs%bL-Dr+8-%u!y`9P(Z1;&x9C7GQ#?fTyVdSIK9mqBxk7DD@CuzUkG=ggji3#NW zTy;Obo$gng6woKgW_x>Ypu-sqAGXWUFSt}Fcdf@%medLl9kfc)3cgR~oy|N;A({&E z-j2;5vbV$s41-UnRu8vFofzNtqx>owzZS^p3lcM7J5-#$d9W4NjORMr*7x*&Uw4#C zJRyTnprhugJKxe)HhL4gaucD)1GyD|v`mLa(SxrVsQ4ca_xmPmk!W}7{qW(H z8tt7VV}ISUnhwNeP0yT*?hXg4^@+sSe;nvvXI&|a7~>FXr(*gQPUR6v(H-F+iI&RR)L6L`?m@RwKx1pm_JjvZg@E*GRWKh1=lLoF`1c{`6uX)l-8 z)@wVRBf-?Bj`43W_KAxn3)!~A2-!i4eHYl}!q4G+Z(vVv`(&~9^1?6w!ehC;(V_Ed z$!SMm5d*x&`!dq!u;s}i=P+<6I^4NCcQx)*TAe(h`)9l0qbFx-P4QmC>RB&Yu>eh_|0lxu{%gM#zi=IJG6#ePU*Z0?H8l)FT zox&Gebyw=B`>Z6udBs5Jap6Ql`|tj0plQFO_M-Oc?6~9ek@Q}~m1h)XKQJtHHryF> zp*(lA;5P^*cV(Lm&2?2inA?JpWOvs9vBP#xjtpzLNH(6i-D>;&=pcfL$v*sR_gk*h zh<9}<&EWOLG9(+XqX)n_$WJC9(YTFJ)@kpeurUldSuFhwkXOGvI`JvaW*v}7b5`)*j$cC;i0aM9G zxv7$N=K9JL>WZXMCR=&a-=lAR)0oK}*!^H4bKtMt)9`*ql*nK^!2jpl4~@;;21?Fr zhvqF@8IH+IW-W}OciM0e+(f)Rw8W6Qli19~{J@`&g!r)^%M&hYkW{P1LQ6X@3lALJ z&gUy@`v8ZF>9f%J_8nlq8sSxX0SqQwp)G1}y<6`wq`us9u@Dn$+&NjiYM9T7FYP3| zdh;=Iff)8>X8-rGJc^e}zkX^)SWN;R(VADW9yIwga()r&Eq|2K_7xJAp+uo**bx3O z7V2=d*_m^e=M6mhmAONA@g)m2>$6V>oJ0Y8K_cIX5|&pyENB)u=h zU53RrXLiJ|e$ju%)0 zz7wx3m%8J>F*rp(e~WQqNbT`qX={QG>8@y0WjlJ#B$wnGPz%cxw7 zo1N=gv!N52we1&Qrk?o?4!o%-&5jo#qLUT-UH+V^oYdXW4ZuR;oc$glM$*u>KG7l8 zkEj?bcr9A9Zc5}MFW-J{X}8p!Q3?c`a?f^;x{-PW_`gqM*SRulz4*EKb$7GWB51x# z`YVFfNh6&&_4#N0dFjtlweRW-&hDw@Jgk1A>^>qAfxFu}Fp7KB+g;f`T~za$R5HclM);2)2B5mbNPtDqB9Rlnz}~dfN^wP^eI#umvnwthQ=_ zD$ozQcX0tNRC6&9t%MC9F_J*+#l&c%LXg-5X<`B|Ry2f!D3UQQh*Ptrk5NbSRxCD{W0uvWLes9&_=S zo5yq>GX`Rwdy=TB`wu+e1rvPWhX4d23qmjko`A9NB#eXc@DyZ24orZFFbO6@uDt)i z3Y~N(m0*S@F=0D3u7_NDZr8abvgufOtY5?Y$5WXzVVDAWkS{Z53fBKk3WcjbGEc<% zBe|qQuIrCnC90}Z@#pqxOD;baIYLFXnPjdCEgq+W6lqp!btVE&!&I0Cg)kjvKoL9x zGa(AaFbihG9GDBwLJ2$v^W^GG>4_%hxv5wRrwVsl<`UN_SJYcieW#6IV=EU|wan-K1Qb%vwumH*-1`FYNcmZC7MNk0@D&^7JRa<)0D%TdFw^UD; zb6Tncu0AUL(#={Q>v?-y<~|sfTs29um+18(<@Bf>)psHp3Qp6`JH|WUHR7j?opN4`vsLg=J2* z%)ZyuqKcN@MOnhSm>rO%2h&9=XInXYjk9LXUgzu$&RRHYCIPU|ehWs{YGLaBg6?|1ys7Yrnia z#7n=+2^y=E;J%<1*dH+bY2QO%xB1B2VJhBT(&|l}*Acy2>++a!+4`Grl*+mzsS`Z| zgXs=KEX#K+)sF5I4WD7ZpI%Bw#KA*#|CKttNlO|(rY914VXAhKNdHgi`)Z0t_riPB q$jIK#y}xR5@Wb>Z6CZ%0$k2_R43Yfj^a?6Rhts-GYD?4ql>ZBvarwXi diff --git a/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.lfm b/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.lfm index a6ca95179..0e613b3e3 100644 --- a/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.lfm +++ b/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.lfm @@ -1,160 +1,132 @@ object LogLinScreenFrm: TLogLinScreenFrm - Left = 456 - Height = 584 - Top = 135 - Width = 402 + Left = 417 + Height = 379 + Top = 130 + Width = 662 AutoSize = True Caption = 'Cross-Classification Log Linear Screen' - ClientHeight = 584 - ClientWidth = 402 + ClientHeight = 379 + ClientWidth = 662 OnActivate = FormActivate OnCreate = FormCreate OnShow = FormShow - Position = poMainFormCenter LCLVersion = '2.1.0.0' - object Label1: TLabel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = CountVarChk - AnchorSideTop.Side = asrBottom - Left = 8 - Height = 15 - Top = 39 - Width = 337 - BorderSpacing.Left = 8 - BorderSpacing.Top = 12 - BorderSpacing.Right = 16 - Caption = '1. Select the variables of the Grid that define your classifications' - ParentColor = False - end object Label2: TLabel AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Panel1 - AnchorSideTop.Side = asrBottom + AnchorSideTop.Control = Owner Left = 8 Height = 15 - Top = 208 + Top = 8 Width = 97 BorderSpacing.Left = 8 - BorderSpacing.Top = 12 + BorderSpacing.Top = 8 Caption = 'Available Variables' ParentColor = False end object Label3: TLabel AnchorSideLeft.Control = SelectList AnchorSideTop.Control = Label2 - Left = 232 + Left = 255 Height = 15 - Top = 208 + Top = 8 Width = 44 Caption = 'Selected' ParentColor = False end object CountVarChk: TCheckBox - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Owner - Left = 8 + AnchorSideLeft.Control = SelectList + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = GroupBox1 + Left = 255 Height = 19 - Top = 8 + Top = 252 Width = 247 - BorderSpacing.Left = 8 + Anchors = [akLeft, akBottom] BorderSpacing.Top = 8 + BorderSpacing.Right = 8 + BorderSpacing.Bottom = 8 Caption = 'Last Variable Selected is a Frequency Count' - TabOrder = 0 - end - object Step2Btn: TButton - AnchorSideLeft.Control = Label10 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Label10 - AnchorSideTop.Side = asrCenter - Left = 234 - Height = 25 - Top = 55 - Width = 52 - AutoSize = True - BorderSpacing.Left = 16 - Caption = 'Click' - OnClick = Step2BtnClick - TabOrder = 1 + OnChange = CountVarChkChange + TabOrder = 4 end object VarList: TListBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Label2 AnchorSideTop.Side = asrBottom AnchorSideRight.Control = AllBtn - AnchorSideBottom.Control = GroupBox1 + AnchorSideBottom.Control = CountVarChk + AnchorSideBottom.Side = asrBottom Left = 8 - Height = 230 - Top = 225 - Width = 162 + Height = 246 + Top = 25 + Width = 185 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 8 BorderSpacing.Top = 2 BorderSpacing.Right = 8 - BorderSpacing.Bottom = 8 - Constraints.MinHeight = 220 ItemHeight = 0 MultiSelect = True OnSelectionChange = VarListSelectionChange - TabOrder = 3 + TabOrder = 0 end object InBtn: TBitBtn - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = Bevel2 AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = VarList - Left = 187 + Left = 210 Height = 28 - Top = 225 + Top = 25 Width = 28 Images = MainDataModule.ImageList ImageIndex = 1 OnClick = InBtnClick Spacing = 0 - TabOrder = 4 + TabOrder = 1 end object OutBtn: TBitBtn - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = Bevel2 AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = InBtn AnchorSideTop.Side = asrBottom - Left = 187 + Left = 210 Height = 28 - Top = 257 + Top = 57 Width = 28 BorderSpacing.Top = 4 Images = MainDataModule.ImageList ImageIndex = 0 OnClick = OutBtnClick Spacing = 0 - TabOrder = 5 + TabOrder = 2 end object AllBtn: TBitBtn - AnchorSideLeft.Control = Owner + AnchorSideLeft.Control = Bevel2 AnchorSideLeft.Side = asrCenter AnchorSideTop.Control = OutBtn AnchorSideTop.Side = asrBottom - Left = 178 + AnchorSideBottom.Side = asrBottom + Left = 201 Height = 25 - Top = 289 + Top = 89 Width = 46 AutoSize = True BorderSpacing.Top = 4 + BorderSpacing.Bottom = 24 Caption = 'ALL' OnClick = AllBtnClick Spacing = 0 - TabOrder = 6 + TabOrder = 3 end object SelectList: TListBox AnchorSideLeft.Control = AllBtn AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = VarList - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = VarList - AnchorSideBottom.Side = asrBottom - Left = 232 - Height = 230 - Top = 225 - Width = 162 + AnchorSideRight.Control = MinMaxGrid + AnchorSideBottom.Control = CountVarChk + Left = 255 + Height = 219 + Top = 25 + Width = 185 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 8 BorderSpacing.Right = 8 @@ -162,154 +134,40 @@ object LogLinScreenFrm: TLogLinScreenFrm OnSelectionChange = SelectListSelectionChange TabOrder = 7 end - object Panel1: TPanel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Label11 - AnchorSideTop.Side = asrBottom - Left = 24 - Height = 85 - Top = 111 - Width = 244 - AutoSize = True - BorderSpacing.Left = 24 - BevelOuter = bvNone - ClientHeight = 85 - ClientWidth = 244 - TabOrder = 2 - object Label7: TLabel - AnchorSideTop.Control = VarNoEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = VarNoEdit - Left = 137 - Height = 15 - Top = 12 - Width = 44 - Anchors = [akTop, akRight] - BorderSpacing.Right = 8 - Caption = 'Variable:' - ParentColor = False - end - object Label8: TLabel - AnchorSideTop.Control = MinEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = MinEdit - Left = 98 - Height = 15 - Top = 39 - Width = 87 - Anchors = [akTop, akRight] - BorderSpacing.Right = 4 - Caption = 'Minimum Value:' - ParentColor = False - end - object Label9: TLabel - AnchorSideTop.Control = MaxEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = MaxEdit - Left = 92 - Height = 15 - Top = 66 - Width = 89 - Anchors = [akTop, akRight] - BorderSpacing.Right = 8 - Caption = 'Maximum Value:' - ParentColor = False - end - object ScrollBar1: TScrollBar - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = VarNoEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label7 - Left = 0 - Height = 17 - Top = 11 - Width = 121 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Right = 16 - PageSize = 0 - TabOrder = 0 - OnChange = ScrollBar1Change - end - object VarNoEdit: TEdit - AnchorSideTop.Control = Panel1 - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 189 - Height = 23 - Top = 8 - Width = 55 - Alignment = taRightJustify - Anchors = [akTop, akRight] - BorderSpacing.Top = 8 - TabOrder = 1 - Text = 'VarNoEdit' - end - object MinEdit: TEdit - AnchorSideLeft.Control = VarNoEdit - AnchorSideTop.Control = VarNoEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 189 - Height = 23 - Top = 35 - Width = 55 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - OnKeyPress = MinEditKeyPress - TabOrder = 2 - Text = 'MinEdit' - end - object MaxEdit: TEdit - AnchorSideLeft.Control = VarNoEdit - AnchorSideTop.Control = MinEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - Left = 189 - Height = 23 - Top = 62 - Width = 55 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - OnKeyPress = MaxEditKeyPress - TabOrder = 3 - Text = 'MaxEdit' - end - end object GroupBox1: TGroupBox AnchorSideLeft.Control = Owner + AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Bevel1 Left = 8 - Height = 72 - Top = 463 - Width = 241 + Height = 51 + Top = 279 + Width = 390 Anchors = [akLeft, akBottom] AutoSize = True BorderSpacing.Left = 8 + BorderSpacing.Right = 8 Caption = 'Options' ChildSizing.LeftRightSpacing = 12 ChildSizing.TopBottomSpacing = 6 + ChildSizing.HorizontalSpacing = 20 ChildSizing.VerticalSpacing = 2 ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 52 - ClientWidth = 237 - TabOrder = 8 + ChildSizing.ControlsPerLine = 2 + ClientHeight = 31 + ClientWidth = 386 + TabOrder = 6 object MarginsChk: TCheckBox Left = 12 Height = 19 Top = 6 - Width = 213 + Width = 129 Caption = 'Print Marginal Totals' TabOrder = 0 end object GenlModelChk: TCheckBox - Left = 12 + Left = 161 Height = 19 - Top = 27 + Top = 6 Width = 213 Caption = 'Print General Linear Modle Estimates' TabOrder = 1 @@ -319,9 +177,9 @@ object LogLinScreenFrm: TLogLinScreenFrm AnchorSideRight.Control = ComputeBtn AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 193 + Left = 453 Height = 25 - Top = 551 + Top = 346 Width = 54 Anchors = [akRight, akBottom] AutoSize = True @@ -331,15 +189,15 @@ object LogLinScreenFrm: TLogLinScreenFrm BorderSpacing.Bottom = 8 Caption = 'Reset' OnClick = ResetBtnClick - TabOrder = 10 + TabOrder = 9 end object ComputeBtn: TButton AnchorSideRight.Control = CloseBtn AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 255 + Left = 515 Height = 25 - Top = 551 + Top = 346 Width = 76 Anchors = [akRight, akBottom] AutoSize = True @@ -349,16 +207,16 @@ object LogLinScreenFrm: TLogLinScreenFrm BorderSpacing.Bottom = 8 Caption = 'Compute' OnClick = ComputeBtnClick - TabOrder = 11 + TabOrder = 10 end object CloseBtn: TButton AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 339 + Left = 599 Height = 25 - Top = 551 + Top = 346 Width = 55 Anchors = [akRight, akBottom] AutoSize = True @@ -368,17 +226,16 @@ object LogLinScreenFrm: TLogLinScreenFrm BorderSpacing.Bottom = 8 Caption = 'Close' ModalResult = 11 - OnClick = CloseBtnClick - TabOrder = 12 + TabOrder = 11 end object HelpBtn: TButton Tag = 131 AnchorSideRight.Control = ResetBtn AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom - Left = 134 + Left = 394 Height = 25 - Top = 551 + Top = 346 Width = 51 Anchors = [akRight, akBottom] AutoSize = True @@ -388,7 +245,7 @@ object LogLinScreenFrm: TLogLinScreenFrm BorderSpacing.Bottom = 8 Caption = 'Help' OnClick = HelpBtnClick - TabOrder = 9 + TabOrder = 8 end object Bevel1: TBevel AnchorSideLeft.Control = Owner @@ -397,38 +254,69 @@ object LogLinScreenFrm: TLogLinScreenFrm AnchorSideBottom.Control = CloseBtn Left = 0 Height = 8 - Top = 535 - Width = 402 + Top = 330 + Width = 662 Anchors = [akLeft, akRight, akBottom] Shape = bsBottomLine end - object Label10: TLabel - AnchorSideLeft.Control = Label1 - AnchorSideTop.Control = Label1 - AnchorSideTop.Side = asrBottom - Left = 8 - Height = 15 - Top = 60 - Width = 210 - BorderSpacing.Top = 6 - Caption = '2. Click here when variables are selected' - ParentColor = False - end - object Label11: TLabel - AnchorSideLeft.Control = Label1 - AnchorSideTop.Control = Label10 - AnchorSideTop.Side = asrBottom + object MinMaxGrid: TStringGrid + AnchorSideLeft.Control = SelectList + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = SelectList AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom - Left = 8 - Height = 30 - Top = 81 - Width = 386 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 6 + AnchorSideBottom.Control = SelectList + AnchorSideBottom.Side = asrBottom + Left = 448 + Height = 219 + Top = 25 + Width = 206 + Anchors = [akTop, akRight, akBottom] + AutoFillColumns = True + BorderSpacing.Left = 8 BorderSpacing.Right = 8 - Caption = '3. For each variable complete the specifications below. Press the ENTER key following each entry.' + ColCount = 3 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goEditing, goSmoothScroll] + RowCount = 1 + TabOrder = 5 + ColWidths = ( + 64 + 69 + 69 + ) + Cells = ( + 3 + 0 + 0 + 'Variable' + 1 + 0 + 'Minimum' + 2 + 0 + 'Maximum' + ) + end + object Label1: TLabel + AnchorSideLeft.Control = MinMaxGrid + AnchorSideTop.Control = Label2 + AnchorSideBottom.Control = MinMaxGrid + Left = 448 + Height = 15 + Top = 8 + Width = 142 + Caption = 'Min/Max for each variable:' ParentColor = False - WordWrap = True + end + object Bevel2: TBevel + AnchorSideLeft.Control = VarList + AnchorSideRight.Control = SelectList + AnchorSideRight.Side = asrBottom + Left = 8 + Height = 4 + Top = 2 + Width = 432 + Anchors = [akTop, akLeft, akRight] + Shape = bsSpacer end end diff --git a/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.pas b/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.pas index 3ab454d9d..4ad7c0218 100644 --- a/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.pas +++ b/applications/lazstats/source/forms/analysis/cross-classification/loglinscreenunit.pas @@ -16,7 +16,7 @@ interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - StdCtrls, Buttons, ExtCtrls, + StdCtrls, Buttons, ExtCtrls, Grids, Globals, MainUnit, FunctionsLib, OutputUnit, DataProcs, ContextHelpUnit; type @@ -25,10 +25,10 @@ type TLogLinScreenFrm = class(TForm) Bevel1: TBevel; + Bevel2: TBevel; HelpBtn: TButton; InBtn: TBitBtn; - Label10: TLabel; - Label11: TLabel; + Label1: TLabel; OutBtn: TBitBtn; AllBtn: TBitBtn; ResetBtn: TButton; @@ -37,53 +37,37 @@ type MarginsChk: TCheckBox; GenlModelChk: TCheckBox; GroupBox1: TGroupBox; - MaxEdit: TEdit; - MinEdit: TEdit; - Label8: TLabel; - Label9: TLabel; - VarNoEdit: TEdit; Label2: TLabel; Label3: TLabel; - Label7: TLabel; - Panel1: TPanel; - ScrollBar1: TScrollBar; SelectList: TListBox; + MinMaxGrid: TStringGrid; VarList: TListBox; - Step2Btn: TButton; CountVarChk: TCheckBox; - Label1: TLabel; procedure AllBtnClick(Sender: TObject); procedure ComputeBtnClick(Sender: TObject); + procedure CountVarChkChange(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure HelpBtnClick(Sender: TObject); procedure InBtnClick(Sender: TObject); - procedure MaxEditKeyPress(Sender: TObject; var Key: char); - procedure MinEditKeyPress(Sender: TObject; var Key: char); procedure OutBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject); - procedure CloseBtnClick(Sender: TObject); - procedure ScrollBar1Change(Sender: TObject); procedure SelectListSelectionChange(Sender: TObject; User: boolean); - procedure Step2BtnClick(Sender: TObject); - function ArrayPosition(Sender: TObject; NoDims : integer; - VAR Data : DblDyneVec; - VAR Subscripts : IntDyneVec; - VAR DimSize : IntDyneVec) : integer; - procedure Marginals(Sender: TObject; - NoDims : integer; - ArraySize : integer; - VAR Indexes : IntDyneMat; - VAR Data : DblDyneVec; - VAR Margins : IntDyneMat); + function ArrayPosition(NumDims: integer; const Data: DblDyneVec; + const Subscripts, DimSize: IntDyneVec): integer; + procedure Marginals(NumDims, ArraySize: integer; const Indexes: IntDyneMat; + const Data: DblDyneVec; const Margins: IntDyneMat); + procedure VarListSelectionChange(Sender: TObject; User: boolean); private { private declarations } FAutoSized: Boolean; procedure UpdateBtnStates; - procedure Screen(VAR NVAR : integer; + procedure UpdateMinMaxGrid; + + procedure Screen(VAR NVAR : integer; VAR MP : integer; VAR MM : integer; VAR NTAB : integer; VAR TABLE : DblDyneVec; VAR DIM : IntDyneVec; VAR GSQ : DblDyneVec; @@ -96,35 +80,35 @@ type VAR X : DblDyneVec; VAR Y : DblDyneVec; VAR IFAULT : integer); - procedure CONF(VAR N : integer; VAR M : integer; + procedure CONF(VAR N : integer; VAR M : integer; VAR MP : integer; VAR MM : integer; VAR ISET : IntDyneVec; VAR JSET : IntDyneVec; VAR IP : IntDyneMat; VAR IM : IntDyneMat; VAR NP : integer); - procedure COMBO(VAR ISET : IntDyneVec; + procedure COMBO(VAR ISET : IntDyneVec; N, M : Integer; VAR LAST : boolean); - procedure EVAL(VAR IAR : IntDyneMat; + procedure EVAL(VAR IAR : IntDyneMat; NC, NV, IBEG, NVAR, MAX : integer; VAR CONFIG : IntDyneMat; VAR DIM : IntDyneVec; VAR DF : integer); - procedure RESET(VAR FIT : DblDyneVec; NTAB : Integer; + procedure RESET(VAR FIT : DblDyneVec; NTAB : Integer; AVG : Double); - procedure LIKE(VAR GSQ : Double; VAR FIT : DblDyneVec; + procedure LIKE(VAR GSQ : Double; VAR FIT : DblDyneVec; VAR TABLE : DblDyneVec; NTAB : integer); - procedure LOGFIT(NVAR, NTAB, NCON : integer; + procedure LOGFIT(NVAR, NTAB, NCON : integer; VAR DIM : IntDyneVec; VAR CONFIG : IntDyneMat; VAR TABLE : DblDyneVec; VAR FIT : DblDyneVec; VAR SIZE : IntDyneVec; VAR COORD : IntDyneVec; VAR X : DblDyneVec; VAR Y : DblDyneVec); - procedure MaxCombos(NoDims : integer; VAR MM : integer; VAR MP : integer); + procedure MaxCombos(NumDims: integer; out MM, MP: integer); public { public declarations } @@ -132,53 +116,23 @@ type var LogLinScreenFrm: TLogLinScreenFrm; - Minimums : IntDyneVec; - Maximums : IntDyneVec; - Response : BoolDyneVec; - Interact : BoolDyneVec; - NoDims : integer; implementation uses - Math, Utils; + Math, LCLIntf, LCLType, Utils; { TLogLinScreenFrm } procedure TLogLinScreenFrm.ResetBtnClick(Sender: TObject); -VAR i : integer; +var + i : integer; begin - Panel1.Visible := false; - VarList.Clear; - SelectList.Clear; - VarNoEdit.Text := '1'; - MaxEdit.Text := ''; - MinEdit.Text := ''; - InBtn.Enabled := true; - OutBtn.Enabled := false; - NoDims := 0; - Minimums := nil; - Maximums := nil; - Response := nil; - Interact := nil; - ScrollBar1.Min := 1; - ScrollBar1.Max := 1; - ScrollBar1.Position := 1; - for i := 1 to NoVariables do VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); -end; - -procedure TLogLinScreenFrm.CloseBtnClick(Sender: TObject); -begin - Maximums := nil; - Minimums := nil; - Response := nil; - Interact := nil; - Close; -end; - -procedure TLogLinScreenFrm.ScrollBar1Change(Sender: TObject); -begin - VarNoEdit.Text := IntToStr(ScrollBar1.Position); + VarList.Clear; + for i := 1 to NoVariables do VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); + SelectList.Clear; + UpdateBtnStates; + UpdateMinMaxGrid; end; procedure TLogLinScreenFrm.SelectListSelectionChange(Sender: TObject; @@ -187,21 +141,6 @@ begin UpdateBtnStates; end; -procedure TLogLinScreenFrm.Step2BtnClick(Sender: TObject); -begin - if CountVarChk.Checked then - begin - NoDims := NoDims - 1; - ScrollBar1.Max := NoDims; - end; - Panel1.Visible := true; - setLength(Maximums,NoDims); - SetLength(Minimums,NoDims); - SetLength(Response,NoDims); - SetLength(Interact,NoDims); - MaxEdit.SetFocus; -end; - procedure TLogLinScreenFrm.InBtnClick(Sender: TObject); var i: integer; @@ -213,37 +152,14 @@ begin begin SelectList.Items.Add(VarList.Items[i]); VarList.Items.Delete(i); - NoDims := NoDims + 1; i := 0; end else i := i + 1; end; - Scrollbar1.Max := NoDims; + UpdateMinMaxGrid; UpdateBtnStates; end; -procedure TLogLinScreenFrm.MaxEditKeyPress(Sender: TObject; var Key: char); -VAR DimNo : integer; -begin - if ord(Key) = 13 then // return key - begin - DimNo := StrToInt(VarNoEdit.Text); - Maximums[DimNo-1] := StrToInt(MaxEdit.Text); - ScrollBar1.SetFocus; - end; -end; - -procedure TLogLinScreenFrm.MinEditKeyPress(Sender: TObject; var Key: char); -VAR DimNo : integer; -begin - if ord(Key) = 13 then // return key - begin - DimNo := StrToInt(VarNoEdit.Text); - Minimums[DimNo-1] := StrToInt(MinEdit.Text); - MaxEdit.SetFocus; - end; -end; - procedure TLogLinScreenFrm.FormActivate(Sender: TObject); var w: Integer; @@ -257,8 +173,14 @@ begin ComputeBtn.Constraints.MinWidth := w; CloseBtn.Constraints.MinWidth := w; - Constraints.MinWidth := Width; + MinMaxGrid.ClientWidth := 3 * MinMaxGrid.Canvas.TextWidth('Maximum ') + 6*varCellPadding; + + Constraints.MinWidth := MinMaxGrid.Width * 3 + AllBtn.Width + 4 * VarList.BorderSpacing.Left; Constraints.MinHeight := Height; + AutoSize := false; + Height := 2*Height; + + Position := poMainFormCenter; FAutoSized := true; end; @@ -287,9 +209,8 @@ begin for i := 0 to VarList.Items.Count-1 do SelectList.Items.Add(VarList.Items[i]); VarList.Clear; - NoDims := SelectList.Items.Count; - ScrollBar1.Max := NoDims; UpdateBtnStates; + UpdateMinMaxGrid; end; procedure TLogLinScreenFrm.ComputeBtnClick(Sender: TObject); @@ -308,7 +229,6 @@ var WorkVec : IntDyneVec; Indexes : IntDyneMat; LogM : DblDyneVec; - NSize : IntDyneVec; M : DblDyneMat; astr, HeadStr : string; MaxDim, MP, MM : integer; @@ -333,30 +253,53 @@ var IFAULT : integer; TABLE : DblDyneVec; DIM : IntDyneVec; + NoDims: Integer; + Minimums: IntDyneVec; + Maximums: IntDyneVec; +// Response: BoolDyneVec; +// Interact: BoolDyneVec; lReport: TStrings; begin lReport := TStringList.Create; try // Allocate space for labels, DimSize and SubScripts + NoDims := MinMaxGrid.RowCount - 1; NoVars := SelectList.Items.Count; - SetLength(Labels,NoVars); - SetLength(DimSize,NoDims); - SetLength(Subscripts,NoDims); - SetLength(GridPos,NoVars); + + SetLength(Labels, NoVars); + SetLength(GridPos, NoVars); + SetLength(Minimums, NoDims); + SetLength(Maximums, NoDims); + SetLength(DimSize, NoDims); + SetLength(Subscripts, NoDims); + + for i := 1 to NoDims do + begin + if not TryStrToInt(MinMaxGrid.Cells[1, i], Minimums[i-1]) then + begin + MessageDlg('Integer number > 0 expected.', mtError, [mbOK], 0); + exit; + end; + if not TryStrToInt(MinMaxGrid.Cells[2, i], Maximums[i-1]) then + begin + MessageDlg('Integer number > 0 expected.', mtError, [mbOK], 0); + exit; + end; + end; // get variable labels and column positions for i := 1 to NoVars do begin - astr := SelectList.Items.Strings[i-1]; - for j := 1 to NoVariables do - begin - if OS3MainFrm.DataGrid.Cells[j,0] = astr then - begin - Labels[i-1] := astr; - GridPos[i-1] := j; - break; - end; - end; + astr := SelectList.Items.Strings[i-1]; + for j := 1 to NoVariables do + begin + if OS3MainFrm.DataGrid.Cells[j,0] = astr then + begin + Labels[i-1] := astr; + GridPos[i-1] := j; + break; + end; + end; end; // Get no. of categories for each dimension (DimSize) @@ -364,9 +307,9 @@ begin ArraySize := 1; for i := 0 to NoDims - 1 do begin - DimSize[i] := Maximums[i] - Minimums[i] + 1; - if DimSize[i] > MaxDim then MaxDim := DimSize[i]; - ArraySize := ArraySize * DimSize[i]; + DimSize[i] := Maximums[i] - Minimums[i] + 1; + if DimSize[i] > MaxDim then MaxDim := DimSize[i]; + ArraySize := ArraySize * DimSize[i]; end; // Allocate space for Data and marginals @@ -377,46 +320,49 @@ begin SetLength(Indexes,ArraySize+1,NoDims); SetLength(LogM,ArraySize); SetLength(M,ArraySize,NoDims); - SetLength(NSize,NoDims); // Initialize data and margins arrays for i := 1 to NoDims do - for j := 1 to MaxDim do - Margins[i-1,j-1] := 0; - for i := 1 to ArraySize do Data[i-1] := 0; - N := 0; + for j := 1 to MaxDim do + Margins[i-1,j-1] := 0; + for i := 1 to ArraySize do + Data[i-1] := 0; // Read and store frequencies in Data for i := 1 to NoCases do begin - if GoodRecord(i, NoVars, GridPos) then // casewise check - begin - for j := 1 to NoDims do // get cell subscripts - begin - index := StrToInt(OS3MainFrm.DataGrid.Cells[GridPos[j-1],i]); - index := index - Minimums[j-1] + 1; - Subscripts[j-1] := index; - end; + if GoodRecord(i, NoVars, GridPos) then // casewise check + begin + // get cell subscripts + for j := 1 to NoDims do + begin + index := StrToInt(OS3MainFrm.DataGrid.Cells[GridPos[j-1],i]); + index := index - Minimums[j-1] + 1; + Subscripts[j-1] := index; + end; - index := ArrayPosition(Self, NoDims, Data, Subscripts, DimSize); + index := ArrayPosition(NoDims, Data, Subscripts, DimSize); - for j := 1 to NoDims do // save subscripts for later use - Indexes[index,j-1] := Subscripts[j-1]; + // save subscripts for later use + for j := 1 to NoDims do + Indexes[index,j-1] := Subscripts[j-1]; - if CountVarChk.Checked then - begin - k := GridPos[NoVars-1]; - Data[index] := Data[index] + StrToInt(OS3MainFrm.DataGrid.Cells[k,i]); - end - else Data[index] := Data[index] + 1; - end; + if CountVarChk.Checked then + begin + k := GridPos[NoVars-1]; + Data[index] := Data[index] + StrToInt(OS3MainFrm.DataGrid.Cells[k,i]); + end else + Data[index] := Data[index] + 1; + end; end; // get total N - for i := 1 to ArraySize do N := N + Round(Data[i-1]); + N := 0; + for i := 1 to ArraySize do + N := N + Round(Data[i-1]); // Get marginal frequencies - Marginals(Self,NoDims,ArraySize,Indexes,Data,Margins); + Marginals(NoDims, ArraySize, Indexes, Data, Margins); // Print Marginal totals if requested if MarginsChk.Checked then @@ -472,10 +418,10 @@ begin astr := astr + format('%10.0f %10.2f %10.3f',[Data[i-1],Expected[i-1],LogM[i-1]]); lReport.Add(astr); end; - chi2 := 0.0; - G2 := 0.0; // Calculate chi-squared and G squared statistics + chi2 := 0.0; + G2 := 0.0; for i := 1 to ArraySize do begin chi2 := chi2 + Sqr(Data[i-1] - Expected[i-1]) / Expected[i-1]; @@ -484,10 +430,10 @@ begin G2 := 2.0 * G2; DF := 1; for i := 1 to NoDims do DF := DF * (DimSize[i-1]-1); - ProbChi2 := 1.0 - Chisquaredprob(chi2,DF); - ProbG2 := 1.0 - Chisquaredprob(G2,DF); - lReport.Add('Chisquare: %10.3f with probability %10.3f (DF = %d)',[chi2, ProbChi2, DF]); - lReport.Add('G squared: %10.3f with probability %10.3f (DF = %d)',[G2, ProbG2, DF]); + ProbChi2 := 1.0 - ChiSquaredProb(chi2,DF); + ProbG2 := 1.0 - ChiSquaredProb(G2,DF); + lReport.Add('Chisquare: %10.3f with probability %10.3f (DF = %d)', [chi2, ProbChi2, DF]); + lReport.Add('G squared: %10.3f with probability %10.3f (DF = %d)', [G2, ProbG2, DF]); lReport.Add(''); lReport.Add('U (mu) for general loglinear model: %10.2f', [U]); @@ -647,7 +593,6 @@ begin PART := nil; DGFR := nil; GSQ := nil; - NSize := nil; M := nil; LogM := nil; Indexes := nil; @@ -674,12 +619,11 @@ begin VarList.Items.Add(SelectList.Items[i]); SelectList.Items.Delete(i); i := 0; - NoDims := NoDims - 1; end else i := i + 1; end; - if NoDims > 0 then ScrollBar1.Max := NoDims else ScrollBar1.Max := 1; UpdateBtnStates; + UpdateMinMaxGrid; end; procedure TLogLinScreenFrm.Screen(var NVAR: integer; var MP: integer; @@ -880,6 +824,11 @@ begin GOTO 120; end; +procedure TLogLinScreenFrm.CountVarChkChange(Sender: TObject); +begin + UpdateMinMaxGrid; +end; + procedure TLogLinScreenFrm.COMBO(var ISET: IntDyneVec; N, M: Integer; var LAST: boolean); label 100, 110, 130, 150; @@ -1121,67 +1070,70 @@ begin end; // 230 CONTINUE end; -procedure TLogLinScreenFrm.MaxCombos(NoDims: integer; var MM: integer; - var MP: integer); +procedure TLogLinScreenFrm.MaxCombos(NumDims: integer; out MM, MP: integer); var - combos : integer; - i,j : integer; - + combos: integer; + i,j: integer; begin - MM := 0; - MP := 0; - for i := 1 to NoDims do - begin - combos := 1; - // get numerator factorial products down to i - for j := NoDims downto i + 1 do - combos := combos * j; - // divide by factorial of NoDims - i; - for j := (NoDims - i) downto 2 do - combos := combos div j; - if combos > MP then MP := combos; - if i * combos > MM then MM := i * combos; - end; + MM := 0; + MP := 0; + for i := 1 to NumDims do + begin + combos := 1; + + // get numerator factorial products down to i + for j := NumDims downto i + 1 do + combos := combos * j; + + // divide by factorial of NumDims - i; + for j := (NumDims - i) downto 2 do + combos := combos div j; + + if combos > MP then + MP := combos; + if i * combos > MM then + MM := i * combos; + end; end; -function TLogLinScreenFrm.ArrayPosition(Sender: TObject; NoDims : integer; - VAR Data : DblDyneVec; - VAR Subscripts : IntDyneVec; - VAR DimSize : IntDyneVec) : integer; - +function TLogLinScreenFrm.ArrayPosition(NumDims: integer; + const Data: DblDyneVec; const Subscripts, DimSize: IntDyneVec): integer; var - Pos : integer; - i, j : integer; - PriorSizes : IntDyneVec; - + Pos : integer; + i, j : integer; + PriorSizes : IntDyneVec; begin - // allocate space for PriorSizes - SetLength(PriorSizes,NoDims); - // calculate PriorSizes values - for i := 0 to NoDims - 2 do PriorSizes[i] := 1; // initialize - for i := NoDims - 2 downto 0 do - for j := 0 to i do PriorSizes[i] := PriorSizes[i] * DimSize[j]; - Pos := Subscripts[0] - 1; - for i := 0 to NoDims - 2 do - Pos := Pos + (PriorSizes[i] * (Subscripts[i+1]-1)); - Result := Pos; - PriorSizes := nil; + // allocate space for PriorSizes + SetLength(PriorSizes, NumDims); + + // calculate PriorSizes values + for i := 0 to NumDims - 2 do + PriorSizes[i] := 1; // initialize + + for i := NumDims - 2 downto 0 do + for j := 0 to i do PriorSizes[i] := PriorSizes[i] * DimSize[j]; + + Pos := Subscripts[0] - 1; + for i := 0 to NumDims - 2 do + Pos := Pos + (PriorSizes[i] * (Subscripts[i+1]-1)); + + Result := Pos; + PriorSizes := nil; end; -procedure TLogLinScreenFrm.Marginals(Sender: TObject; NoDims: integer; - ArraySize: integer; var Indexes: IntDyneMat; var Data: DblDyneVec; - var Margins: IntDyneMat); -var i, j, category : integer; - +procedure TLogLinScreenFrm.Marginals(NumDims, ArraySize: integer; + const Indexes: IntDyneMat; const Data: DblDyneVec; const Margins: IntDyneMat); +var + i, j, category: integer; begin - for i := 1 to ArraySize do - begin - for j := 1 to NoDims do - begin - category := Indexes[i-1,j-1]; - Margins[j-1,category-1] := Margins[j-1,category-1] + Round(Data[i-1]); - end; - end; + for i := 1 to ArraySize do + begin + for j := 1 to NumDims do + begin + category := Indexes[i-1,j-1]; + Margins[j-1,category-1] := Margins[j-1,category-1] + Round(Data[i-1]); + end; + end; end; procedure TLogLinScreenFrm.UpdateBtnStates; @@ -1191,6 +1143,24 @@ begin AllBtn.Enabled := VarList.Items.Count > 0; end; +procedure TLogLinScreenFrm.UpdateMinMaxGrid; +var + NumDims, j: Integer; +begin + if CountVarChk.Checked then + NumDims := SelectList.Count - 1 + else + NumDims := SelectList.Count; + if NumDims < 0 then NumDims := 0; + MinMaxGrid.RowCount := NumDims + 1; + for j := 1 to MinMaxGrid.RowCount-1 do + begin + MinMaxGrid.Cells[0, j] := SelectList.Items[j-1]; + MinMaxGrid.Cells[1, j] := ''; + MinMaxGrid.Cells[2, j] := ''; + end; +end; + procedure TLogLinScreenFrm.VarListSelectionChange(Sender: TObject; User: boolean); begin UpdateBtnStates;