Sp  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMO/S@oWY[]_a c@e`gikmoq s@u`wy{}O` / @ ` @ `  @ ` @ ` ǀ ɠ @ o /O@o!Aa  Aa!!#A%a')+-/1!3A579;=?A!CAEaGIMOQ!SAUaW[_/cAeagikmoq!sAuwy{}!Aa/Oa!Aa!Aa!Aoǁ!O١!Aa!Aa " B b  !"!O!b!!!!!"!""#B"%b"')"+"-"/#1"#3B#5b#7#9#;#=#?A"$CB$Eb$G$I$K$M$O%Q"%So%%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'su @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMO/S@oWY[]_a c@e`gikmoq s@u`wy{}O` / @ ` @ `  @ ` @ ` ǀ ɠ @ o /O@o!Aa  Aa!!#A%a')+-/1!3A579;=?A!CAEaGIMOQ!SAUaW[_/cAeagikmoq!sAuwy{}!Aa/Oa!Aa!Aa!Aoǁ!O١!Aa!Aa " B b  !"!O!b!!!!!"!""#B"%b"')"+"-"/#1"#3B#5b#7#9#;#=#?A"$CB$Eb$G$I$K$M$O%Q"%So%%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'suA611 ULETEMFLY LTMFPROG LEES DIT U3MAKEGEM MTOS_ACC  NVRAM  SMALLAES  TAKEOFF  WRAPMOUS  MDIAL103 }. .. DOKU ICONS ADRESSE TXT PhLETEMFLYPRG mLET_CONFACC *ULET_CONFCPX @6READ_ME N. .. CHANGES TXT QFUTURE TXT |GLETEMFLYTXT ƯMULTITOSTXT ~. .. GEM1ICONRSC 2GEM2ICONRSC 2LTMFICONRSC 2. .. GCC PURE_C 3FLIGHTSTXT ADRESSE TXT hCHANGES TXT O_SAMPLC  FUTURE TXT GLTMF_LIBC r7LTMF_LIBH  MULTITOSTXT . .. AES H ]TOS H wVDI H . .. PORTAB H . .. DIALIB BLK FSELLIB BLK ,MAKEGEM PRG MAKEGEM RSC MAKEGEM TXT -MESAGLIBBLK USERLIB BLK gWINDLIB BLK  .  .. ADRESSE TXT hMTOS_ACCAPP MTOS_ACCTXT }.  .. NVRAM CPX v!RESETNVRPRG % WICHTIG TXT A .  .. ADRESSE TXT hCRYSTAL S SMALLAESC  SMALLAESH pTSMALLAESTXT u.  .. ADRESSE TXT `hCHANGES TXT Y TAKEOFF2ACC 6fPTAKEOFF2DVI iTAKEOFF2TXT K^7TKOFFICNRSC ]H.  .. README TXT aP(WM PRG l$WRAP_CPXCPX v[`Y VD o<| #Y#YOs//Bg?<JNAO aJ@g3LAY\a yaZXaAYaa ya^aAYhaHy&?<&NN\J@fN$J@g AYa~HyX?<-?<NMP#TJyLgHyO`(0*t|g|g `5| `5|`5|5k5k5k5k K0aL65k5k5k y@Ym@ 9Yf8HWHybBgBgr?Bgp0aFOHWHybBgBgp?Bgp0aFO0OL Nu?/ UO6GyVCA42+0aJHWHoCA2+0aJpPO2+0aJ2+0aJL2+0aJ2+0aJTO&_6NuH0&H6$IHj/ /?p,aFO2H ЀЁ5s5sL NuH<8(o :/$&o&$o*BC8/ / / ?p,aEO2H ЀЁA4(||| bJB4; N .@8@@..@@8SCphg SCrhgSC`6( KC`"h 6)ph g|ovp h gJCj8DD`8DJCkBC yYm 0(|gUCSR0(D2AA"o.24(DA$o24LO6?A?B>/Lno2`2.<nl0`0.:nl2`2.845F0ES@5@4ASB5BC( Jap yY&f2gJDoJEoa6r EH;AI;ApD;@0-H2-HaD 29yHHaDЀ+@<2g < `paA O6*|8*|fp`B@3aT29aPfa`GyHkHkHkHSp?Bgpha>\OpyY&gTy2gLHoHoHo Ho Bg/ aLOHoHoC JazPOpo |5@ro|5A:*<*//Ho HoHR"K Ta O ?/ ?/??BgBgBBBAB@a O /?/?/??p?Bgp*a;OB@ Ta6|?/ ?/??BgBgBBBApaO 2H ЀЁ Tp paByaR| gjKHUHUHRHSpOa;6OHUHUHUHUBgp??pa;OC0 Ta0WHy6rCI@6JAfp`| l`p``BOL< NuH8$H&I(oH"ҁҀA0(|49aTg"|f2(|g$h 0*|"JXI`2(|gC `C |g|f Q$P`X|g|f Q$h`D|f2I|}B9}E}`"|g|f$Q`Cc;A}a;0$H g Ja;j8 g&`R Sg HaTJ@g JLNuH0$H8&IBC`&4H"ҁ҂ҁ02H"r KaJ@fp`RCCo2H ЀЁЀ$2fB@L Nu?6KAy001B1o1o6NuH>O$H86Bo:Bo2H$Ԃԁ02(|>|GSG49aTg 2|gREIyMG 29aTg4|/gJCg~2| g<0J@gS@g`9D `9D"BA0 Jaj`\0HAA/H0Bh`8HV"K0 JaXO*H5pa<R@g$??420aXO?@`0HV"K0 JaXO*H2H ЀЁC/I49aTg >)|f0fTr ohfH>H$ԂԇC(.0)|f,ri f$0)ha:W@lzDHV"K0 JaXO*Hp ohg?|0gdJCg29aTg 4, gH&փւ>28| `BGJGf"Sp AbaJ@g ?|9D "SpAc aJ@g9D"0/g4 Sa<? S?42aXO?@0/gBA Ja` m" nHHAAh/H0Bh`BC`T S00HajJ@g S00aT<R@g2I44gP`RC S00Ha`2/ 4*BRAH>2*oW4/EH…o ESB?B y@Ym>"9Yf64,||f ybg2,||f ybfSoSW2@SA?A?o0|| bH@0;N>>>>,>| ShrphA?h `|k2+I|`BF2?|89YH|CyJQmxQm|pl g JCf F D|oDf DIb09YH|g Qo2/gB o0/a*XO"H0*qB/G ofHSHS"K K29yL0a7PO`HSHS"K Kr0a7PO20a7"K KtBA0a7r0a7ABA0a7~A4/20a8`TpEoCAa*//?/?/?/?/p?Bgp*a3FO`0/g2`20a7Ar0a6OLxNuH:QO$H&I8:c0f49}gvBCIbMy``0HAypfNB?<pNa2\Oa8ra6C NaABA0a620"K JaB0aB?<pNa2\O`RC|$mPOL\8NuH<0QO6/$8/&0@|6rDg԰|bf29aRf3aRB@aEyBHWHoHo C RaTO ??/?/?/ BgBgBBBAB@afO /?/?/?/ ?/p?Bgp*a1OB@ Ra:|??/?/?/ BgBgBBBApaO 2H ЀЁ Rp pa2ByaR`Ey0*(gֶ|af0* `ʶ|bf0*"`09c.f62|HgWAg"UAgWAg ` 0*p`0*x`0*`0*`~|;m|Dn0HA0(H`bpDf29c.fRHx"| |a4fXO&H|xm|n|fB@`pC6` k00a6R@g 0H02`B@POL JCg:BD`00Hrf$r02H$ԂԀs(g0`2I02` RD|$m0L NuHO/H8>vH$ԂԀ0(29aTg"|f4(|g"h 0)|&IXK`0(|gG `G S*P @g(h Ma1:*Ky La1,,C0 oa S0(S@gS@g `0/FW`0/FHW0H@pR@ 4_g4fRC2WAo Cm4fںCl6JCjBC0O L8NuH8$H6H"ҁҀ82Gc.IaT`2H ЀЁA:(4f pEg6pEEg62<Ef.4g0|f"0( |f2(||qg J0raZ0<Ef2g4|f0 Jab2H ЀЁ82Dg|flL8NuH0>QO$o(09aPfaJ0*||fr`BA3aTI{|09Y&|g29aTg 4*|fp`B@9@Gc0BkgBC`0HBtBtRC|2m0,gBCKp`0HBuBuRC|2mB@9@9@ JB@a09YH|gMbar@f/ aXOK0/ LaR:GHo HoHSHRpOa+.O/ ??p?Bgp+a+O ?@R@gr0/H$ԂԀt(gx`BDB?pNa*\O`:0g.@g*:BUtCBA0 La 0/gtCBA L0a t0/g"2 L0a\?@tCBA L0a PBoHoHo HoHoHSHRBBg?<BgBgBgBgBgp???????r?t'?pa*BO<>r@g49aRf"9Y4g?/ ?/ ANXO`B@?@J@fR?/ ?/ aXO?@J@g"Mr La6`:Ho"M4/ 20 LaXO62/gtC L0a ` ofBC:pGg~/ ??r?Bgp+a)O La:Bo`6p4|H"ҁ҂tg09Y&|g?|`p Gg|pGgP/ ??r?Bgp+a(O ?@R@g r0/H$ԂԀt(g |gx`JDgBDB?pNa'\OJCg0/f2gAgtCBA0 La nJCfp?pka'TOBgpka'TOBBgpNa'\OByc,3c.0OLBG:`Wl l0P5pRGH|Xgn*|Fgn|9g6Q@gH`x|Ng~U@g"`f|agP[@gQ@gU@g"`JHaܾJ@gx`BD`6HaݒHatJ@f< fx`BD`HaܚJ@f< fx`BD`HaRHa4J@f< g HaNJ@gx`BD`HaNJ@f< g Ha&J@gx`BD`HaHa^J@f< fx`BD`zHaHa:J@g<:g<?g <*gx`BD`JHaܨHa^J@gx`BD`.Ha܌HaBJ@g<?g <*gx`BD`x`BDJDg TPREol5pg< g< f, TB0P0/ Ka./ / p??Bg?/p.a$O0\OL&H6,I*o(8EcI}"0jf@4H"ҁ҂ s "P2*0HAHAAp(a%>2*0HAHAB4(Bl4 Ma$ M2a~:R@g,/2IEIEC K0aXO<4J@fjfp`JFf|frpa%B@L|xNuH0$H68&Iy2fBy2/ / ??p8a"O 829}g$tE2H ЀЁrgCy J0ra0L NuH YO$H?@86tCgp`p>rCgz`BE>/2H ЀЁ<2`Pp FgrCfJEgBG`~BE`WJGjJEg0BBr B@ Ja>BE2H ЀЁ<24DBf0`JGj0/XOLNuH>O$H:?A 6*I(o:y2fBy20*||fr`BA3aT|qg09Y&|gM HoHVHVHVpOa!O8: C|rg|fpog$r0H$ԂԀr(g r( /aXO`tpogBBr J0a:@f: 0o fLBBr JB@a~:J@fBBr0 Jal:`(<C0 Ja/ p?r0H$ԂԀ犂r( ??/?/?/?/Bg?p/a O:BTB@`|fJpof 29c.f8BBrB@ Ja<H"ҁҀG>JFg4+||fHoHoHo Ho ?/ aچOk/ ?/ ?/ ?/ ?/ p?Bgp*a @OBy2r0Cy Japogx`BDtDr0 JaT<H"ҁҀG4+||fxk f 2<kgFfkHoHoHo Ho ?/ aO/ ?/ ?/ ?/ ?/ p??p*aOr0Cy Jaj`pog22|g |8g`rtr0 Ja:`^trB@ Ja:`N0/fJ2|g|8g SAgQAg"`0BBrB@ Jab:`tr0 JaR:`tr0 JaB:BTp`/ / / ?/??p7aOOL|NuH0YO$H/pPaXO Ja "&GcJCf@HSHop}aPO fHk Hop}aPO g/pQa|XO"W Ja Ja&JCg 2\0g C Ja2p` Apa:B@XOL NuH>O0$H6?A(I?Ḇy2fBy22H ЀЁG?T0*||ft`BB3aT|qg09Y&|grkg of(HoHoHoHopOaO k ,P Na*0/@@29cycf"NAXp(a&B9pog/H|Pgn |-gSAgSAg|g`|SgP| gSAgN`ST0k6HazJ@f<26g`ST0k6HaXJ@f<26fRT`RTTo 26Ha0J@f<26f`RTTo26Ha J@f<26g`Hycr"L0 JaXO`HycBA"L0 JaXO`ADaJ@gxCDADabCcADa B@ADap.JGopK Mr?0a:?@0aB0/B5rog: k :(BD` / / p??5@H??p.aORDTo 5 @l`/ "M0 JaLXO3V`ADaJ@gCDADaCcADaXpog*ADpa.JGo>t2palAcr0aL`0KCD Ma`Cc Ma MaJ@gB@ADa.JGo N2H0a 0a> /-f0/ / p??Bg?p.aOBT`/ / p??Bg?p.aO0B60 Ja/ / p??Bg?p.aO`pog/H|H| bA2;N":RBT`8`HyXr"L0 JajXO`rHyXBA"L0 JaRXO`Z0? k ha~S@2@l0` k hafS@ k "h 1XfaJgH?@`ZHo/ p??/Bg?p.aO/ / p??Bg?p.aO` of09Vg k /a XOByV3cc of ByV` of3V29c0HAHAA}"B0"k iaS@2/ʲ@l` k hax"SA?A k "h|/ Pg pg Fg ff k ,h`RNg<_f8/` _fSDRNgJDf`RN _gf ._fH|Fg| g0|g| g2`XHaJ@fL`:HaJ@g.<:g(`Ha*J@f*`HaJ@g <?g<*fHa&J@f fRoHa0o g2/ k "hX/ / ?/??/?p.aO0/ k "hp`/ / ?/??/?p.aOOL|NuH0BAt`0$Q&QH|]g|g`BB&QB&QRf6H!8RA$QgAoJBf0L NuH $H:BC8`*0H/2H rac0H ra&RDDn0L8NuH>O?@/HryY&g:49aPfaEyGyHyyHyyHRHSpMaO o(H|M|n <"oA aHB.Ky60H U!v$.C Npa> WR [fpCAa8 N0a?@A0a:VEBF`\2H ЀЁ(UI0tF8JCgp@`p9@2H4B9A0H va^9@2I)v lRFFn2H ЀЁ U1<`2H ЀЁ Up8RF|mJCgp`poT@2İAoJCgp`poT@`0?@JCg U2(.H`BAAo0`JCg U0(.H`B@V@>29Y&|gt`BB?BBF`r2H ЀЁ(UItF8l]0/2ĐAH4BR@9@pG2HA9@rE9A0o9@2I)v RFFnSFpF U1@4H"ҁ҂ UBh Uh <`2H ЀЁ UhRF|m0/gH"ҁҀ Uh0/ U1@2TA U1A|o Uh` Uh U09YLh |h Uh3aRHoHo HoC UaO p?pkaTO 9Yg @"h")8f i0g 9Yf( yYl29^fB?<pNa\O?| `Bo >9y?/?/?/ ?/BgBgBBBAB@aϾO /?/?/ ?/?/p?Bgp*a8OB@ Ua |?@?/?/?/ ?/BgBgBBBApajO 3y0/ gB?<pNa\OBgpkaTOByaR2/H ЀЁ Up po`//?/p4a\OOL|Nu??O6ryY&grJ@oj|@ld|%l@Ad&80`BD0HAc"pAa~CiAa*r Ai&pCF@a"HAaChAaApaB@` ?p5aTOO86NuH 68J@j6DCEAd00HHCdp"q Ja|g "yd Ja J`RHg<%f %fpA J/|fp`p _a4SBg SBgSBg`2DAH` "<`r|f"< `0HLNuH>OJ/H?A?B&I4HEwCAyaIh"LA(aK"MA(a^CA(aR6o o8o0CWl6U`0-Coo6/m0-Dol 8/m`0-Doo8/m0/C62/D o0?C?DGpM(0/g2,HyHH/A4,H…yHH/B҂ ЀЁn`0/g| //0/a"ll 0/a2`2,H a* //0/all 0/a2`2,H a. Ї"/aR@6/HÇ8/Hĉmm m m0all 0a>`>,0all 0az:`:,C MaJ@f Bo:,`?|p lH7@H7@7E0/g r GH7AI7A4,E7B`B@7@7@7@BF`H2IFI03H23Ha29yHHaЀ2IA!4JFJ7yH Bs RF|m&8 Я'@B?<pNa\OABA09bavJEg<JDo 0-ER@`0- =@=m JDo0-`0- ES@=@rV=ABn 0.lS@=@ rE=A=U(JDo0-`0-ER@=@*=m,JDo 0-ES@`0-=@.=j0 JDoB@`0,Ej2=@"=j4$0."ES@=@&HS"J Nr09babXOJGg(0/g JCo 2- GRA`2-=AJDo0- `0-=@JCo2- `2-GSA=AJDo0-`0-=@rn=ABn0.GS@=@2,ESA=AJCo0`0-GR@=@8JDo2- `2-=A:JCo0GS@`0-=@JCo0*0`0*4GR@=@0JDo2`BAj2=A20.0GS@=@42.2lESA=A6Hk"JA09bra6XO/ "J Mr09ba"XOJGg0/g/ CA0r09baXOJEg/ CA r09baXO0/gJCo2`BAj0?AJDo0`B@j2?@ JCoBA`20*4A?@ JDoBA`20*2lS@A?@JCoBA`2pm@?AJDoBB`4j2?B0/lGS@?@JDo2`BA0*2lS@A?@HjCA r09baXOJEg>"NAaƴJDo0,E`B@j2=@ ES@=@Hj"K Nr09baXOJGgp0/gjCAajJCopo`0/G=@JDoBA`2j2=A0.GS@=@2.lESA=AHjCA09brahXOB?<pNa \OC(Aaj0j00*0lS@5@4 ohh"MAaėoo0/f,2/f$OL|NuH>O/H829aTg4(| gv`BC2HGwIyC LaK"MA(ažM pC Na ,8B?<pNa \OE"JA(a$CA0aABA09ba HV"K Jr09baRXOB?<pNa \O309ba?-?-?-?BgBgBBBApaO JCgxUHo4Ho:?,?,?,??-??-?-pGa *OJCg 0/6|D?@6m2lAoQo6?-?-?/8?/O*oFHyyHyyHyyHyyp?BgphaO09y0HIw M09y0aJ&Jglr?pkaTOa3b29aTg4-| gx`BDr@g(/?HV"J4/ M09y02/aO ?R?VpGgJDg?l(2,(|F4o49yyyڲBoQR/?HV"J4/2/09y0 MaO `JDg|W09babHVHR?9y?9y?9y?9y?/?/?/?/pGaOa3bJDg 2|F4o49yyyڲBoQR/?HV"J4/ 2/ 09y0 MaO BBgpNaZ\O l8aB09baBgpka>TOOL|NuH8:O&o*I.M009aPfaEyHjHjHjHRp?BgphaO09y0HEw K09y0al&2kJg49Y&| gr?pkaTOax8H|aJDg Ai.a" a6%H8CA(a8HVHTC KaPO@NAO $_NuHR??/?<BNAO $_NuH>?NAO $_NuHR??<>NAXO$_NuHR?HP?<=NAPO$_NuHRHP?<ANA\O$_NuHR?HP?<x>x~|~~~~~?,4,4 ,4,4,4,4/5UU\*5\+58\+858\+858\+85\  @ "Dă H@@*R         ?!@ @? P>  ڎ.T 2$0B ""@*, "|$J> p"4,"Br\$JT "l.p<$$2 $ 0VH2^Jhz HT 0  D f2000H0  N#qwmp#XwW| ;67;3Z7ɖfqWfhO>p1GǢ?Lz^Tf,$FGð>tQheE{,!"1^8pmS5-ՒrPQ0J.0.a': êiE{()`R慟. =J.YgF.RVA)6 ,SEUpՐfBG(??4VE6jp8'=@MdٝUCdsu$AU,z~BX7mRDV8Yf께Q/UM;FQ SʻgfD.n5Uq%AلB>Ȅ$ӷ1MJwK RKH haj5DP'vICnK";8xZ0*D@0;IݦTwݓVDB[C dzXℴ{lF8pB׏PW'=4T(P=zPZv&jR0`:f``T>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#T3T k #T Ј<.@#T JyTg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON1f0 J"LN#t? 9:hg @N 9:lg @NN6?<LNAH0&H$I& Ia3r` t`(؂3H2(f RbA` R$eؑL Nu/ / $H&Ia3lp\ Ja3H&H"o Aa3V J&_$_NuHBCCa"fCB@ Ja"ZBE`(0H sa2@o0`0H sa26REEnBEIJR@g"2H6H$Ԃԃ r(  J0a"0O$L-$|/| `|>-(/|` `| >-*/| pD;@P// ?Bg??r@?/- m h NO Whjk`: l f0-$|gz`BE`> l"j "j Whk@0, | mPb2(|g&4, |gk Whk j `"k j `j WhkRC|m$0-Lg<2-HmJg2C mpa/-?/?/?/?/p??p*a(O;mHJOL|fB@`pOL@0;N2222t22nL2****nL22222nL2::::nL2BBBB2r2b2l&a\8`a`a8r Uhg4praN4rp UaB4rp Ua6p&CVA a"X;kT2 m@ Pe 0(|gpm2`0-2;@Bm;|JDgf``trp Uatrp UaBR` 0@; RR Rm;|2 m@ Pe 0(|gpm2`0-2;@Bm;|aHRHRHRHRBgp??pa O` mo` mo`HRHRHoHRpOa OHo HR/p(?p,a O0/ o lr`r?A HzXBgHmBgpm??t?p(?r'?/ m h(NO`2 mo(Hmp? m hVN\OBp?pNa 2\OHzHmBgpm?r(?t'?/ m h0NOHmBg m hVN\O`|zCHŋm2A45 0@BHI llp0-F2,Asg 43FBmF`n0,@23mF l2H ЀЁ"U"q$"/ oN?(?(?(?p?rC?p*aXO`& l f0-h|g mh l2H ЀЁ"U"q$"`mh`~|zCHŋm2A45 0@BHI ll^p?2-F4,Bs gt`BBr"l0 UaTO<J@gS@g`0,@23FAmF`l0,@23mF`Z l fPp?2-h|gt`BBr"l0 UaTO<J@gS@g`mh`mh` ;|`;|`;|`;|#|zCHŋm2A45 0@BHI0,|g U@gS@g&`4~/|U. `"~/|U.``~ /|U. lf0-h|4mh/?"o BB2pm Ua\O lf@0mh`60/|g|g| g`p8CD m@aBD` mo0/|Hg|8g|gD|2g`HzBgHmBgpm?r?t&?p(?r'?/ m h(NO`HzBgHmBgpm?r?t)?p(?r'?/ m h(NO`jHz\BgHmBgpm?r?t?p(?r'?/ m h(NO`4Hz&BgHmBgpm?r?t?p(?r'?/ m h(NO|g4r0| UaJDfb`HyN+p?p4a\OB@OL/&8/(:/*/L/T6/V(oXHoHoHo Ho(pOaOC0/P Na 2H ЀЁG:/4/kRBB<E`HoHoHo HRpOaO0/Rg־Cl&0oEH2GHa2/kHa8`(0GH2/4+BBHan2oEHa820 LaTgnC0 Na //\?????/\/aOC0 NaCAa/po ?ro ?to ?po ?r??/^p*aO<?R0/fO L\NuH?:O,oL8/R>/T6/V(oXHoHoHo$Ho$pOaOC0/P NaD2H ЀЁG:/4/kRBB<E`HoHoHRHo$pOaHO0/RgоCo2oE4CH0/k8` 0C2/4+BBH2oE820 LaRTgxC0 NaC0 Na//\?????/\/aOC0 NanCAa/po ?ro ?to ?po ?r??/^p*avO<?R0/f O L\Nu// $o0/ J@gS@g`/ aXO`/ ?<pNa.\O$_$NuHQO,H(Ip?pkaTOGNfHoHoHo Ho p ??phaOKV`ZC LaJ@g.C MaJ@g"/?/ ?/ ?/ ?/ p?Bgp*aOHoHoHo Ho p ??phaO0/g2/fBgpkatTOPOLxNu/ / &H$Ip?pkaXTO?*?*?*?p??9Nfpia8O EVHjHjHjHRp??9NfphaO7R7jBgpkaTO&_$_NuH $H<BCxz4RBg SBgSBg`2z6E`*x`&2H ЀЁ224Dg0`p Agv`EJCj0LxNu?6J@f rB@a606NuH?>O&oD*oJEBRI0/H Ka8 Ka 6BDzM`:0g @g8BTHR/ p??Bg?p.a$OHoHVHoHoHoHo"/ BgBgBgBgBgBgBgBgBgBgBgBgp??r?t?paO<<r@g4||bB4; N ,nnC Ka\HWHoHoHop ??9NfphabO0/yNffB Ka6`8BgBgBgBgp ??9Nfpia0O `C Ka`3VBE8pFgJCg2/0a>`BGJGgHT/ p??p8aO :``>HVHT/ ???p7aO:2gHR/ t????p.aO0|Hg|8g|g|2g`:5;GBE8pFgB/ ?/?/r?Bgp+a\O 8R@f rpalBT`HT/ ?/ ?p8a6O :JEg0g@gHR/ p??Bg?p.aOJEf0OL|NuHQO(H:&I*o0BC8HoHo /?p,N O2H ЀЁA.ME 4||| b^B4; N *T@TT**TT@SCpVg6SCrVg.SC`*2H ЀЁ64 KC`2H ЀЁ t 6(pRg|ovp RgJCl8DD`8DJCmBCoo2H ЀЁ<4D4BB04DB& g67o7F7@" g":;o4/FSB;B6/@SC;CPOL|xNu?/ QO&H6BCNXO/ ?/ ?/ ?/ ?/ p??p*N OPO&_6NuH $H86:JAlH$ԂԀr( `2H ЀЁ爇r JEg0 JNL8NuH>O(H8BBEWr`RB6KJ0g|m6KG09@9AM fR&KHU"NB@ LNXOC, MNp nH7@ H7@7nAtr0*\N6*|0+ H2+HN2HNЀм@'@6$HIWZtoHԞBBF:G`82H ЀЁЀ rN $Ӽ@o0`2H ЀЁЀ rN <REEn0A rhAl>2@4H…B4(hBo>@2HA2/F4H…B4hBoF2HA?BGO7o7G7F7@7Cz`XpE2AEI7777BspEH$ԂԀԂ7( '( BspE777REEl0@CHBs7 t2 K0/NHIHTHoHo"Ho(pONnO0/gBA`r?AHS?/?/"p?Bgp+NDO :KR@fC KB@NBF`RC0 KN"MANptEH"ҁ҂ҁrf(HS~?r??-?-?-?Bg?p/NO|~HTHoHTHoHo*Ho0BBgBgBgBgBgBgBg?/0?/0?/0?/0??/Hp??r?pNO<8r@g84/B?B?E|HgRnSBg|g|+gd`|Pg |gr`rREElz|mptEH"ҁ҂ҁrf`JSE|l:|mptEH"ҁ҂ҁrf`"z`REptEH"ҁ҂ҁrf`zBG og8HSp?toH"ҁ҂ҁ?2?-?-?-?Bg?/*p/NO|g@"M0 KN:HSp?tEH"ҁ҂ҁr??-?-?-?Bg?p/NJOpDg|g4HSr?pEH$ԂԀԂ?2(?-?-?-?Bg?p/NOHS?/?/"p?Bgp+NO :R@fC KB@NBF`RC0 KN"MANptEH"ҁ҂ҁrf(HSp?r??-?-?-?Bg?p/NO|pDfJGf KN||gptEH"ҁ҂ҁrgv`6:HTHTHTHTBgp??pN8O0O LNAXONua3:fp`ް|c/ ??<>NAXO$_JkpNua3:fpNuHR@W@e >?NAO $_JkNua3:fpNuT@alJ@gX  _H&Hx&SgkJ9SRkvf~a<g&< g<<gP< g< e޸dRa`JgSSKpap apa`Rp aSRp a`bJg^SR`TxB9SR`Jx B9SR`?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu/ /?/f HN6(.gHMS\|:?<NATO|ATNBg/?<GNAPOJf\B.UN _0S@k "H`W,_$_NuHR???<NM\O$_NuHRHP?< NA\O$_NuHRHP?<INA\O$_NuHR/?<HNA\O @$_NuAXX1@ 01BHB0ps"<SHRNB$_AY~0NuHRHQEXX5Q CS" #H o #H AZ#H$d5| psNB _0Xd$_Nuret`#SAXf 1A rm$<af#ZSNu#SAZ#S3Xvrfta<#Y~S#[SNu J<J@JYJ]JxJwJzJwJw JJwJw JJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJwJJwJw JJwJw$JJwJw KJwJwJjJwJwK*JwJwK;JwJwKTJwJw KtJwJw#.8Wu0+ * UU`UUj+66 ?* : : A : @: @; *%A %   @;$ @ ;@   @@A @;\ @@;x@ ; @@A@;@@;@ ; @@A@<@ @<  @ <<!$ "@$##@A"@ >4>P >l>>>  KK%KA >  KK>? ?0 @8 ?L  ?h  ?? ?@FDGfK KKKKLLLLLLL"L)L0HL>H LIHLZHLgHLuHLI LHLH LH LHLH LHLHLHMMI M M/ 0 @ @000Let 'em Fly! V_.__ light999 1991-92 by Oliver ScheelConfig. CPXSelectionAll XX1X2X3X4InfoConfigure Visible SwitchesInformationd.h. es darf fr nicht-kommerzielleZwecke frei benutzt und kopiertwerden. Meine Adresse:Rothehausstr. 28W-5000 Kln 30 (Germany)Email: Oliver_Scheel@k2.maus.deMan fliegt nicht mehr ohne ...SaveOKCancelBackLet 'em Fly! ist Freeware,@(#)Let 'em Fly! Configuration Module 1.20 Apr 5 1993OffOnNoYesHollowSolidNormalInvertUscoreColChr Let 'em Fly! Key Dials Extended Editor Alert-Boxes Flying Dials Fly Type Ghost Flights Dials to Mouse Jumpin' Dials Save Position Send Redraw VSCR Support Form Grow/Shrink Graf Grow/Shrink Niceline Fly Delay Shortcut Disp. Shortcut Col. Alert-Border *.*LET_LGHT.PRGLETEMFLY.PRG*.PR?PATCH:[3][| Wrong File!][ Abort ][1][| Not enough memory!][ Abort ][2][|Save CPX Configuration?][ Yes |No][1][|WARNING: Versions of LET_CONF|and LETEMFLY don't match!][ Abort |Ignore][1][|Let 'em Fly! not installed!][ Abort ]LET_CONF.CFG\NjhZ\jjjjjjn Let 'em Fly! Config. [1][ Out of windows. ][ Cancel ] Let 'em Fly! WWXX:XHXP  XXXvZY~[XXXvY~Z[r  2N "  2"fPL&j"  "H: N>& 2:@,$*h T$J2 H**.b 2F LD.R    . 8t20H`0`0`0`000H000   |x}# ]=oEZ?b2p6g; z6Bb!b0~: $@l;f7|}M-Dˌ#?qu W>g!I,ŭ^T()i9tB܌Ż#*(EDA~낻& +!A9)Aswr>=E@AwP>w a1Awӫ#Ns#!?) A!tiGGWWqN;Uaj67na^P:ϡc*b0uYW2XA m௣P~:5^jL65,k9:yF4A9tf!161-!?9y*d$Vcq)rv&-9!G* ]*"6eKbeS9W/ڴO 2>+tQ8+ʨѢ)@کtY(VNxdLTMFLETEMFLYly!#.8Wu0+ * UU`UUj+66 Let 'em Fly!`fN H0&H$I& Iar` t`(؂3H2(f RbA` R$eؑL Nu/ / $H&Ia`p\ Ja<&H"o AaJ J&_$_NuHBCCaCB@ JaBE`(0H sa@o0`0H sa6REEnBEI,K3`C0HE@Aah0H"s2IEAAa0H sa/0HC2IEAAaC0HE@Aa0HE@A2I/REEnzHoHo ?/T??Ho m hNO>R@g"2H6H$Ԃԃ r(  J0a<0O$L-$|/|z `|>-(/| `| >-*/| pD;@P// ?Bg??r@?/- m h NO Whjk`: l f0-$|gz`BE`> l"j "j Whk@0, | mPb2(|g&4, |gk Whk j `"k j `j WhkRC|m$0-Lg<2-HmJg2C mpa Z/-?/?/?/?/p??p*azO;mHJOLQO(H:&I*o0BC8HoHo /?p,NO2H ЀЁA.ME 4||| b^B4; N *T@TT**TT@SCpVg6SCrVg.SC`*2H ЀЁ64 KC`2H ЀЁ t 6(pRg|ovp RgJCl8DD`8DJCmBCoo2H ЀЁ<4D4BB04DB& g67o7F7@" g":;o4/FSB;B6/@SC;CPOL|xNu?/ QO&H6BCNXO/ ?/ ?/ ?/ ?/ p??p*NOPO&_6NuH $H86:JAlH$ԂԀr( `2H ЀЁ爇r JEg0 JNL8Nu/ QO&HBCB@N(XO/ ?/ ?/ ?/ ?/ p?Bgp*N OPO&_NuH0EG562IA0v`B@2A7RC|oBC` 0@7(RCkmBC` 0H'VRCkmA0N:vAH` 0@"Z2RCkmBC` 0H"Z"^RCkm0L Nu"H00<NBL NuS0QNuprJg0k A`NuH06&Hp Cgp@CfFpC?/ ?<=NAPOJk&8jaTpCgF?<?p/?<BNAO Jj.`Br߲fNAXONua35p`ް|c/ ??<>NAXO$_JkpNua35pNuHR@W@e >?NAO $_JkNua35pNuT@alJ@gX  _H&Hx&SgkJ92kvf~a<g&< g<<gP< g< e޸dRa`JgSSKpap apa`Rp a2p a`bJg^2`TxB92`Jx B92`?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~/ /?/f HN.gHM2|:?<NATO|ATNBg/?<GNAPOJf\B.UN _0S@k "H`W,_$_NuHRHP?<INA\O$_NuHR/?<HNA\O @$_Nu ,,,,,,,,, ,,, ,,,,,,,,,,,,,,,,,,-,,,,,,,,-,,,,,,,,-,,- ,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-),, -5,,$-Y,, -y,,,,,-,,-,,-,, -,,#.8Wu0+ * UU`UUj+66 ">*   A 6 @R @n *%A %   @ @    @@A @ @@@  @@A@@@2@ N @@A@j@ @ @ !$ "@$##@A"@ @&) '@)((@ '@%@ +/ ,.-- ,-/-*%.  A . Jf         * F  b ~      ! !&  --%.A !B  .. !^!z ! " !  !  !" """',).( .U.Y.Y.U.\._.c.j.p.w.~..+N.+F .+F.+F.+F.+^.+f .+F.+F / +V /+V/%+F /3+F/E+F/W+F/a/l+n /|/  @ @000Let 'em Fly! V_.__ light999 1991-92 by Oliver ScheelConfig. CPXSelectionAll XX1X2X3X4InfoConfigure Visible SwitchesInformationd.h. es darf fr nicht-kommerzielleZwecke frei benutzt und kopiertwerden. Meine Adresse:Rothehausstr. 28W-5000 Kln 30 (Germany)Email: Oliver_Scheel@k2.maus.deMan fliegt nicht mehr ohne ...SaveOKCancelBackLet 'em Fly! ist Freeware,@(#)Let 'em Fly! CPX Module 1.20 Apr 5 1993OffOnNoYesHollowSolidNormalInvertUscoreColChr Let 'em Fly! Key Dials Extended Editor Alert-Boxes Flying Dials Fly Type Ghost Flights Dials to Mouse Jumpin' Dials Save Position Send Redraw VSCR Support Form Grow/Shrink Graf Grow/Shrink Niceline Fly Delay Shortcut Disp. Shortcut Col. Alert-Border *.*LET_LGHT.PRGLETEMFLY.PRG*.PR?PATCH:[3][| Wrong File!][ Abort ][1][| Not enough memory!][ Abort ][2][|Save CPX Configuration?][ Yes |No][1][|WARNING: Versions of LET_CONF|and LETEMFLY don't match!][ Abort |Ignore][1][|Let 'em Fly! not installed!][ Abort ]55566*62  ,N "  2"fPL@&~j"z  " H**.b 2F LD.R t20H`0`0`0`000H000   `X-HPG72RaZ];MWRWT"ٙ)He= +Z } YM+++mPK̰P`5O ) 0%54k%vEMdKfz.f\zMXCzPX )WdrHGEJkva[b\TDEP[ `M1;cDBa7ha 5-+uZ8ۈqS0@]( a (}_c:T%$Sb#ujZ-߼)uun;y_%Q9S,Ti1 VLet 'em Fly! V1.20 (c) 1991-93 by Oliver Scheel ... this software goes Freaky Deaky! Let 'em Fly! ist Freeware, d.h. es darf frei kopiert und benutzt werden. Davon ausgeschlossen ist die gewerbliche Nutzung. Diese ist nur mit schriftlicher(!) Genehmigung meinerseits mglich, eingeschlossen davon sind PD-Versande! Die Rechte bleiben in allen Fllen bei mir. Zuwiderhandlungen werde ich strafrechtlich verfolgen. Zu Let 'em Fly! gehren folgende Dateien: - LETEMFLY.PRG Das eigentliche Programm - LET_CONF.PRG/ACC Das Konfigurationsprogramm - LET_CONF.CPX Das Ganze als CPX-Modul - GEM1ICON.RSC Die originalen Atari Icons fr die Alert-Boxen - GEM2ICON.RSC Die Icons aus GEM/2 fr die Alert-Boxen - LTMFICON.RSC Die Let 'em Fly! Icons - LETEMFLY.TXT Diese Anleitung - CHANGES.TXT Die nderungen zwischen den ver- schiedenen Versionen - MULTITOS.TXT Eine Info zu Let 'em Fly! in Verbindung mit MultiTOS (Wichtig!) - FUTURE.TXT Ein Statement zur Zukunft von Let 'em Fly! (Wichtig) - READ_ME Eine kurze Info Let 'em Fly! darf nur komplett mit diesen Dateien weitergegeben werden. Weitere Informationen stehen in der ausfhrlichen Anleitung LETEMFLY.TXT. Meine Adresse: Oliver Scheel Rothehausstr. 28 W-5000 Kln 30 (ab 1.7. 50823 Kln) MausNet: Oliver Scheel @ K2 EMail: Oliver_Scheel@k2.maus.de WICHTIG: Meine Adresse kann sich zum September '93 hin ndern! Nheres ist dann der Zeitschrift ST-Magazin zu entnehmen. Let 'em Fly! Man fliegt nicht mehr ohne ... m5tŋwB iiC9PKh!c1 MELDUNG/STOP QHLUK-J,JJ,)KWH/**** WICHTIG *** Durch die Umstellung der Postleitzahlen zum 1.7.93 lautet meine Adresse von da an: Oliver Scheel Rothehausstr. 28 50823 Kln Weiterhin wird sich meine Adresse wird mit hoher Wahrscheinlichkeit zum August/September hin ndern. Nhere Informationen sind dazu dann aus der Zeitschrift ST-Magazin zu entnehmen. Oliver Scheel T= UO9YQ/{crSbڼMPKkN?p SETZEN/ABB3,.IͳIJM̫,IͬJRPqR3b`1 E)y ) 9y% )E y@Ni^Bb^JjQMIUHON˫JLLet 'em Fly! Changes ==================== 1.19 (Happy Birthday ...) ---- - Niceline macht den GFA-Basic Check jetzt anders. Es wird nicht mehr auf die `1' getestet, sondern ob sich hier ein non-Space im ersten Accessory-Eintrag befindet. - Der Niceline-Patch fr Objekt-Bume wurde ber eine Funktion von auen zugnglich gemacht. Damit kann man jetzt auch seine eigenen Mens (auch PopUps) mit Nicelines versehen. - Niceline ermittelt jetzt das AES-Workstation Handle korrekt. Vorher wurde immer 1 angenommen, was ein Relikt aus den Hack-Zeiten war. - Das Sichern der Mausform wurde wieder gekillt, da es mit einigen VDI-Treibern (insbesondere TrueColor) Probleme gab. Bevor Atari nicht eine legale Mglichkeit zur Verfgung stellt, wird es auch nicht von Let 'em Fly! untersttzt. - Bei den Eingabefeldern gibt es im AES ein undocumented Feature, welches es erlaubt den pvalid-String zu krzen. Let 'em Fly! sollte damit jetzt zurechtkommen. - Rundungsfehler bei `Dials to Mouse' beseitigt, der bei Boxen mit der Rahmendicke -1 (ohne SHADOWED und OUTLINED) auftrat. 1.20 (MultiTOS revenge) ---- - Die Farbzuweisung der Icons in den Alert-Boxen wird jetzt ber die Resource geregelt. Der globale Regler existiert nicht mehr. Sollen die Icons neue Farben bekommen, so mu man mit einem LET_ICON.RSC arbeiten und dort die Farben mit einem Resource Construction Kit ndern. Damit kann jetzt jedem einzelnen Icon eine andere Farbe verpassen. - Interne Boxen unter dem neuen AES jetzt im 3D-Look ("Ich setze meine rosarote Brille auf ..."). - Befinden sich in einer Dialogbox Kstchen mit Pfeilen und ist zudem kein editierbares Feld vorhanden, so knnen diese Kstchen mit den Cursor-Tasten bettigt werden (z.B. bei einer Liste). - War der String beim Einfgen in ein Edit-Feld vom Clipboard oder der History lnger als das Feld, so wurde die Resource zerstrt. Den Fehler habe ich aber erst in der 1.19 eingebaut (gut wa?). - Die Anzahl der Farben wurde nicht korrekt abgefragt, was dazu fhrte, da unter TrueColor-Karten keine farbigen Shortcuts mglich waren. - Es kam manchmal vor, da die `ColChar's nicht genau den alten Buchstaben berdeckten. Sollte nun nicht mehr passieren. - Bei [ALT]+[Tab] werden jetzt versteckte Objekte bergangen. - Der Niceline-Bug ist nun drauen. Vorher strzten einige Programme, wenn Sie als Accessory installiert wurden (z.B. 1st Base, qed) ab. - Fr einen form_error(36) fehlte ein Tabelleneintrag, was unweigerlich zum Absturz fhrte. - Ein form_do(tree, -1) auf ein editierbares Objekt fhrt jetzt nicht mehr zum Absturz. - Wegen einigen nderungen im neuen AES kann man u.a. den Extended Editor *nicht* mehr ber die Flags ausschalten. Fr weitere Infos zu Let 'em Fly! und MultiTOS bzw. neues AES verweise ich auf die Datei MULTITOS.TXT! - Einige andere kleinere Anpassungen an MultiTOS. - Im CPX wurden ein paar Fehlerchen beseitigt. Bekannte Bugs & Probleme: ------------------------- - Wird die Box durchsichtig gemacht und der ist Speicher knapp, dann kann es sein, da sich die Box beim nchsten mal nicht mehr verschieben lt. Tja, anscheinend ist das GEMDOS nicht immer in der Lage einen Block mit der Lnge X zu free-en und danach wieder einen Block mit gleichem X zu allozieren. Auch POOLFIX schafft hier keine Abhilfe. - Aus irgendwelchen Grnden sind manchmal die Icons bei den Alert-Boxen in Let 'em Fly! zerstrt. Bis jetzt bin ich ratlos. Falls jemand einen reproduzierbaren Fall hat, sollte er ihn mir nach Mglichkeit miteilen. - Unter Overscan werden nach dem Runterschalten der Auflsung die Dialogboxen nicht (immer?) richtig zentriert. Die Ursache ist aber bei Overscan zu suchen, da Let 'em Fly! die Bildschirmausmae bei fast jeder Funktion erneut abfragt. - Es gibt ein undokumetiertes Feature in den Alert-Boxen, welches von Let 'em Fly! momentan nicht untersttzt wird. Es handelt sich dabei um das Escapen der Zeichen []|. )k Let 'em Fly! ------------ (Flying Dials and more ...) Version 1.20 April 1993 (c) 1991-93 by Oliver Scheel Freaky Deaky Software (it's Freeware) Einleitung ========== Tjaaa, eigentlich wollte ich nur mal sehen wie schnell das VDI des Atari ST sein kann, doch daraus ist dann wohl etwas mehr geworden ... Jeder drfte inzwischen fliegende Dialogboxen kennen. Sie sind z.B. in `Gemini' (dem Shareware Alternativ-Desktop) oder in `Rufus' (einem Terminalprogramm) eingebaut. Zudem sind diese Dialogboxen auch ber die Tastatur bedienbar und hufig bleibt einem so der fliegende Wechsel zwischen Tastatur und Maus erspart. Leider sind diese Dialog- boxen nur innerhalb dieser Programme aktiv und sobald man diese verlassen hat, steht man wieder ohne da. Und hier setzt Let 'em Fly! an, und viele `normale' Dialogboxen sind jetzt auch mit diesen Features ausgestattet. Die wichtigesten Features: -------------------------- - Fliegende Dialoge: Viele Dialoge werden flugfhig gemacht. Hiermit kann man Ver- decktes sichtbar machen. Auch die Alert-Boxen knnen jetzt flie- gen. Durch ein ausgeklgeltes Verfahren sind die Boxen auch ohne Blitter beim Verschieben ertrglich schnell und optisch opti- miert. Zudem luft die ganze Geschichte speicherplatzoptimiert ab, d.h. auch wenn wenig Speicher vorhanden ist, ist es in einigen Fllen noch mglich die Boxen zu verschieben. Weiterhin merkt sich Let 'em Fly! innerhalb des jeweiligen Progamms die Position der Dialogboxen, d.h. da nach dem Ver- schieben einer Box diese dann beim erneuten Aufruf an der letzten Position wieder dargestellt wird. Auch virtuelle Screens a la `BigScreen 2.0' werden untersttzt, d.h. die Dialogboxen werden in dem zur Zeit sichtbaren Aus- schnitt zentriert. - Tastaturbedienbarkeit von Dialogen: Ebenso viele Dialoge kann man jetzt ber die Tastatur bedienen. Bei ganz bestimmten Mustern werden auch die Sondertasten [HELP] und [UNDO] belegt. - Zustzliche Editierfunktionen: Sind in einem Dialog editierbare Eingabefelder vorhanden, so werden zustzliche Editierfunktionen bereitgestellt. U.a. wird auch das GEM-Clipboard untersttzt, sowie eine History der letzten 20 Eingaben gefhrt. Einige Editierfunktionen knnen auch in Programmen Wirkung zeigen welche eigene Routinen zur Dialogverarbeitung benutzen. - neue Alert-Boxen mit neuen Icons: Die Optik der Alert-Boxen wurde berarbeitet. Sie sind jetzt nur noch so gro wie sie wirklich sein mssen. Weiterhin kann man neue Icons nachladen. - Grow-/Shrinkboxen abschaltbar: Es lassen sich auch die Grow- und Shrinkboxen abschalten, um so einen Geschwindigkeitsgewinn beim Zeichnen von Dialogboxen u.a. Dingen zu erzielen. - Kein Flugschein erforderlich! Ja, Sie haben richtig gelesen. Fr Let 'em Fly! brauchen Sie keinen Flugschein. Grundkenntnisse in der Bedienung des Steuer- aggregats sollten aber trotzdem vorhanden sein. Das Programm luft auf allen ST/TT Rechnern in allen Auflsungen. Falls es trotzdem Probleme gibt, bitte ich um Kontaktierung. Das Programm ist Freeware, d.h. es darf frei kopiert und benutzt werden. Davon ausgeschlossen ist die gewerbliche Nutzung. Diese ist nur mit schriftlicher(!) Genehmigung meinerseits mglich, eingeschlos- sen davon sind PD-Versande! Die Rechte bleiben in allen Fllen bei mir. Zuwiderhandlungen werde ich strafrechtlich verfolgen. Zu Let 'em Fly! gehren folgende Dateien: - LETEMFLY.PRG Das eigentliche Programm - LET_CONF.PRG/ACC Das Konfigurationsprogramm - LET_CONF.CPX Das Ganze als CPX-Modul - GEM1ICON.RSC Die originalen Atari Icons fr die Alert-Boxen - GEM2ICON.RSC Die Icons aus GEM/2 fr die Alert-Boxen - LTMFICON.RSC Die Let 'em Fly! Icons - LETEMFLY.TXT Diese Anleitung - CHANGES.TXT Die nderungen zwischen den ver- schiedenen Versionen - MULTITOS.TXT Eine Info zu Let 'em Fly! in Verbindung mit MultiTOS (Wichtig!) - FUTURE.TXT Ein Statement zur Zukunft von Let 'em Fly! (Wichtig) - READ_ME Eine kurze Info Let 'em Fly! darf nur komplett mit diesen Dateien weitergegeben werden. Ich erhebe mit dieser Anleitung keinen Anspruch darauf, da jeder alles versteht, was zur normalen Benutzung auch nicht notwendig ist. Das ist in diesem Fall prinzipbedingt, da das Programm in die Tiefen des Betriebssystem eintaucht und um alles zu verstehen, mu man auch dieses ensprechend genau kennen. WICHTIG: Weiterhin ist noch eine Zusatzdokumentation fr Pro- grammierer und Fortgeschrittene erhltlich. Diese ist jetzt nicht mehr Teil des Let 'em Fly! `Grundpaketes'. Sie sollte entweder in den etablierten Mailboxen zu finden sein, kann jedoch auch ber einen adressierten und frankierten Rckumschlag bei mir bezogen werden. Jetzt aber erstmal das ... Ich bernehme keine Haftung oder Verantworung fr direkte oder in- direkte Schden jedweder Art, seien sie finanzieller, materieller oder sonstiger Art, die aus dem Gebrauch, Nichtgebrauch oder Mi- brauch von Let 'em Fly! entstehen. Fast alle Soft- und Hardwarebezeichnungen, die in dieser An- leitung erwhnt werden, sind eingetragene Warenzeichen und sollten als solche betrachtet werden. Installation ============ Das eigentliche Programm LETEMFLY.PRG lt sich sowohl vom Desktop aus starten als auch aus dem AUTO-Ordner heraus. Im zweiten Fall mu man das Programm in den AUTO-Ordner des Boot-Laufwerks kopieren. Nach dem nchsten Reset ist es dann automatisch installiert. Daneben gibt es auch noch ein Konfigurationsprogramm LET_CONF.PRG/ACC. Mit diesem Programm ist es mglich Let 'em Fly! an die persnlichen Bedrfnisse anzupassen. Es kann entweder vom Desktop aus gestartet werden oder als Accessory installiert werden. Im zwei- ten Fall mu die Endung auf 'ACC' lauten und das Programm im Wurzelverzeichnis des Boot-Laufwerks stehen. Nach einem Reset ist es dann ber die Accessory-Leiste aus jedem (echten) GEM-Programm heraus ansprechbar. Da das Konfigurationsprogramm nicht unbedingt klein ist und nicht jeder 2 oder 4 MByte Speicher besitzt, empfehle ich `The Chameleon' von Karsten Isakovic. Mit diesem Programm kann man Acces- sories nachladen und auch wieder entfernen. Das Konfigurationsprogramm gibt's auch als CPX fr das neue Kontrollfeld von Atari. Es heit LET_CONF.CPX und mu im ent- sprechendem Verzeichnis liegen. Bedienung ========= Grundstzliches --------------- Nicht alle Dialogboxen werden von Let 'em Fly! untersttzt, da einige Leute eigene Routinen zur Dialogverarbeitung programmiert haben. Hier kann Let 'em Fly! garnicht oder nur teilweise seine Features zur Verfgung stellen. Fr alle Programmierer, die Let 'em Fly! optimal ausnutzen wollen, gibt es (wie oben schon erwhnt) eine Zu- satzdokumentation. Auch die Dialoge im Desktop werden nicht untersttzt, da hier das TOS seine Routinen direkt anspringt. Das wird sich aber wahr- scheinlich mit der Einfhrung von MultiTOS ndern. Falls irgendetwas nicht funktionieren sollte, dann bitte ich erst die Einstellungen mit dem Konfigurationsprogramm (s.u.) zu pr- fen! So, nun geht's aber los ... Let 'em Fly! ------------ In einer Dialogbox gibt es in erster Linie anwhlbare und nicht anwhlbare Objekte. Falls man jetzt ein nicht anwhlbares Objekt in einem Dialog mit der linken Maustaste anklickt und die Maustaste festhlt, so sollte sich der Mauszeiger in eine Flache Hand verwandeln. Nun kann man die Dialogbox auf dem Bildschirm verschieben. Je nachdem wie Let 'em Fly! konfiguriert wurde (s.u.), lt sich die Box als Ganzes in Echtzeit verschieben oder nur als Rahmen, so wie auch die normalen Fenster verschoben werden. Falls man beim Anklicken der Box zustzlich die rechte Maustaste (oder eine der Shift-Tasten) gedrckt hlt, so verschwindet die Box und ein Geisterrahmen er- scheint. Somit ist es jetzt mglich `durch' die Box zu schauen, falls diese etwas verdeckt. Der Geisterrahmen lt sich natrlich auch verschieben. Beim Loslassen der Maustaste(n) erscheint die Box wieder auf dem Bildschirm. Die Funktion der rechten Maustaste kann man mit Hilfe des Konfigurationsprogramms auch umkehren. Bemerkung: es kann sein, da andere Programme, die Let 'em Fly! explizit untersttzen auch nur ber ein spezielles Objekt `fliegen' knnen (der File-Selector `Selectric' untersttzt z.B. Let 'em Fly! und man kann dort die Box ber das Eselsohr in der oberen rechten Ecke verschieben). Man kann die Exlusivitt des `Flugobjekts' aber durch zustzliches Drcken der rechten Maustaste unterdrcken, d.h. man kann jetzt auch die anderen Objekte wieder zum Fliegen benutzen. Falls die Box sich zwar noch normal verschieben lt, nicht aber durchsichtig gemacht werden kann, dann steht nicht genug Speicher zur Verfgung um die komplette Box zu sichern. Der erste Modus zerlegt bei nicht ausreichendem Speicher die Flugbahn in entsprechend viele Einzelschritte und fhrt diese dann aus, daher hat man hier mehr Chancen. Klickt man auerhalb des Dialogs, so machte es normalerweise nur `Pling', nun kommt zustzlich der Dialog zur Mausposition `geflogen'. Diese Funktion ist besonders bei Grobildschirmen sehr ntzlich. Zudem bewirkt ein Doppelklick auf das Flugobjekt ein Zentrieren des Dialogs. Weiterhin merkt sich Let 'em Fly! die letzte Position der Dialogboxen innerhalb eines Programms, d.h. verschiebt man die Dialoge, so werden sie bei einem erneuten Aufruf an der letzten Position wieder dar- gestellt. Durch Drcken von [ALT]+[CTRL] beim Aufruf(!) des Dialoges wird die Box wieder richtig zentriert. Diese Funktion zeigt auch bei fremden Flugroutinen Wirkung. Auch ist es nun mglich, Dialogboxen an der aktuellen Mausposition erscheinen zu lassen. Bei installierten virtuellen Screens a la `BigScreen 2.0' knnen die Dialoge im zur Zeit sichbaren Ausschnitt zentriert werden. Somit erspart man sich so manche Suche nach dem Dialog. Alert-Boxen werden unabhngig von der Einstellung im Konfigurationsmen immer im sicht- baren Ausschnitt zentriert. Alert-Boxen sind ja dazu da dem Anwender eine wichtige Information zu geben und nicht, um sie erst lange suchen zu mssen. Zusammenfassung: - Nicht alle Boxen knnen fliegen! Es mu a) gengend Speicher vorhanden sein und b) die entsprechende Betriebssystemfunktion vom Programm aufgerufen werden. - Manchmal ist es zwar mglich die Box zu verschieben, aber sie lt sich nicht mehr durchsichtig machen. In diesem Fall steht nicht mehr gengend Speicherplatz fr die Bufferung der kompletten Box zur Verfgung. - Weiterhin knnen Programme, welche nicht darauf vorbereitet sind, da ihre Boxen fliegen knnten, ein etwas eigenartiges Verhalten zeigen. Es wirkt sich aber nur auf die Bildschirmdarstellung aus und irretiert eher. Daten gehen hierbei normalerweise nicht verloren. Eine Garantie kann ich dafr jedoch nicht geben. Key Dials --------- Viele Dialoge lassen sich ab sofort auch ber die Tastatur bedienen. Das sieht man daran, da in/neben den Buttons unter dem Text ein Buchstabe bzw. eine Zahl unterstrichen ist (in der Farbauflsung steht auch noch eine andere Darstellungsart zur Verfgung). Drckt man diesen Buchstaben bzw. diese Zahl in Verbindung mit der [ALT]-Taste, so wird das entsprechende Objekt angewhlt. Das entspricht dann einem einfachen Mausklick auf das Objekt. Weiterhin bewirkt ein Mausklick auf ein unterstrichenes Objekt neben dem eigentlichen Button eben- falls einen Klick auf das entsprechende Objekt. Ist kein editierbares Feld im Dialog vorhanden, so kann man die Shortcuts auch ohne [ALT]-Taste erreichen (z.B. in den Alert-Boxen). Zudem werden je nach Mglichkeit auch die Tasten [UNDO] und [HELP] belegt: [HELP] sucht nach den Zeichenfolgen 'help', 'hilfe' [UNDO] sucht nach den Zeichenfolgen 'abbruch', 'abbrechen', 'verlassen', 'ende', 'nein', 'quit', 'cancel', 'abort', 'no', 'exit' Gro- und Kleinschreibung wird nicht bercksichtigt. Beim Drcken einer dieser Tasten wird dann das jeweilige Objekt angewhlt. Insgesamt werden 38 Tasten (A-Z, 0-9, HELP, UNDO) verwaltet. Das Default-Objekt (wird beim Drcken von RETURN angewhlt und ist dick umrandet), sowie das UNDO-Objekt ist zudem (fast) immer ber den ersten Buchstaben im jeweiligen Text zu erreichen. D.h. `OK' ber [ALT]+[O], `Abbruch' ber [ALT]+[A] u.s.w.. ber [ALT]+[Tab] und [SHIFT]+[ALT]+[Tab] kann man den Default-Button `verschieben', d.h. man kann in vielen Fllen mit dieser Mglichkeit und der RETURN-Taste den Dialog bearbeiten. Ist kein Edit-Feld vorhanden, so kann man auch [ALT] weglassen. ber [SHIFT]+[HELP] wird innerhalb eines Dialogs eine Copyright Info angezeigt. Bei Alert/Error-Boxen ist diese Funktion ausgeschaltet. Extended Editor --------------- Sind in einer Dialogbox editierbare Eingabefelder vorhanden, so werden von Let 'em Fly! auch zustzliche Editierfunktionen zur Verfgung gestellt. Neben den schon im Betriebssystem fest eingebauten ... [Cursor Up] Ein Eingabefeld zurck. [Cursor Down] Ein Eingabefeld vor. [Cursor Left] Ein Zeichen nach links. [Cursor Right] Ein Zeichen nach rechts. [TAB] Ein Eingabefeld vor. [RETURN] Beendet den Dialog. ... gibt es jetzt noch viel mehr ... [RETURN] Falls kein Default-Objekt vorhanden ist, wird zum nchsten Eingabefeld gesprungen. [SHIFT]+[RETURN] springt zum nchsten Eingabefeld (auch wenn ein Default-Objekt vorhanden ist). [SHIFT]+[TAB] Ein Eingabefeld zurck. [SHIFT]+[Csr Left] springt an den Anfang des Eingabefeldes. [SHIFT]+[Csr Right] springt an das Ende des Eingabefeldes. [CTRL]+[Csr Left] springt wortweise nach links. [CTRL]+[Csr Right] springt wortweise nach rechts. [Home] springt zum ersten Eingabefeld im Formular. [SHIFT]+[Home] springt zum letzten Eingabefeld im Formular. [CTRL]+[Delete] lscht alle Zeichen rechts vom Cursor. Zudem besitzen die Tasten [Cursor Up] und [Cursor Down] sogenannte `Turn-Around' Funktionen, d.h. ist man im ersten Eingabefeld und drckt [Cursor Up], so gelangt man ins letzte Eingabefeld. Fr [Cursor Down] gilt das Umgekehrte. Weiterhin wird auch die direkte Cursor-Positionierung in- nerhalb(!) des Edit-Feldes durch die Maus untersttzt. Das Be- triebssystem setzt normalerweise den Cursor beim Anwhlen eines Ein- gabefeldes immer an das Ende. Ist eine direkte Positionierung mg- lich, so verwandelt sich der Mauscursor ber dem editierbaren Feld in einen Textcursor. Alle erlaubten Zeichen fr Dateinamen und Pfade ----------------------------------------------- ... kann man jetzt in die dafr vorgesehenen Eingabefelder eingeben. Das TOS verhlt sich da SEHR merkwrdig, zum einen lt es viele legale Zeichen berhaupt nicht zu (z.B. `$', `-'), auf der anderen Seite kann man dann aber die `belsten' Zeichen (`', `' ...) eingeben (Bacardi Feeling ...). Spezielle Zeichen: ------------------ In manchen Fllen mu man Zeichen eingeben, die ber die Tastatur nicht so einfach (wenn berhaupt) erreichbar sind. Mit [SHIFT]+[Insert] kann man eine kleine Box auf den Bildschirm zaubern, aus der man das Zeichen mit der Maus anwhlen kann. Diese Funktion kann nur aufgerufen werden, wenn in das editierbare Feld alle Zeichen eingegeben werden drfen. GEM-Klemmbrett: --------------- Innerhalb der editierbaren Felder wird auch das Clipboard (GEM- Klemmbrett) untersttzt, d.h. man kann z.B. in anderen Programmen Text ausschneiden und dann spter im Dialog einfgen. Um das Clip- board benutzen zu knnen, mu dieses vorher auch definiert worden sein, d.h. das Betriebssystem mu wissen wo die Daten abgespeichert werden sollen. Hierzu mu die Environment-Variable `CLIPBRD' oder `SCRAPDIR' gesetzt worden sein. Benutzt man `Gemini', so geschieht das mehr oder weniger automatisch. Andernfalls kann man diese Variab- le durch spezielle Programme (z.B. `JCNBOOT' von Jens C.Neffe) setzen lassen. Die zustzliche Zeile sieht dann folgendermaen aus: CLIPBRD=Pfad Beispiel: CLIPBRD=C:\CLIPBRD Folgende Clipboard-Funktionen werden untersttzt: [CTRL]-[X] Schneidet die komplette Zeile aus und speichert diese auf dem Klemmbrett. [CTRL]-[C] Kopiert die komplette Zeile ins Klemmbrett, d.h. die Zeile wird im Dialog nicht gelscht. [CTRL]-[V] Fgt den Inhalt in die aktuelle Zeile ein. Der alte Inhalt wird dabei gelscht. Will man das unterdrcken, so kann man zustlich die [SHIFT]-Taste gedrckt halten. Wird bei den ersten beiden Funktionen zustzlich [SHIFT] gedrckt, so wird der Inhalt des Klemmbretts nicht gelscht und der entsprechende Text wird angehngt. Dabei wird vorher ein Zeilenvorschub erzeugt, d.h. die einzelnen Textausschnitte sind dann durch einen Vorschub voneinander getrennt. History-Funktion: ----------------- Oft mu man Dinge eingeben, die man vorher schon einmal eingegeben hat (z.B. Shell-Funktion), und um einmal mehr Fingerarbeit einzu- sparen kann man die letzten 20 Eingaben wieder herzaubern. Diese Funktion ist auch als `History' bekannt. Jeder History-Eintrag kann bis zu 40 Zeichen speichern, doppelte Eintrge in der History werden unterdrckt (fr unsere Gemini-Freaks: `nohistdouble = TRUE'). [CTRL][Csr Up/Down] geht die History durch. [SHIFT][Csr Up/Down] Die in der aktuellen Eingabezeile stehende Zeichenkette wird als Suchmuster verwendet, d.h. es werden hier nur die Eingaben angezeigt die mit dieser Zeichenkette beginnen. Die Leute, die noch nicht mit einer History gearbeitet haben, sollten etwas damit experimentieren. Weiterhin verhlt sich die History, weitestgehend wie die in der Commandline-Shell `Mupfel'. Viele der zustzlichen Editierfunktionen (auer die Mausunter- sttzung) sind auch in Dialogen mit fremden Routinen ansprechbar. Hier heit es dann: Ausprobieren! Die MagicDials von Peter Hellinger werden brigens optimal von Let 'em Fly! untersttzt. Die neuen Alert-Boxen --------------------- Die ursprnglichen Alert-Boxen des Atari ST wurden berarbeitet, damit sie u.a. auch in den Genu von Let 'em Fly! kommen. Die drei Knpfe in der Alert-Box lassen sich neben dem oben beschriebenen Verfahren auch noch ber F1-F3 anwhlen, um so unntige Affengriffe zu vermeiden. Ebenso braucht man fr die Tastenkrzel keine [ALT]-Taste zu drcken. Weiterhin sind diese Boxen nur noch so gro, wie sie wirklich sein mssen damit der Text hineinpat und es lassen sich zudem neue Icons beim Programmstart nachladen. Die entsprechende Datei mu dann LET_ICON.RSC heien und sich im selben Verzeichnis wie das Haupt- programm befinden. Der Aufbau der Datei ist im Programmer's Guide beschrieben. Die GEM/1 und GEM/2 Icons liegen Let 'em Fly! bei (s.o.) und mssen nur ins entsprechende Verzeichnis kopiert und umbenannt werden. Die vom TOS erzeugten Fehlerboxen, werden ebenfalls von Let 'em Fly! ersetzt. Dabei unterscheidet man zwei Arten: kritische Fehler (z.B. `Daten auf Disk x defekt') und Fehlermeldungen der Applikation (z.B. `Nicht gengend Speicher'). Die erste Variante wird von Let 'em Fly! z.Zt. nur unter Mag!X (Multitasking AES von BELA) untersttzt, da hier die Vorraussetzungen erfllt sind (Reentranz des AES und Desktop ist eigenstndige Applika- tion). Vermutlich wird MultiTOS ebenfalls diese Vorraussetzungen er- fllen und daher kann man damit rechnen, da diese Boxen auch hier freigegeben werden. Die Event-Critic Boxen unterscheiden sich vom Original in zweier- lei Hinsicht. Zum einen wurden sie mit sinnvollen Icons versehen, zum anderen existiert nun auch ein `Ignore'-Button, d.h. der Fehler wird einfach ignoriert. Dieser Button sollte aber nur im Notfall benutzt werden, da einige Applikationen merkwrdige Fehler produzieren knnen. Die zweite Variante luft unter allen Vorraussetzungen und un- terscheidet sich vom Original dadurch, da eine przisere Fehlermel- dung mit Nummer ausgegeben wird. Have a nice time with Niceline ------------------------------ `Niceline' ist eigentlich ein eigenstndiges Programm, welches nur in Let 'em Fly! integriert wurde. Es erfolgt daher an dieser Stelle nur eine kurze Beschreibung. Fr weitere Informationen empfehle ich die Stand-Alone Version. Hat sich jemand schonmal die Trennstriche im `Gemini'-Men ge- nauer angeschaut? Er wird sicher bemerkt haben, da hier nicht normale Minuszeichen verwendet wurden, sondern eine richtig schne Linie. Leider gibt's das bis jetzt nur in Gemini. Mit `Niceline' werden auch fremde Mens entsprechend angepat. Damit aber das Erscheinungsbild innerhalb von Applikationen, die auch Mens in Fenstern ber die Geiss-Libs realisiert haben (z.B. Phnix und Interface), gleich bleibt, untersttzt Niceline auch diese Form von Mens. Leider gibt's Probleme bei GFA-Basic Programmen, daher wurde `Niceline' so ausgelegt, da es sich bei einem bestimmten Men-Muster, welches meist in GFA-Basic Programmen verwendet wurde, automatisch deaktiviert. Leider haben einige andere Programme (z.B. Rufus 1.1) ein hnliches Muster, womit hier auch keine schnen Linien in- stalliert werden. WICHTIG: Der umgekehrte Fall kann u.U. auch eintreten, d.h. ein kritisches GFA-Basic Programm konnte nicht durch das Muster identifiziert werden. Das macht sich darin bemerkbar, da man im Men falsche Punkte ausgewhlt werden. Oft kann man das Programm durch diesen Mistand auch nicht verlassen. Arbeitsweise: Installiert ein Programm eine Menleiste, so wird zuerst getestet, ob es sich um eine Menleiste handelt, die vom GFA-Basic Befehl `menu' stammen knnte. Diese Menleiste erkennt Niceline dadurch, da die sechs Accessory Eintrge in der Struktur keine fhrenden Leerzeichen aufweisen. Dabei wird jedoch nur der erste Eintrag getestet. Hier kann man natrlich einen Patch ansetzen, der bei Programmen die zwar mit Niceline funktionieren wrden, aber durch dieses Merkmal dis- qualifiziert werden (z.B. Rufus-Men). Ist diese Hrde berwunden, so werden die disableden Objekte mit dem ausschlielichem Inhalt von Minus- und Gleichheitszeichen durch ein benutzerdefiniertes Objekt ersetzt, welches die Linie bei Bedarf malt. Bei den Mens in den Fenstern wird etwas anders vorgegangen. Hier wird ein objc_draw() mit bestimmten Parametern und einer bestimmten Baumstruktur abgefangen. Will man in eigenen Programmen von den Nicelines profitieren, kann man ber eine Funktion auch eigene Objekt-Bume patchen lassen. Das Konfigurationsprogramm ========================== Nach dem Start des Programms (LET_CONF.PRG/ACC/CPX) gelangt man in ein Men ... In der obersten Zeile steht die Version von Let 'em Fly! die der Benutzer zur Zeit installiert hat. Es wird auch zwischen `normal' und `light' unterschieden. In der zweiten Zeile steht mein Name (Uii!). In der Mitte ist ein rechteckiger Kasten zu finden, wo sich die Schalter zum Konfigurieren befinden. Da es inzwischen so viele ge- worden sind und eigentlich alle auch ihre Daseinsberechtigung haben, kann man mit dem Slider auf der rechten Seite die Punkte `durchfahren'. Wie der erfahrene Let 'em Fly! User schon erkannt hat, hat sich das Programm seit Version 1.12 etwas verndert. Auf den ersten Blick sieht es vielleicht etwas unbersichtlich aus, jedoch wurden die Schalter nach einem neuen Kriterium sortiert. Nun sind die wichtigen Schalter auf der ersten und zweiten Seite und der Rest liegt dahinter. Damit sollte man schneller zum Ziel kommen. Benutzt man das PRG/ACC, so kann man diese Box auch ber die Tastatur bedienen. Mit [CsrUp] und [CsrDown] kann man auch den Slider bedienen. Drckt man zustzlich [SHIFT], so wird nicht zeilenweise, sondern seitenweise geblttert. Beim CPX-Modul ist das aus pro- grammiertechnischen Grnden leider nicht mglich. Am unteren Rand befinden sich vier Buttons: - Info Zeigt eine kleine Informationsseite an. - Save Sichert die Einstellungen permanent im eigentlichen Pro- gramm. Es erscheint darauf hin eine Auswahlbox, wo das Programm (LETEMFLY.PRG oder LET_LGHT.PRG) angewhlt werden kann. - Cancel Alle Einstellungen werden rckgngig gemacht und das Kon- figurationsprogramm wird verlassen. - OK Die Einstellungen werden bernommen, jedoch nicht abge- speichert, d.h. beim nchsten Neustart des Rechners sind diese futsch. Die gleiche Wirkung hat der Closer oben links. Da es inzwischen so viele Schalter geworden sind, wurde das Kon- figurationsprogramm schnell unbersichtlich. Daher kann man jetzt bestimmte und weniger hufig gebrauchte Schalter ausblenden. Dazu gibt es im oberen Drittel drei Knpfe: - Config. CPX Hier gelangt man zu dem Dialog, in dem man die sichtbaren Schalter bestimmen kann. Die selektierten Eintrge werden angezeigt, die anderen ausgeblendet. Mit `OK' wird die Einstellung bernommen, mit `Save' kann man die Selektion abspeichern. - Selection Mit diesem Knopf wird nur die bei `Config. CPX' eingestellte Auswahl dargestellt. - All Falls man doch mal an einen selten gebrauchten Schal- ter mu, so kann man mit diesem Button schnell mal alle Schalter anzeigen, die Auswahl wird dann ignoriert. Nun aber zu den Schaltern bzw. Reglern. Die Schalter stellen sog. Pop-Up Mens dar, d.h. ein Klick auf den Schalter zaubert eine kleine Auswahlbox hervor. Klickt man auf den erklrenden Text, so wird zwischen den beiden Mglichkeiten hin- und hergeschaltet. - Let 'em Fly! ber diesen Schalter lt sich Let' em Fly! ein- bzw. (komplett) ausschalten. Die restlichen Einstellungen sind damit ohne Wirkung. - Alert-Boxes Hier lassen sich die neuen Alert- und Error-Boxen ein-/ausschalten. - Key Dials Aktiviert/Deaktiviert die Tastaturbedienbarkeit der Dialogboxen. - Extended Editor Dieser Schalter ist fr die zustzlichen Editier- funktionen da. - Flying Dials Mit diesem Schalter werden die Flugroutinen akti- viert. Die Dialoge knnen jetzt fliegen (Uii!). - Fly Type Hier wird bestimmt, wie die Boxen fliegen: Solid: in Echtzeit, d.h. sie folgen der Mausbe- wegung. Ohne Blitter und ohne Bild- schirmbeschleuniger ist diese Version etwas trge. Hollow: Hier wird mit einem einfachen Rahmen gearbeitet. - Ghost Flights Will man die Funktion der rechten Maustaste fr den Flugmodus umkehren (invert), so kann das mit diesem Schalter geschehen. - Dials to Mouse Die Dialoge werden nun nicht mehr zentriert, sondern erscheinen an der aktuellen Mausposition. - Jumpin' Dials Wer nicht mchte, da die Dialoge zur Mausposition geflogen kommen, wenn man auerhalb des Dialogs klickt, kann hier diese Funktion abschalten. (Natrlich kann man die Funktion auch wieder einschalten) - Save Position Mit diesem Schalter kann man einstellen, ob sich Let 'em Fly! die Position der Dialoge merken soll. - Send Redraw Bei manchen Programmen gibt es Probleme nach dem lschen der Dialogbox, d.h. der Hintergrund wird nicht wieder richtig hergestellt (z.B. TC-Filese- lector, Adimens). Ist diese Funktion einge- schaltet, so wird dem gerade laufenden Programm gesagt, da nach dem Lschen der Box der ent- sprechende Bildschirmausschnitt neugezeichnet wer- den soll. - VSCR Support Dieses megagigantische Krzel VSCR heit nichts anderes, als Virtual SCReen (der Ausschnitt des Bildschirms ist ungleich dem Gesamtma des Bild- schirms, auch mit der Fenstertechnik zu ver- gleichen) und kennzeichnet ein Verfahren um anderen Programmen mitteilen zu knnen, welcher Bildschirmausschnitt denn nun gerade sichtbar ist. Ist dieser Punkt eingeschaltet, so wird dieses Verfahren untersttzt. Einen nicht vor- handenen VSCR erkennt Let 'em Fly! automatisch. Vertreter dieser Gattung ist z.B. `BigScreen 2.0' von Julian Reschke. Was macht nun Let 'em Fly! in diesem Fall? Nun, die Dialogboxen werden immer im sichtbaren Aus- schnitt zentriert. Die Alert-Boxen jedoch werden immer, unabhngig von diesem Schalter, im sicht- baren Bereich zentriert. - Form Grow/Shrink Schaltet die Grow-/Shrinkboxen beim Zeichnen von Dialogboxen ein bzw. aus. Somit wird der Bild- schirmaufbau erheblich beschleunigt, jedoch geht das 'Intuitiv-sensitive' verloren. Das KAOS-TOS wirbt brigens mit diesem Feature. - Graf Grow/Shrink Schaltet auch die restlichen Grow- und Shrink- boxen aus, z.B. wenn ein Programm von Gemini aus gestartet wird. - Niceline Konfiguriert die schnen Striche in den Mens. - Fly Delay Damit man in die Buttons `reinfahren' kann, ohne da der Dialog vorher anfngt zu fliegen, kann man hier eine Verzgerung einstellen (0 steht fr keine Verzgerung). Die persnliche `Note' er- reicht man durch Probieren. - Shortcut Disp. Mit diesem Schalter kann man bestimmen, ob die Shortcuts durch Striche oder durch farbig ge- druckte Buchstaben kenntlich gemacht werden sollen. Natrlich ist das nur fr die Farb- auflsungen interessant, im monochromen Modus hat dieser Schalter keine Wirkung. Hier wird immer der Strich unter den Buchstaben benutzt. - Shortcut Col. ber diesen Schieberegler kann den Tastenkrzel eine Farbe zugewiesen werden, z.B. ist in der mittleren Auflsung rot besser auszumachen. Steht der Regler auf ganz links, so werden zwar Tasten vergeben, jedoch wird kein Strich gemalt. - Alert-Border Um das Individuelle noch weiter zu steigern, kann hier die Rahmendicke (normal ist 1) der Alert- Boxen eingestellt werden. ... Hier stand mal etwas zur light-Version von Let 'em Fly!. Zur Zeit gibt es aber keine light-Version, und deshalb steht hier auch nix. Bei der light-Version handelte es sich brigens um eine abgespeckte Version. (bekannte) Probleme mit anderen Programmen ========================================== - Der Universal Item Selector (UIS III) mu nach Let 'em Fly! gestartet werden, da er sonst wieder ausgeklinkt wird. Das drfte fr alle Programme gelten, die kein XBRA benutzen. - Der Little Green Selector funktioniert mit Let 'em Fly! nicht so richtig, sowohl mit dem Fliegen als auch mit den Tastatur- Shortcuts gibt es Probleme. Diese Probleme sind aber im LGS zu suchen! Der LGS hngt z.B. im ikbdsys drin, blo wofr (SINN!?). Dort bringt er anscheinend die Tastencodes vollkommen durch- einander, so da nur der LGS damit etwas anfangen kann (na schn). Warum benutzt der LGS nur im GEMDOS-Trap XBRA und sonst nirgendswo? Ich wei ja nicht was der freundliche Atari-Hndler empfiehlt, ich empfehle Selectric als File-Selector. - Da die MagicDials von Peter Hellinger die benutzerdefinierten Objekte und Buttons nicht `konventionell' behandeln, wird beim Anwenden der Tastenkombination [ALT]+[Tab] (und auch bei der Umkehrung mit [SHIFT]) der Button nicht korrekt gezeichnet. Zu Abstrzen kann es jedoch nicht fhren. - Bei MiNT-Versionen kleiner-gleich 0.91 kann sich Let 'em Fly! nicht installieren. Das Problem haben aber auch andere Programme. Abhilfe: MiNT 0.94 benutzen. - Wird ein Dialog in NeoDesk mit [RETURN] beendet, so verschwindet er nicht. Abhilfe: Desktop aus TOS 2.06 oder Gemini benutzen. Trappelshouting =============== Let 'em Fly! klinkt sich in den TRAP #2 (AES/VDI) und den TRAP #13 (BIOS) ein und benutzt dazu die XBRA-Kennung `LTMF'. Unter bestimmten Umstnden (s.o.) wird auch etv_critic verbogen. Zudem wird ein sog. Cookie-Jar installiert (benutzt auch die Kennung `LTMF'). Eine ge- nauere Beschreibung ist im Programmer's Guide `Three Flights Up' zu finden. Ausleitung ========== Wie schon gesagt wollte ich nur sehen wie schnell das VDI sein kann und irgendwie ist dann dieses Programm entstanden. Die Flugroutinen waren eigentlich nur fr eigene Programme ge- dacht, aber in der ST-Computer 6/91 hat Robert Tolksdorf gezeigt, da man so etwas prinzipiell auch resident installieren kann, jedoch haben beide Programme nichts gemeinsam, auer da wir beide auf die form_do() Sourcen von D.R. zurckgegriffen haben. Der Rest ist eher aus der Not entstanden. Dan Wilga hat ein Programm mit dem Namen `FormDoIt!' geschrieben, welches es ermglicht die Dialoge auch mit der Tastatur zu bedienen und zustzlich noch einige Editierfunktionen bereitstellte. Leider ist seine form_do() Routine nicht 100% kompatibel zum Original und es gab besonders bei TOUCHEXIT Objekten Probleme. Zudem benutzt er die Line-A Routinen zur Grafikausgabe, welche in der heutigen Zeit nicht mehr benutzt werden sollten. Auch `FormDoIt!' hat mit Let 'em Fly! nur so viel zu tun, da ich viele Funktionen und das Prinzip auch in Let 'em Fly! im- plementiert habe, jedoch geht mein Programm wesentlich weiter, da es a) nicht nur form_do() ersetzt, b) kein Line-A benutzt und c) wesentlich `intelligenter' ist. Was noch zu sagen ist, da sog. `Schweineprogramme' nur bis zu einem gewissen Grad untersttzt werden. Unter `Schweineprogrammen' verstehe u.a. ich Programme, die sich nicht an die Regeln des AES halten. Beispielsweise kennt UnLZH kein appl_init/exit, OBWOHL es AES Routinen benutzt. Das Gleiche gilt auch fr PFX-PAK. Weiterhin gibt es immer noch Programme, welche kein XBRA verwenden. Das betrifft in erster Linie Programme aus den USA. XBRA ist inzwischen von Atari zum Standard erhoben worden und sollte daher von JEDEM Programm benutzt werden, welches Vektoren verbiegt. In Let 'em Fly! sind zwar ziemlich viele Sicherheitsabfragen enthalten, aber alles kann man nun auch nicht abfragen. Credits ------- An dieser Stelle will ich mich trotzdem bei den beiden o.g. Leuten bedanken, da sie gezeigt haben, da solche Geschichten mglich sind. Fr das Design der Dialogboxen innerhalb und auerhalb (CPX) von Let 'em Fly! wurde Interface von Olaf Meisiek verwendet. Vergessen will ich hier mal nicht die Betatester (Thanx). Einen davon, dem Martin Khling, mu ich aber jetzt nochmal getrennt danken, da er auch schon im non-Betatester-Status viele Fehler und Unschnheiten gefunden hat. Meine Adresse ... oder Tomaten, Drohbriefe etc. bitte an: Oliver Scheel Rothehausstr. 28 W-5000 Kln 30 (ab 1.7. 50823 Kln) Und fr die Leute, die eine Piepmaschine (Modem) ihr Eigen nennen knnen oder auf Kosten der Uni den ganzen Tag im InterNet hngen: MausNet: Oliver Scheel @ K2 EMail: Oliver_Scheel@k2.maus.de WICHTIG: Meine Adresse kann sich zum September '93 hin ndern! Nheres ist dann der Zeitschrift ST-Magazin zu entnehmen. Let 'em Fly! Man fliegt nicht mehr ohne ... ---- Rchzschreipfler (c) 1991-93 by Oliver Scheel rm$) SPEZIAL/VERZ,QIKUHKKLH-Let 'em Fly! - A look into the future ===================================== Wie geht's weiter mit Let 'em Fly!? Diese Frage soll nun aus aktuellem Anla hier diskutiert werden: Zunchst einmal mchte ich bekanntgeben, da ich meinen Schwerpunkt vom ATARI auf einen anderen Rechner verlagern werde. Das hat in erster Linie zwei Grnde: a) ATARI beschrnkt sich nun auf den Consumermarkt und hat somit den Profimarkt und die Entwicklung wirklich leistungsfhiger Rechner aufgegeben. b) ATARI ist anscheinend nicht in der Lage dieses offiziell bekanntzugeben, um Soft- und Hardwarehersteller sowie Anwender vor Fehlinvestitionen zu bewahren. Meinen ATARI werde ich natrlich weiterhin behalten, jedoch werden sich meine Entwicklungen auf diesem Rechner nur noch auf Spezialanwendungen beschrnken. Und nun zu der Eingangs gestellten Frage: Let 'em Fly! ist inzwischen sehr weit entwickelt und man knnte mit Sicherheit noch mehr einbauen (z.B. Dialoge in Fenstern). Um das aber in vernnfiger Art und Weise zu realisieren, mte Let 'em Fly! mal komplett berarbeitet werden. Leider mu dazu unheimlich viel Zeit investiert werden. Meine nderungen an Let 'em Fly! werden sich daher nur noch auf Bugfixes beschrnken. Aus diesem Grund bin ich gerne bereit die weitere Entwicklung und Pflege von Let 'em Fly! abzugeben. Ich mu aber gleich hinzufgen, da das Programm sehr komplex ist und an vielen Stellen in die Trickkiste gegriffen wurde. Es ist also kein leichtes Unterfangen, wobei ich aber prinzipiell bereit bin bei Fragen zur Seite zu stehen. Wer also interessiert ist und bereit ist sich damit ernsthaft zu beschftigen, sollte sich also bei mir melden. Meine Adresse: Oliver Scheel Rothehausstr. 28 W-5000 Kln 30 (ab 1.7. 50823 Kln) Email: Oliver_Scheel@k2.maus.de jI5 H^(0dHGmJF?N- XQ?A\ziLnttY(кu0n]Jr[ 3{fyygFD#5 w`6!B!* Bt  ~Mhapm9HC¬$n"~g6 ‹' ]]ש0˹g Let 'em Fly! und MultiTOS (bzw. neues AES) ========================================== Einige wichtige Informationen Tja, man sollte es nicht fr mglich halten: MultiTOS ist nun offiziell erhltlich. Leider sind durch einige nderungen Inkompatibilitten zu bestehenden Programmen entstanden. Das betrifft leider in gewisser Weise auch Let 'em Fly! In diesem Fall sind es die Objekt-Flags, die Let 'em Fly! benutzt, um die einzelnen Resource-Bume unterschiedlich konfigurieren zu knnen. Das neue AES, welches auch in MultiTOS integriert ist, benutzt jetzt ebenfalls diese Flags. Leider war die Dokumentation ber die freie Verfgbarkeit dieser Flags zwiespltig. Nun gut. Die Flags 9 und 10 werden jetzt vom AES fr die 3-D Objekte verwendet, d.h. u.a. da der Extended Editor *nicht* mehr ber Flags im Resource (lokal) abgeschaltet werden kann. Weiterhin kann man eine EXAPPLBLK-Struktur *nicht* mehr ber das Flag 9 anzeigen, sondern mu hier ber den ExObType (Bit 7) gehen. Besonders letzteres ist etwas rgerlich, da die Library RUBY dieses Feature benutzt und die entsprechenden Programme nun angepat werden mssen. Durch die weitere Entwicklung des AES kann es sein, da noch mehr Konflikte entstehen knnen. Oliver Scheel yU3K+Q ;!QwPcih:1{{s*ӖBu3C|M$!xKh e^ ȤU^ m]#s 1BL[uC('{~f{ 8})'i2K.5J/7§}9|DstJ3V\\.T>}.* <䧈$~ӟ-#1}_A`&^daӗ؀'ou/GV˅ZY^C1uN9sV^Z\:5*XRȃoLqjD{B}xecCHt[UowfA^{4ܮ`'e@9ܹBO8U? .fȉ(c_<GՂi:=ɻ'y ^ǃp|\S|r?M".Cf\ݜk(=fws O[A\+]JN+wHg{8bH}ƛ-BBjHpDUWJN {G=gڋ"qa^qfrL#QfRPC;o4VC0$+視L9u͎kJ j$'o&jUbt|nB|2Bk?_<Ϡ*PKȶHjIISPE$$.2` 7o;=|>?` ??7?o?????o?7? ?`|>=;o7 `??_o/7  ?`?@|>|>;\:l6/7 `` 7o 2e2e2e22 2}2}}}o7 `$  $  ;ׂ̊lQ,i)1A>8+W1۷|0؊IEdkRgW~|h_u=|N)|z2YUlk4[-7Kr(ei jtPK P- SPEZIAL/NAMES.IMGMoGgfqp챓)PC\$kcDUGR=$$B*SUD/#24UT%W.rH%Q?KLP38S{0-r>>>>>>>>?|?|?|??????$  $  rJ f"x5Q:)Y4Cb&{mӜF#Oyk|le$%Q@!ksZ3H9\i5\myaU;UUZ JFLWm r\83ɷSp9fw敼 ӥ20YRhrV$BS %g}?߻Gm1rjj&1[3=dv8՟X\>H3n`#/KO8+-t^^^v=g_`Rg^A=vP®0ET &V01hq,6'SSc)#-aZd-r$6r "ɏa=39Xlk ~gc9cx{&j]_aDEٰsX%1eA z]qbuu($2(  2  ?????~~~~~~~~~~~~~??????3y!p!p!p!p!p!p!p!p!p!p"ppp p0>x>x~|~~~~~?#gzt>\լ0f9\-$r`%uلyi_!q;s:vticˉg3#?G{FGRIqH='Eҭ.PX~QKF+Hc)KҢ$7gӟ8vKaN0&x ĩz99hWrVX +0k&%˷+-ĚA/J*yh(~=٢r}*|SiDH梨[At}VZ%I +TM0'VhNR T զѭ/>ΗI|5aNYs(x5w Nz{*_e^COSw)*{ǝ^bdXfrMݰve|<>E7!,`]ݩfsXXb(/* ------------------------------------------------------------------------- */ /* ----- Let 'em Fly! Library ----------- (c) 1991-92 by Oliver Scheel ----- */ /* ------------------------------------------------------------------------- */ #include #include #include #include #include "ltmf_lib.h" /* ------------------------------------------------------------------------- */ MLOCAL WORD STDARGS draw_fly _((PARMBLK *pblock)); /* ------------------------------------------------------------------------- */ LTMFLY *letemfly = NULL; /* ------------------------------------------------------------------------- */ MLOCAL USERBLK fly_button = { draw_fly, 0l }; MLOCAL WORD wk_handle; /* ----- Cookie Jar -------------------------------------------------------- */ typedef struct { LONG id, *ptr; } COOKJAR; /* ------------------------------------------------------------------------- */ /* ----- get_cookie -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ LONG *get_cookie(cookie) LONG cookie; { LONG sav; COOKJAR *cookiejar; LONG i = 0; sav = Super((void *)1L); if(sav == 0L) sav = Super(0L); cookiejar = *((COOKJAR **)0x05a0l); if(sav != -1L) Super((void *)sav); if(cookiejar) { while(cookiejar[i].id) { if(cookiejar[i].id == cookie) return(cookiejar[i].ptr); i++; } } return(0l); } /* ------------------------------------------------------------------------- */ /* ----- ltmf_check -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD ltmf_check(UWORD version) ** ** Funktion: Checkt, ob Let 'em Fly! installiert ist und ob es ** die Mindest-Versionsnummer besitzt. ** ** Parameter: version Enhlt die zu prfende Versionsnummer ** (es wird ein '>='-Test gemacht!!) ** ** Return: TRUE Let 'em Fly! ist installiert und ** die Versionsnummer ist ok. ** FALSE Entweder nicht installiert oder zu ** niedrige Versionsnummer. ** ** ------------------------------------------------------------------------- */ WORD ltmf_check(version) UWORD version; { if(!letemfly) letemfly = (LTMFLY *)get_cookie(0x4C544D46L /*'LTMF'*/); /* !gcc! */ if(letemfly && (letemfly->version >= version)) return(TRUE); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- di_fly ------------------------------------------------------------ */ /* ------------------------------------------------------------------------- */ /* ** WORD di_fly(OBJECT *tree) ** ** Funktion: Lt Dialoge fliegen ... ** ** Parameter: *tree Enthlt die Adresse des Objekt-Baums ** der fliegen soll. ** ** Return: TRUE Let 'em Fly! ist installiert. ** FALSE Let 'em Fly! ist NICHT installiert. ** ** ------------------------------------------------------------------------- */ WORD di_fly(tree) OBJECT *tree; { if(ltmf_check(0x0100)) letemfly->di_fly(tree); return(letemfly != 0l); } /* ------------------------------------------------------------------------- */ /* ----- obj_clsize -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD obj_clsize(OBJECT *tree, WORD obj, ** WORD *x, WORD *y, WORD *w, WORD *h) ** ** Funktion: Berechnet die ECHTEN Ausmae eines Objekts, d.h. ** auch SHADOWED-Objekte werden korrekt behandelt. ** ** Parameter: *tree Enthlt die Adresse des Objekt-Baums ... ** obj und hier die entsprechende Objekt-Nr. ** *x, *y, In diesen Variablen steht dann das Ergebnis. ** *w, *h ** ** Return: siehe di_fly() ** ** ------------------------------------------------------------------------- */ WORD obj_clsize(tree, obj, x, y, w, h) OBJECT *tree; WORD obj; WORD *x, *y, *w, *h; { if(ltmf_check(0x0110)) letemfly->obj_clsize(tree, obj, x, y, w, h); return(letemfly != 0l); } /* ------------------------------------------------------------------------- */ /* ----- init_keys --------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD init_keys(OBJECT *tree) ** ** Funktion: Weist den Objekten ein Tastenkrzel zu (initialisert ** also die interne Tabelle) und malt den Strich. Die ** Funktion wird durch den Schalter 'Key Dials' und die ** ExObTypes beeinflut! ** ** Parameter: *tree Enthlt die Adresse des entsprechenden ** Object-Baums. ** ** Return: TRUE Key Dials aktiv, knnen also angesprochen ** werden. ** FALSE Key Dials inaktiv. ** ** ------------------------------------------------------------------------- */ WORD init_keys(tree) OBJECT *tree; { WORD ret; if(ltmf_check(0x0113)) { wind_update(BEG_UPDATE); ret = letemfly->init_keys(tree); wind_update(END_UPDATE); return(ret); } else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- lookup_key -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD lookup_key(WORD key, WORD kbshift) ** ** Funktion: Gibt zu einer Taste das entsprechende Objekt zurck. ** Darf nur benutzt werden, wenn init_keys() TRUE ** zurckgeliefert hat. ** ** Parameter: key Enthlt den ASCII/Scancode der Taste. Ist ** identisch mit dem von evnt_keybd(). ** kbshift Enthlt den Shift-Status (siehe evnt_button()). ** ** Return: Objekt-Nr. bzw. 0 falls kein Objekt zugewiesen werden ** konnte. ** ** ------------------------------------------------------------------------- */ WORD lookup_key(key, kbshift) WORD key, kbshift; { if(ltmf_check(0x0113)) return(letemfly->lookup_key(key, kbshift)); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- set_do_key -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD set_do_key(VOID (*key_handler)()) ** ** Funktion: Installiert einen zustzlichen Key-Handler ** fr form_do(). ** ** Parameter: key_handler Enthlt die Adresse der Funktion des ** Key-handlers. ** ** Return: TRUE Handler konnte installiert werden. ** FALSE Handler konnte nicht installiert werden. ** ** ------------------------------------------------------------------------- */ WORD set_do_key(key_handler) WORD STDARGS (*key_handler)(); { if(ltmf_check(0x0112)) { letemfly->do_key = key_handler; return(TRUE); } else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- di_moveto --------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD di_moveto(OBJECT *tree, WORD x, WORD y) ** ** Funktion: Bewegt eine Dialogbox zu einer bestimmten Position. ** ** Parameter: *tree Der Objektbaum ** x, y Die Zielkoordinaten. Wird fr x -1 bergeben, ** so wird nur geprft, ob der Dialog flugfhig ** ist. Bei x = -2 wird gesagt, ob ein Redraw ** gesendet wird oder nicht. ** ** Return: 0 Box kann bzw. konnte nicht fliegen. ** 1 Box ist uneingeschrnkt flugfhig. ** 2 Box fliegt nur im Sparmodus. ** ** ------------------------------------------------------------------------- */ WORD di_moveto(tree, x, y) OBJECT *tree; WORD x, y; { if(ltmf_check(0x0115)) return(letemfly->di_moveto(tree, x, y)); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- di_center --------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD di_center(OBJECT *tree) ** ** Funktion: Zentriert einen auf dem Bildschirm befindlichen ** Dialog (hnlich di_moveto(), jedoch mit ausgerechneten ** Werten). ** ** Parameter: *tree Der zu zentrierende Objektbaum bzw. Dialog ** ** Return: siehe di_moveto() ** ** ------------------------------------------------------------------------- */ WORD di_center(tree) OBJECT *tree; { if(ltmf_check(0x0117)) return(letemfly->di_center(tree)); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- ins_spcchar ------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** CHAR ins_spcchar(void) ** ** Funktion: Bearbeitet eine Auswahlbox fr die blen Zeichen. ** ** Parameter: keine ** ** Return: Das ausgewhlte Zeichen (0 fr keine Auswahl) ** ** ------------------------------------------------------------------------- */ CHAR ins_spcchar() { if(ltmf_check(0x0115)) return(letemfly->ins_spcchar()); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- hist_insert ------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD hist_insert(CHAR *string) ** ** Funktion: Fgt einen String in die History ein. ** ** Parameter: string Der einzufgende String. ** ** Return: TRUE String wurde eingefgt. ** FALSE String wurde nicht eingefgt. ** ** ------------------------------------------------------------------------- */ WORD hist_insert(string) CHAR *string; { if(ltmf_check(0x0116)) return(letemfly->hist_insert(string)); else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- init_niceline ----------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD init_niceline(OBJECT *tree) ** ** Funktion: Versieht einen Menbaum (auch Popups) mit den ** Nicelines. Dabei werden alle G_STRINGs, die DISABLED ** sind und `---' enthalten durch die Nicelines ersetzt. ** ** Parameter: Menbaum. ** ** Return: TRUE Let' em Fly! installiert. ** FALSE Let' em Fly! nicht installiert. ** ** ------------------------------------------------------------------------- */ WORD init_niceline(tree) OBJECT *tree; { if(ltmf_check(0x0118)) { letemfly->init_niceline(tree); return(TRUE); } else return(FALSE); } /* ------------------------------------------------------------------------- */ /* ----- init_flyobj ------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ** WORD init_flyobj(OBJECT *tree) ** ** Funktion: Initialisiert das Flug-Objekt. Es wird dann durch ** eine Verschiebeecke ersetzt. Der Objektbaum mu ** mindestens zwei Objekte (ROOT + 1) enthalten. ** Die Flugecke wird nur bei installiertem Let 'em Fly! ** initialisiert. Zu beachten ist, da ein Flugobjekt ** erst ab Version 1.15 explizit untersttzt wird. ** ** Parameter: Objektbaum, in dem das Flugobjekt enthalten ist. ** ** Return: TRUE Es existiert ein Flugobjekt. ** FALSE Es existiert kein Flugobjekt. ** ** ------------------------------------------------------------------------- */ WORD init_flyobj(tree) OBJECT *tree; { OBJECT *tr; WORD obj; WORD d; ltmf_check(0x0100); /* init 'letemfly' */ if((tree[ROOT].ob_type & 0xff00) == 0x8900) /* Magic? */ { obj = 1; /* ROOT Objekt geht nicht */ do { tr = &tree[obj]; if(tr->ob_type & 0x4000) /* Flug-Objekt? */ { tr->ob_type &= 0xff00; tr->ob_type |= G_USERDEF; tr->ob_spec.userblk = &fly_button; wk_handle = graf_handle(&d, &d, &d, &d); return(TRUE); } } while(!(tree[obj++].ob_flags & LASTOB)); } return(FALSE); } WORD STDARGS draw_fly(pblock) PARMBLK *pblock; { WORD attrib[8], pxy[8]; WORD off; /* an dieser Stelle u.U. Register sichern */ if(letemfly && !letemfly->config.bypass && letemfly->config.fly) { vql_attributes(wk_handle, attrib); /* Attribute sichern */ vswr_mode(wk_handle, MD_REPLACE); pxy[0] = pblock->pb_xc; /* Clipping einstellen */ pxy[1] = pblock->pb_yc; pxy[2] = pblock->pb_xc + pblock->pb_wc - 1; pxy[3] = pblock->pb_yc + pblock->pb_hc - 1; vs_clip(wk_handle, 1, pxy); off = (pblock->pb_tree[pblock->pb_obj].ob_state & OUTLINED) ? 3 : 0; vsl_color(wk_handle, 0); vsl_width(wk_handle, 3); vsl_type(wk_handle, 1); pxy[0] = pxy[2] = pblock->pb_x - off + 1; pxy[1] = pblock->pb_y; pxy[3] = pxy[5] = pblock->pb_y + pblock->pb_h + off - 2; pxy[4] = pblock->pb_x + pblock->pb_w - 1; v_pline(wk_handle, 3, pxy); /* vsl_color(wk_handle, pblock->pb_tree[pblock->pb_obj].ob_spec.obspec.framecol); */ vsl_color(wk_handle, 1); vsl_width(wk_handle, 1); pxy[0] = pxy[2] = pblock->pb_x + 3 - off; pxy[1] = pblock->pb_y; pxy[3] = pxy[5] = pblock->pb_y + pblock->pb_h - 4 + off; pxy[4] = pblock->pb_x + pblock->pb_w - 1; v_pline(wk_handle, 3, pxy); pxy[0] = pxy[2] = pblock->pb_x - off; pxy[1] = pblock->pb_y - off; pxy[3] = pxy[5] = pblock->pb_y + pblock->pb_h + off - 1; pxy[4] = pblock->pb_x + pblock->pb_w - 1 + off; v_pline(wk_handle, 3, pxy); pxy[0] = pblock->pb_x - off; pxy[1] = pblock->pb_y - off; pxy[2] = pblock->pb_x + pblock->pb_w + off - 1; pxy[3] = pblock->pb_y + pblock->pb_h + off - 1; v_pline(wk_handle, 2, pxy); vsl_type(wk_handle, attrib[0]); vsl_color(wk_handle, attrib[1]); vsl_width(wk_handle, attrib[3]); vswr_mode(wk_handle, attrib[2]); } /* an dieser Stelle die Register u.U. wieder herstellen */ return(NONE); /* nix mehr malen */ } b=EppTȫپZsM6HN}$ 9HjSE V/>%9V( 1wlاVJC@Vn7#s_{PJ GSflvsR!{cLet 'em Fly! Changes Complete ============================= 1.01 (beta, not released) ----- - [Enter] auf dem 10er-Block selektiert jetzt auch das Default-Objekt. - Die Alert-Boxen wurden berarbeitet. Es wird jetzt von vornherein 8K fr den Hintergrund reserviert. Weiterhin hab ich mich dazu herabgelassen neue Icons zu malen (die anderen hatte ich aus FormDoIt! geklaut ... wre auch zu dreist gewesen). - Der Word-Skip wurde auch verbessert. Vorher kannte Let 'em Fly! keine Umlaute. - War ein Eingabefeld bis zum Ende voll, so konnte man mit der Maus den Cursor nicht hinter das letzte Zeichen positionieren. - Ich habe den Fehler mit den Linienresten beim Fliegen gefunden und natrlich behoben. - Das Verfahren zum Setzen der Underscores wurde komplett berarbeitet. Die Vorteile liegen auf der Hand: a) es wird jetzt weniger Speicher alloziert, b) es gibt nur noch wenige Programme, die Let 'em Fly! berlisten knnen. - Hatte man versucht mit LET_CONF (als Programm!!!) Let 'em Fly! komplett auszuschalten, so klappte das auch prima ... man durfte es dann nur nicht wieder einschalten ... 1.02 (first official release) ---- - Falls nun ein Programm den Maus-Cursor vor den Alert-Boxen nicht einschaltet, hat der Maus-Cursor trotzdem verloren (Btsch). Irgendwo hat man mal gelesen, da Computer auch zhlen knnen ... - Vom AES nicht vordefinierte Objektflags/stati werden von Let 'em Fly! nun ignoriert. Hatte zwar vorher keine Probleme, aber sicher ist sicher, da es sonst mit Sicherheit bumst. - Ich glaube zwar nicht, da irgendein Programm 6 Dialoge ineinander verschachtelt, aber trotzdem fange ich solche Versuche jetzt ab. - Neue Editierfunktion: [CTRL]+[Delete] lscht alles rechts vom Cursor. - Man kann jetzt explizit nach jedem letzten form_dial(FMD_FINISH, ...) einen Redraw senden lassen (siehe Config.-Programm). - Aus der Konfiguration ist der Punkt 'Save Background' herausgeflogen, da eigentlich berflssig. Dazugekommen ist der eben schon erwhnte Punkt 'Send Redraw'. 1.03 (internal, not released) ---- - Da das AES fr seine Alert-Boxen ja einen eigenen Buffer anlegt, mir jedoch entfallen ist, da man mit wind_get(WF_SCREEN, ...) die Adresse und Lnge abfragen kann, wird in Let 'em Fly! dieser Buffer nun auch fr die Alert- Boxen benutzt. Bei TOS-Versionen < 1.04 wird als Lnge konstant 8K angenommen. Resultat: Let 'em Fly! alloziert 8K weniger Speicher. - UNDO zustzlich fr 'verlassen', HELP zustzlich fr 'hilfe'. - erweiterte form_center() Routine. Dialoge, welche ein zweites mal aufgerufen werden, erscheinen an der letzten Position. Drckt man beim Aufruf des Dialogs zustzlich [ALT]+[CTRL], so wird die Box wieder zentriert dargestellt. - Clipboard-Untersttzung. Mit [CTRL]-[C/X/V] kann man jetzt auch in editierbaren Feldern kopieren, ausschneiden und einfgen. Ausgeschnitten/ Kopiert wird immer die komplette Zeile, beim Einfgen wird jedoch 'echt' eingefgt. - Neue Icons knnen installiert werden. Die Datei mu LET_ICON.RSC heien und entweder im AUTO-Ordner oder im ROOT liegen. Der Aufbau ist selbsterklrend. - Beim durchsichtig machen eines Dialogs wird jetzt kein Redraw mehr gesendet, auch wenn 'Send Redraw' eingeschaltet ist. - Das Scannen des Alert-Strings wurde komplett berarbeitet und ist jetzt, bis auf einige zustzliche Sicherheitsabfragen, weitgehend kompatibel zum Original. - Trifft die Routine fr die Tastenvergabe auf einen String, welcher ausschlielich aus Spaces besteht, hat es vorher geknallt. Ist nun auch behoben. - Insgesamt wurde Let 'em Fly! von Library-Funktionen entrmpelt. Dadurch ist die neue Version auch nur ~1K lnger geworden. 1.10 (internal, not realeased) ---- - Neues Configurations-Accessory, welches der CPX-Version angepat wurde. (Ich bin halt ein fauler Mensch ... jetzt mu ich nur noch ein Programm pflegen) - ntersttzt jetzt virtuelle Bildschirme a la BigScreen 2.0, d.h. der Dialog kann an der zur Zeit sichtbaren Stelle zentriert werden. Alert-Boxen werden immer im sichbaren Bereich zentriert. - ber den erweiterten Objekttyp und die nicht genutzten ob_flags ist es nun mglich Let 'em Fly! ber den jeweiligen Objektbaum zu steuern. Z.B. ist es so mglich gezielt Tasten zu vergeben oder bestimmte Funktionen abzuschalten. - ber den Cookie wird nun eine neue Funktion (obj_clsize) zum Berechnen der echten Ausmae eines Objekts bereitgestellt. 1.11 (second official release) ---- - Der 'Send Redraw' wurde auf alle form_dial(FMD_FINISH, ...) erweitert, da es oft nicht gereicht hat nur den letzten FMD_FINISH zu bercksichtigen. - Bei dem unten aufgefhrten GEMDOS Bug hat sich Let 'em Fly! etwas seltsam verhalten, was mit dieser Version jetzt aber (hoffentlich) behoben ist. - Wird ein Ersatzobjekt mit Underscore angeklickt, so wird der Klick auf das eigentliche Objekt simuliert. Ausnahme: Das Ersatzobjekt ist editierbar. - War der Alert-String lnger als 255 Zeichen war die Wahrscheinlichkeit, da Let 'em Fly! abstrzt sehr hoch. - Der Code wurde hinsichtlich der Gre um ein paar hundert Bytes kleiner. 1.12 (third official) ---- - Um innerhalb von form_do() eigene Tastendrcke verwalten zu knnen, ist es nun mglich ber den Cookie-Jar eine User-Funktion zu installieren, welche bei jedem Tastenevent aufgerufen wird. - Als SPECIAL Keys gelten jetzt auch die Funktionstasten [F1]-[F10]. Diese lassen sich aber nur ber die ExObTypes vergeben. Die eingebauten Alert-Boxen machen hiervon Gebrauch, d.h. die drei Tasten kann man jetzt zustzlich mit [F1]-[F3] erreichen. - Das VDI-Workstation Handling wurde komplett berarbeitet, somit gibt es jetzt auch keine Probleme beim Auflsungswechsel mehr. - Ebenso wurde das Clipboard-Handling berarbeitet. Das Clipboard wird beim Ausschneiden von Texten vorher gelscht, auer man benutzt die neue Funktion zum Anhngen von Daten, welche bei zustzlich gedrckter Shifttaste ausgelst wird. Weiterhin kommt Let 'em Fly! nun auch mit sog. falschen Pfadangaben zurecht, d.h. ein Backslash ('\') am Ende der Pfadangabe fr das Clipboard wird korrekt behandelt. - Bei der direkten Cursorpositionierung wurde die Ausrichtung des Textes nicht bercksichtigt. Seltsame Positionierungen sollten nun der Vergangenheit angehren. - Wurde ber die ExObTypes ein UNDO oder HELP Objekt festgelegt, so wurde das Objekt mit zwei Tasten (und auch zwei Strichen) belegt. Ist jetzt behoben. - Ist bei einem Objekt die '9' unterstrichen, so kann man dieses nun auch ber [ALT]+'9' anwhlen (knnte vielleicht mal ganz ntzlich sein). - Ein peinlicher Fehler bezgl. der Speicherverwaltung in der Icon-Laderoutine wurde beseitigt. - Ein kleiner (aber durchaus bler) Tippfehler in der form_dial() Routine wurde behoben. Bei der Verschachtelung von Dialogen konnte es Probleme geben. - In der form_keybd()-Routine wurde ein Work-Around fr die MyDials (Interface) eingebaut. Vorher gab es Probleme beim Drcken von RETURN, d.h. das richtige Objekt wurde selektiert, jedoch ein falsches wurde zurckgegeben. - Wurden zwei Dialoge mit der gleichen Adresse nacheinander abgearbeitet, obwohl diese unterschiedlich waren (z.B. Dialog-Test in Interface), dann hat Let 'em Fly! zwei Bomben geworfen. Ist nun auch behoben. - Das Selektieren des DEFAULT-Objekts beim Drcken von RETURN wurde korrigiert. Es wird nun nicht mehr brute-force auf SELECTED-only gesetzt (peinlich). 1.13 (never release '13'er versions ...) ---- - Den Underscores und dem Alert-Icon kann nun eine bestimmte Farbe zugewiesen werden. Bei der Farbzuweisung der Underscores wird nach den Regeln des AES verfahren, d.h. ist ein Objekt SELECTED wird Bit 0 komplementiert. - Durch diese Farbuntersttzung mute natrlich auch ein neues Konfigurationsprogramm her. - Mit [ALT]+[Tab] bzw. [ALT]+[SHIFT]+[Tab] kann man nun das DEFAULT Objekt innerhalb eines Dialogs 'verschieben'. Smtliche selektierbaren G_BUTTONs werden dabei durchgegangen. - Ohne [ALT] kann man jetzt auch die Shortcuts innerhalb der Alert-Boxen erreichen. - Man kann nun die rechte Maustaste fr den Flugmodus (normal/ durchsichtig) umkonfigurieren, d.h. rechte Taste nicht gedrckt: durchsichtig; Taste gedrckt: normal. - Let 'em Fly! versucht jetzt immer erst TT-Ram zu allozieren. Dadurch wird es natrlich noch etwas schneller. - Die Flugroutinen wurden weiter optimiert. Boxen die grer als der Bildschirm sind, knnen jetzt auch fliegen. Weiterhin brauchen die Werte zum Saven des Bildschirms bei FMD_START nicht mehr genau sein. Wird zuviel gesaved, so pat Let 'em Fly! die Koordinaten beim Flug an. Wurde zuwenig gesaved, so wird der Dialog als flugunfhig angesehen. - ber die ExObTypes (bzw. die nicht genutzten Flags) lassen sich nun auch Dialoge flugunfhig machen. Das ist interessant, wenn das Programm mit den fliegenden Dialogen nicht zurrechtkommt. - Ebenfalls ist nun ber die ExObTypes ein 'Snap-in' Modus erreichbar. Nach dem Fliegen rastet die Dialogbox wieder auf das ursprngliche Byte-Alignment ein. - Da man z.B. bei Dialogboxen in Fenstern (-> Kontrollfeld) eine eigene form_do() Routine schreiben mu, mute man bis jetzt auch immer auf die Tastatur-Shortcuts von Let 'em Fly! verzichten. Nun sind zwei wichtige, vorher nur interne Funktionen fr dieses Problem ber den Cookie ansprechbar. Es handelt sich dabei um init_keys() (scannt den Dialog und malt die Striche) und lookup_key() (gibt bei einem Tastendruck das jeweilige Objekt zurck). - Das wind_update() Verhalten bei den Alert-Boxen wurde verbessert, vorher kam es immer etwas zu spt. - Die form_error() Routine zeigt jetzt nur noch Fehler kleiner #64 an. Das Original macht's genauso. - Da sich bei AS-Overscan die Auflsung ohne Reset ndern kann, konnte es bei eingeschaltetem 'Save Position' Probleme geben. - Eine in V1.12 eingebaute Inkompatibilitt in der form_keybd() Routine wurde entfernt. Das DEFAULT-Objekt mute auch EXIT sein, da ist beim Original jedoch nicht der Fall. - Let 'em Fly! liegt jetzt eine vernnftige Library bei. Somit sollte es jetzt etwas einfacher sein die zustzlichen Features von Let 'em Fly! zu nutzen. - Nachdem ich in V1.11 bezgl. des GEMDOS Bugs von 'hoffentlich' gesprochen habe (was sich natrlich nicht erfllt hat), ist das Verhalten ab dieser Version tatschlich schner. - Einen Fehler in der form_keybd() Routine entfernt. Trat aber nur unter extremen Bedingungen auf. - Der neuen appl_exit()-Routine fehlte seit der letzten Version etwas, nmlich ein appl_exit() (was ja eigentlich auch der Sinn sein sollte). Irgendwie ist diese Zeile verlorengegangen ... 1.14 (4th official) ---- - Versionsnummer vorsichtshalber auf 1.14 gendert ... - Ein bichen an der Optik gefeilt. 1.15 (beta only) ---- - In der TOS 10/91 wurden auch neue Dialogroutinen vorgestellt. Natrlich knnen sie Let 'em Fly! nicht das Wasser reichen, aber eine Idee fand ich so gut, da ich sie auch in Let 'em Fly! verwirklicht habe. Es handelt sich hier um die History-Funktion fr die editierbaren Felder. Mit [CTRL]+[Csr up/down] kann man die History durchgehen, mit [SHIFT]+[Csr up/down] kann man nach dem eben eingetippten String(anfang) suchen lassen (s.a. Mupfel). - [CTRL]+[V] fgt jetzt nicht mehr 'echt' ein, sondern lscht die Zeile vorher. Der alte Modus ist weiterhin ber [CTRL][SHIFT]+[V] erreichbar. - Um Zeichen zu erzeugen, die nicht so einfach ber die Tastatur einzugeben sind, kann man in editierbaren Feldern (die alle Eingaben zulassen!) ber [SHIFT]+[Insert] eine kleine Dialogbox mit den 'blen' Zeichen auf den Bildschirm zaubern. Diese Funktion ist auch ber den Cookie-Jar erreichbar. - Klickt man auerhalb von Dialogboxen, so hat es vorher nur 'Pling' gemacht, nun kommen die Dialogboxen zur Maus geflogen (Jumpin' Dials). - Diese neue Flugroutine ist auch ber den Cookie erreichbar. Nebenbei gibt es hier eine Mglichkeit nachzuprfen, ob der Dialog fliegen kann. - Damit man in die Buttons 'reinfahren' kann, ist es nun mglich die Zeit bis zum Fliegen einzustellen. Ausnahmen: ein Flugobjekt wurde definiert, die di_fly()-Routine wurde ber den Cookie angesprungen. - Neben den Strichen zum Kennzeichnen der Shortcuts, kann man jetzt den Buchstaben farbig drucken lassen (geht natrlich nur in Farbe). - ber die ExObTypes lt sich nun auch ein Flugobjekt festlegen. Kann die Box nicht fliegen, so wird es von Let 'em Fly! gelscht. - Eine sog. EXAPPLBLK-Struktur wird untersttzt. ber diese Struktur kann Let 'em Fly! benutzerdefinierte Objekte untersttzen (z.B. runde Radio-Buttons). - Die Tastenvergabe wurde weiter optimiert, sie geht jetzt durch vier (4) Instanzen: 1.) Taste ber ExObType festgelegt? 2.) Default/Undo-Key (d.h. erster Buchstabe)? 3.) Wortweise vergeben (d.h. immer der erste Buchstabe eines Wortes). 4.) Suche ein beliebiges Zeichen (so wie frher auch). - Ich glaube, der GEMDOS Bug verfolgt mich (mein Psychater kann mir leider auch nicht helfen). Nun denn, ab dieser Version wird der Redraw beim Lschen der Box an der richtigen Stelle und in der richtigen Gre gesendet. - In der obj_clsize()-Routine war ein kleiner Fehler enthalten: SHADOWED Objects mit einer positiven Rahmendicke wurden falsch berechnet. Das hat sich auch auf einige Dialoge ausgeweitet, da Let 'em Fly! ja nun selbst die Objektgre berechnet. 1.16 (experimental version) ---- - In die Eingabefelder fr Datei- und Pfadnamen, knnen jetzt alle legalen Buchstaben eingeben werden. - Da ein String in die History nur dann eingefgt wird, wenn dieser auch verndert wurde, kann man jetzt mit [CTRL]+[Return] den String im aktuellen Eingabefeld 'manuell' einfgen. - ber den Cookie-Jar kann man im eigenen Programm ebenfalls manuell Strings in die History einfgen. - Bei CAPS-LOCK konnte die [RETURN]-Taste nicht mehr den Dialog beenden. Diesen Bug hatte ich in V1.15 eingebaut. - Das Flugobjekt wird (im Gegensatz zu V1.15) nicht mehr ber die ObFlags, sondern ber den ExObType festgelegt. - Damit bei der manuellen Tastenvergabe (die ber den ExObType) die Sondertasten nicht zustzlich mit einer normalen Taste belegt werden, kann man dies nun durch setzen eines Flags verhindern. - Let 'em Fly! ffnet jetzt berhaupt keine virtuellen Workstations mehr, sondern speichert die Attribute der GEM-Workstation (nein, nicht die von dem Synthesizer ...), die verndert werden. 1.17 (number five is alive) ---- - ber editierbaren Feldern wechselt der normale Maus-Cursor in einen Edit-Cursor. Geklaut vom Mac, bzw. aus den Dialog-Boxen von Markus Fritze (please forgive me). - Ein Doppelklick auf das Flugobjekt re-centered die Dialogbox wieder. (Diese Funktion ist auch ber den Cookie-Jar erreichbar) - Anstelle der rechten Maustaste, kann man nun auch eine der Shifttasten benutzen, um den Dialog durchsichtig zu machen. - Ist in einem Dialog KEIN editierbares Feld vorhanden, so braucht man fr die Shortcuts kein [ALT] mehr zu drcken. Dieses Verfahren galt vorher nur fr die Alert-Boxen. - Vor dem Bearbeiten der Dialogbox wird nun der Tastaturbuffer gelscht. Das Original macht es anscheinend genauso. - War ein Default-Button durch ein DISABLED `gefangen', so kann man ihn jetzt mit [ALT]+[Tab] auch wieder `befreien'. - Der Gong bei den Jumpin' Dials erklingt nur, wenn die TOS-Bimmel eingeschaltet ist, d.h. man kann ihn auch nur so abschalten. - Die Vergabe der Tasten nach 2 (s.o.) hatte noch einen kleinen Tenkfehler in der Anzeige. - Das Prfen der Flugfhigkeit wurde verfeinert. Es gibt jetzt drei Returnwerte (nicht mglich, mglich im Sparmodus, uneingeschrnkt mglich). - Der ExObType 113 (0x71), der bei FormDoIt! untersttzt wird um die KeyDials fr dieses Objekt auszuschalten, wird jetzt auch von Let 'em Fly! supported. Vorher war dieser Wert nur im ROOT-Objekt gltig (und schaltete so Let 'em Fly! komplett ab). - Der Sparmodus beim Fliegen wurde komplett neu geschrieben und funktioniert jetzt auch vernnftig (hoffe ich zumindest ...). 1.18 (the show must go on) ---- - `Have a nice time with NICELINE' wurde jetzt in Let 'em Fly! integriert. Bei Mens werden nun die `---' und die `===' durch schne Striche, wie in Gemini, ersetzt. Es werden auch die Mens in den Fenstern untersttzt, wenn diese mit der Geiss-Lib realisiert wurden. - Unter Mag!X gibt es nun auch neue Event-Critic Boxen mit dem obligatorischen Ignore-Button und neuen Icons. - Die Error-Boxen (nicht die Event-Critic-Boxen) enthalten jetzt eine genauere Fehlerbeschreibung inkl. Fehlernummer. Das Original hat immer einen halben Roman dargestellt aus dem man meistens aber auch nicht viel schlauer wurde. - Dialoge knnen jetzt auch an der Mausposition zentriert werden. - Ein von Let 'em Fly! untersttztes Flugobjekt verliert seine Exklusivitt, wenn man zustzlich die rechte Maustaste drckt. Jetzt kann man auch wieder ber die anderen Objekte fliegen. Natrlich wird in diesem Fall auch der Dialog durchsichtig gemacht. - Die Jumpin' Dials wurden in ihrem Verhalten verbessert. Zum einen werden sie beim Rausfahren aus dem Dialog mit gedrckter Maustaste nicht mehr aktiviert und zum anderen bremsen sie jetzt kurz vor dem Bildschirmrand ab. Damit kann sich nun keiner mehr beschweren, da der durch die Jumpin' Dials Beulen im Bildschirmrand bekommt. Weiterhin lehne ich an dieser Stelle smtliche Schadensersatzansprche dieser Art ab. - UNDO reagiert jetzt auch auf `ende'. - Wenn kein Edit-Feld vorhanden ist, kann man ja die Shortcuts auch ohne [ALT] bedienen. Leider hatte ich jedoch die Zahlen irgendwie nicht bercksichtigt. Zudem kann man jetzt auch [Tab] ohne [ALT] bedienen. - Bei der Bestimmung des Clipboards wird jetzt neben der Environment-Variable `SCRAPDIR' auch `CLIPBRD' untersttzt. - In TT-Mid war die Darstellung farbiger Shortcuts als Buchstabe fehlerhaft. - Hatte der Mauszeiger die Cursorform, so wurde sie beim Aufruf der Info-Seite und der Seite fr die speziellen Zeichen nicht umgestellt. - die Funktionsweise von [SHIFT]-[Return] war fehlerhaft. - Bei den Alert-Boxen wird die Mausform nun vorher gesichert. - folgt auf ein FMD_START direkt ein FMD_FINISH, so wird nun auch ein Redraw ausgelst. Damit drften wieder einmal ein paar mehr Programme besser mit Let 'em Fly! zusammenarbeiten. - ber den ExObType kann man jetzt ein Lschen des Flugobjekts durch Let 'em Fly! verhindern. - In allen Versionen vorher war das letzte Objekt im Baum nicht zum fliegen zu gebrauchen. - Bei den legal Filename Characters wurden die small Letters `p' und `f' nicht bercksichtigt. - Objekt No. 0 kann jetzt auch wieder TOUCHEXIT sein. - Kollision zwischen nicht exklusivem Flugobjekt und Magic 113 (FormDoIt) beseitigt. 1.19 (Happy Birthday ...) ---- - Niceline macht den GFA-Basic Check jetzt anders. Es wird nicht mehr auf die `1' getestet, sondern ob sich hier ein non-Space im ersten Accessory-Eintrag befindet. - Der Niceline-Patch fr Objekt-Bume wurde ber eine Funktion von auen zugnglich gemacht. Damit kann man jetzt auch seine eigenen Mens (auch PopUps) mit Nicelines versehen. - Niceline ermittelt jetzt das AES-Workstation Handle korrekt. Vorher wurde immer 1 angenommen, was ein Relikt aus den Hack-Zeiten war. - Das Sichern der Mausform wurde wieder gekillt, da es mit einigen VDI-Treibern (insbesondere TrueColor) Probleme gab. Bevor Atari nicht eine legale Mglichkeit zur Verfgung stellt, wird es auch nicht von Let 'em Fly! untersttzt. - Bei den Eingabefeldern gibt es im AES ein undocumented Feature, welches es erlaubt den pvalid-String zu krzen. Let 'em Fly! sollte damit jetzt zurechtkommen. - Rundungsfehler bei `Dials to Mouse' beseitigt, der bei Boxen mit der Rahmendicke -1 (ohne SHADOWED und OUTLINED) auftrat. 1.20 (MultiTOS revenge) ---- - Die Farbzuweisung der Icons in den Alert-Boxen wird jetzt ber die Resource geregelt. Der globale Regler existiert nicht mehr. Sollen die Icons neue Farben bekommen, so mu man mit einem LET_ICON.RSC arbeiten und dort die Farben mit einem Resource Construction Kit ndern. Damit kann jetzt jedem einzelnen Icon eine andere Farbe verpassen. - Interne Boxen unter dem neuen AES jetzt im 3D-Look ("Ich setze meine rosarote Brille auf ..."). - Befinden sich in einer Dialogbox Kstchen mit Pfeilen und ist zudem kein editierbares Feld vorhanden, so knnen diese Kstchen mit den Cursor-Tasten bettigt werden (z.B. bei einer Liste). - War der String beim Einfgen in ein Edit-Feld vom Clipboard oder der History lnger als das Feld, so wurde die Resource zerstrt. Den Fehler habe ich aber erst in der 1.19 eingebaut (gut wa?). - Die Anzahl der Farben wurde nicht korrekt abgefragt, was dazu fhrte, da unter TrueColor-Karten keine farbigen Shortcuts mglich waren. - Es kam manchmal vor, da die `ColChar's nicht genau den alten Buchstaben berdeckten. Sollte nun nicht mehr passieren. - Bei [ALT]+[Tab] werden jetzt versteckte Objekte bergangen. - Der Niceline-Bug ist nun drauen. Vorher strzten einige Programme, wenn Sie als Accessory installiert wurden (z.B. 1st Base, qed) ab. - Fr einen form_error(36) fehlte ein Tabelleneintrag, was unweigerlich zum Absturz fhrte. - Ein form_do(tree, -1) auf ein editierbares Objekt fhrt jetzt nicht mehr zum Absturz. - Wegen einigen nderungen im neuen AES kann man u.a. den Extended Editor *nicht* mehr ber die Flags ausschalten. Fr weitere Infos zu Let 'em Fly! und MultiTOS bzw. neues AES verweise ich auf die Datei MULTITOS.TXT! - Einige andere kleinere Anpassungen an MultiTOS. - Im CPX wurden ein paar Fehlerchen beseitigt. Bekannte Bugs & Probleme: ------------------------- - Wird die Box durchsichtig gemacht und der ist Speicher knapp, dann kann es sein, da sich die Box beim nchsten mal nicht mehr verschieben lt. Tja, anscheinend ist das GEMDOS nicht immer in der Lage einen Block mit der Lnge X zu free-en und danach wieder einen Block mit gleichem X zu allozieren. Auch POOLFIX schafft hier keine Abhilfe. - Aus irgendwelchen Grnden sind manchmal die Icons bei den Alert-Boxen in Let 'em Fly! zerstrt. Bis jetzt bin ich ratlos. Falls jemand einen reproduzierbaren Fall hat, sollte er ihn mir nach Mglichkeit miteilen. - Unter Overscan werden nach dem Runterschalten der Auflsung die Dialogboxen nicht (immer?) richtig zentriert. Die Ursache ist aber bei Overscan zu suchen, da Let 'em Fly! die Bildschirmausmae bei fast jeder Funktion erneut abfragt. - Es gibt ein undokumetiertes Feature in den Alert-Boxen, welches von Let 'em Fly! momentan nicht untersttzt wird. Es handelt sich dabei um das Escapen der Zeichen []|. cO;k&)X$o\wFj$Cpհ&@daV T9e2j VS AMAP50B_5r@Ғm/I/* ------------------------------------------------------------------------- */ /* ----- Let 'em Fly! form_do() Sample ------------------------------------ */ /* ------------------------------------------------------------------------- */ #include #include #include #define TRUE (!0) /* ------------------------------------------------------------------------- */ #define FMD_BACKWARD -1 #define FMD_FORWARD 1 #define FMD_DEFLT 0 int find_obj(OBJECT *tree, int start_obj, int which) { int obj, flag, theflag, inc; obj = 0; flag = EDITABLE; inc = 1; switch(which) { case FMD_BACKWARD : inc = -1; case FMD_FORWARD : obj = start_obj + inc; break; case FMD_DEFLT : flag = DEFAULT; break; } while(obj >= 0) { theflag = tree[obj].ob_flags; if(theflag & flag) return(obj); if (theflag & LASTOB) obj = -1; else obj += inc; } return(start_obj); } int fm_inifld(OBJECT *tree, int start_fld) { if(start_fld == 0) start_fld = find_obj(tree, 0, FMD_FORWARD); return(start_fld); } /* ------------------------------------------------------------------------- */ int my_form_do(OBJECT *tree, int start_fld) { int edit_obj, next_obj, which, cont, idx = 0, mx, my, mb, ks, kr, br; int keys, kb_obj; int msg[8]; next_obj = fm_inifld(tree, start_fld); keys = init_keys(tree); edit_obj = 0; cont = TRUE; while(cont) { if((next_obj != 0) && (edit_obj != next_obj)) { edit_obj = next_obj; next_obj = 0; objc_edit(tree, edit_obj, 0, &idx, ED_INIT); } which = evnt_multi(MU_KEYBD|MU_BUTTON, 0x02, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, msg, 0, 0, &mx, &my, &mb, &ks, &kr, &br); if(which & MU_KEYBD) { kb_obj = keys ? lookup_key(kr, ks) : 0; if(kb_obj) cont = form_button(tree, kb_obj, 0x01, &next_obj); else { cont = form_keybd(tree, edit_obj, next_obj, kr, &next_obj, &kr); if(kr) objc_edit(tree, edit_obj, kr, &idx, ED_CHAR); } } if(which & MU_BUTTON) { next_obj = objc_find(tree, ROOT, MAX_DEPTH, mx, my); if(next_obj == -1) { if(!di_moveto(tree, mx, my)) Bconout(2, 7); next_obj = 0; } else if((tree[next_obj].ob_flags & 0xff) == NONE) { if(br == 2) di_center(tree); else di_fly(tree); /* Let 'em Fly! */ next_obj = 0; } else cont = form_button(tree, next_obj, br, &next_obj); } if((!cont) || ((next_obj != 0) && (next_obj != edit_obj))) objc_edit(tree, edit_obj, 0, &idx, ED_END); } return(next_obj); } HsILE"L.5 F|#>2?%/jo } N1Uʢ#D8NMDwcS8Zzy2it*7jg rKkTN8 usٴh$tRiuPUbRX5N#aRUZ.mhaeHZmL:NjRA6)$i11"AC[sCRzD@'HJ.T)F"'O/HÜ_ӄ6/B'[ݻ_R6'4~PX6⤼lԾ,G3Pڞڿ1:mg:?ti\ľ.`}5 W10b(:/* ------------------------------------------------------------------------- */ /* ----- Let 'em Fly! Library ----------- (c) 1991-92 by Oliver Scheel ----- */ /* ------------------------------------------------------------------------- */ #ifndef __LTMFLIB__ #define __LTMFLIB__ #include /* ------------------------------------------------------------------------- */ /* ----- Let 'em Fly! Structure -------------------------------------------- */ /* ------------------------------------------------------------------------- */ typedef struct { UWORD version; /* BCD format */ struct { unsigned light : 1; /* light version (read) */ unsigned niceln : 1; /* niceline */ unsigned jumpin : 1; /* jumpin' dials */ unsigned flyswi : 1; /* conf. flymode switch */ unsigned vscr : 1; /* virtual scr. support */ unsigned center : 1; /* center mode */ unsigned keys : 1; /* key handling */ unsigned edit : 1; /* extended editor */ unsigned redraw : 1; /* send redraw message */ unsigned flytyp : 1; /* solid/hollow fly */ unsigned fly : 1; /* flying on/off */ unsigned alert : 1; /* alerts/errors on/off */ unsigned mouse : 1; /* use virtual memory */ unsigned f_grow : 1; /* grow/shrink boxes */ unsigned g_grow : 1; /* dials to mouse */ unsigned bypass : 1; /* ON/OFF highest prio */ } config; WORD conf2; /* reserved */ WORD reserved; /* reserved */ VOID STDARGS (*di_fly) _((OBJECT *tree)); VOID STDARGS (*obj_clsize) _((OBJECT *tree, WORD obj, WORD *x, WORD *y, WORD *w, WORD *h)); WORD STDARGS (*do_key) _((WORD key, WORD kshift)); WORD STDARGS (*init_keys) _((OBJECT *tree)); WORD STDARGS (*lookup_key) _((WORD key, WORD kshift)); WORD STDARGS (*di_moveto) _((OBJECT *tree, WORD mx, WORD my)); WORD STDARGS (*di_center) _((OBJECT *tree)); WORD ucol; /* underscore color */ WORD aicol; /* alert icon color */ WORD aframe; /* alert frame size */ WORD flydelay; /* delay before flying (form_do()-only) */ WORD STDARGS (*hist_insert) _((CHAR *string)); CHAR STDARGS (*ins_spcchar) _((VOID)); VOID STDARGS (*init_niceline) _((OBJECT *tree)); } LTMFLY; /* ------------------------------------------------------------------------- */ EXTERN LTMFLY *letemfly; /* ------------------------------------------------------------------------- */ /* ----- Prototypes -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ LONG *get_cookie _((LONG cookie)); WORD ltmf_check _((UWORD version)); WORD di_fly _((OBJECT *tree)); WORD obj_clsize _((OBJECT *tree, WORD obj, WORD *x, WORD *y, WORD *w, WORD *h)); WORD init_keys _((OBJECT *tree)); WORD lookup_key _((WORD key, WORD kbshift)); WORD set_do_key _((WORD STDARGS (*key_handler)())); WORD di_moveto _((OBJECT *tree, WORD x, WORD y)); WORD di_center _((OBJECT *tree)); CHAR ins_spcchar _((VOID)); WORD hist_insert _((CHAR *string)); WORD init_niceline _((OBJECT *tree)); WORD init_flyobj _((OBJECT *tree)); #define _get_cookie get_cookie /* some useful defines ... */ #define fly_check(tree) di_moveto(tree, -1, 0) #define redraw_check(tree) di_moveto(tree, -2, 0) #endif /* ------------------------------------------------------------------------- */ ʁ7EQ ! ӏz[2*zO$/7T_j9jl}.N}>H:jd;]&p/,ܗD}¢l6fFyMh+)Kr™ڝߑt\^5;\P24ἂ*^ Ǟ)?D֑]JU%LɵZl7d)!Kd0ykr`!Ϣ+f.YIRT&wUK%ү =`qvǤ4@M_6rgϾ?Y\>d7ܻ6&KoUi,ޟx4As 7ˆ Lz`*JS( I0=!s F@@@Ƙrf+0*@Ufyz{<# KjaE4×xyHwAXCD@4a1HB[#iHxi 8iƜI'#'L"`~w~e =PzG)ʋk=^s|Qy՞Dʵu|Ș$4kZP7rnOk#f?Iq@!RDiZd"_Iq#D@!¢xdg)B/ ?D"gV߶> T?*Tk7so|S JA1(Xr&dsL ߅< 3 @xJ"L$P.Pa@ Three Flights Up ---------------- The new Programmer's Guide to Let 'em Fly! (includes version 1.20) April 1993 (c) 1991-93 by Oliver Scheel ... this guide (however) goes Freaky Deaky! Introduction ============ Tja, nun ist es soweit, der komplett berarbeitete Guide ist da. Er soll dazu dienen die programmiertechnischen Mglichkeiten in Zu- sammenhang mit Let 'em Fly! nherzubringen. Um jedoch hochgesteckten Erwartungen entgegenzuwirken: Er kann das Gehirn des einzelnen nicht ersetzen, also nichts fr den Ex US-Prsidenten Ronny ("The President's brain's missin'!"). Nun denn, fr diesen Guide sind C-Kenntnisse (und nach Mglichkeit auch Assemblerkenntisse) erforderlich. Eine Untersttzung von GFA- Basic (oder Omikron-Basic) wird es von meiner Seite her nicht geben, da ich noch nie mit Basic auf dem ST gearbeitet habe (ich stelle mir es aber ziemlich kompliziert vor) und natrlich gewisse Abneigungen gegen Basic auf dem ST habe. Da eine echte strukturierte Pro- grammierung unter Basic nicht mglich ist (da kann der Herr Ostrowski noch so viel `while's und `case's einbauen), drfte besonders der Zugriff auf die Struktur nicht ganz einfach sein. Auch wenn dieser Absatz etwas hart kommt, mu ich aber leider sagen, da ich mich recht hufig ber GFA-Basic Programme aufregen mu. Dabei meine ich nicht unbedingt die der Freizeitprogrammierer, sondern eher die der `Professionellen'. Der Lieferumfang und die Kondome (h, Konditionen) -------------------------------------------------- Dieses Paket ist Public Domain, d.h. es darf frei kopiert und benutzt werden. Der Vertrieb ber einen PD-Versand ist nur mit schrift- licher(!) Genehmigung meinerseits mglich. Zuwiderhandlungen werde ich strafrechtlich verfolgen. Zu `Three Flights Up' gehren folgende Dateien: - 3FLIGHTS.TXT Dieser Text - CHANGES.TXT Die komplette Changes-Liste von Let 'em Fly! - MULTITOS.TXT Bemerkungen zu Let 'em Fly! und MultiTOS (Wichtig!) - FUTURE.TXT Die Zukunft von Let 'em Fly! - LTMF_LIB.C Eine Library fr C - LTMF_LIB.H Dazu das Header-File - DO_SAMPL.C Ein form_do() Sample Das Paket darf nur komplett mit diesen Dateien weitergegeben werden! Es ist erlaubt die *.C Dateien fr die eigenenen Anforderungen zu verndern. Es ist jedoch NICHT erlaubt diese vernderten Dateien weiterzugeben. Fr Fehlerkorrekturen habe ich natrlich immer ein offenes Ohr. First Flight (Internes) ======================= Na, wo hngen wir denn berall drin? ------------------------------------ Let 'em Fly! verbiegt den TRAP #2 (AES/VDI) und den TRAP #13 (BIOS) und benutzt dazu die XBRA-Kennung `LTMF'. Unter bestimmten Vor- raussetzungen verbiegt Let 'em Fly! den etv_critic Vektor. Ansonsten wird noch ein Cookie-Jar installiert (s.u.). Der Werdegang einer Dialogbox bei installiertem Let 'em Fly! ------------------------------------------------------------ Normalerweise wird in einem Programm eine Dialogbox nach dem folgen- den Schema abgearbeitet: [...] form_center(dialog, &x, &y, &w, &h); form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); objc_draw(dialog, ROOT, MAX_DEPTH, x, y, w, h); choice = form_do(dialog, 0); form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h); [...] Let 'em Fly! hngt in allen eben benutzten Funktionen drin und mischt mehr oder weniger krftig mit. Da dies die grundlegenden Funktionen im Dialogbox-Handling sind, werden die Einflsse von Let 'em Fly! auf diese Funktionen jetzt im einzelnen beschrieben: form_center(dialog, ...) ------------------------ Hier wird der Dialog normalerweise zentriert. Bei eingeschaltetem `Save Position' werden nur die Tree-Koordinaten mit Korrektur zurckgegeben. Ist der `VSCR-Support' aktiv, so wird die Box von Let 'em Fly! im gerade sichtbaren Ausschnitt zentriert. form_dial(FMD_START, ...) ------------------------- ber diese Funktion sichert Let 'em Fly! den Dialogbox-Hintergrund. Der bergebene Bereich sollte daher mglichst genau angegeben werden. Wird eine LTMF-Version ab 1.14 benutzt, so kann man auch einen greren Ausschnitt bergeben, Let 'em Fly! transformiert dann bei Bedarf die Koordinaten. `form_center()' liefert bei 'normalen' Dialog- boxen richtige Ergebnisse, Probleme gibt's z.B. bei SHADOWED Ones. Im Zweifelsfall lieber ein bichen mehr angeben. Konnte der Hintergrund nicht gesichert werden, so wird die UR- Routine aufgerufen. objc_draw(dialog, ...) ---------------------- Let 'em Fly! setzt hier nur einige interne Flags. form_do(dialog, ...) -------------------- Hier greift Let 'em Fly! in die Vollen. Zwei AES-Funktionen, die in form_do() benutzt werden (und form_do() selbst natrlich auch), wur- den komplett neu programmiert und ins Betriebssystem eingebunden: `form_keybd()' und `objc_edit()'. Bei selbstgebauten form_do()- Routinen sollte man daher Gebrauch von diesen beiden Funktionen machen, insbesondere von objc_edit(), da hier u.a. der Clipboard- Support, die History und die Special Character Box integriert wurden. Auch sollte man nicht zuviele Tastenkombinationen vor dem Aufruf herausfiltern. Innerhalb von `form_do()' wird dann u.a. der Objektbaum nach Tastenkombination durchgescannt. Diese (rekursive) Funktion arbeitet wie folgt: Das entsprechende Objekt mu entweder SELECTABLE, EXIT oder TOUCHEXIT sein und darf nicht DISABLED oder geHIDETREEd sein. Ist der Parent geHIDETREEd, so werden die Children ebenfalls nicht durchsucht. Jetzt wird geprft, ob sich ein Text in dem Objekt befindet. Falls ja, dann wird dieser Text nach einer freien Tastenkombination abgesucht. Falls nicht, dann schaut Let 'em Fly! nach, ob das nchste Objekt in der Liste(!) einen Text enthlt und dieses Objekt nicht SELECTABLE, EXIT, TOUCHEXIT, DISABLED oder geHIDETREEd ist. Dieser Text wird dann zur Zuweisung der Tastenkombination benutzt. Die Y-Koordinate des Ersatzobjektes mu auf +/- 3 Pixel bereinstimmen. Daher ist darauf zu achten, da die Dialogbox richtig sortiert ist. Der Text des `Abbruch'-Buttons sollte mit einem der oben schon aufgefhrten bereinstimmen. Zu beachten ist, da es auch eine HELP-Taste geben kann. Weiterhin ist es ab Version 1.10 mglich die Tasten gezielt zu vergeben (s.u.). Ebenso wurden in `form_do()' das `Fly Delay' (ab V1.17) und die direkte Cursor-Positionierung implementiert. Let 'em Fly! lscht ab Version 1.17 vor dem Eintritt in den Event-Loop den Tastaturbuffer. Die Let 'em Fly! Funktion ist brigens sehr kompatibel zum Original, da sie auf den (inzwischen ffent- lichen) D.R. form_do() Sourcen basiert. form_dial(FMD_FINISH, ...) -------------------------- Das ist das Gegenstck zu FMD_START. Hier wird dann der Bildschirmaus- schnitt wieder korrekt hergestellt. Konnte der Hintergrund vorher nicht gesichert werden, so wird hier ein Redraw ausgelst. Die Hauptapplikation wird somit aufgefordert den Bildschirmausschnitt wie- der herzustellen. Die FMD_STARTs und FINISHes sind gegen die untere (0) und obere (6) Grenze abgesichert. Natrlich sollte man darauf achten, da es zu jedem FMD_START auch nur ein entsprechendes FMD_FINISH (und um- gekehrt) gibt, ansonsten kann man Let 'em Fly! durcheinander bringen. Werden zuviele FINISHes aufgerufen, so wird ein entsprechender Redraw erzeugt (s.a. Third Flight). Steuerung von Let 'em Fly! ber die Extended Objects ---------------------------------------------------- Ab Version 1.10 werden die erweiterten Objekttypen benutzt, um Let 'em Fly! innerhalb von Dialogen `steuern' zu knnen. Es knnen jetzt so bei einigen Dialogen Funktionen abgeschaltet werden und die Tasten gezielt vergeben werden. Der Extended Object Type im ROOT- Objekt mu ein Magic enthalten, damit Let 'em Fly! wei, da die restlichen Werte des Dialogs gltig sind. Damit sollen Kollisionen mit fremden Dialogroutinen vermieden werden. ber die Objekt-Flags 10 und 11 im ROOT-Objekt knnen die Key- Dials und der Extended Editor global (also fr diesen Dialog) abge- schaltet werden. Das Objekt-Flag 14 erzwingt ein Zentrieren des Dialogs (interessant bei eingeschaltetem `Save Position'). ber das Objekt-Flag 12 kann ein Dialog flugunfhig gemacht werden. Das ist dann interessant, wenn ein Programm mit den fliegenden Dialogen nicht zurrechtkommt. Das Objekt-Flag 15 wird brigens von Let 'em Fly! benutzt, um einen bereits zentrierten Dialog zu markieren. Dies ist unabhngig vom Magic und kann nur durch den Schalter `Save Position' unterdrckt werden. Fr die restlichen Objekte im Dialog wird das Extended Object Byte dazu benutzt um Tasten gezielt zu vergeben. Es wird dabei zwischen normalen Tasten (A-Z, 0-9) und Sondertasten (HELP, UNDO, F1- F10) unterschieden. Weiterhin kann man bestimmen, ob das nchste Objekt fr die Tastenvergabe benutzt werden soll. Die Objekt-Flags 10 und 11 haben die gleiche Bedeutung wie im ROOT-Objekt, sind jedoch nur lokal wirksam. So, und hier die genaue Belegung der Bits and Bytes (die Flags werden von 0, entspricht Bit 0, ab an gezhlt!): ROOT-Objekt ----------- - Extended Object Byte (erweiterter Objekttyp) MAGIC 0x89 (137) Sagt Let 'em Fly!, da die restlichen Werte im Dialog gltig sind. GLOBOFF 0x71 (113) Hiermit wird Let 'em Fly! fr diesen Dialog komplett(!) ausgeschaltet. Das Byte stimmt mit dem in FormDoIt! benutzten berein. - Objekt-Flags Flag 11 Schaltet die Key Dials global aus. Flag 12 Macht den Dialog flug_un_fhig. Flag 13 Rastet den Dialog nach dem Fliegen wieder auf das ursprngliche Byte-Alignment ein. Flag 14 Erzwingt ein Zentrieren des Dialogs (entspricht `Save Position' OFF). restliche Objekte ----------------- - Extended Object Byte (erweiterter Objekttyp) Das Byte wird in zwei Nibbles ( 4 Bit) unterteilt. Das obere Nibble konfiguriert das untere Nibble. Eine kleine Grafik drfte hier hilfreich sein: +---+---+---+---+----------------+ | E | F | S | T | Key Identifier | +---+---+---+---+----------------+ ^ ^ ^ ^ ^ | | | | +---- Identifiziert die Taste. Ist dieses | | | | Nibble nicht gesetzt, also gleich Null, | | | | so vergibt Let 'em Fly! die Taste nach | | | | dem herkmmlichen Verfahren. Besitzt | | | | dieses Nibble einen Wert (1-15), so wird | | | | damit die Position(!) der Taste im Text | | | | angegeben. Vorsicht: Der Zhler beginnt | | | | mit 1 (also nicht mit 0) und fhrende | | | | Spaces werden mitgezhlt! | | | | | | | +-------- Zeigt an, da das nchste Objekt zur | | | Tastenvergabe benutzt werden soll. Es | | | mu kein Key Identifier verhanden sein. | | | In diesem Fall sucht sich Let 'em Fly! | | | die Taste selbst aus. | | | | | +------------ Dieses Bit sagt, da dieses Objekt mit | | einer Sondertaste belegt werden soll. | | Der Key Identifier mu dann einen | | gltigen Wert haben: | | 1 - UNDO | | 2 - HELP | | 3 - F1 | | [...] | | 12 - F10 | | Weiterhin wird das Objekt noch nach dem | | Let 'em Fly! Algorithmus mit einer Taste | | belegt. Man kann es aber ber das | | ObFlag 12 unterdrcken. | | | +---------------- ber dieses Bit wird das Flugobjekt | festgelegt. Eine Kombination mit den an- | deren beiden Bits ist nicht sinnvoll. | Das untere Nibble (Key Identifier) sagt | dann aus, ob das Flugobjekt Ex- | clusivrechte besitzt (d.h. es kann nur | ber dieses Objekt `geflogen' werden) | oder nicht. Dabei gilt: | 0 - Exclusiv | 1 - Inclusiv (d.h. Background und | Flugobjekt). | 2 - sinnlos | 3 - Inclusiv, jedoch wird das | Objekt unter keinen Umstnden | von Let 'em Fly! gelscht. | +-------------------- Zeigt an, da bei diesem Objekt eine sog. EXAPPLBLK-Struktur benutzt wurde. Die Struktur wird weiter unten be- schrieben. Zu beachten ist, da auch weiterhin die automatische Tastenvergabe aktiv ist. Wird UNDO ber die ExObTypes vergeben, so ist es gegen eine weitere automatische Vergabe geschtzt. Bei HELP ist dies nicht der Fall! Special ab V1.17: Ab dieser Version wird auch das FormDoIt! Byte (0x71 / 113) zur Unterdrckung der Tastenvergabe fr das jeweilige Objekt untersttzt. Da dieser Wert eh sinnlos ist, gibt es daher auch keine Kollisionen. - Objekt-Flags Flag 11 Schaltet die Key Dials fr dieses Objekt (und dessen Unterobjekte!) aus. Flag 12 Wird eine Taste mit einer Sondertaste (z.B. UNDO) belegt, so wurde trotzdem noch eine `normale' Tastenkmbination dafr herausgesucht. Durch setzen dieses Flags kann man es (erfolgreich) verhindern. Vorsicht: Fr Kollisionen bei der Tastenvergabe ist der Pro- grammierer, bzw. der Vernderer des RSC-Files selbst ver- antwortlich! Natrlich kann man auch `fremde' RSC-Files modifizieren, jedoch sollte man hier sehr vorsichtig sein. Vielleicht werden die Bits ja auch vom Programm selbst benutzt und verndert. Weiterhin ist es selbstverstndlich, da vernderte RSC-Files grundstzlich NICHT weitergegeben werden drfen!!! Falls ich solchen Fllen auf die Spur kommen sollte, so bekommt derjenige er- heblichen(!) rger von mir! Abhngigkeiten zwischen Schalter, ob_flags und Funktionen --------------------------------------------------------- Function | Switch | ob_flags (only with MAGIC) ---------------+-------------------+--------------------------- form_do() | Let 'em Fly ON/OFF| ExObType Value 0x71 (113) | Key Dials | Flag 11 / ExObType 0x71 form_dial() | Flying ON/OFF | Flag 12 (ROOT-only) | Grow/Shrink | --- | Send Redraw | --- form_center() | Save Position | Flag 14 | VSCR Support | no flag available yet form_alert() | Alert/Error-Boxes | --- form_error() | Alert/Error-Boxes | --- form_keybd() | Extended Editor | --- objc_edit() | Extended Editor | --- appl_exit() | - no switch - | --- ---------------+-------------------+--------------------------- di_fly() | Flying ON/OFF | Flag 12 (ROOT-only) | Solid/Hollow Fl. | --- Die EXAPPLBLK-Struktur ---------------------- Um Benutzerdefinierte Objekte ins Resource einzubinden, mu man eine spezielle Struktur benutzen (USERBLK), die weitere Informationen fr das AES enthlt. Die EXAPPLBLK-Struktur ist eine erweiterte USERBLK- Struktur und sieht wie folgt aus: typedef struct { int cdecl (*ub_code)(struct __parmblk *parmblock); union obspecptr *ub_spec; /* old ob_spec */ int ub_type; /* old ob_type */ } EXAPPLBLK; `ub_code' ist der Zeiger auf die Funktion zum Malen des Objekts, `ub_spec' ist ein Zeiger auf den alten ObSpec und `ub_type' der alte Objekt-Typ (der neue mu ja G_USERDEF sein). Fr weitere Informationen zu benutzerdefinierten Objekten verweise ich an dieser Stelle auf das neue Profibuch. ber diese Struktur kann Let 'em Fly! nun auch bei entsprechenden be- nutzerdefinierten Objekten Tasten vergeben. Ich nutze jetzt die Mglichkeit um hier auf eine Library von Markus Nick aufmerksam machen. Sie heit `Ruby' und ermglicht es Flugecken, runde Radio-Buttons und Check-Boxen in ein Resource einzubinden. Die Flugfhigkeit und die Tastenvergabe bernimmt Let 'em Fly!. Somit ist nur der Let 'em Fly!-unabhngige Teil im eigentlichen Programm ent- halten, was sich natrlich auf die Gre positiv auswirkt. Weiterhin ist das Format in den Grundelementen kompatibel zu denen der Fly/My/MagicDials, d.h. sptere Library-Wechsel sind relativ einfach zu bewerkstelligen. `Ruby' sollte inzwischen in jeder gut sortierten Mailbox zu finden sein. Ebenso kann diese Library auch ber einen adressierten und frankierten Rckumschlag bei mir oder beim Markus bezogen werden. Second Flight (The Cookie) ========================== Let 'em Fly! installiert einen Cookie mit der Kennung `LTMF', welcher auf die folgende Struktur zeigt: typedef struct { unsigned int version; /* Version im BCD-Format*/ struct { unsigned light : 1; /* light version (read) */ unsigned niceln : 1; /* niceline */ unsigned jumpin : 1; /* jumpin' dials */ unsigned flyswi : 1; /* conf. flymode switch */ unsigned vscr : 1; /* virtual scr. support */ unsigned center : 1; /* center mode */ unsigned keys : 1; /* key handling */ unsigned edit : 1; /* extended editor */ unsigned redraw : 1; /* send redraw message */ unsigned flytyp : 1; /* solid/hollow fly */ unsigned fly : 1; /* flying on/off */ unsigned alert : 1; /* Alerts/Errors on/off */ unsigned mouse : 1; /* dials to mouse */ unsigned f_grow : 1; /* grow/shrink boxes */ unsigned g_grow : 1; unsigned bypass : 1; /* ON/OFF highest prio */ } config; int conf2; /* reserved */ int reserved; /* reserved */ void cdecl (*di_fly)(OBJECT *tree); void cdecl (*obj_clsize)(OBJECT *tree, int obj, int *x, int *y, int *w, int *h); int cdecl (*do_key)(int key, int kshift); int cdecl (*init_keys)(OBJECT *tree); int cdecl (*lookup_key)(int key, int kshift); int cdecl (*di_moveto)(OBJECT *tree, int mx, int my); int cdecl (*di_center)(OBJECT *tree); int ucol; /* underscore color */ int aicol; /* alert icon color */ int aframe; /* alert frame size */ int flydelay; /* delay before flying (form_do()-only) */ int cdecl (*hist_insert)(char *string); char cdecl (*ins_spcchar)(void); void cdecl (*init_niceline)(OBJECT *tree); } LTMFLY; Die Variablen und Funktionen werden jetzt ab hier genauer be- schrieben. Dabei steht die Zahl in der Klammer fr den Zeitpunkts (Version) des Einzugs in Let 'em Fly!. Will man auf entsprechende Teile zugreifen, so mu man vorher die Version prfen, ansonsten kann es zu berraschungseffekten kommen. Ausnahme: Die Version ist kleiner oder gleich 1.02. Das ist nmlich die erste offizielle Release. 1.) Die Variablen (bzw. Konstanten) ----------------------------------- version ------- Hier ist die Version von Let 'em Fly! im BCD-Format (0x0114 ent- spricht 1.14) zu finden. light (1.00) ------------ Zeigt an welche Version geladen wurde (light oder normal). Dieses Flag darf nicht verndert werden! niceln (1.18) ------------- Konfiguriert das in Let 'em Fly! integrierte Niceline. jumpin (1.15) ------------- Schaltet die Jumpin' Dials ein. flyswi (1.13) ------------- Ist dieses Flag gesetzt, so wird die rechte Maustaste fr den Flugmodus (Ghost-Flights) umgeschaltet bzw. invertiert. vscr (1.10) ----------- Zeigt an, ob der VSCR-Cookie ausgewertet und benutzt werden soll. center (1.03) ------------- Bestimmt den Center-Mode. Dabei gilt 1 fr nicht centern und 0 fr centern. keys (1.00) ----------- Schaltet die Key Dials ein. edit (1.00) ----------- ber dieses Flag wird der Extended Editor eingeschaltet. redraw (1.02) ------------- Zeigt an, ob nach dem Lschen der Dialogbox ein Redraw gesendet werden soll. flytyp (1.00) ------------- Bestimmt den Flugmodus (0: Solid, 1: Hollow). fly (1.00) ---------- Schaltet die fliegenden Dialoge aus. alert (1.00) ------------ Konfiguriert die neuen Alert-Boxen. mouse ----- Zentriert die Dialoge an der Mausposition. f_grow (1.00) ------------- Ist dieses Flag gelscht, so werden die FMD_GROW/SHRINK-Aufrufe igno- riert. g_grow (1.00) ------------- Genauso wie `f_grow', jedoch gilt die ganze Geschichte fr die graf_grow/shrinkbox()-Aufrufe. bypass (1.00) ------------- Hier ist das Master-Flag. Ist es gesetzt, so wird Let 'em Fly! deaktiviert. ucol (1.13) ----------- Bestimmt die Farbe und die Form der Underscores. Ist Bit 0 vom oberen Byte gesetzt, so werden anstelle der Underscores die Buchstaben eingefrbt (natrlich ohne dabei zu tropfen). aicol (1.13) ------------ Reprsentiert die Farbe der Alert-Icons. aframe (1.13) ------------- Bistimmt die Rahmendicke der Alert-Boxen. flydelay (1.15) --------------- Gibt die Zeit (ohne Einheit im Bereich von 0-10) zwischen dem Mausklick und dem Flug an. 2.) Die Funktionen ------------------ Let 'em Fly! stellt auch einige Funktionen zur Verfgung, welche besonders fr eigene form_do()-Routinen ntzlich sein knnten. Um die Funktionen zu benutzen sollte man das Bindings `LTMF_LIB' verwenden, da hier u.a. auch die unterschiedlichen Versionen bercksichtigt werden. Die jetzt folgende Beschreibung bezieht sich auf das Binding. Weiterhin verweise ich auch auf das form_do()-Beispiel, welches einige Let 'em Fly! Funktionen benutzt. int di_fly(OBJECT *tree) (1.00) ------------------------------- ber diese Funktion kann man Dialoge fliegen lassen. Der Bildschirm- ausschnitt mu vorher mit FMD_START korrekt gesichert worden sein. Die genaue Verwendung ist aus dem form_do()-Sample zu entnehmen. int di_moveto(OBJECT *tree, int x, int y) (1.15) ------------------------------------------------ Diese Funktion wird von den Jumpin' Dials benutzt. Sie lt den Dialog (maus)zentriert an die angugebende Position springen. ber diese Funktion kann man jetzt auch testen ob ein Dialog flugfhig ist bzw. ob der Hintergrund gesichert werden konnte. Dazu wurden in LTMF_LIB.H zwei Macros definiert. int di_center(OBJECT *tree) (1.17) ---------------------------------- Hiermit kann ein Dialog re-centered werden. int obj_clsize(OBJECT *tree, int obj, int *x, *y, *w, *h) (1.10) ---------------------------------------------------------------- Diese Funktion berechnet die wahren Ausmae eines Objekts. Es wird auch der SHADOWED-Status korrekt behandelt. Eigentlich sollte sie fester Bestandteil des AES sein. int init_keys(OBJECT *tree) (1.13) ---------------------------------- Benutzt man eine eigene form_do()-Routine, will aber trotzdem nicht auf die Tastaturbedienbarkeit verzichten, so kann man mit dieser Funktion die Tastenvergabe von Let 'em Fly! aufrufen. Dabei werden dann auch die Strichlein gemalt, d.h. sie darf erst aufgerufen werden, wenn sich der Dialog auf dem Bildschirm befindet. int lookup_key(int key, int kbshift) (1.13) ------------------------------------------- Hat man vorher init_keys() aufgerufen und einen Wert != 0 zu- rckbekommen, dann kann man die eingehenden Keyboard-Events von die- ser Funktion checken lassen, um zu gucken, ob ein Objekt ber einen Shortcut angewhlt wurde. Diese Funktion mu VOR form_keybd() und objc_edit() aufgerufen werden! int set_do_key(void (*key_handler)()) (1.12) -------------------------------------------- Oft ist es so, da man eigene Tasten mit einbinden mchte, aber denoch nicht auf den Let 'em Fly! Support verzichten zu wollen. Let 'em Fly! erlaubt es daher einen benutzerdefinierten Key-Handler zu installieren (do_key() im Cookie). Hier erstmal ein kleines Bei- spiel: [...] #include [...] int cdecl my_keys(int key, int kshift) { printf("%04x %04x\n\r", key, kshift); return(0); } [...] int do_dialog(OBJECT *tree) { int what; draw_dialog(tree); set_do_key(my_keys); /* Routine einklinken */ what = form_do(tree, 0); set_do_key(0l); /* und wieder ausklinken. */ undraw_dialog(tree); return(what); } [...] Dieses kleine Beispielprogramm macht nichts anderes, als einen Dialog darzustellen und abzuarbeiten, jedoch werden die Tastendrcke inner- halb von form_do() mit printf() auf dem Bildschirm ausgegeben. Die Funktion zur Tastenbearbeitung mu folgenden Regeln folgen: int cdecl do_key(int key, int kshift); Eingabe: key Enthlt den Tastencode. Er stimmt mit dem von evnt_keybd() zurckgegebenen berein, d.h. Bits 0..7 enthalten den ASCII-Code und Bits 8..15 den Scancode. kshift Enthlt den Shiftstatus, der von evnt_button() geliefert wurde. Return: 0 Taste konnte nicht verarbeitet werden, bzw. Let 'em Fly! sieht den Tastencode als gltig an und versucht ihn selbst zu verarbeiten. 1 Taste konnte verarbeitet werden. Let 'em Fly! ignoriert die Taste nun. 2 Wie `1', jedoch wird der Dialog zustzlich abgebrochen und als Ergebnis (bei form_do()) `0' zurckgeliefert. Wird innerhalb dieser Routinen ein Dialog dargestellt, so wird dieser nicht von Let 'em Fly! untersttzt, da der TRAP-Handler von Let 'em Fly! nicht reentrant ist. Weiterhin mu der Programmierer dafr Sorge tragen, da der Funktions- Pointer nach Beendigung des Dialogs auf `0L' zurckgesetzt wird. Es knnten sonst berraschende Effekte (z.B. Bomben) auftreten. Aus- nahme: Man will nur mal kurz eine Alert-Box darstellen. In diesem Fall wird die neue Tastenroutine von Let 'em Fly! nicht aufgerufen. int ins_spcchar(void) (1.15) ---------------------------- Let 'em Fly! besitzt ab Version 1.15 eine Box, in der man die `blen' Zeichen eingeben kann. Diese Box kann man ber diese Funktion nicht nur innerhalb, sondern auch auerhalb von Dialogen benutzen. int hist_insert(char *string) (1.16) ------------------------------------ Manchmal ist es sinnvoll Strings manuell in die Let 'em Fly!-History einzufgen. Diese Funktion macht den Weg frei ... int init_niceline(OBJECT *tree) (1.18) -------------------------------------- Mit dieser Funktion kann man `zu Fu' die Niceline fr einen Menbaum installieren. Bei diesem Menbaum kann es sich auch um ein Popup-Men handeln. Beim Aufruf dieser Funktion werden alle G_STRINGs, die DISABLED sind und `---' enthalten durch die Nicelines ersetzt. int init_flyobj(OBJECT *tree) ----------------------------- Let 'em Fly! untersttzt ab Version 1.17 explizit sog. Flugobjekte. Diese Objekte werden mit bestimmten Eigenschaften versehen (s.a. ExObTypes). Kann ein Dialog nicht fliegen (z.B. Speicherplatzmangel), so wird dieses Objekt gelscht. Da sich die Flugecke von Julians FlyDials irgendwie eingebrgert hat, kann man ber diese (externe!) Funktion eine eben solche installieren. Das zu verwandelnde Objekt mu natrlich die richtige Kennung und vernnftige Ausmae besitzen. Am besten ist es, wenn man eine G_BOX mit OUTLINED-Status benutzt. Diese Funktion wird z.B. von Selectric, Take-Off 2 und der Fuzzy- Clock ab Version 1.06 benutzt. Bemerkung: Es wird hier natrlich ein USERDEF installiert. Um auch mit Accessories und TSRs (Terminate & Stay Resident) ohne Probleme zu funktionieren, wird die Workstation vom AES benutzt. Die Attribute, die verndert werden, werden natrlich gesichert. Third Flight (Tips & Tricks & Guidelines) ========================================= Das mit dem Redraw einzelner Objekte ... ---------------------------------------- ... machen viele noch falsch. Wird ein Dialog durch Let 'em Fly! flugfhig, so kann sich ja die Position der Box und somit auch der einzelnen Objekte ndern. Da objc_draw() und objc_change() jedoch Clipping-Koordinaten bentigen, mssen diese vor *JEDEM* Aufruf neu berechnet werden. Viele benutzen nur die, die am Anfang von form_center() zurckgeliefert wurden, was natrlich zu Problemen in der Bidlschirmdarstellung fhrt. Das TOS bercksichtigt es ja auch, sonst wrde Let 'em Fly! berhaupt nicht funktionieren. Um diesen Mistand zu beheben, folgen nun entsprechende Funktionen, die a) komfortabel und b) Let 'em Fly!-fest sind. Sie sollten sich selbst erklren ... ----- cut here ------------------------------------------------------ /* ---------------------------------------------------------------- */ /* Berechne die _absoluten_ Koordinaten eines Objekts */ /* ---------------------------------------------------------------- */ void obj_xywh(OBJECT *tree, int obj, GRECT *p) { objc_offset(tree, obj, &p->g_x, &p->g_y); p->g_w = tree[obj].ob_width; p->g_h = tree[obj].ob_height; } /* ---------------------------------------------------------------- */ /* Redraw eines einzelnen Objekts unter Bercksichtigung der */ /* _aktuellen_ Position. */ /* ---------------------------------------------------------------- */ void obj_update(OBJECT *tree, int obj) { GRECT p; obj_xywh(tree, obj, &p); objc_draw(tree, obj, MAX_DEPTH, p.g_x, p.g_y, p.g_w, p.g_h); } /* ---------------------------------------------------------------- */ /* Objekt-Status eines Objekts verndern. Dabei gilt ~STATUS fr */ /* Status lschen. */ /* ---------------------------------------------------------------- */ void obj_stchange(OBJECT *tree, int obj, int state, int update) { if(state < 0) tree[obj].ob_state &= state; else tree[obj].ob_state |= state; if(update) obj_update(tree, obj); } /* ---------------------------------------------------------------- */ /* Objekt-Flags eines Objekts verndern. Dabei gilt ~FLAG fr */ /* Flag lschen. */ /* ---------------------------------------------------------------- */ void obj_flchange(OBJECT *tree, int obj, int flag, int update) { if(flag < 0) tree[obj].ob_flags &= flag; else tree[obj].ob_flags |= flag; if(update) obj_update(tree, obj); } ----- cut here again ------------------------------------------------ Bei den beiden letzten Funktionen ist zu beachten, da diese nur Flags/Stati bis zur Nummer 14 korrekt behandeln, da sonst ein Vorzeichenfehler auftritt. Fr den normalen Hausgebrauch reichen sie aber vllig aus. Nochwas: Wenn man mit VDI-Funktionen in die Box malt (z.B. Edison- Utilities), dann mu man ebenfalls vorher ein obj_xywh() bzw. objc_offset() aufrufen, um den Offset und das Clipping-Rectangle zu erhalten! Senden von Redraws ------------------ In manchen Situationen mu man sich selbst (also der Applikation) einen Redraw senden, um z.B. einen Desktop-Redraw auszulsen. Hierzu gibt es zwei Verfahren: 1.) Das Senden einer Message ber appl_write() und 2.) ein form_dial(FMD_FINISH, ...) mit den entsprechenden Koordinaten (dabei vorher *KEIN* form_dial(FMD_START, ...) machen, da es a) nicht notwendig und vllig berflssig ist und b) Let 'em Fly! Versionen vor 1.18 in diesem Fall keinen Redraw senden). Beide Mglichkeiten sind von Atari offiziell dokumentiert. Redrawunterdrckung beim Lschen von Info-`Dialogen' ---------------------------------------------------- Will man nur mal eine Dialogbox auf den Bildschirm zaubern, um eine kleine Info anzuzeigen (z.B. `Sortiere ...'), ohne da eine Eingabe vom Benutzer erwartet wird, so wird von Let 'em Fly! immer ein Redraw beim Lschen der Box gesendet, da einige Programme das brauchen. Da hilft auch das Abschalten von `Send Redraw' alleine nichts. Dies ist dann hinderlich, wenn man Let 'em Fly! das Buffern des Hintergrundes berlassen will. Man kann es aber unterdrcken, indem man (zustzlich zum vorrbergehenden Abschalten von `Send Redraw'!) vor dem FMD_FINISH ein Dummy-objc_find() macht. Der Aufruf sieht wie folgt aus: objc_find(tree, ROOT, MAX_DEPTH, 0, 0); Tastenvergabe in nicht-modalen Dialogen (die in den Fenstern) ------------------------------------------------------------- Vergibt man bei diesen Dialogen die Tasten ber init_keys(), so ist darauf zu achten, da sich der Dialog im obersten Fenster befindet. Ansonsten sollte man auf einen Aufruf bei einem Redraw verzichten, da es in diesem Fall zu Bildschirmmll kommt. Das Sortieren der Objekte ------------------------- Damit sinnvolle Ergebnisse bei der Verwendung von Ersatzobjekten bei der Tastenvergabe entstehen, mssen die Objekte auch richtig sortiert sein. Am besten ist es, wenn man den ganzen Dialog von links nach rechts und von oben nach unten sortiert. Umlaute als Shortcuts --------------------- Damit Let 'em Fly! international bleibt, ohne enormen Aufwand dafr zu treiben, kann man *keine* Umlaute und Sonderzeichen als Shortcuts mibrauchen. Schnere Buttons ---------------- Da Let 'em Fly! unter die Buchstaben seine Striche malt, stoen diese in der Regel am Boxrand an, was natrlich nicht unbedingt optimal aussieht. Daher empfehle ich die Boxen, welche nur ein Zeichen hoch sind, um 2 Pixel in Y-Richtung zu vergrern (siehe FuzzyClock, Selectric, Take-Off 2, LET_CONF). Der Aufbau der RSCs fr die Icons der Alertboxen ------------------------------------------------ Let 'em Fly! erwartet in der Datei LET_ICON.RSC seine Icons welche sinnvollerweise in einer G_BOX abgelegt sein sollten. Die Icons mssen von links nach rechts sortiert sein, da sonst die Zuweisungen nicht stimmen. Die Gre der Icons betrgt 32x32 Pixel. Zum Editieren wird ein Resource-Construction-Set und u.U. ein Icon-Editor bentigt. Ab Version 1.17 knnen eine variable Anzahl von Icons ersetzt werden, jedoch nicht individuell, sondern nur zusammenhngend be- ginnend mit dem ersten Icon. Die ersten drei Icons sind fr die Alertboxen gedacht (siehe auch mitgelieferte Icons). Die restlichen drei Icons sind fr die Event-Critic Boxen. Dabei reprsentiert das erste einen allgemeinen Diskettenfehler, das zweite eine schreibgeschtzte Diskette und das dritte eine zu wechselnde Diskette. Nachschlag ========== Hmm, ich wei garnicht was ich hier schreiben soll. Na auf jeden Fall bedanke ich mich mal an dieser Stelle fr die vielen Hinweise und Problemanfragen einiger Programmierer, die somit `Three Flights Up' zu dieser Form verholfen haben (und natrlich auch bei denen, die dazu beigetragen haben, da die Programmierschnittstelle in- zwischen diesen Umfang erreicht hat). Falls noch irgendwelche Ver- besserungsvorschlge etc. da sind, hier ... meine Adresse ... Oliver Scheel Rothehausstr. 28 W-5000 Kln 30 (ab 1.7. 50823 Kln) MausNet: Oliver Scheel @ K2 InterNet: Oliver_Scheel@k2.maus.de WICHTIG: Meine Adresse kann sich zum September '93 hin ndern! Nheres ist dann der Zeitschrift ST-Magazin zu entnehmen. Let 'em Fly! Man fliegt nicht mehr ohne ... ---- Rchzschreipfler (c) 1991-92 by Oliver Scheel R[ 6Mx]UrP﹥#IT2MHcwB"YAA i;d'r,?vYy2T/ "v8KY F` 1rV"'eHd,E9feFHTNLet 'em Fly! - A look into the future ===================================== Wie geht's weiter mit Let 'em Fly!? Diese Frage soll nun aus aktuellem Anla hier diskutiert werden: Zunchst einmal mchte ich bekanntgeben, da ich meinen Schwerpunkt vom ATARI auf einen anderen Rechner verlagern werde. Das hat in erster Linie zwei Grnde: a) ATARI beschrnkt sich nun auf den Consumermarkt und hat somit den Profimarkt und die Entwicklung wirklich leistungsfhiger Rechner aufgegeben. b) ATARI ist anscheinend nicht in der Lage dieses offiziell bekanntzugeben, um Soft- und Hardwarehersteller sowie Anwender vor Fehlinvestitionen zu bewahren. Meinen ATARI werde ich natrlich weiterhin behalten, jedoch werden sich meine Entwicklungen auf diesem Rechner nur noch auf Spezialanwendungen beschrnken. Und nun zu der Eingangs gestellten Frage: Let 'em Fly! ist inzwischen sehr weit entwickelt und man knnte mit Sicherheit noch mehr einbauen (z.B. Dialoge in Fenstern). Um das aber in vernnfiger Art und Weise zu realisieren, mte Let 'em Fly! mal komplett berarbeitet werden. Leider mu dazu unheimlich viel Zeit investiert werden. Meine nderungen an Let 'em Fly! werden sich daher nur noch auf Bugfixes beschrnken. Aus diesem Grund bin ich gerne bereit die weitere Entwicklung und Pflege von Let 'em Fly! abzugeben. Ich mu aber gleich hinzufgen, da das Programm sehr komplex ist und an vielen Stellen in die Trickkiste gegriffen wurde. Es ist also kein leichtes Unterfangen, wobei ich aber prinzipiell bereit bin bei Fragen zur Seite zu stehen. Wer also interessiert ist und bereit ist sich damit ernsthaft zu beschftigen, sollte sich also bei mir melden. Meine Adresse: Oliver Scheel Rothehausstr. 28 W-5000 Kln 30 (ab 1.7. 50823 Kln) Email: Oliver_Scheel@k2.maus.de )))j1+ϦҮ;ɔɖJJAYi44ͤjc*fɦY!9ApjfqG91Mb6fKOrV rsC$x:fGhUלrsJ4[!6}NDuvIY{ՙ~i0<ϹLet 'em Fly! und MultiTOS (bzw. neues AES) ========================================== Einige wichtige Informationen Tja, man sollte es nicht fr mglich halten: MultiTOS ist nun offiziell erhltlich. Leider sind durch einige nderungen Inkompatibilitten zu bestehenden Programmen entstanden. Das betrifft leider in gewisser Weise auch Let 'em Fly! In diesem Fall sind es die Objekt-Flags, die Let 'em Fly! benutzt, um die einzelnen Resource-Bume unterschiedlich konfigurieren zu knnen. Das neue AES, welches auch in MultiTOS integriert ist, benutzt jetzt ebenfalls diese Flags. Leider war die Dokumentation ber die freie Verfgbarkeit dieser Flags zwiespltig. Nun gut. Die Flags 9 und 10 werden jetzt vom AES fr die 3-D Objekte verwendet, d.h. u.a. da der Extended Editor *nicht* mehr ber Flags im Resource (lokal) abgeschaltet werden kann. Weiterhin kann man eine EXAPPLBLK-Struktur *nicht* mehr ber das Flag 9 anzeigen, sondern mu hier ber den ExObType (Bit 7) gehen. Besonders letzteres ist etwas rgerlich, da die Library RUBY dieses Feature benutzt und die entsprechenden Programme nun angepat werden mssen. Durch die weitere Entwicklung des AES kann es sein, da noch mehr Konflikte entstehen knnen. Oliver Scheel Qq RIpQ5o[By4ٔmgc,'E\VEd+ɸIqsby ՗x*v4u0W2Od*/O 2':ec0xM,3u-Hߖz^܄خg+37'6dxdߔZ34tk h8ܥ{0c~-gY7*,>yXq !&o~3QӰWX׬b9W%ԄP18'b~Hu(@ka:&$8etf ys0~bBWsӞ3L:1~DfHO;E'4.VHIC~:Ziܽ"g2nKkF#иT?ViIER kHI$0i4+eĺs)쾴N!}64?U&V3k1iDC髥V^KS܄ty>񰒛^yWsIwvz=ۛ$[7Qf9"pwsfU.ucL Q~'1|soȌn W#SA_Y֣ERd>;ʔ /y(ܬN*cHiųU,508E<-DaTOGLew 'vO,IuFw}#f#6P\ʔ[wNC@ΚӘDWbL$- ******************************************************************** Deze diskette is samengesteld door de Stichting ST, Postbus 11129, 2301 EC Leiden. Onze bibliotheek van public domain programma's omvat op dit moment (lente 1994) al meer dan negenhonderd disks. Daarop vindt u programma's op elk gebied, van tekstverwerker en database tot de leukste spelletjes, de fraaiste tekenprogramma's en de handigste utilities. Ook bevat onze bibliotheek een speciale afdeling voor public domain disks met Macintosh software, die te gebruiken zijn onder de ALADIN emulator. Deze MAC-PD serie bevat tot nu toe ongeveer vijfendertig disks. ******************************************************************** U vindt in het twee maandelijks tijdschrift "ST" (Onafhankelijk tijd- schrift van en voor gebruikers van Atari ST computers) een overzicht en een bespreking van de inhoud van de nieuwe public-domain diskettes. Dit tijdschrift bevat tevens een bestelkaart zodat U vlot over de software kunt beschikken. De november/december uitgave 1993 bevat de aanvullin- gen en wijzigingen van dat jaar. In uitgave nov/dec 1992 is een over- zicht van de Public Domain bibliotheek (bijgewerkt tot dec. 1992) te vinden. De Stichting ST geeft ook een speciale PD catalogus disk (database met filenamen) uit. Deze public domain disk is geproduceerd en gedistribueerd door: ************** Stichting ST afd. Software Bakkersteeg 9A 2311 RH LEIDEN ************** Ondanks onze controle komt het af en toe voor dat een diskje niet goed is gecopieerd.Mocht U dit overkomen, aarzel dan niet en stuur de defecte disk aan ons terug. U krijgt dan direct een vervangende disk toegestuurd. ************************************************************************ Teneinde het voor ons mogelijk te maken om productiefouten op te sporen en vervolgens in de toekomst te vermijden, zijn alle disks, geproduceerd door de Stichting ST, voorzien van een groen productienummer. ************************** WICHTIG *** Durch die Umstellung der Postleitzahlen zum 1.7.93 lautet meine Adresse von da an: Oliver Scheel Rothehausstr. 28 50823 Kln Weiterhin wird sich meine Adresse wird mit hoher Wahrscheinlichkeit zum August/September hin ndern. Nhere Informationen sind dazu dann aus der Zeitschrift ST-Magazin zu entnehmen. Oliver Scheel L ^& Ur,DpZCx"a.eKZJ^-_B:"Kp-/mE— 4cLo/UK9sp.jk%L{?@z)b [I=w+1t$1QǂJ:|ﻋtfqM-V%B1)6$_I0^fTU!ˋKrztb$Jr.Vl%$ܓd4r'#!Ky9m.[5Fr@ʂ44)HQʓb^*2Œ)&<4 Ngef,j IKIt5ҹoo1r{=Nj}{OÉxG1ވ9;N7qV-ŗ\¯~Jᣄqɲ^Hў@q5@= #=123,*o" H )1C,8 Z7b{VY.Et ,#`a% c0h*ൌn1VoTpjӿ"֦~ғΟRa"ʜ}^u/k~-XEeT֌)vڃ$Uv9-&^e.ӱ|Nq7/* This header is "Public Domain". (P) 1992 by Markus M. Nick This header makes it easier to compile sources with both PureC/TurboC and GNU-CC. Now you needn't include different header files any more. Please send your comments and suggestions to: Markus_Nick@mz.maus.de */ #ifndef __AES__ #define __TCC_COMPAT__ 1 #define OBSPEC U_OB_SPEC extern short _global[]; #define global _global #ifndef cdecl #define cdecl /**/ #endif /* this is the sort of MFDB PureC/TurboC supports */ #define __MFDB__ 1 typedef struct { char *fd_addr; /* Addrerss of upper left corner of first*/ /* plane of raster area. If NULL then */ /* MFDB is for a physical device */ short fd_w; /* Form Width in Pixels */ short fd_h; /* Form Height in Pixels */ short fd_wdwidth; /* Form Width in shorts(fd_w/sizeof(int)*/ short fd_stand; /* Form format 0= device spec 1=standard*/ short fd_nplanes; /* Number of memory planes */ short fd_r1; /* Reserved */ short fd_r2; /* Reserved */ short fd_r3; /* Reserved */ } MFDB; #include #define __AES__ 1 #endif s??{+'*bIf|a~ ł̃kS,vMe>3K', ɺx B}Ji'),vTw㹈oQ, ld0]u\gm!C]ޮܓtYrTVX`ơȒI*moj{Q+xz0Hb:D_[ّygۙ^$Hkpäoj `]-K 1|jJqNZ6XgžߠeZEX>xB&h|>1RKDP\"ʁD98W 66 rHHB(ENRHW4VA*ݔI<ԧIoOI;Hk,2 CHS'~;&q|IV?xp|DF5Hp<7ٱ1z?Îo\ol㟯yk('߭i Q)"Sp˓,}*.dԾzsn1BYa _xQ':v-4bìڑF#f # 0 ab0&aXFΤ1,/* This header is "Public Domain". (P) 1992 by Markus M. Nick This header makes it easier to compile sources with both PureC/TurboC and GNU-CC. Now you needn't include different header files any more. Please send your comments and suggestions to: Markus_Nick@mz.maus.de */ #ifndef __TOS__ #include #define __TOS__ #endif j?Hwi DEWkGv|P K\%#퍶p:3 n]'a[örZea  sR,lTK0, Z6jNLU9 l1 a kst.aG?lj-Q|1izz~nڟdMV.) _S)1~N4`[@(gL"OtL ܇aD xczGL^[鶤wT& -9^' S]0/xh_ ArXSE|i^עQ:rt_$Һng*2fdt{wGruYw8㝗R/* This header is "Public Domain". (P) 1992 by Markus M. Nick This header makes it easier to compile sources with both PureC/TurboC and GNU-CC. Now you needn't include different header files any more. Please send your comments and suggestions to: Markus_Nick@mz.maus.de */ #ifndef __VDI__ #define vql_attributes vql_attribute #include #define __VDI__ #endif p8nX'ws0Vi +=W}Qqv㽔'Үl. -ZG7%sGL[,sE(󱴆=ήKbqwŢJfKXqd!fꏺ)b=ÇiYv\mbmqŕ㸞5s^c;l(%qSiFJ7fPF~ RUUϯ5]} .vna|%Sw񃏍E֗|;uB:.e]PD_ "wvʏe,ڊ !.Er8ˠ7W<pG2aiOpI:D:xř{MN IĔv!o/\Opf W(X IF/* portab.h - portability support for Turbo/Pure-C */ #ifndef __PORTAB__ #define __PORTAB__ typedef void VOID; typedef char CHAR; typedef char BYTE; typedef int WORD; typedef long LONG; typedef unsigned char UBYTE; typedef unsigned int UWORD; typedef unsigned long ULONG; #define EXTERN extern #define MLOCAL static #define REG register #define _(params) params #define STDARGS cdecl #define FALSE (0) /* boolean false */ #define TRUE (!FALSE) /* boolean true */ #define YES TRUE #define NO FALSE #define SUCCESS TRUE #define FAILURE FALSE #define EOF (-1) #define NULLPTR NULL #define NULLFUNC ((void(*)(void))0) #ifndef NULL #define NULL ((void *)0) #endif #endif 3 ()`ukBgElk:$Tǐt;< y05| Vգy LjdX q[.a5`(/Pbg,pc2 TD#Dω#PcO͹vjC3swu90 meyӄ\ gW9)xƮ]T\m@>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3 k # Ј<.@#Jyg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 94g @N 98g @NN?<LNAH 6$Hp afJ@kR|oL ym0x`&Hy`0H/2BgBgr?pya0O:RDDn`Hyap?p4a\Opa B@L8NuH0EG62IAv`B@2A7RC|oBC` 0@7(RCkmBC` 0H'VRCkmAa:vAH` 0@"Z2RCkmBC` 0H"Z"^RCkm0L Nu"H00<NBL NuA(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_Nu@(#)MTOS_ACC Version 1.0 Apr 14 1993[1][|MTOS_ACC:|MultiTOS nicht installiert!][Abbruch]$2: r  & ,( H` ~QyOP|R8W>*zm}Du^Q W. p&i`5vYR:-5̰ zVrwâ)` q` yDq$hF<{TMcL1 "DS(ʑ\3)Fp"R:\9e}&jb?&1VV qaohנ .ړeV !< S096$1JZcgrLc cH&>3#50f{h%p1臁`Z;o Kkzz"J^$߂%/)7םyb Xx<è0hQW5 vuPXnmTB'pm>*0,0,jdوGm6Zg(v^_=;\YٹNoI_J7n<].BV+ƲU;O!]RU}MTOS_ACC Version 1.0 ==================== (c) 1993 by Oliver Scheel Da es sich beim NEWDESK des MultiTOS anscheinend um ein Individuum mit ausgeprgter Ignoranz handelt, ist es z.Zt. nicht mglich ber den NEWDESK Accessories nachtrglich zu installieren. Der Systemaufruf existiert zwar, wird aber nicht vom NEWDESK untersttzt. MTOS_ACC soll dieses Problem nun beheben. Legen Sie sich das Programm MTOS_ACC auf den Desktop und/oder melden Sie es als Applikation auf die Endung `ACC' (oder auch anders) an. Werden MTOS_ACC nun Programme bergeben (z.B. durch Draggen), so werden diese als Acessory installiert. Das geht natrlich nur mit Programmen, die sich auch sonst als Accessory installieren lassen. Ach ja, entfernen knnen Sie die Accessories wieder, indem Sie mit gedrckter CTRL-Taste den entsprechenden Desk-Eintrag anklicken. MTOS_ACC ist Freeware, d.h. es frei benutzt und kopiert werden. Vorraussetzung ist natrlich, da MTOS_ACC.APP nur in Verbindung mit diesem Text weitergegeben werden darf. Viel Spa. Oliver Scheel Rothehausstr. 28 5000 Kln 30 Email: Oliver Scheel@k2.maus.de ګlgtŔI(8bۭ7u՘Ug&#ѷoLa "E&M{֘E4/pT بbϔR^Ua8WL^zIi6)D "ȳN?]c*yLxI,|>3Y Xݫ#ZsBA?UgDF%$'޽\W]C=)߻g Aݰ x(V{WpQw7k1/VGi^U1&97j xKȶm{,;5xq1LB\zZlXD, @}i`%ZBHpmWZA'TI}I\4R&SGb|Xxu-]?H2IJ `d'i! ;R%$qe9x}\[M\n.ݶWIs+I} zw$Ä_yN_OCZO&mM?V)6rWv;G:ޟ=G_PK,\} SCRIPT/LAYOUT/TXT231.IMGogzǟg^N&䐦і%4Ჹd)Z#^u쁆l$ZTZ( w tlq{(0VEU>P%yw>~())<>/.g7$ؠG\2}#t̾ ;,Xh*** WICHTIG *** Durch die Umstellung der Postleitzahlen zum 1.7.93 lautet meine Adresse von da an: Oliver Scheel Rothehausstr. 28 50823 Kln Weiterhin wird sich meine Adresse wird mit hoher Wahrscheinlichkeit zum August/September hin ndern. Nhere Informationen sind dazu dann aus der Zeitschrift ST-Magazin zu entnehmen. Oliver Scheel Q_U:o#|:WL i)!i$sD"ɴSv|EwՒN@i1m\Af?u%7R$į< 7b}Hܞ4F15Ɂi7o;ZnO;1?(΅Gv%y*q#@mZ$@'}/ͳKHV n$#3% 2+p]9!}^PBjdR;…kNԕVnL  !$kdA_4_osni z,E̅Dl k8cFjhO?3֒$hݙ (sN53BqLcZ{PAF uG;"o W<IV$)hݭs) zZMt窫@+z 4Ae\*6ލPN_͠CdNvRaby R. Kurzxx?Boot FALCON/TT` NH8I)o l0(gp`ELGx l0(fpHjHRHjHjHjHjHj\HjHjXr?BgBgt'? hNO,&)j| Sh Sh. ShF ShN Shf Sh~&)j|(BBB BBBBB B$ LNu?/ OBEHo/<_MCH j hPNPO fp?rX?N HXOr@3$ R"j3P R"j3hHjp?BgBgr.?N O N ( R?(?(?(4rB@ jN \OHWBg/* j h4NO 6ANJ@gB@O$_6NuHQO&H6(I:8HoCN XO2H ЀЁ?s?s/9Hot???/ y hNO:4H"ҁ҂s POL8NuH` S@f>`>4r"Lp kNS@f6@` Vf6`BSN`^()|p+g>`BW4r"Lp kN`BW4r"Lp kNj`BW4r"Lp kN `BW4r"Lp kN$J@mY@o>4r"Lp kN4r"L kpNJ@l> Wf> WoSW Wo>4r"Lp kN`J@l> Wf> WoSW Wo>4r"Lp kN ?@ABCD EFGJKL MNO PQRSTUVWXYZ[\]^8                                  @ @@   %  @ @H@I F @ @ @ @ @ `NVR_RSC.RSCUSADFGBESPI?CH(F)CH(D)MM-TT-JJTT-MM-JJJJ-MM-TT?241625665536?InfoOKAbbruchVideoVGAModusNTSCDesktopDeutschTastaturDeutschFarben32000Spalten80Uhrzeit12 Std.DatumMM-TT-JJZeilenverdoppelungKompatibilitsmodusOverscanSeperator._XBootprefUnixBOOT-Init-CPX V1.1fr FALCON/TTPD 1993 byRichard KurzVogelherdbogen 627992 TettnangMaus UNFido 2:241/7232.5CompuServe 100025,2263[1][ |Overscan funktioniert nicht|mit einem VGA-Monitor!][ Abbruch ][1][Geht nicht!|Zu viele Farben oder|zu viele Spalten!][ Abbruch ] keine TOS UNIX [1][Wenn Sie kein UNIX auf|der Festplatte haben,|wird Ihr Rechner nur|noch von Diskette booten!][ OK | Abbrechen ] TV VGA NTSC PAL [2][ |Kann Ihr Bildschirm|NTSC darstellen?][ Ja | Nein | Abbruch] 40 80 12 Std. 24 Std. 2 4 16 256 65536 MM-TT-JJ TT-MM-JJ JJ-MM-TT USA D F ESP I USA D F GB ESP I CH(F) CH(D) . / : , [0][Hiiiiilfe !!!! ][ Ah ja ][2][Undo oder nicht Undo|ist hier die Frage][ Ja | Nein ]8040PALNTSCVGATV24 Std12 StdkeineTOSUNIX? >8B @@tDXNH@>NNzd   ,$ , F[JM l7Ȳ[b79ȼrIT*%T1@2^JJ޵z{?j(ԍXZӄs`͋-ܵ,m;^PLz)W$7,`yM!Kn'bD 9nNAH)D18HU"#ƽZs1$MI!iJ{ S]s$_|35/15#Ru"EAz)_،e>]"+ ڡJ2ӄE23T/W\EZ SV's_2-aD"g)P@ >>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#3 k # Ј<.@#Jyg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9g @N 9g @NN"P | dNu?/a8 _2J@f 0Nu3 pNuC!I!IR!I `H&H(k6+"+g0DtaJk+fZ"S"L Ip gSj`*| // " 0a`"_"JkNgPAp SjH@" 0a/2¾M<,ly:6,~#OluTzJh<:8ыT:^O&6'/'DLBӷ;7wCgWH`D`E*-:!y2 *6&[noX1y)8++ZƑSx~a-3~'@_F'BGE:s6GљGߠwW9P';|"=bWE!F\E;i$. Wh:Wz I1yalqy${34S״jȐILzLshZQklx+G!k{oJ ZܚF{ ;ӫk' 0m%λ%w%놔"Jظ__ȑJŋ?'Svs;DHcX$| 熜2 BOOT-Init-CPX V1.1 fr FALCON/TT PD 1993 by Richard Kurz NVRAM.CPX CPX-Modul zum konfigurieren des NV-RAMs von FALCON & TT RESETNVR.PRG Setzt das NV-RAM auf die Werksparameter zurck Diese Software kann, darf und soll frei weitergegeben werden, solange NVRAM.CPX, RESETNVR.PRG und WICHTIG.TXT zusammenbleiben. ACHTUNG! Dieses CPX-Modul erklrt sich zwar von selbst, aber im Interesse Ihres Rechners sollten Sie die nchsten Zeilen sehr aufmerksam lesen! Mit diesem CPX knnen Sie Ihren FALCON/TT ganz einfach zu Tode konfigurieren! Bevor Sie weitermachen, formatieren Sie eine Diskette, legen einen AUTO-Ordner auf selbiger an und kopieren RESETNVR.PRG in diesen Ordner! Sollten Sie nun Ihren Rechner ber den Jordan bringen, knnen Sie durch Booten von dieser Disk wahrscheinlich eine Wiederbelebung durchfhren. Auf dem FALCON knnen Sie, bei angeschlossener Festplatte, von Diskette booten, wenn Sie nach einem Reset die ALTERNATE-Taste gedrckt halten! Es dauert allerdings eventuell ein Weilchen (Speichertest usw...). RESETNVR.PRG gibt nach erfolgreicher Rettung einen PING aus und Sie knnen erneut die RESET-Taste bettigen. Nun sollte alles wieder funktionieren... Ich bernehme KEINERLEI Verantwortung fr diese Software! Sie handeln absolut auf eigene Gefahr! Sie sollten also wissen, was Sie tun! Wenn Sie Gefallen an diesem CPX-Modul finden, wre es nett, wenn ich eine kleine Anerkennung in Form eines DM 10.- Schecks/Scheins erhalten wrde. Allerdings ist diese Spende keine Bedingung fr die Benutzung, es wre 'nur' ein netter Zug von Ihnen. Sollten Sie Interesse an den Sourcen zu diesem Programm haben (Pure C / Assembler) senden Sie mir eine Leer-Diskette mit einem frankierten Rckumschlag zu. Allerdings sollten Sie dann auch die Spende nicht vergessen. nderungen seit V1.0 Auf Wunsch von Atari, werden die eingegebenen Werte berprft bzw. entsprechend angepat. Damit sind TODESKONFIGURATIONEN nicht mehr so leicht mglich, knnen aber immer noch vorkommen, speziell bei einem Monitor-Wechsel! Mutige Zeitgenossen, die wissen was sie tun, knnen die nichtprfende Version direkt bei mir bekommen! -> Diskette mit Rckumschlag. Richard Kurz Vogelherdbogen 62 7992 Tettnang Via E-Mail: Maus-Netz: Richard Kurz @ UN Fido-Netz: Richard Kurz 2:241/7232.5 CompuServe: Richard Kurz 100025,2263 긔mq O$o|5h5ψ/~lʞEvtGdrh{inڡd%ʠ\D :.d/* ------------------------------------------------------------------------- */ /* ----- The smaller AES-Binding V1.2 --- (c) 1991-93 by Oliver Scheel ----- */ /* ------------------------------------------------------------------------- */ /* ----- SMALLAES.H Definition File -------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Dieses Binding ist Public Domain. nderungen sind genau zu dokumentieren! */ /* ------------------------------------------------------------------------- */ /* This Binding is public domain. Changes have to be documented! */ /* ------------------------------------------------------------------------- */ /* Autor: Oliver Scheel */ /* Rothehausstr. 28 */ /* W-5000 Kln 30 (West-Geramny) */ /* Net: Oliver_Scheel@k2.maus.de */ /* ------------------------------------------------------------------------- */ #ifndef __SMALLAES__ #define __SMALLAES__ #define __AES__ #include /* ------------------------------------------------------------------------- */ /* ----- AES-Call ---------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ----- input: 1. Func.No. 2. int_in; 3. addr_in; 4. int_out; 5. addr_out - */ /* ------------------------------------------------------------------------- */ WORD aes(WORD args, ...); /* ------------------------------------------------------------------------- */ EXTERN WORD _app; /* Turbo-C only */ /* ------------------------------------------------------------------------- */ /* ----- Constants --------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ----- Event Manager ----------------------------------------------------- */ #define MU_KEYBD 0x0001 /* which event */ #define MU_BUTTON 0x0002 #define MU_M1 0x0004 #define MU_M2 0x0008 #define MU_MESAG 0x0010 #define MU_TIMER 0x0020 #define MN_SELECTED 10 /* event messages */ #define WM_REDRAW 20 #define WM_TOPPED 21 #define WM_CLOSED 22 #define WM_FULLED 23 #define WM_ARROWED 24 #define WM_HSLID 25 #define WM_VSLID 26 #define WM_SIZED 27 #define WM_MOVED 28 #define WM_NEWTOP 29 #define WM_UNTOPPED 30 /* AES 3.3 */ #define WM_ONTOP 31 /* AES 3.3 */ #define AC_OPEN 40 #define AC_CLOSE 41 #define AP_TERM 50 /* AES 4.0 */ #define AP_TFAIL 51 /* AES 4.0 */ #define AP_RESCHG 57 /* AES 4.0 */ #define SHUT_COMPLETED 60 /* AES 4.0 */ #define RESCH_COMPLETED 61 /* AES 4.0 */ #define AP_DRAGDROP 63 /* AES 4.0 */ #define SH_WDRAW 72 /* AES 4.0 */ #define CH_EXIT 80 /* AES 4.0 */ #define K_RSHIFT 0x0001 /* keyboard states */ #define K_LSHIFT 0x0002 #define K_CTRL 0x0004 #define K_ALT 0x0008 /* ----- Objects ----------------------------------------------------------- */ #define G_BOX 20 /* object type */ #define G_TEXT 21 #define G_BOXTEXT 22 #define G_IMAGE 23 #define G_USERDEF 24 #define G_IBOX 25 #define G_BUTTON 26 #define G_BOXCHAR 27 #define G_STRING 28 #define G_FTEXT 29 #define G_FBOXTEXT 30 #define G_ICON 31 #define G_TITLE 32 #define G_CICON 33 #define NONE 0x0000 /* object flags */ #define SELECTABLE 0x0001 #define DEFAULT 0x0002 #define EXIT 0x0004 #define EDITABLE 0x0008 #define RBUTTON 0x0010 #define LASTOB 0x0020 #define TOUCHEXIT 0x0040 #define HIDETREE 0x0080 #define INDIRECT 0x0100 #define FL3DIND 0x0200 #define FL3DBAK 0x0400 #define FL3DACT 0x0600 #define NORMAL 0x00 /* object states */ #define SELECTED 0x01 #define CROSSED 0x02 #define CHECKED 0x04 #define DISABLED 0x08 #define OUTLINED 0x10 #define SHADOWED 0x20 #if !defined(__COLORS) /* object colors */ #define __COLORS #define WHITE 0 #define BLACK 1 #define RED 2 #define GREEN 3 #define BLUE 4 #define CYAN 5 #define YELLOW 6 #define MAGENTA 7 #define LWHITE 8 #define LBLACK 9 #define LRED 10 #define LGREEN 11 #define LBLUE 12 #define LCYAN 13 #define LYELLOW 14 #define LMAGENTA 15 #endif #define ROOT 0 #define MAX_LEN 81 /* max string length */ #define MAX_DEPTH 8 /* max depth of search or draw */ #define IBM 3 /* font types */ #define SMALL 5 #define ED_START 0 /* editable text field definitions */ #define ED_INIT 1 #define ED_CHAR 2 #define ED_END 3 #define TE_LEFT 0 /* editable text justification */ #define TE_RIGHT 1 #define TE_CNTR 2 /* ----- Forms/Dialogs ----------------------------------------------------- */ #define FMD_START 0 /* form_dial() */ #define FMD_GROW 1 #define FMD_SHRINK 2 #define FMD_FINISH 3 /* ----- Graf handler ------------------------------------------------------ */ #define ARROW 0 /* mouse forms */ #define TEXT_CRSR 1 #define HOURGLASS 2 #define BUSYBEE 2 #define POINT_HAND 3 #define FLAT_HAND 4 #define THIN_CROSS 5 #define THICK_CROSS 6 #define OUTLN_CROSS 7 #define USER_DEF 255 #define M_OFF 256 #define M_ON 257 #define M_SAVE 258 #define M_RESTORE 259 #define M_PREV 260 /* ----- Windows ----------------------------------------------------------- */ #define NAME 0x0001 /* window elements */ #define CLOSER 0x0002 #define FULLER 0x0004 #define MOVER 0x0008 #define INFO 0x0010 #define SIZER 0x0020 #define UPARROW 0x0040 #define DNARROW 0x0080 #define VSLIDE 0x0100 #define LFARROW 0x0200 #define RTARROW 0x0400 #define HSLIDE 0x0800 #define WF_KIND 1 /* wind_get/set */ #define WF_NAME 2 #define WF_INFO 3 #define WF_WORKXYWH 4 #define WF_CURRXYWH 5 #define WF_PREVXYWH 6 #define WF_FULLXYWH 7 #define WF_HSLIDE 8 #define WF_VSLIDE 9 #define WF_TOP 10 /* Mag!X and AES 3.3 */ #define WF_FIRSTXYWH 11 #define WF_NEXTXYWH 12 #define WF_RESVD 13 #define WF_NEWDESK 14 #define WF_HSLSIZE 15 #define WF_VSLSIZE 16 #define WF_SCREEN 17 #define WF_COLOR 18 /* AES 3.3 */ #define WF_DCOLOR 19 /* AES 3.3 */ #define WF_OWNER 20 /* AES 3.3 */ #define WF_BEVENT 24 /* AES 3.31 */ #define WF_BOTTOM 25 /* AES 3.31 */ #define WA_UPPAGE 0 /* arrow events */ #define WA_DNPAGE 1 #define WA_UPLINE 2 #define WA_DNLINE 3 #define WA_LFPAGE 4 #define WA_RTPAGE 5 #define WA_LFLINE 6 #define WA_RTLINE 7 #define WC_BORDER 0 /* wind calc flags */ #define WC_WORK 1 #define END_UPDATE 0 /* update flags */ #define BEG_UPDATE 1 #define END_MCTRL 2 #define BEG_MCTRL 3 /* ----- Resources --------------------------------------------------------- */ #define R_TREE 0 #define R_OBJECT 1 #define R_TEDINFO 2 #define R_ICONBLK 3 #define R_BITBLK 4 #define R_STRING 5 /* gets pointer to free strings */ #define R_IMAGEDATA 6 /* gets pointer to free images */ #define R_OBSPEC 7 #define R_TEPTEXT 8 /* sub ptrs in TEDINFO */ #define R_TEPTMPLT 9 #define R_TEPVALID 10 #define R_IBPMASK 11 /* sub ptrs in ICONBLK */ #define R_IBPDATA 12 #define R_IPBTEXT 13 #define R_BIPDATA 14 /* sub ptrs in BITBLK */ #define R_FRSTR 15 /* gets addr of ptr to free strings */ #define R_FRIMG 16 /* gets addr of ptr to free images */ /* ------------------------------------------------------------------------- */ /* ----- TypeDefs ---------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ----- Common ------------------------------------------------------------ */ typedef struct orect { struct orect *o_link; WORD o_x; WORD o_y; WORD o_w; WORD o_h; } ORECT; typedef struct { WORD g_x; WORD g_y; WORD g_w; WORD g_h; } GRECT; typedef struct { WORD v_x1; WORD v_y1; WORD v_x2; WORD v_y2; } VRECT; /* ----- Event Manager ----------------------------------------------------- */ typedef struct /* evnt_mouse() */ { WORD m_out; WORD m_x; WORD m_y; WORD m_w; WORD m_h; } MOBLK; /* ----- Objects ----------------------------------------------------------- */ typedef struct { CHAR *te_ptext; /* ptr to text (must be 1st) */ CHAR *te_ptmplt; /* ptr to template */ CHAR *te_pvalid; /* ptr to validation */ WORD te_font; /* font */ WORD te_junk1; /* junk WORD */ WORD te_just; /* justification: left, right...*/ WORD te_color; /* color information */ WORD te_junk2; /* junk WORD */ WORD te_thickness; /* border thickness */ WORD te_txtlen; /* text string length */ WORD te_tmplen; /* template string length */ } TEDINFO; typedef struct { WORD *ib_pmask; WORD *ib_pdata; CHAR *ib_ptext; WORD ib_char; WORD ib_xchar; WORD ib_ychar; WORD ib_xicon; WORD ib_yicon; WORD ib_wicon; WORD ib_hicon; WORD ib_xtext; WORD ib_ytext; WORD ib_wtext; WORD ib_htext; } ICONBLK; typedef struct { WORD *bi_pdata; /* ptr to bit forms data */ WORD bi_wb; /* width of form in bytes */ WORD bi_hl; /* height in lines */ WORD bi_x; /* source x in bit form */ WORD bi_y; /* source y in bit form */ WORD bi_color; /* foreground color */ } BITBLK; typedef struct cicon_data { WORD num_planes; /* number of planes */ WORD *col_data; /* pointer to data bitmap */ WORD *col_mask; /* pointer to mask bitmap */ WORD *sel_data; /* pointer to selected bitmap */ WORD *sel_mask; struct cicon_data *next_res; } CICON; typedef struct { ICONBLK monoblk; /* default monochrome icon */ CICON *mainlist; } CICONBLK; struct __parmblk; #ifndef __STDC__ /* * using this structure is not possible * if ANSI keywords only is ON */ typedef struct { WORD STDARGS (*ub_code)(struct __parmblk *parmblock); LONG ub_parm; } USERBLK; typedef struct { int cdecl (*ub_code)(struct __parmblk *parmblock); union obspecptr *ub_spec; /* old ob_spec */ int ub_type; /* old ob_type */ } EXAPPLBLK; #endif typedef struct { unsigned character : 8; signed framesize : 8; unsigned framecol : 4; unsigned textcol : 4; unsigned textmode : 1; unsigned fillpattern : 3; unsigned interiorcol : 4; } bfobspec; typedef struct { unsigned framecol : 4; unsigned textcol : 4; unsigned textmode : 1; unsigned fillpattern : 3; unsigned interiorcol : 4; } tfobspec; typedef union obspecptr { LONG index; union obspecptr *indirect; bfobspec obspec; TEDINFO *tedinfo; ICONBLK *iconblk; BITBLK *bitblk; #ifndef __STDC__ USERBLK *userblk; EXAPPLBLK *exapblk; #endif CHAR *free_string; } OBSPEC; typedef struct { WORD ob_next; /* -> object's next sibling */ WORD ob_head; /* -> head of object's children */ WORD ob_tail; /* -> tail of object's children */ UWORD ob_type; /* object type: BOX, CHAR, ... */ UWORD ob_flags; /* object flags */ UWORD ob_state; /* state: SELECTED, OPEN, ... */ OBSPEC ob_spec; /* "out": -> anything else */ WORD ob_x; /* upper left corner of object */ WORD ob_y; /* upper left corner of object */ WORD ob_width; /* object width */ WORD ob_height; /* object height */ } OBJECT; typedef struct __parmblk { OBJECT *pb_tree; WORD pb_obj; WORD pb_prevstate; WORD pb_currstate; WORD pb_x, pb_y, pb_w, pb_h; WORD pb_xc, pb_yc, pb_wc, pb_hc; LONG pb_parm; } PARMBLK; /* ----- Menus ------------------------------------------------------------- */ typedef struct { OBJECT *mn_tree; WORD mn_menu; WORD mn_item; WORD mn_scroll; WORD mn_keystate; } MENU; typedef struct { LONG display; LONG drag; LONG delay; LONG speed; LONG height; } MN_SET; /* ----- Graf Handler ------------------------------------------------------ */ typedef struct mfstr { WORD mf_xhot; WORD mf_yhot; WORD mf_nplanes; WORD mf_fg; WORD mf_bg; WORD mf_mask[16]; WORD mf_data[16]; } MFORM; /* ----- Resources --------------------------------------------------------- */ typedef struct rshdr { UWORD rsh_vrsn; UWORD rsh_object; UWORD rsh_tedinfo; UWORD rsh_iconblk; /* list of ICONBLKS */ UWORD rsh_bitblk; UWORD rsh_frstr; UWORD rsh_string; UWORD rsh_imdata; /* image data */ UWORD rsh_frimg; UWORD rsh_trindex; UWORD rsh_nobs; /* counts of various structs */ UWORD rsh_ntree; UWORD rsh_nted; UWORD rsh_nib; UWORD rsh_nbb; UWORD rsh_nstring; UWORD rsh_nimages; UWORD rsh_rssize; /* total bytes in resource */ } RSHDR; /* ------------------------------------------------------------------------- */ /* ----- AES Defines ------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ----- Applications ------------------------------------------------------ */ #define appl_init()\ aes(10) #define appl_read(id, length, buff)\ aes(11, id, length, buff) #define appl_write(id, length, pbuff)\ aes(12, id, length, pbuff) #define appl_find(pname)\ aes(13, pname) #define appl_tplay(pmem, pnum, pscale)\ aes(14, pnum, pscale, pmem) #define appl_trecord(rmem, rcount)\ aes(15, rcount, rmem) /* only GEM/2 ... */ #define appl_bvset(vdisk, vhard)\ aes(16, vdisk, vhard) #define appl_yield()\ aes(17) #define appl_search(ap_smode, ap_sname, ap_stype, ap_sid)\ aes(18, ap_smode, ap_sname, ap_stype, ap_sid) #define appl_exit()\ aes(19) #define appl_getinfo(ap_gtype, ap_gout1, ap_gout2, ap_gout3, ap_gout4)\ aes(130, ap_gtype, ap_gout1, ap_gout2, ap_gout3, ap_gout4) /* ----- Event Manager ----------------------------------------------------- */ #define evnt_keybd()\ aes(20) #define evnt_button(clicks, mask, state, mx, my, button, kstate)\ aes(21, clicks, mask, state, mx, my, button, kstate) #define evnt_mouse(flags, x, y, width, height, mx, my, button, kstate)\ aes(22, flags, x, y, width, height, mx, my, button, kstate) #define evnt_mesag(pbuff)\ aes(23, pbuff) #define evnt_timer(locount, hicount)\ aes(24, locount, hicount) #define evnt_multi(flags, bclicks, bmask, bstate, m1flags, m1x, m1y, m1width, m1height, m2flags, m2x, m2y, m2width, m2height, mgpbuff, tlocount, thicount, mox, moy, mobutton, mokstate, kreturn, breturn)\ aes(25, flags, bclicks, bmask, bstate, m1flags, m1x, m1y, m1width, m1height, m2flags, m2x, m2y, m2width, m2height, tlocount, thicount, mgpbuff, mox, moy, mobutton, mokstate, kreturn, breturn) /* ----- Menu Manager ------------------------------------------------------ */ #define menu_bar(tree, show)\ aes(30, show, tree) #define menu_icheck(tree, item, check)\ aes(31, item, check, tree) #define menu_ienable(tree, item, enable)\ aes(32, item, enable, tree) #define menu_tnormal(tree, title, normal)\ aes(33, title, normal, tree) #define menu_text(tree, item, text)\ aes(34, item, tree, text) #define menu_register(rapid, pstring)\ aes(35, rapid, pstring) #define menu_popup(me_menu, me_xpos, me_ypos, me_mdata)\ aes(36, me_xpos, me_ypos, me_menu, me_mdata) #define menu_attach(me_flag, me_tree, me_item, me_mdata)\ aes(37, me_flag, me_item, me_tree, me_mdata) #define menu_istart(me_flag, me_tree, me_imenu, me_item)\ aes(38, me_flag, me_imenu, me_item, me_tree) #define menu_settings(me_flag, me_values)\ aes(39, me_flag, me_values) /* ----- Objects ----------------------------------------------------------- */ #define objc_add(tree, parent, child)\ aes(40, parent, child, tree) #define objc_delete(tree, object)\ aes(41, object, tree) #define objc_draw(tree, startob, depth, xclip, yclip, wclip, hclip)\ aes(42, startob, depth, xclip, yclip, wclip, hclip, tree) #define objc_find(tree, startob, depth, mx, my)\ aes(43, startob, depth, mx, my, tree) #define objc_offset(tree, object, xoff, yoff)\ aes(44, object, tree, xoff, yoff) #define objc_order(tree, object, newpos)\ aes(45, object, newpos, tree) #define objc_edit(tree, object, char, idx, kind)\ aes(46, object, char, *(idx), kind, tree, idx) /* #define objc_edit(tree, object, char, idx, kind, newidx)\ aes(46, object, char, idx, kind, tree, newidx) */ #define objc_change(tree, object, resvd, xclip, yclip, wclip, hclip, newstate, redraw)\ aes(47, object, 0/*resvd*/, xclip, yclip, wclip, hclip, newstate, redraw, tree) #define objc_sysvar(ob_smode, ob_swhich, ob_sival1, ob_sival2, ob_soval1, ob_soval2)\ aes(48, ob_smode, ob_swhich, ob_sival1, ob_sival2, ob_soval1, ob_soval2) /* ----- Forms/Dialogs ----------------------------------------------------- */ #define form_do(tree, startob)\ aes(50, startob, tree) #define form_dial(flag, littlx, littly, littlw, littlh, bigx, bigy, bigw, bigh)\ aes(51, flag, littlx, littly, littlw, littlh, bigx, bigy, bigw, bigh) #define form_alert(defbttn, string)\ aes(52, defbttn, string) #define form_error(enum)\ aes(53, enum) #define form_center(tree, x, y, w, h)\ aes(54, tree, x, y, w, h) #define form_keybd(tree, object, obnext, char, nxtobject, nxtchar)\ aes(55, object, char, obnext, tree, nxtobject, nxtchar) #define form_button(tree, object, clicks, nxtobj)\ aes(56, object, clicks, tree, nxtobj) /* ----- Graf Handler ------------------------------------------------------ */ #define graf_rubberbox(x, y, minwidth, minheight, lastwidth, lastheight)\ aes(70, x, y, minwidth, minheight, lastwidth, lastheight) #define graf_dragbox(width, height, startx, starty, boundx, boundy, boundw, boundh, finishx, finishy)\ aes(71, width, height, startx, starty, boundx, boundy, boundw, boundh, finishx, finishy) #define graf_movebox(width, height, sourcex, sourcey, destx, desty)\ aes(72, width, height, sourcex, sourcey, destx, desty) #define graf_growbox(stx, sty, stwidth, stheight, finx, finy, finwidth, finheight)\ aes(73, stx, sty, stwidth, stheight, finx, finy, finwidth, finheight) #define graf_shrinkbox(finx, finy, finwidth, finheight, stx, sty, stwidth, stheight)\ aes(74, finx, finy, finwidth, finheight, stx, sty, stwidth, stheight) #define graf_watchbox(tree, object, instate, outstate)\ aes(75, object, instate, outstate, tree) #define graf_slidebox(ptree, parent, object, vh)\ aes(76, parent, object, vh, ptree) #define graf_handle(wchar, hchar, wbox, hbox)\ aes(77, wchar, hchar, wbox, hbox) #define graf_mouse(number, faddr)\ aes(78, number, faddr) #define graf_mkstate(mx, my, mstate, kstate)\ aes(79, mx, my, mstate, kstate) #define graf_mbox graf_movebox /* ----- Scrap ------------------------------------------------------------- */ #define scrp_read(pscrap)\ aes(80, pscrap) #define scrp_write(pscrap)\ aes(81, pscrap) #define scrp_clear()\ aes(82) /* ----- File-Selector ----------------------------------------------------- */ #define fsel_input(inpath, insel, exbutton)\ aes(90, inpath, insel, exbutton) #define fsel_exinput(inpath, insel, exbutton, label)\ aes(91, inpath, insel, label, exbutton) /* ----- Windows ----------------------------------------------------------- */ #define wind_create(kind, wx, wy, ww, wh)\ aes(100, kind, wx, wy, ww, wh) #define wind_open(handle, x, y, w, h)\ aes(101, handle, x, y, w, h) #define wind_close(handle)\ aes(102, handle) #define wind_delete(handle)\ aes(103, handle) #define wind_get(handle, field, w1, w2, w3, w4)\ aes(104, handle, field, w1, w2, w3, w4) #define wind_set(handle, field, w1, w2, w3, w4)\ aes(105, handle, field, w1, w2, w3, w4) #define wind_newdesk(handle, addr, object)\ aes(105, handle, WF_NEWDESK, addr, object, 0) #define wind_find(mx, my)\ aes(106, mx, my) #define wind_update(begend)\ aes(107, begend) #define wind_calc(type, kind, inx, iny, inw, inh, outx, outy, outw, outh)\ aes(108, type, kind, inx, iny, inw, inh, outx, outy, outw, outh) #define wind_new()\ aes(109) /* ----- Resources --------------------------------------------------------- */ #define rsrc_load(pfname)\ aes(110, pfname) #define rsrc_free()\ aes(111) #define rsrc_gaddr(type, index, addr)\ aes(112, type, index, addr) #define rsrc_saddr(type, index, addr)\ aes(113, type, index, addr) #define rsrc_obfix(tree, object)\ aes(114, object, tree) #define rsrc_rcfix(rc_header)\ aes(115, rc_header) /* ----- Shell Functions --------------------------------------------------- */ #define shel_read(pcmd, ptail)\ aes(120, pcmd, ptail) #define shel_write(doex, isgr, iscr, pcmd, ptail)\ aes(121, doex, isgr, iscr, pcmd, ptail) #define shel_get(addr, len)\ aes(122, len, addr) #define shel_put(addr, len)\ aes(123, len, addr) #define shel_find(pbuff)\ aes(124, pbuff) #define shel_envrn(pvalue, parm)\ aes(125, pvalue, parm) /* only GEM/2 ... */ #define shel_rdef(lpcmd, lpdir)\ aes(126, lpcmd, lpdir) #define shel_wdef(lpcmd, lpdir)\ aes(127, lpcmd, lpdir)\ /* ---- XGRFs -------------------------------------------------------------- */ /* only GEM/2 ... */ #define xgrf_stepcalc(orgw, orgh, xc, yc, w, h, pcx, pcy, pcnt, pxstep, pystep)\ aes(130, orgw, orgh, xc, yc, w, h, pcx, pcy, pcnt, pxstep, pystep) #define xgrf_2box(xc, yc, w, h, corners, cnt, xstep, ystep, doubled)\ aes(131, cnt, xstep, ystep, doubled, corners, xc, yc, w, h) #endif /* ----- end of SMALLAES.H ------------------------------------------------- */ L`n$bRe7֜槌F5y 5*G7셠z)f~Zn_Q@vS)51:~:?9#ՍCDh.9 iT'Tҗ 2YJbNHqP+* ~WqbVyo`VedZ*pЪA);iasOAvUH: ЙX~*}m&SȦA ȫ^MW[uK]5mUQճ1m^r` Kh؉}wDLλvG?t~qrˎ2h/P|_xF{/YrďcϜ b ~-%G$,iF|ʘ'VP'1\="zY"N gT",֛nLj$-_]/* ------------------------------------------------------------------------- */ /* ----- The smaller AES-Binding V1.2 --- (c) 1991-93 by Oliver Scheel ----- */ /* ------------------------------------------------------------------------- */ /* ----- SMALLAES.C -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Dieses Binding ist Public Domain. nderungen sind genau zu dokumentieren! */ /* ------------------------------------------------------------------------- */ /* This Binding is public domain. Changes have to be documented! */ /* ------------------------------------------------------------------------- */ /* Autor: Oliver Scheel */ /* Rothehausstr. 28 */ /* W-5000 Kln 30 (West-Geramny) */ /* Net: Oliver_Scheel@k2.maus.de */ /* ------------------------------------------------------------------------- */ #include #include /* ------------------------------------------------------------------------- */ typedef struct { WORD *control; WORD *global; WORD *int_in; WORD *int_out; LONG *addr_in; LONG *addr_out; } AESPB; WORD control[5]; WORD global[15]; WORD int_in[16]; WORD int_out[7]; LONG addr_in[2]; LONG addr_out[1]; AESPB aespb = { control, global, int_in, int_out, addr_in, addr_out }; UBYTE ctrl_cnts[122][4] = { 0, 1, 0, 0, /* appl_init */ 2, 1, 1, 0, /* appl_read */ 2, 1, 1, 0, /* appl_write */ 0, 1, 1, 0, /* appl_find */ 2, 1, 1, 0, /* appl_tplay */ 1, 1, 1, 0, /* appl_trecord */ 2, 1, 0, 0, /* appl_bvset (GEM/2) */ 0, 1, 0, 0, /* appl_yield (GEM/2) */ 1, 3, 1, 0, /* appl_search (AES 4.0) */ 0, 1, 0, 0, /* appl_exit */ 0, 1, 0, 0, /* evnt_keybd */ 3, 5, 0, 0, /* evnt_button */ 5, 5, 0, 0, /* evnt_mouse */ 0, 1, 1, 0, /* evnt_mesag */ 2, 1, 0, 0, /* evnt_timer */ 16, 7, 1, 0, /* evnt_multi */ 2, 1, 0, 0, /* evnt_dclicks */ 0, 0, 0, 0, /* AES 27 */ 0, 0, 0, 0, /* AES 28 */ 0, 0, 0, 0, /* AES 29 */ 1, 1, 1, 0, /* menu_bar */ 2, 1, 1, 0, /* menu_icheck */ 2, 1, 1, 0, /* menu_ienable */ 2, 1, 1, 0, /* menu_tnormal */ 1, 1, 2, 0, /* menu_text */ 1, 1, 1, 0, /* menu_register */ 2, 1, 2, 0, /* menu_popup (AES 3.3) */ 2, 1, 2, 0, /* menu_attach (AES 3.3) */ 3, 1, 1, 0, /* menu_istart (AES 3.3) */ 1, 1, 1, 0, /* menu_settings (AES 3.3) */ 2, 1, 1, 0, /* objc_add */ 1, 1, 1, 0, /* objc_delete */ 6, 1, 1, 0, /* objc_draw */ 4, 1, 1, 0, /* objc_find */ 1, 3, 1, 0, /* objc_offset */ 2, 1, 1, 0, /* objc_order */ 4, 2, 1, 0, /* objc_edit */ 8, 1, 1, 0, /* objc_change */ 4, 3, 0, 0, /* objc_sysvar (AES 3.4) */ 0, 0, 0, 0, /* AES 49 */ 1, 1, 1, 0, /* form_do */ 9, 1, 0, 0, /* form_dial */ 1, 1, 1, 0, /* form_alert */ 1, 1, 0, 0, /* form_error */ 0, 5, 1, 0, /* form_center */ 3, 3, 1, 0, /* form_keybd */ 2, 2, 1, 0, /* form_button */ 0, 0, 0, 0, /* AES 57 */ 0, 0, 0, 0, /* AES 58 */ 0, 0, 0, 0, /* AES 59 */ 0, 0, 0, 0, /* AES 60 */ 0, 0, 0, 0, /* AES 61 */ 0, 0, 0, 0, /* AES 62 */ 0, 0, 0, 0, /* AES 63 */ 0, 0, 0, 0, /* AES 64 */ 0, 0, 0, 0, /* AES 65 */ 0, 0, 0, 0, /* AES 66 */ 0, 0, 0, 0, /* AES 67 */ 0, 0, 0, 0, /* AES 68 */ 0, 0, 0, 0, /* AES 69 */ 4, 3, 0, 0, /* graf_rubberbox */ 8, 3, 0, 0, /* graf_dragbox */ 6, 1, 0, 0, /* graf_movebox */ 8, 1, 0, 0, /* graf_growbox */ 8, 1, 0, 0, /* graf_shrinkbox */ 4, 1, 1, 0, /* graf_watchbox */ 3, 1, 1, 0, /* graf_slidebox */ 0, 5, 0, 0, /* graf_handle */ 1, 1, 1, 0, /* graf_mouse */ 0, 5, 0, 0, /* graf_mkstate */ 0, 1, 1, 0, /* scrp_read */ 0, 1, 1, 0, /* scrp_write */ 0, 1, 0, 0, /* scrp_clear (GEM/2) */ 0, 0, 0, 0, /* AES 83 */ 0, 0, 0, 0, /* AES 84 */ 0, 0, 0, 0, /* AES 85 */ 0, 0, 0, 0, /* AES 86 */ 0, 0, 0, 0, /* AES 87 */ 0, 0, 0, 0, /* AES 88 */ 0, 0, 0, 0, /* AES 89 */ 0, 2, 2, 0, /* fsel_input */ 0, 2, 3, 0, /* fsel_exinput (TOS 1.04) */ 0, 0, 0, 0, /* AES 92 */ 0, 0, 0, 0, /* AES 93 */ 0, 0, 0, 0, /* AES 94 */ 0, 0, 0, 0, /* AES 95 */ 0, 0, 0, 0, /* AES 96 */ 0, 0, 0, 0, /* AES 97 */ 0, 0, 0, 0, /* AES 98 */ 0, 0, 0, 0, /* AES 99 */ 5, 1, 0, 0, /* wind_create */ 5, 1, 0, 0, /* wind_open */ 1, 1, 0, 0, /* wind_close */ 1, 1, 0, 0, /* wind_delete */ 2, 5, 0, 0, /* wind_get */ 6, 1, 0, 0, /* wind_set */ 2, 1, 0, 0, /* wind_find */ 1, 1, 0, 0, /* wind_update */ 6, 5, 0, 0, /* wind_calc */ 0, 0, 0, 0, /* wind_new (TOS 1.04) */ 0, 1, 1, 0, /* rsrc_load */ 0, 1, 0, 0, /* rsrc_free */ 2, 1, 0, 1, /* rsrc_gaddr */ 2, 1, 1, 0, /* rsrc_saddr */ 1, 1, 1, 0, /* rsrc_obfix */ 0, 1, 1, 0, /* rsrc_rcfix (AES 4.0) */ 0, 0, 0, 0, /* AES 116 */ 0, 0, 0, 0, /* AES 117 */ 0, 0, 0, 0, /* AES 118 */ 0, 0, 0, 0, /* AES 119 */ 0, 1, 2, 0, /* shel_read */ 3, 1, 2, 0, /* shel_write */ 1, 1, 1, 0, /* shel_get */ 1, 1, 1, 0, /* shel_put */ 0, 1, 1, 0, /* shel_find */ 0, 1, 2, 0, /* shel_envrn */ 0, 1, 2, 0, /* shel_rdef (GEM/2) */ 0, 0, 2, 0, /* shel_wdef (GEM/2) */ 0, 0, 0, 0, /* AES 128 */ 0, 0, 0, 0, /* AES 129 */ 1, 5, 0, 0, /* appl_getinfo (AES 4.0) */ 0, 0, 0, 0 /* AES 131 */ }; /* ------------------------------------------------------------------------- */ VOID _crystal(AESPB *aesbpb); /* ------------------------------------------------------------------------- */ /* ----- AES - Call -------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ WORD aes(WORD args, ...) { REG WORD i; UBYTE *c; va_list vargs; va_start(vargs, args); control[0] = args; c = ctrl_cnts[args-10]; for(i = 1; i <= 4; ) control[i++] = *c++; for(i = 0; i < control[1]; ) int_in[i++] = va_arg(vargs, WORD); for(i = 0; i < control[3]; ) addr_in[i++] = va_arg(vargs, LONG); _crystal(&aespb); for(i = 1; i < control[2]; ) *(WORD *)(va_arg(vargs, LONG)) = int_out[i++]; for(i = 0; i < control[4]; ) *(LONG *)(va_arg(vargs, LONG)) = addr_out[i++]; va_end(vargs); return(int_out[0]); } /* ----- end of SMALLAES.C ------------------------------------------------- */ 2.IMGAo,w\2L1LZ[4+`9ƫ3@߀ @ʴHnD0\ LArA>Ңib$d|mߐkI937}*dB"L7`I=f@KI `%$4 p?k?D ׳}{S^"Ÿ*=Uu~c;cR'gU"1yvawoS:͂1Nӗv 4ydaۭ;<Y)&e!k /;qKH6^eb**************************************************************************** * * The Smaller AES-Binding V1.2 (c) 1991-93 by Oliver Scheel * * crystal.s * **************************************************************************** **************************************************************************** * Dieses Binding ist Public Domain. nderungen sind genau zu dokumentieren! **************************************************************************** * This Binding is public domain. Changes have to be documented! **************************************************************************** * Autor: Oliver Scheel * Rothehausstr. 28 * W-5000 Kln 30 (West-Geramny) * Net: Oliver_Scheel@k2.maus.de **************************************************************************** .globl _crystal **************************************************************************** __TC__ equ 1 ; Turbo-C switch **************************************************************************** .text _crystal: .if __TC__ move.l a0,d1 ; AESPB .else move.l 4(sp),d1 ; AESPB .endif movem.l d2-d3/a0-a3,-(sp) ; save regs move.w #200,d0 ; we want AES trap #2 movem.l (sp)+,d2-d3/a0-a3 ; restore regs rts .end ԞP٬+}3PԳjTЀ #ɑ0ީKamxTd 粟{R+ZZ ܓ9 ox_Ȼ Qh1{Ik!|ևAun {cgs-Y=rs˺mz'fL2Y7Kv6^ 3iٛEgG؁e2Ug"x#P4e> 1A/f)-j9LôK H5st! #d!lJ1S)]#[W⇁n XZVz>"w+b&"fݽVJa糎sJSh1ٵH}{Yx8Y5ǓTa[gT(o< I7FA+#xI0K }q!BZg@40$ Xt„n>vIJ3 ERؠI(ա| ++_-EFg Tz"%DI|XA@`@zd0wVp-\d'Tʃ?EOjdr)sfI:>IL1# *sJ<^brҕ}!9L 0 }8gYœfܕLsPC*** WICHTIG *** Durch die Umstellung der Postleitzahlen zum 1.7.93 lautet meine Adresse von da an: Oliver Scheel Rothehausstr. 28 50823 Kln Weiterhin wird sich meine Adresse wird mit hoher Wahrscheinlichkeit zum August/September hin ndern. Nhere Informationen sind dazu dann aus der Zeitschrift ST-Magazin zu entnehmen. Oliver Scheel 7K8"ܠخ1z3ea$ #}CHߋN_ޭFrH|_ \ZtA;BpZ'.J.gpsu U RwB+JM0YV-/eG< ʲyM j8 |Y,2۸:YƟʷ scl_PܙAFuO2.DB y/2ib5z2F)ϩi$R݀Z!(90ŏkXPD  /R&,3rRd %D+?XQ;X{+R*Z:v'*(CV\XN~y9Q;F?RIJ0M 6+ڱQg&cu,]{G5UMkhf,^Xʠr:ji.[ssIrʔ$#, c]vԄޥet䰊Y]t#>Aw+'R} ;'iDrOz)cpүOI|$<&4@ A^ѰD*.[^u-n%&Hr/B͢Ra_[>yl+فM]VϮ{^!gż; TeX output 1993.03.23:2018i3 g3E=h2 K`y 3 cmr10Arefy!oureadyagainforJ Xԟ |cn$X^h$Kl^hĄ8Ąx>4tĄ ЎĄn$#;Ąn$ |~n$"+n$*<<>D<x>@<^hT<^h~<>"+<>'N 'N7x>7x>ȟ7>o$7x>!87x>ȟGpn$`GpN ğW,x>PW, X̟W,x>PW,N|W, XPW,> ̟W,/4>?W,x W,x ǔf>5fN1xfNfNl(fNğf vx>؟v>Etv>vx>v>v Xvx> vx>Ovx>vx>!vN5`>T` `>` Lx>%NT}ތx>{/4>؟x>Tx>?x>x> ؄}П؄>l(؄>ې鵔x>؟鵔 ó鵔x П鵔H鵔x>鵔x>04鵔x>H鵔x>`P^h£ܟPNտPHܟP>ԟ x> >@ x>£ܟ >տ > > x x>͌ x>`Ȅ/4>sdȄ>x>i,x>x> x>`NSNx>Пx>Yp@> @NԯX@/4><@>`@n$4t@^h\x>YpNdx>ԯXNx>x>ǔn$-8NYp#ԯX# # ̌3tx>x3t^hȟ3tNt3tx>D3t}>П3tn$P3t} D3tx>X3tx>}(brdNrdNrdN5rdNTrdNPrdNތrdNl(rdNğrdN`rdNrdNrdN04rdNПrdN N*< N؟ NEt N N` NH N{ N N N$ NT N? N͌ N\܄N9܄Nǔ܄NU0܄N̟܄Nph܄N܄N㋠܄N<܄N؟܄N4t܄N ܄NO܄NH܄NN*<N؟NEtNN`NHN{N NN$NTN?N͌NTN}(TNTN5TNTTNPTNތTNl(TNğTN`TNTNTN04TNПTN*  XQ cmr12VVersion2.06 Ǐ)Myarz1993R XQ ff cmr12CopyrightDc/:!",ff cmsy10 Ƹ1991{1993/byJ\~Thomas/KleinandOliverScheelFiàPIt'sfFereew!are*i3 %': 3 cmti10Inhaltsverzeichnis[.fffAkg3E3"[.MkAHff cmssbx10MInhaltsverzeichnis4[.KkAH 3 cmssbx10K1.!EinleitungY2!1.1:_Feeatures)}- b> 3 cmmi10:=::::::::::::::::::::::::::::::::::::۶2!1.2:_DiefDateien:=::::::::::::::::::::::::::::::::::۶3!1.3:_Haftungsaussc!hlu:=::::::::::::::::::::::::::::::۶3!1.4:_DiefStoryC:=:::::::::::::::::::::::::::::::::::۶3!1.5:_CreditsEȍ:=:::::::::::::::::::::::::::::::::::::۶44[.K2.!BedienungW/5!2.1:_Kon guration(:=:::::::::::::::::::::::::::::::::۶5!2.2:_Startenfv!onProgrammenkO:=::::::::::::::::::::::::::۶7!2.3:_TeastaturbMedien!barkeit0:=::::::::::::::::::::::::::::۶74[.KA.!PXatchvariablenB^8[.B.!DerAufbauder%fest,danngelangtmandirektindiezw!eiteEbMene.MankdDannaberauc!h[.innerhalbdesP!opupsdieEbMenenwechseln,indemmanebMenfallseinederebengenann!ten[.Teastenffesthzaltundmitderlink!enMaustasteirgendwohinklickt."[.L2.1/lJKon guration><[.Bev!orgmanrichtigloslegenkdDann,mumanTeake-O kon gurieren.Dazuruftmandas[.P!opup-MenMޞzueaufundsuchtsicheinenSlotaus.MitgedrMޞzuckter[CTRL]-Teasteklickt[.mandiesenanundesersc!heinteineDialogbMo!x.Mit`Select'wzahltmanmitHilfedes[.FileselectorsBeinProgrammaus.Dasic!hdie8Zeichen+ExtensionalsNameimPopup-[.MenMޞzuNmnic!htbMesondersschzonmachen,kdDannmandemausgewzahltenProgrammٓRcmr71ein16[.Zeic!henJlangesAliaszuweisen,z.B.`1stWeordplus'anstellevon`WORDPLUS.PRG'.In[.diesemfAliasdarfk!einKlammera e'@'enthaltensein.[.WirdinderFileselectorbMo!xnureinVeerzeichnis,abMerkeineDateiangebMen(dieDatein-[.amenzeile#m!uleersein),sowirdderEintragalsDirectoryverwaltet.BeimAnklicken[.wird[hin!terhernichteinProgrammgestartet,sonderneinFeenstermitdemgewMޞzunschten[.Veerzeic!hnisgezo net.DieseOptionistabMernurunterGeminieinsetzbar.VeordemEin-[.trag6timP!opuperscheinteineRaute,umVeerzeichnisseundProgrammeunterscheidenzu[.kzonnen.[.ĉffL •U-=Aacmr61 ? o cmr9Auc9hbwennhierimmervonProgrammengesproAchenwird:EsistnatAǞg3urlichmg3oglichbAeliebigeDateienin dasMenAǞg3uzu?̞g3ubAernehmen.Jedoc9histdasnursinnvollwennaufeinepassendeMaskeinGeminieine Applik|rationangemeldetwurde.Un9terMag!X-onlyoAderMultiTOS-onlykannmanj cmti9nurApplikationen starten./߿56i3 cH2.Bepdienung[.wffAkg3E3"[.Wieeingangssc!honerwzahnt,kdDannmandenProgrammenParametermitaufdenWeeg [.gebMen.Teak!e-O bietetdabeizw!eiMzoglichkeitenan,diemiteinanderkombiniertwerden[.kzonnen.~Zumeinenistesmzoglic!hbMestimmteParameterfMޞzurjedesProgrammfestzule-[.gen*zundabzuspMeic!hern.DieseParametermMޞzussenin`Parameter'eingetragenwerdenund[.w!erdengbMeijedemProgrammstartmitSEzubergeben.ZumanderenkdDannmanindiesem[.Dialog~mitangebMen,obv!orherParameter,diedemProgrammƞzubMergeben~werdensol-[.len,abgefragtw!erdensollen.EserscheintdannvordemLaunchendesProgrammseine[.en!tsprechendefDialogbMox.T[.DasGanzewiederholtmanjetztsolangebismank!eineLustmehrhatoMdermeintfertig[.zu[sein.DamitdieDatenbMeimnzac!hstenRechnerstartwiederdasind,mumandiese[.nac!hCAAnderungenimmerabspMeichern.DazugibtesdenMenMޞzupunkt`SaveINF1:1::~Ŷ'.Es[.ersc!heintseineFileselectorbMo!x,indermandieDateiauswzahlenkdDann.DieDateidievon[.Teak!e-O 9automatischbMeimNeustartgeladenwirdheitTAKEOFF.INF7undmusichim[.selbMenfVeerzeic!hniswieTak!e-O bMe nden.[.NatMޞzurlic!hqkdDannmanauchmehrereKon gurationenunterverschiedenenNamenabspMei-[.c!hernfundsomit`LoadINF...'jederzeitnachladen.s[.KTip1:5/MankdDannauc!heinProgrammaufdasTeake-O -IconziehenunddanndenEin-,2tragXmitgedrMޞzuc!kter[CTRL]-Teasteauswzahlen.JetztwirdderNameundderent-,2sprec!hendeۃPfaddirektindenDialogeingetragenundmanbrauchtnurnoMchdas,2Aliasfzuzandern.8N[.KTip2:5/Um*zdasP!opup-MenMޞzuetwasxXzubMersichtlicherzugestalten,kdDannmansog.Dummy-,2Ein!trzage'(z.B.`---------')einfMޞzugen.Diesezeichnensichdadurchaus,dazwar,2eingAliaseingetragenwurde,abMerk!einProgrammausgewzahltwurde(dafzurauc!h,2der`Clear'-Button).DieseEin!trzagekdDannmanzwarselektieren,jedoMchpassiert,2bMeimfAuswzahlennic!htsf(esv!erschwindetfnurdasPopup).8N[.KTip3:5/WieebMensc!honerwzahnt,kdDannmanverschiedeneINF-DateienabspMeichernund,2nac!hladen.Teake-O wertetsogardieKommandozeileaus.FeallsnuneineDatei,,2die+gaufdasMusterTAKE*.INF+Epat,yEzubMergeben+gwird,wirddieseautomatisc!hge-,2laden.˝Esistdahersinn!voll˝Teake-O aufdiesesMusterinGeminialsApplikdDation,2anzumelden.WJetztgibtesdreiMzoglic!hkeitenWdieINF-DateizubzubMergeben:Wa),2durc!h$ DraggenaufdasTeake-O -Icon,b)durchDoppMelklickaufdieINF-Datei(die,2sic!h #auchaufdemDesktopbMe ndenkdDann)undc)ZzubereinenEin!tragimPopup-,2MenMޞzubv!onTeake-O .Besondersl@zubMerdieletzteMzoglichkeitkdDannmansichTeake-O ,2extrem#q exibMelk!on gurieren.DiesesVeerfahrenistz.Zt.abern!urunterGemini,2an!wendbar.s[.Ben!utztqmanMag!X_oMderMultiTOS,sokdDannmanauchohneGeminiApplikdDationen(!)[.parallel,starten.IstjedoMc!hGeminiaktiv,sowirdderBefehlzumStartenimmeran[.Gemini&.gesc!hickt.WillmanmitGemini1.xApplikdDationenunterMag!X& parallelstarten,[.sokm!umandasProgramm`GeminigoMesMag!X'iben!utzen,welchesnatMޞzurlichauchmit[.Teak!e-O fzusammenarbMeitet./߿6Gi3 cH2.Bepdienung[.wffAkg3E3"[.L2.2/lJSta"rtenfhvonProgrammend[.Das=Startenv!onProgrammenisteigentlichsehreinfach:ManruftTeake-O aufund [.klic!kt=*dasentsprechendeProgramman.JenachKon gurationerscheinteineDialogbMox,[.w!ofmandemProgrammdieParametervonHandmitgebMenkdDann.[.Ben!utztfmanGemini,sohatmannoMchweitereMzoglichkeiten: n!,2WillmandemProgrammmitderMausP!arametermitaufdenWeeggebMen,so,2zieh!t8mandieentsprechendenDateienaufdasTeake-O -Iconundwzahltdanndas,2ProgrammfimP!opup-MenMޞzuaus.\"!,2Hzaltt!manbMeimClic!kaufdenEintragdie[ALT]-Teastefest,sowirdnichtdas,2Programmgestartet,sonderndasVeerzeic!hnisindemdasProgrammstehtineinem,2Feensterv!onGeminidargestellt(alsozahnlichwiebMeidenIcons,wodasjagenauso,2ist).!,2BeiqVeerzeic!hnissen(RautevordemEintrag)wirdautomatischeinentsprechendes,2Feensterfgezo net.$ꍍ[.L2.3/lJTfastaturb]edienba"rkeitd[.Teak!e-O ۆkdDannmanunterGeminiohneweitereskomplett)dzubMerdieTeastatursteuern(incl.[.Aufruf).nWiedasgeh!t?ZuerstlegtmansicheinTeake-O -IconaufdenGemini-Desktop[.(solltemanso!wieso).DiesemIconweistmandanninGeminieineTeastenkombinationzu.[.Somityclzatsic!hTeake-O AzubMerdieTeastaturaktivieren.DasPopUpselbMeristauchtasta-[.turbMedien!bar.%AUber[CsrUp/Down]kdDannmandenCursorbew!egen,mit[RETURN]%!oder[.[ENTER]@wzahlt@mandenMenMޞzupunktaus.MankdDanndabMeiauc!h[CTRL]oder[SHIFT][.drMޞzuc!kenfumsoandie`SpMecials'zugelangen./߿7Xi3 A.Patchvariablen[.fffAkg3Ez=[.TNH cmbx12TAnhang5[.MA.+g{P\atchvariablen[.AbGVeersion2.05existiertinTak!e-O einePatchvdDariable,mitdermandasKzastchen [.inEderlink!enobMerenEckeunterdrMޞzuckenkdDann.DazubMedientmansicheinesDisketten-[.Monitorso.za.undsuc!htinTAKEOFF2.ACCdieZeic!henkette`pmarker:'.DieZahlhinter[.dieser-Veariablegibtan,obdasKzastc!hengezeichnetwerdensolloMdernicht.`1'stehtdabMei[.fMޞzurfzeic!hnenund`0'fMޞzurnichtzeichnen.[.Wicthtig:fGepatc!hteTeake-O sdMޞzurfennichtweitergegebMenwerden!)[.MB.+g{DerGAufbauderU߆Tff cmtt12UINFM-Datei[.Willrmanumfangreic!heUmstrukturierungenimPopupvornehmen,soistesamsinn-[.v!ollsteneinenASCIMI-Editor(z.B.qed)zuben!utzen.DerAufbaudesINF-Filesistrelativ[.einfac!h.DieSlot-Nr.,dervollstzandigePfad,dasAlias,dieKon guration(0:Normal,1:[.TTP)SfundSdiev!orgegenenenParametersindjeweilsdurchein'@'unterteilt.DieSlot-[.Nummern0-15geltenfMޞzurdieersteSeite,dieNummern16-31fMޞzurdiezw!eite.DieEintrzage[.brauc!hen2wnichtsortiertwerden,dadurchdieNummernderEintragjaeindeutigzuge-[.ordnetfw!erdenkdDann.HiereineinfachesBeispielfMޞzureinenEintrag: n3*12@C:\WORDPLUS\WORDPLUS.PRG@1stWordplus@0@BRIEF.DOC[.Nummerngrzoer31w!erdenabgefangen,umsokompatibMelzurVeersion1.0xzubleiben, [.diefja40Ein!trzagebMeherrscht./߿8`; U߆Tff cmtt12TNH cmbx12MkAHff cmssbx10LkAH cmssbx10KkAH 3 cmssbx10:!",ff cmsy108!", 3 cmsy10- b> 3 cmmi10%2-!uKBH7ns!ҥq&l% t [i7=aZ|%`%Wِꖘ@U¤Ti:2Q'` h'~U#¤l&1O{rׂfx %=)ZRI!ߙq'Ck^ : ׌f [ה"ObDS~RngU9L'V . vX!NhPLژCg2Xpr2A64Jq<`9)``N>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@#N3N k #N Ј<.@#NJyNg<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON&0 J"LN? 99g @N 99g @NN3?<LNA/ / $Hgza/ 2 fB2p. Ja/Z&H gZC:Hpa/J@fJp\ Ja/<&H gJ@kH"ҀҁҀҀҁCAa.`BAaJ@fJGk2H ЁЀЁЁЀA&H Ma./Aa.Пмa/(H gCa.XC:< La-"M La-pkg Lax*H g"M La.( g\ yi4g/9:p a"XO3: 09: kj yi4f r yOJgVK:G";yOLBm+K+L HUp??9: p a"lPO09NgHUpa"XXO UG#g U)f` 9ONgn"KA <a. B/p\Aa-T gBH|a3Aa3p~"LANa-ANa-NHyN/ rd?t??pya!O`T yi2m8p~"LANa-ANa-@NHyN/ BgBgBgpya!O`Hy:Sp?p4a!|\O La.p`B@OL8NuH>OEhN0H>29hPHH?ABC?|G?yOL ?C /|:xHot??p a! POIG0K.M,xp yOJg,| 2RC| oBC y: (1fAr09Hpa38Ho(Ho,Ho2HVHUHSHTBg?<,BgBgBgBgBgBgBgBgBgBgBgBgBg?pa O<8r@g4|(gLSBgh|Fg||g`0,Hr4,Hļ/@?/* @02IA24ahTO`J?/*A:44BAB@aPTOJ@f0aL`*ByOJHop?Bgp aPO`3OJ3: p Dg29hPH4Al0Sm2yhVҰop?pkaTOHo(Ho,Ho2HVHUHSHTBg?<BgBgBgBgBg09hPH?2Rl4`49hV?Bg0RlBA`29hVR?p????r?pa.O<8r?pkaTOpDg?/*A:4420aBTO`O2L|NuH0QO6&HEOLp a429Nf$J@k Hy:?p#a\OR@f pap`5| BBgpNa\Op?pkaTOpa aRr09Hpa129hPH09Hpa1BgpkaZTO0k~/9:p aFXO3: ap09Nfa0gJHWHoHo HopOaO|o k`A:4&H?4/2/0/69hNKCa$TOa 2paB@POL NuH0BCEB`Hj?pra\ORC|,mBC`0H raRC|mGOR&'j'j'j 09hNyhPf 29hP ShZ y:A "S$il$"k ia(7@PL Nu/ EeCFG Ja(nHRp|aXOJ@g *:g4 \g.pw Ja.( Ja( 2\g CFS Ja'CFG Ja' Ja 8H$ԀԂԀԀԂEObKf$JDg"JAa'BCAa'6MFIeGOZC S hl Pa'C S h Pa'g0H"J S ha'~`"yB S ha& Ja'ToCP0 S hAa&BB?pjgr`rp S4a |B@ SaD8| fHBAA"J Ma&/9BHncHmC MaO J@g""M Ja&XCAa&L` | fBB*| g| f| fV S"hl"QAa&*fB S"h"QAa&Bjp Shgj Ja&.J@g& 2\fj`CAa%C Ja%B-B-| fp`B@L|NuH:O:8/HpBfroBgv`BCGfB+B+EFVJCgp`p jBF`2FH ЁЀЁЁЀIOb,g4C0@F@ rTHa%plgr`r 0@F@ r`.CH;0@F@ ra$r 0@F@ r^HpFa#RF|mrp?pkanTOp?r? Jt02a8XO<r?pkaJTOHoHoHoHopOa2OpofrogJCgB@`p6`d|faL`V|fDp?pkaTOB@/9BHyHCHk"KAearO J@gTAeaX`H|fPp?pkaTOB@/9BHyHCHk"KAea(O J@g AeaBgpkafTO`|gl0FW@<H"ҀҁҀҀҁIObHoHoHoHopOa Opogn~ ogLCFa#,H g<"LAa#>CAa#2"o La#(p\ La#,H g CAa#BG20aJ@g oBBF`pof rlgg yi4g/9:p axXO3: 09: kz"L Ka"p\ Ka",H gB.>G ?yOLBo/K/|H9 HWp??9: p aPO09NgHWpa XO WG!g W)f|` g0`p`JFgpOL\NuHO6Hj"K Ja&XO0g 5j5j0&_$_Nu09Hpa'ByHpNu?/ 6EhZHjHjHjHRp?BgphaOJCgaP`ByHpB@` 2IB R@|m$_6Nu09Hpg aByHpNuH0&H6$IHj/ /?p,a~O2H ЀЁ5s5sL NuH>QO(H:&I*o0BC8HoHo /?p,a6O2H ЀЁA.ME 4||| b^B4; N *T@TT**TT@SCpVg6SCrVg.SC`*2H ЀЁ64 KC`2H ЀЁ t 6(pRg|ovp RgJCj8DD`8DJCkBCoo2H ЀЁ<4D4BB04DB& g67o7F7@" g":;o4/FSB;B6/@SC;CPOL|xNu?/ QO&H6Cap/ ?/ ?/ ?/ ?/ p??p*aOPO&_6NuH $H86:JAjH$ԂԀr( `2H ЀЁ爇r JEg0 JaL8NuH 0QO&oEHpr0a$r0a$r0a%BBBA0a$>?k0+k?@2+k?AA0ra$>> 09hPHk S@?@?@2+ k?AA0ra#RoRoAr0a#ABA0a#0+POL NuH>O$H85@5AIRyHx yHxlKhZ09HxHG &B"LB@ Ja м"mJDgJDg"0/|r24/Hx҂+A'A` +BAp Ma 6?,?,?,?BgBgBgBgr?p3a ,OJCf g NaSyHxOLtNuH4UO$H6*Ir?pka TOp?pka TO Ja/ ?p2a \O8|:2H ЀЁGt@kgTp2+ @gJ4+||fSE2H ЀЁ r J0alHWHoHoHo Bgp??pa dOp@kfx"M Ja&BBr0 Jahp?pka 8TOBgpka .TO0TOL,8NuH>O?@(6:&HHx"| |aXO.poVhP@>/XBD`@2H ЀЁЀItTg l -g laNR@@o0` laRDDn0hN>0hPryh\Al62@49hPH…B49h\yh`Bo6@29hPHAryhZ4/(Al?A(2/(G49hNH…B49hZyh^BoG29hNHA?B(KHz;o(;C;G;@;Ex`0@DHMrD<=|=|Bn0H$ԂԀԂ=s( BnrDhP=A=G=yhPrs(g s( -f=|-|J `=|2H ЀЁЀ-s RDDln0@EHBu; t2 M0/(aJMHVHoHo,Ho2pOa OpogBA`r?AHU?/(?/,p?Bgp+aO >E |fCB@ Ma2BC`TC0 Ma""JAa2p4H"ҁ҂ҁsf(HUp?s??*?*?*?Bg?p/avOv?|HVHo HVHo"Ho4Ho:BBgBgBgBgBgBgBg?/4?/4?/4?/4??/Lp??r?pa O<<r@g4/B?B?G"|HgfnSBg|g|+g`|Pg|g|g`|f>/VRGGl~|mp4H"ҁ҂ҁsf`|f>/VSG|l>|mp4H"ҁ҂ҁsf`~`RGp4H"ҁ҂ҁsf`~Bo`0/ W"h1H?A|f>/V?G RGGl~2H ЀЁЀIt0BgZBD`RD l0@g HaJ@g l0@HaJ@g l0@H|` l0@H< l0@g4/@go f o"g6HUp?4/(H"ҁ҂ҁ?3?*?*?*?Bg?/4p/a`O|g>"J0 MaHUp?4H"ҁ҂ҁs??*?*?*?Bg?p/aOpFg|g2HUr?0H$ԂԀԂ?3(?*?*?*?Bg?p/aOHU?/(?/,p?Bgp+aO >R@fC MB@aBC`TC0 Ma"JAap4H"ҁ҂ҁsf(HUp?s??*?*?*?Bg?p/aZOvpFf2/fpFg4HVHoHo,Ho2pOa,OHU?/(?/,p?Bgp+aO > Maܾ|gp4H"ҁ҂ҁsgv`6>HVHVHVHVBgp??paO0O*L|NuH0EHt f ?l0,lS@?@2,lSA?AA0rN|p4,H"ҁ҂ Tp gv`BCBA0Nr0Nr0N0, CR@?@>?l 0, lCU@?@ ?@2, lSA?AA0rNr0Nr0NJpl C?@>?l 0, lCY@?@ ?@2, lSA?AA0rNJ0, C?@>2, C?A0, lCS@?@ ?@4, lCSB?BA0rN0, C>2, C?A4, lCSB?B0, lCS@?@A0rN20N2*0N2*0Nn2*0N,B@O LNuH0EGi(62IAJv`B@2A7RC|oBC` 0@7(RCkmBC` 0H'VRCkmAJa:vAH` 0@"Z2RCkmBC` 0H"Z"^RCkm0L Nu"H00<NBL NuA(p"@ "ByMA1B3M3MO"Nu/ Hz?<&NN\O$_Nu(VHNuH8$H&I+g|2g+gC'I&'IR'I UAe"S(kt d W`2+gH@ KaLJ@f,H@ KaLJ@gkg&B JLNu3 9`/ / B@JgB)g@)fJ&Q(i ge"// Ia"_ _J@f&Q`B@"(_&_Nu3 9p`#H#H&HJfS#K " I(IaJ"LJ@f`p/alXONu(g4(f>"P | dNu?/a _2J@f 0Nu3 9pNuC!I!IR!I `H&H(o Ia6k g La` a|Jf(H <a )Hg0@0;6 K (:gNa0|g9@{00 l)H()H `da)b*a)b* / ?/?<=NAP$_JkR9@{0 la A()H)HRH)H QC#9 LLNup`p`p 39 g la `YOCBgg Ar`THWf0XONup`rwar+w+a+rbwbabr+b rb+ w+b wb+ a+b ab+ Aip`Ar(WVNu?/ AMza4AMa*Gi6<`Gp+g Ka Q&_6Nu/ &H+g+g8aJ@f80+aJ@k,+g kaB@7@? Ka0&_Nu3 9p`H&H(k L0+"+ aJkRgF+f, L"St gSj`"HSISSk ögSjJg&"'LBLNup`p`H&H(k6+"+g0Dta$Jk+fZ"S"L Ip gSj`*| // " 0a"_"JkNgPAp SjH@" 0aLJk*g,`0" La|Jkg&'LB@LNup`p`H06&Hp Cgp@CfFpC?/ ?<=NAPOJk&8jaTpCgF?<?p/?<BNAO Jj.`Br߲fNAXONua39p`ް|c/ ??<>NAXO$_JkpNua39pNu/ /?<ANA\OJkp$_Nua39p$_NuHR@W@e >?NAO $_JkNua39pNuT@a J@gX  _H&Hx&SgkJ9Mkvf~a<g&< g<<gP< g< e޸dRa`JgSSKpap apa`Rp aMp a`bJg^M`TxB9M`Jx B9M`"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" l eb&/ ?<INA\OJfQLNuP`|A0|Nu|A 0|Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu/ /?/f HN2z.gHMM|:?<NATO|ATNBg/?<GNAPOJf\B.UN _0S@k "H`W,_$_NuHRHP?< NA\O$_NuHRHP?<INA\O$_NuHR/?<HNA\O @$_NuHR??<NAXO$_NuHRHP?<;NA\O$_NuHR//HQHP?<NNO @$_NuClNHRt""2"<Nd0<NBAm0$_NuHQHP"@(#)Take-Off Version 2.07 Apr 17 1993GEMINI pmarker:1.INF\TAKE[1][|Take-Off not possible.][ OK ]TAKEOFF2 Take-Off 2BBBBBBBBBBBBC BBC%BBCABBCTCeC}CCC)CD0Dm==xx??<~xxx?xx<><<~x>x<x<xxxx<x|<<x<?xx?x|>|>|>|>>|>|>|>|>|>;( @:>v:: : :  D 'D (@&D#D#DEB E& E7  EP  ;  D  ;6  , @*Epq;R@q @E#;n( E E( E  E  E 'D" @@>Eq ;<E,'D6>?t@AEEF F&Are you ready again forX 1991-93 by Thomas Kleinand Oliver ScheelTake-Off *not* possible!Yeah, and this program alsogoes Freaky Deaky!CP_NAME~~~~~~~~~Alias: ________________XXXXXXXXXXXXXXXXCP_PARA~~~~~~~~~~~~~~~~~~~~~~Parameter: _____________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXPP_PARA~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~____________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXInfoOKTake-Off ist Freeware, d.h. es darfzu nicht-kommerziellen Zwecken freikopiert und benutzt werden.Kontaktadresse:Rothehausstr. 28W-5000 Kln 30 (Germany)EMail: Oliver_Scheel@k2.maus.deConfigure SlotTTP/GTPProgram/Directory:CP_PATH~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~SelectClearCancelParametersNo program selectedSelect program ...Select info file to save ...Select new info file to load ...TAKEOFF.INF\FFFFGG"G5GHG[GnGGGGGGGHFHH( About Take-Off..- Slot 1 Slot 2 Slot 3 Slot 4 Slot 5 Slot 6 Slot 7 Slot 8 Slot 9 Slot 10 Slot 11 Slot 12 Slot 13 Slot 14 Slot 15 Slot 16 Load INF ... Save INF ...*.* Slot *.INFr @ w# Take-Off 2.07 INF-Datei #  JJ@(#)Freaky Deaky GEM-Utility Package Version 2.02 Mar 16 1993\#i(i2iPipi~i M*M*M*MzlNlllmnno*oHqhpPro*oHpPqhrr  6,.8 &>  0 .><* J  4*6 *> \   0  .$ &JHH00H0 JF}Jsf_M4 ^$l^q~#,Sҹ u Cep}@XAYryzQW!)b`}1ğҼ)JR<5 \NbT [ T."o\q/H")qBJT"]@- Ⱦ+jƲD@P(mcP|R?ٮ7iHE绅bX)HH\?.m3 txȟHSr#8Ml~ӹrc8ة#Dy"u?=`Q@[`w-nM m Xy *EcrU] #QtrM㿟IN)Lt  GIsZWdm>iTZoRNy!+Y*aٱnd\Xæ]EZ `#̞_bGk]'ʧ hO&ǦdjQOY>5CS02җL"~;[4>gZFSM3ij oi?7T2-\BS#yPO)QծW&*X1Xc΄fOѷpom< !&alUIKͯ^RR/nIq |xx_aq(cA*2,>u|&FH@C*:TtUP`0dT[!Ez/ xҗU> Hߤ*0ϢW0bADj~{{P|teYXNAtx@+nb?+I:?ռW{*@J_!lT5t:>sPdFc#LۋF8?GU[\=6Y׫JZ7A>Oƥp G_Ǩ_Take-Off 2 Changes ------------------ 2.02 ---- - Bei den Dialogen fehlte ein wind_update(). - Die INF-Datei sollte beim Start jetzt immer gefunden werden. - Luft in einer Multitasking-Umgebung nun auch als Programm, d.h. nach dem Start erscheint direkt das PopUp und man kann das entsprechende Programm `launchen'. - Gemini mu in einer Multitasking-Umgebung nicht mehr Applikation 0 sein, jedoch luft Take-Off 2 defaultmig nur noch mit Gemini zusammen. Will man einen anderen Desktop benutzen, der auch AV_PROGSTART versteht, so mu man Take-Off 2 umpatchen. - Ist Mag!X installiert, so kann man auch ohne Gemini Programme(!) (parallel!) starten. - Die PopUps wurden um ein kleines Feature erweitert. Man kann nun auch durch Drcken einer Zahl oder eines Buchstabens Eintrge direkt anfahren. Dabei wird immer der erste Buchstabe/Zahl im Eintrag bercksichtigt. Fhrende Sonderzeichen werden ignoriert. Ist die Taste nicht eindeutig, dann wird bei jedem weiteren Tastendruck der nchste Eintrag angewhlt. 2.03 ---- - In der VA-Protokoll Untersttzung war ein bler Fehler drin. - Die Parameterbergabe unter Mag!X hat nicht richtig funktioniert. - Man kann nun Programmen auch Parameter ber eine Dialogbox mitgeben. Dadurch hat sich das Format der INF-Datei leicht gendert. Man kann die alten INF-Dateien aber weiterhin benutzen. 2.04 ---- - Bei der Eingabe in die Parameter-Box wurden Speicherbereiche berschrieben. Dadurch hat sich Take-Off hier sehr seltsam verhalten. - Der Mauszeiger wird jetzt vor dem Aufruf des PopUps auf einen Pfeil umgestellt. 2.05 ---- - MultiTOS wird jetzt untersttzt. Benutzt man MultiTOS, aber kein Gemini, so kann man nun auch von Take-Off profitieren. Es gelten die gleichen Punkte und Einschrnkungen wie fr den Support von Mag!X-only. - Beim Mag!X-only Betrieb wird vor dem Start des Programms der entsprechende Pfad gesetzt. Einige Programme konnten sonst ihre INF- Dateien nicht finden. - Take-Off ist nicht mehr fest auf Gemini als VA-Server eingestellt. Gemini hat aber weiterhin die hchste Prioritt. - Das Kstchen oben links kann nun `weggepatcht' werden. Dazu mu man in TAKEOFF2.ACC den String "pmarker:" suchen (Disk-Monitor o..) und die Zahl dahinter (normal "1") auf ein anderes Zeichen (z.B. "0") setzen. Das Kstchen wird dann nicht mehr angezeigt. 2.06 ---- - Es ist nun auch mglich Ordner mit Take-Off unter Gemini zu ffnen. Dabei darf bei der Dateiauswahl kein Name eingetragen sein. - Man kann nun auch Preset-Parameter bei den Programmen angeben. Wurde zustzlich TTP/GTP angewhlt, so werden die Parameter mit in die Zeile kopiert. 2.07 ---- - Es gab (komischerweise) Probleme beim Laden eines TAKE*.INFs ber einen Eintrag im Take-Off Popup. Kein Wunder, es war auch ein Bug. Dieses Feature, welches in Tip 3 unter Punkt c) beschrieben wird, funktioniert nun auch ohne Gemini (warum nicht gleich so? :-)). Weiterhin wird beim Abspeichern einer INF-Datei jetzt der entsprechende Pfad dem Fileselector bergeben. - Die 3-D Features des neuen AES werden jetzt untersttzt. i/]tP~gݽ3njA[|wȃ6҉ ;~R4J2P8HdCGh,0phWx6!֧/. t-Eph|+Ok=POրVCyk#"|!A]q@p:cއ+ݧ7F##:zD{bE9F]\.o|V*CϵHPKz݃t LATEXHLP.IDXruǯ}?k0Kwy]n0x Ң)>- 6m`m7걪* 6Rٶ*6&;y[@gUc"~5tMg($H( $    6 X   z @ N0 Np0NH NH NH NTAKEOFFTAKEOFFTAKEOFFTAKEOFFTAKEOFFTAKEOFF*A(Tp  8!?LÀ8 aBpU\9T8?Hġ$1рH2 P$`KQRA$~ HLH$H'"NH$I$I$$I$~????<BfDD dL "$H !G 333330??P*UTVTUUVUT*X `@@@UUUV@@@@@5X@j@UT@@@@V@j@UT@*@5X@@ `@ @@@@@@@?@UUUV@@@L@_@@|AfB"?F"ED B A@DC@EUUJEU@@?HuMF[ 9M59w"=p{C>UO'V2^)w]0~=6eyN+EjV}j(0E>f^7=Bymt*H^c˨ >%Z*s7e1)n'# P?KsϥQ4?D_aᘰU=_9/-BG)jQi}cb,"5ǬKj~< 8 u!pڶ.e IcǝLQf,]KcKPٺD!'cXꃉ"ٽQG[:?t%eJKɪ40JmIhB|̰ه twR%,fD F֢bޒwރ@ә1 Dv-dy~E-NZ0,:ȳ`or8v- &ܐ 4weHgBPR}VЙJ*(;4%$/F3YO4"։, @ D]|맃Kj  ME{4Hk[[B'OɏB 2w"9N]<v[Ԣ&kS?M6hFcO-a3@Wq nTM V x)[ v ^0zK _cg36XUPq &aEb $fJc~cەwwD; *;{_s(. Ό4nEdHک~5X Leµ9#'LC=Fj9s LٝNƬ]db7iYغ'j]lC,XɑBUAwJ{E#(a(ό@*** WICHTIG *** Durch die Umstellung der Postleitzahlen zum 1.7.93 lautet meine Adresse von da an: Oliver Scheel Rothehausstr. 28 50823 Kln Weiterhin wird sich meine Adresse wird mit hoher Wahrscheinlichkeit zum August/September hin ndern. Nhere Informationen sind dazu dann aus der Zeitschrift ST-Magazin zu entnehmen. Oliver Scheel |ױ7/4gJ\qz 2Xr8a+=TKTnEQ S4ܿ""F 9:(J:d B5aX= ~1p3#E2́!}$!sI $TbArᦓJohF⥒àCS. *jjk.ŠB3T Ohyd;gGʮ$,G3_`EomX~.mP_W ew0Gh9*!QPޡs\kBW3w|@C|Gso9M=0yP]y'^Y`CIrLdWDDz9UrA8L)u_GN>Druck<< und schon kommt die Maus auf der gegenber- liegenden Seite des Screens wieder heraus! Vor allem Grobild- schirm-Besitzer ersparen sich damit manche Schiebeorgie. nderungen seit Version 1.0 anpassung an MultiTOS anpassung an den FALCON anpassung an die neuen LOGITECH-Muse einige optische nderungen ein paar Kfer entfernt ab Version 1.5 ist WrapMouse Shareware Installation Wrap-Mouse besteht aus zwei Teilen, >>WM.PRG<< fr den Auto- Ordner und >>WRAP_CPX.CPX<< fr XCONTROL. Zuerst sollten Sie ALLE Mausbeschleuniger oder Maustreiber aus Ihrem System entfernen bzw. deaktivieren. ACHTUNG! Oft sind in diversen Tools wie z.B. NVDI auch noch welche versteckt. Erst jetzt darf >>WM.PRG<< in den Auto-Ordner. >>WRAP_CPX.CPX<< kopieren Sie zu Ihren anderen CPX-Modulen und starten den Rechner mit einem Kaltstart neu. WICHTIG! Ohne XCONTROL und >>WRAP_CPX.CPX<< geht gar nichts, also immer XCONTROL.ACC laden! Versuchen Sie nun Ihren Mauszeiger aus dem Bildschirm herauszu- schieben. Kommt er auf der anderen Seite wieder zum Vorschein, ist die Installation fr's erste geglckt! Wer eine MS-DOS Maus anschlieen oder Wrap-Mouse mehr an seine persnlichen Bedrfnisse anpassen mchte, greift zu XCONTROL. Das Steuer-Modul findet sich unter >>WRAP Mouse<<. Der Hautpdialog >>Tasten tauschen [An/Aus]<<: Die Maustasten werden vertauscht, vorallem interessant fr Linkshnder. >>Joystick [An/Aus]<<: Der Joystick als Mausersatz, gut fr gerade Linien in Zeichenprogrammen. Leider ist der Feuerknopf auf dem Atari gleich der rechten Maustaste, warum wissen nur die Gtter, aber dank >>Tasten tauschen<< sollte das kein Problem darstellen. >>Serielle Maus [An/Aus]<<: Wer eine serielle Maus anschlieen will, sollte diesen Punkt auf >>An<< stellen. ACHTUNG! nderungen von >>Aus<< nach >>An<< werden erst nach einem erneuten Booten von Wrap-Mouse erkannt. ACHTUNG! Aufgrund seiner Beharrlichkeit kann das RS232-Modul (Seriell) von XCONTROL u.U. Probleme verursachen. Das Teil berschreibt gnadenlos die Einstellungen von WrapMouse!!! Wird es benutzt, sollte man sich vergewissern, da der Port, an dem die serielle Maus eingesteckt ist auf 1200 Baud, keine Paritt, 8 Bits (bei LOGI 7 Bits), ein Stop-Bit und keine Kom. Parameter eingestellt ist. Wer keine Df betreibt, kann das >>Seriell<<-Modul auch 'rauswerfen. >>Rechte Maustaste<<: Wen hat es nicht schon gergert, da die rechte (bzw. mittlere) Maustaste praktisch nutzlos ist? Hier knnen Sie Abhilfe schaffen, ab sofort kann sie als Shift-, Alternate- oder Control-Taste fungieren. Um mehrere Dateien auf dem Desktop zu selektieren mssen die Finger nicht mehr zur Tastatur, es gengen die Maustasten. Als extra Bonbon kann auch ein Doppelklick der linken Maustaste simuliert werden. Da ein Doppelklick erst beim Loslassen der Taste ausgelst wird, kann Tasten- und Doppelklick- Emulation (z.B. Shift+Doppelklick) zur gleichen Zeit aktiv sein. >>Programm<<: Einige Programme verwenden die rechte Maustaste fr eigene Zwecke. Damit die Emulationen bei Strungen nicht jedesmal von Hand abgeschaltet werden mu, gibt es hier Platz fr 20 individuelle Konfigurationen von >>Rechte Maustaste<< und >>Tasten tauschen<<. Ein Klick auf den Button ffnet ein PopUp- Men in das mit >>Neu<< Programme aufgenommen werden knnen. Die Einstellungen von >>Allgemein<< gelten immer dann, wenn ein Programm aktiv ist, das nicht in der Liste steht. Um ein Programm wieder zu entfernen, wird es mit gedrckter Shift-Taste angewhlt. >>Sichern<<, >>OK<< und >>Abbruch<< folgen den blichen CPX- Regeln. Der RS232-Dialog Je nach verwendetem Rechner steht unter >>Port<< die gewnschte Schnittstelle fr den Mausanschlu zur Wahl. Via >>Mouse<< whlt der frischgebackene Musedompteur, die Art seines Raubtiers. Es drfen Microsoft, Mousesystems oder LOGITECH (LOGI) kompatible Tierchen sein. Als kleine Faustregel kann gelten: Zwei Tasten = Microsoft, drei Tasten = Mousesystems und wenn irgendwo LOGI 'drauf steht ist wahrscheinlich auch LOGI 'drin. Stolze Besitzer einer Drei-Tasten- Maus drfen sich freuen, die Einstellungen unter >>Rechte Maustaste<< gelten dann fr die mittlere Taste, die ganz rechte funktioniert wie gewohnt. ACHTUNG! Einstellungen von >>Port<< werden erst nacheinem erneuten Booten von Wrap-Mouse erkannt. Systembedingt neigen manche MS-DOS Muse ein wenig zum holpern, der Mauszeiger bewegt sich nicht schn flssig ber den Bildschirm, sondern hpft so vor sich hin. Um das atari-verwhnte Auge zu befriedigen sollte >>Gltten<< bei einem solchen Stolperer auf >>An<< gestellt sein. Das Ruckeln vermindert sich circa um die Hlfte. Die Speeder-Dialoge Wie schon erwhnt, ist in Wrap-Mouse auch ein Beschleuniger fr unser Lieblingstier enthalten. Aufgrund der unterschiedlichen Charakteristiken kann die Art und Weise der dynamischen Beschleunigung separat fr Atari-, Serielle- und Joystick-Maus eingestellt werden. Sie finden die jeweiligen Dialoge im Hauptteil unter >>Speeder<<. Im rechten Teil des Dialogs sind zwei Reihen von Slidern zu sehen, ber die Mann/Frau die Beschleunigung individuell programmieren kann. In der oberen Reihe stehen die Schwellenwerte, ab denen die in der unteren Reihe eingestellten Verstrkungsfaktoren (20 entspricht einer Verdoppelung) zum Zuge kommen, damit lt sich praktisch jede gewnschte Dynamik erzeugen. Bei der Joystick-Maus hat der erste, obere Slider eine besondere Bedeutung, er gibt an, nach welcher Zeit sich der Maus- Zeiger um mehrere Pixel bewegen darf. Bei einem Wert von 0 ist die Bewegung um nur ein Pixel nur noch fr Joystickakrobaten mglich. Der linke Teil ist dem namensgebenden Feature, dem >>Wrapen<<, vorbehalten. Um die Maus nicht dauernd auf ungewollte Bildschirm- Rundreisen zu schicken, wird mit den vier Slidern fr jeden Bildschirmrand die Strke des ntigen >>Drucks<< zum durchtunneln (Quantenphysiker mgen mir die Verwendung dieses Wortes verzeihen) eingestellt. Wer das Wrapen oder den Beschleuniger nicht braucht (was mir vllig unverstndlich wre) kann diese Funktionen mit >>Wrap [An/Aus]<< bzw. >>Speeder [An/Aus]<< deaktivieren. Probleme Leider hat bis dato noch keine Colani-Maus ihren Weg zu mir gefunden! Sollten diese Tierchen nicht mit WrapMouse zusammenarbeiten, wre es nett, wenn mir jemand das Teil fr zwei Wochen berlassen wrde! Das Gleiche gilt auch fr andere MS-DOS- Muse, die Probleme machen. ACHTUNG! Bitte nun nicht gleich mit der Maus auf die Post flitzen. Ich mchte nicht in Musen ertrinken........... Zusendungen also nur nach Absprache mit mir! Gut Maus! Richard Kurz y ?A󥔚[7Se'qөOH;ä''H\jjb! z6tNMM@:Q:+3:7Dunrl phRM._lZ^cҐ-״Od|NqNgf{F5O(l)ɖg.eƍa~C902g$iI'!"RodF#f#?Wγlq$Y6ܻ5#[0R*bS eY40)ed!_Pt&UxQ`9<:Ia=y;?RD \1@A61\)2b1:z)]4aHDO<\P|, Sj~!zb}EBF\â.)]?9WOǒ:/15Gt ?XK>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International &H f&op`B@##3$ k #$ Ј<.@#$Jy$g<"@(I$k,"Jf"JfB// ?<?<JNAO A<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHy`$ON(0 J"LNB? 9 tg @N 9 xg @NN?<LNA/p ~fp`NN&#$$28gt`tH#& CNNT#!|09&g#,!|0Ap!N#ANN09&gN p&NuN09'tgpNuB@NuH0YOE$(p5@85@5@r5A:5A5Ap5@<5@5@r5A>5A5Ap5@@5@5@r5AB5A5Ap5@D5@ 5@r5AF5A"5Ap5@H5@$5@r5AJ5A&5Ap5@L5@(5@r5AN5A*5Ap<5@P5@,5@r<5AR5A.5A p<5@T5@05@ r<5AV5A25Ap5@45@5@r5A65A5A45|\5|Z5|X5|`G "KANN6J@gA pN`ANANANANANAN~ANvANnA NfA$N^A9NAAN6ANpN`NlNJ@fN`# ~ANA BnB/|d8(Hĉd`AN ZSDJDn T0(HdH@@`jBn T0(6rhAf`*o^p$C Rn2.qoHBnB/|8(Hĉd`AN SDJDn T0(HdH@D@/g`BnXOLtNuH>(HE$(G |p22g f` fM$$K&p22g.42f(rf@0-gt2 F V"h$Bm`p22g42gL2-g$ fp2 V"h$;|`0-g2-ft2 F V"h$Bm f ;|`Z0-f42-g. f(Bm MN  MN  MN ` 0-gr2F V"h$BmBmL|Nu/ $HNB@3#29&g JB@N09&g JB@N$_NuH<&HE$( jlfp\ KNT(HK& g RL"L MN`"K MNBC`4pC MN>J@f 0*@A1 |3 |Rjp` RC|mB@L<NuA$(0(oSh0(@C3 |NuH8G&0+f2+f4+f0+gA$(0(XgC0@E8Rk2+rm7|dE40(4g<2`0@I82+tm ID4`SQ QlRk kco7|c#B+B+0+gj`0+g *DA0+gj`0+g *DA0(6g KpN KNLNu/ 09&g fE&0f2*f 4*f0*gBj`5|p(g4`BRp(g5|`Bjp(g5|`Bjp(g5|`Bj0f2*f 4*f0*g0*g5|d5| NLBj Bj$_Nu// YOBA <_MCHNE$( bB j`lp???4<BApN\O`p???4<BApN\OAZN` fB j`lp???4<BApN\O`p???4<BApN\OA"N~`0*\S@gS@gS@g,S@g:`pN&ANR`4pN&AN@`"pNx&AN.`p Nf&AN j`lp???4<BApN\O`p???4<BApN\O0N XO$_&NuHE$(0*Zg&G'RI'K'BM# j`f< SoBS< f;|`JfBm` p@gBS`RS0 Sopg`p g`pg r,A`lp g r,A`l0- MN0*^g BA4AgXB@<2*g MpN0*g4 MpN`( j`f~<p@gBS`RS0 Sopg`p g`pg r,A`lp g r,A`l MN`B j`f<g r@gBS`RS0 So|BSpg`p g`pgr,DA` p,@p gr,DA` p,@ MNz0*^gBA4Af;|` j`f0 e cBS`RS SoBSpf`pf`l ,c B,@` ,D@l,- ,c B,A` ,D@,-rfp`B@ MN0*^g BA4Ag,B@<2*g MpNx0*g MpN MN&L|NuXBRAWrApHaL/:Nu/"zN _NuXBRAWrAp OfNh PKf*H haJ@gL# /|`L/:NuHaL/:NuXBRAWrApHaLNuXBRAWrApH@F'aaFLNu08TH xVrJg XA@fpNu!JpNu#0!0Nu#!!Nu!Rp#pNNu#|!!NuXBRAWrApH@F'p8/aTFLNsXBRAWrApH@F'p8a&8FLNsXBRAWrApH@F'p8aFLNsXBRAWrApH@F'p8a8FLNsH0(&HN &$x CN  gf g&p`PJ fB@L NuH8(*N &$x CN f2 <N &H$K g\$%EB%| N &N`f(Jp`RPJ"fl%A%j $%E`N|܀pІN L&H$K fB@`6$%lPJPL f$%EB%F N 8&$|$ CN (pLxNu#*!*#&!1AY&&NuXBRAWrApB!&!*NA(p"@ "By#2A1B3#23#4O"Nu/ Hz?<&NN\O$_NuC#aA#p `/ / B@JgB)g@)fJ&Q(i ge"// Ia"_ _J@f&Q`B@"(_&_Nu3 rp`#H#H&HJfS#K " I(Ia:"LJ@f`"PdB@ Nu(g*gg/a _J@f/a _J@kf"P`3 rpNu(g4(f>"P | dNu?/a _2J@f 0Nu3 rpNuC!I!IR!I `H&H(k L0+"+ aJkRgF+f, L"St gSj`"HSISSk ögSjJg&"'LBLNup`p`H&H(k6+"+g0Dta2Jk+fZ"S"L Ip gSj`*| // " 0a"_"JkNgPAp SjH@" 0aLJk*g,`0" LaJkg&'LB@LNup`p`/ J@f//aJ@fBg`//??<?NAO $_JkNu  _`a3 rpNuH&Hx&SgkJ9#kvf~a<g&< g<<gP< g< e޸dRa`JgSSKpap apa`Rp a#p a`bJg^#`TxB9#`Jx B9#`#p a2 L$_NuBx`xB9#`x B9#`?<NATONu??<NAXONuH@??<@NAO $_JkfNuaZ3 rpNu3 rNu/ |b2@?? /?<BNAO JjfSBg jX?<? p/?<BNAO Jk$`X?<? p/?<BNAO JkzЁ"kt?<? p/?<BNAO Jk\$`?<? p/?<BNAO Jk@$Ҁk: $k2HzN <e/`/? ?<@NAO Jkb $_Nua`3 rp$_Nu0<`H 6?<?B?<BNAO (Bg?/<?<BNAO *Bg?/?<BNAO JWHL8NuD@| |"b;NupNu   g fC`Jg INuSHNugHf8g@f0g8f(g0f g(fg fgfgg!epNupNuJfpNu g<g8g4g0g,g(g$g ggggg ggf @Nu/ &y# g/ &S?<INA\O`&y# g/ &S?<INA\O`&_Nu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNup `p`#*n3(p4`/ 3'V@@A"C'XB@22220<"<NBA)0$_Nu'V't()*n,n / ?<NATO$_Nu/ ??<NAXO$_Nu/ /?< NA\O$_Nu/ /?<HNA\O @$_Nu?/?<1NA/ /?< NA\O$_Nu/ ?< NATO$_NuH瀠>NMPO @$_Nu/ /?<&NN\O$_Nu/ ?/ ?/ ?/ H?<NNO$_Nu/ ?<"NNTO @$_Nu/ ??<,NNX$_Nu/ #-#-#-#-$_NuAllgemein[1][Wrap Mouse V1.5 SHAREWARE|(c)1993 by Richard Kurz|Vogelherdbogen 62|7992 Tettnang|Fido 2:241/7232.5, Maus UN][ OK ]p Wrap Mouse V1.5 q (c)1993 by Richard Kurz Vogelherdbogen 62 W-7992 Tettnang Via EMail Fido: 2:241/7232.5 Maus: @UNp Diese Programm ist SHAREWARE! Fr 'nur' 30.- DM werden Sie vom nun flligen Tastendruck befreit! q[3][ |Fehler:|Wrap Mouse ist bereits|installiert!][ OK ]FEHLER:Bin schon da [3][ |Fehler:|Das Cookie WrAp konnte|nicht angelegt werden!][ OK ]FEHLER:Das Cookie WrAp konnte nicht angelegt werden #L#L#L#r    J22d&> zfB& ~   $ `Nb 2> R  |p_ >- c4-?74KOsO ^Q)ܤĖn~PŘ(G>Lu arQ<6_l hgJ;aCm%.ڌ쎴pr;#1_ Æf jݡ; LB͐ Q9 m9P(E RNXO R?h?h/9WHop?4H"҂"T?)p?HyX` yW hNO8S@f R!|U`JDf R!|Uܸ|g2H Ё T1D yW?(?(?(4rp> RN\O`f#UX`#UXdHoCpD RNXO R?ht?hv/9WHop?4H"҂"T?)x?HyX` yW hNO8S@f R!|Ul`JDf R!|Ul|g2H Ё T1D yW?(?(?(4rpD RN\O`K|mh|lbpC:HЀ4H"҂ T7hHzBgHkrc?t?p??2A| ?4B| ?/ yW h(NO`n|m| lpC:HЀ4H"҂ T7hHzBgHkrc?t???0@| ?2A| ?/ yW h(NO0HЀ4H"҂ T1k`|1mh|7lbpC:HЀ4H"҂ T7hHzBgHkr(?t?p??2A|&?4B|%?/ yW h(NO`l|m|%l|pC:HЀ4H"҂ T7hHzBgHkr(?t???0@|&?2A|%?/ yW h(NO0HЀ4H"҂ T1k|f o0|g|g| g `xN`pc`p o hbfAUpNZ`T o hafHAVpN@8S@f6CX T <bNTN. yW?(?(?(4rB@ RNZ\OB@O L<NuH\O$_Nu/ ?9\CV]29\AH ЀЁ y[ hN`TOEW R?(?(?(4r09\@|& y[N\O$_Nu/ 29\H Ё yX?(CV` y[ h NTOEW R?(?(?(4rp@ y[Nz\O$_Nu/ 29\H Ё yX?( CVc y[ hBA< <b;k`|<*f<`&<0< b ACp ab$Wb<gt<.f6<*f4`$<0< b ACp a$$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a*A pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 JgJgJgJgJg JgJgJfSHggggg ggf @Nug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNuH0$H|g|$bG>rtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"?#`~#`pZa,"o2Nu#`~#`#`p[a "o2Nu/ 3]f@@A"C]hB@22220<"<-TNBA_$0$_Nu]f]^$_$`~b~ 2Allgemein<<<<<<<<<<<<QvQQQQQQQQQQQQQQQQQQQQQQQQQQQRRR RRRR R!R"R,R-R.R:R;R<RKRLRMRWRcRtRuRvRyR|RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSS'S(S)S2S3S4S<S=S>SLSOSeSwSxSySSSSSSSSSSSSSSSSS      !"#$%& '() *+,/0189:BCDHIJQRSTUV WXY Z[\ ]^_ `ab cdeijklmnopqstuxyz{|}A  A A A             & @ &@ &@ #A A A   A  A   #` - KA  . 76'  % @ @  @  @  @  @  @   @2@  @3@  @4@  @5@  @6@  @7@@@@ @ @ @!@"@#@ $@ %@'&&@ %@;)((@ '@<+**@ )@=-,,@  +@>/..@  -@?100@ /@@2@ 3@ 4@ 5@ 6@ @ 8@:99@8@A;@ <@= >@ ?@ E A@@@?@FCBB@ A@GD E@ KF@G@ H@JII@H@LK@ LM MMK%NA  OP   #           & @ f& ` g  h   r v w   k{WRAPCPX.RSCAusAn WRAPMOUSE SPEEDER RS232 OKAbbruchSichernSerielle MausAnJoystick-MausAnTasten tauschenAnRechte MaustasteShift linksShift rechtsControlAlternateDoppelklickProgramm-SetupAllgemeinAtari MouseAnsprechschwelle121212121212Verstrkungsfaktor12121212121212SpeederAus1212WrapAus12ZurckAbbruchZurckAbbruchPortModem 1Modem 2Seriell 1Seriell 2Maus-TypGlttenMouse SystemsAn1993 by Richard KurzVogelherdbogen 627992 TettnangFido 2:241/7232.5OKWrap Mouse V1.5Der Treiber fr serielleMuseMaus UNSHAREWARE DM 30.-[3][ |Sorry,|WRAPMOUS.PRG fehlt][ Okay ][3][ |Sorry,|falsche WrapMouse|Version geladen][ Okay ] Neu [1][ |Wirklich lschen][ Ja | Nein ][3][ |Es knnen keine Programme|mehr aufgenommen werden!][ OK ]Programm whlen Info... Atari Mouse RS232 Mouse Joystick Einstellungen Aus An AnAus[0][Hiiiiilfe !!!! ][ Ah ja ][2][Undo oder nicht Undo|ist hier die Frage][ Ja | Nein ]Atari MouseRS232 Mouse Joystick Aus An AnAus Aus An AnAus[0][Hiiiiilfe !!!! ][ Ah ja ][2][Undo oder nicht Undo|ist hier die Frage][ Ja | Nein ]AnAusAnAus%i%i%i%i%i%i Aus An AnAus Microsoft MouseSystems LOGI 2 Tasten LOGI 3 Tasten [0][Hiiiiilfe !!!! ][ Ah ja ][2][Undo oder nicht Undo|ist hier die Frage][ Ja | Nein ]AnAusMouseSystemsLOGI 2 TastenLOGI 3 TastenMicrosoft!:\\*.**.* F,^: (^R j|nV 4 6 6 6 (L" @,>PzHDDDFFFF&&$$&&$pnf0       >P:4$ $4$4.~   4` ~\  ,$   _L/TXT421.IMGPK,\7Zo  SCRIPT/SCRIPT_L/TXT422.IMGPK,\{Y.YJ ' 'Dialib (C)1993 Bernd Schieferdecker ' ' DIALOGBOX AUFBAUEN, BEARBEITEN UND BILDSCHIRM RESTAURIEREN ' 'Start_Edit: Nummer des ersten editierbaren Feldes (sonst 0) ' Tree: Adresse des Objektbaums von GADDR ' Ret: Nummer des Knopfes, mit dem der Dialog verlassen wurde ' DEF PROC Form_All(Start_Edit%L,Tree%L,R Ret%L) LOCAL X%L,Y%L,W%L,H%L Form_Center(Tree%L,X%L,Y%L,W%L,H%L) Form_Dial(0,X%L,Y%L,W%L,H%L) Form_Dial(1,X%L,Y%L,W%L,H%L) Objc_Draw(0,8,X%L,Y%L,W%L,H%L,Tree%L) Form_Do(Start_Edit%L,Tree%L,Ret%L) Form_Dial(2,X%L,Y%L,W%L,H%L) Form_Dial(3,X%L,Y%L,W%L,H%L) Change_Object(0,0,Ret%L,Tree%L) END_PROC DEF PROC Form_Place(X%L,Y%L,Start_Edit%L,Tree%L,R Ret%L) WPOKE Tree%L+16,X%L+3: WPOKE Tree%L+18,Y%L+3 LOCAL W%L= WPEEK(Tree%L+20)+6,H%L= WPEEK(Tree%L+22)+6:' weil 3+3 Rand (s.o.) Form_Dial(0,X%L,Y%L,W%L,H%L) Form_Dial(1,X%L,Y%L,W%L,H%L) Objc_Draw(0,8,X%L,Y%L,W%L,H%L,Tree%L) Form_Do(Start_Edit%L,Tree%L,Ret%L) Form_Dial(2,X%L,Y%L,W%L,H%L) Form_Dial(3,X%L,Y%L,W%L,H%L) Change_Object(0,0,Ret%L,Tree%L) END_PROC' Idee von Ralf Schlegel, OK! 13, S. 25 ' ' TEXT AUS EDITIERFELD ERMITTELN bzw. EINTRAGEN ' DEF PROC Get_Text(Obj%L,Tree%L,R Txt$) LOCAL Obj_Strukt%L,Ob_Spec%L,Tedinfo%L,Te_Ptext%L,A$="" Obj_Strukt%L=Tree%L+24*Obj%L Ob_Spec%L=Obj_Strukt%L+12 Tedinfo%L= LPEEK(Ob_Spec%L) Te_Ptext%L= LPEEK(Tedinfo%L)'Zeiger auf Text!!! WHILE PEEK(Te_Ptext%L)<>0:A$=A$+ CHR$( PEEK(Te_Ptext%L)):Te_Ptext%L=Te_Ptext%L+1: WEND Txt$=A$ END_PROC DEF PROC Put_Text(Obj%L,Tree%L,Txt$) LOCAL Obj_Strukt%L,Ob_Spec%L,Tedinfo%L,Te_Ptext%L,I%L Obj_Strukt%L=Tree%L+24*Obj%L Ob_Spec%L=Obj_Strukt%L+12 Tedinfo%L= LPEEK(Ob_Spec%L) Te_Ptext%L= LPEEK(Tedinfo%L)'Zeiger auf Text!!! Txt$=Txt$+ CHR$(0) FOR I%L=1 TO LEN(Txt$) POKE Te_Ptext%L+I%L-1, ASC( MID$(Txt$,I%L,1)) NEXT I%L END_PROC ' ' ATTRIBUTE VON BUTTONS NDERN (Objektstatus) ' ' Flag: 1 = Attribut verleihen, 0 = Attribut lschen ' Obj : Nummer des Objekts ' Tree: Adresse des Objektbaums im Speicher ' DEF PROC But_Selected(Flag%L,Obj%L,Tree%L) Change_Object(0,Flag%L,Obj%L,Tree%L) END_PROC DEF PROC But_Crossed(Flag%L,Obj%L,Tree%L) Change_Object(1,Flag%L,Obj%L,Tree%L) END_PROC DEF PROC But_Checked(Flag%L,Obj%L,Tree%L) Change_Object(2,Flag%L,Obj%L,Tree%L) END_PROC DEF PROC But_Disabled(Flag%L,Obj%L,Tree%L) Change_Object(3,Flag%L,Obj%L,Tree%L) END_PROC DEF PROC But_Outlined(Flag%L,Obj%L,Tree%L) Change_Object(4,Flag%L,Obj%L,Tree%L) END_PROC DEF PROC But_Shadowed(Flag%L,Obj%L,Tree%L) Change_Object(5,Flag%L,Obj%L,Tree%L) END_PROC ' DEF PROC Change_Object(Nr%L,Flag%L,Obj%L,Tree%L) LOCAL Obj_Struct%L,Ob_State%L,State%L Obj_Strukt%L=Tree%L+24*Obj%L' Adresse der Struktur Ob_State%L=Obj_Strukt%L+10' Adresse von OB_STATE State%L= WPEEK(Ob_State%L)' Wert von OB_STATE BIT (Nr%L,State%L)=Flag%L' 1=aktiv, 0=nicht aktiv WPOKE Ob_State%L,State%L END_PROC ' ' ABFRAGEN, OB BUTTON EINEN BESTIMTEN OBJEKTSTATUS HAT ' ' Obj : Objektnummer ' Tree : Adresse des Objektbaums im Speicher ' Rckgabe: -1 = Attribut ist aktiv ' 0 = Attribut nicht gesetzt ' DEF FN But_Selected%L(Obj%L,Tree%L)=FN Get_Object_Status%L(0,Obj%L,Tree%L) DEF FN But_Crossed%L(Obj%L,Tree%L)=FN Get_Object_Status%L(1,Obj%L,Tree%L) DEF FN But_Checked%L(Obj%L,Tree%L)=FN Get_Object_Status%L(2,Obj%L,Tree%L) DEF FN But_Disabled%L(Obj%L,Tree%L)=FN Get_Object_Status%L(3,Obj%L,Tree%L) DEF FN But_Outlined%L(Obj%L,Tree%L)=FN Get_Object_Status%L(4,Obj%L,Tree%L) DEF FN But_Shadowed%L(Obj%L,Tree%L)=FN Get_Object_Status%L(5,Obj%L,Tree%L) ' DEF FN Get_Object_Status%L(Nr%L,Obj%L,Tree%L) LOCAL Obj_Struct%L,Ob_State%L,State%L Obj_Strukt%L=Tree%L+24*Obj%L' Adresse der Struktur Ob_State%L=Obj_Strukt%L+10' Adresse von OB_STATE State%L= WPEEK(Ob_State%L)' Wert von OB_STATE RETURN BIT(Nr%L,State%L) END_FN '  O?pX` ' ' Fsellib (C)1993 Bernd Schieferdecker ' ' DATEIAUSWAHLBOX VERWALTEN ' ' Pf$ Pfad ' Ex$ Extension ' Na$ Dateiname ' Info$ Infozeile ' Ret =1 OK =0 ABBRUCH ' DEF PROC Fsel(R Pf$,R Ex$,R Na$,Info$,R Ret%L) LOCAL Pf2$=Pf$,Ex2$=Ex$,Na2$=Na$,P%L,D%,L%L,X%L=157,Y%L=53,B%L=330,H%L=353: IF Ex$="" THEN Ex$="*.*" IF Pf$="" THEN Pf$=FN Pfad$+Ext$ ELSE Pf$= LEFT$(Pf$,FN Backl%L(Pf$))+Ex$ Form_Dial(0,X%L,Y%L,B%L,H%L): MOUSEON :Fsel_Exinput(Pf$,Na$,Info$,Ret%L): MOUSEOFF :Form_Dial(3,X%L,Y%L,B%L,H%L) IF Ret%L=1 THEN :L%L=FN Backl%L(Pf$):Ex$= RIGHT$(Pf$, LEN(Pf$)-L%L):Pf$= LEFT$(Pf$,L%L) ELSE :Pf$=Pf2$:Ex$=Ex2$:Na$=Na2$ ENDIF : END_PROC ' aktuellen Pfad ermitteln DEF FN Pfad$ Pf$=" "*64:P%L= LPEEK( VARPTR(Pf$))+ LPEEK( SEGPTR +28): GEMDOS (,71, HIGH(P%L), LOW(P%L),0) GEMDOS (D%,25): RETURN CHR$(65+D%)+":"+ LEFT$(Pf$, INSTR(Pf$+ CHR$(0), CHR$(0))-1)+"\" ' letzten \ suchen DEF FN Backl%L(Pf$) LOCAL L%L= LEN(Pf$): WHILE L%L>0 AND MID$(Pf$,L%L,1)<>"\":L%L=L%L-1: WEND : RETURN L%L '  DDguaς2Fej.n^Lw3)Zͤ%f&sj6uĜS :>еI cqՙȘS4WB\I~K9=T]{_ nUS{nc:MrLѓMa1Fmaeݴ$:{nF-$a& -gFמj5{[v>VvK^>峅P5_>MV/Tӽ+.e_a!߅ʻ%oۜKмaO7?枊ma7cEU:Xnh=6.ˈ), fP>H@Nu/<aZX//< aLXr AAf"B->/<a4XJ@g/<a$X` Nu pNu/<a XJ@Nu0-fS-a@R-kaFg/<aXaNuH@"Jf` "+L Pg Vg Cg Mg ` p`p`p/TWaXNu&J QNuK" +_+nAz+H8C,A#A!#A##r&m +$gA0('A zaH .Ю///<JNAPaJAr Av8gP/<NNXP+@?<"NNT @C" C!I +H v+N+xNvx$AC p "QA  Ap"Q- zfAE @p aA!&m+|+|F#p+@Bp a;mPp+@BpMa;mPpA000BXBm2pNaPua9@ap- zf: mJ(,k0BgHz?<=a&Pk<HmHx??<?aSWaO A A!a mQa!MHFHFBF܇P^܆vx&mX(KJg&P(K"K(Ę&.ޅ/(/H L` "NّбXfL٭Xa(CvّQ(&ۛ&HB BgHBX66C SAf&`T6Q Ĝo8p2<v HBSg0e8kBd6d&e` HF&&&&QHFQLNu6&]n`6&&n`&6]n`H>| $r az JjDz-r6BBHB(8HB4HD0 :e^DRAJf L|NuHa2lLNuJ[jDJjFWD d?B@H@HA2HA02 JgDNuH8tvx`ҁRCdSCj LJgDNue萁`H:( d@a `"D6KdKd `QQL8NuJAf$4NuH "mh_ m`da m`e4RBB0"HXB+H`"$4L$@gIdId `Q` RAId2Id"Id `""""Q"_NuCa0 AOg& AAg AKg APg AVg ACg AMfJ2NuA2jrVNuSAkA2g(NuH@a AIg AVg ACg AMf ;@LNu5!9A"9A.9<19<9<9<9<9<9D 9E 9F 9D9K4S-At 2XWf0Q>;@r2@ @9A5fI 00AHAABAQB@SAo+H;A -dg +@a;P+mlhBmBm>-g ??<>NAX.m|AZ ra -2-aJmfAH r#an`A6 ra`p0-aF# m1Pa` l? in USE "TRACE_ON" TO GET ERRORLINE m@T"m"iȐDnp" ҈$AIdWo J\`"J]dQNu// 2)aL$YJ*j$/ 0@G$R&_ `Q$_ _2NuRAId0Id Id ` Q$_ _2Nu^%0x;@HItBCBD:<BFa LNuQ2BmBmNuP2BmNu&m`(K(-had gD`a$m`* f H`4Q&m`IXdr ga`B" ff$gRBR&DSAJ`7$Q+Kh+K/ ?0-S@k@G +Ifa faL8&_Nu 2NuJmf +mlha,J-2f&m`F 2ANuJmfJ-2fJmf Jmfp?aHa1Paa0B3@J-2fGv6-(Kr"g&Sr,gfS 2 KARC;CJfBmNugfS R2 @t,gfS4 KB`S-a@R-ahFfj:LgAFBXp`,?Gp~a.?BCa6>`pCa0QCf Jjp`a-3fQ4`VQ3C0. g(C04 `gC0: ^gC0< g C0F ~f fp`2>Wf) ga fa(` e8 g0@Cg^ Lr4`SBkTRSBk  g ^f dr` g +gl -gV g aeG Xg Sg Mg CfUBkf` e 0eJ :ez Ae> [e ae0 {eC g` gZJj?)LfH g& `g g ~gf mf ^fJk*@3`$ 0` %fPr` Uf Lf) %` Uf Lf Ag g gJmg Ag %gH 0gB Ag< g6 g0 Lg* Ug$ Mg`SBkfr` SBkfr`VJAgJ-4f.J- tg.Cg*?>Cp H@E0DgRDH@Qa 0m340a.J-3gpDa-P4`FRCCd>RD`0H@ f,JCg$Cg4J- tf.SCpDa-p a-pDa- 0` Sf*JCgJ- tfSCpDa->CgSDE0Qav` Rf2 gF- t`¸Cg>Cp H@E0DgRDH@Qa>` MfCgRCpCa-*` KfJCf gvp`tSCpDa-`f`bp-?gpfa,E0>C` pa,a,Qf p a,>CpDa,Q0gpea,Nu>D`a,Q>C`pTJg| /a Nu L4/` SBRSBkRSBjNu  g ^g ae Cg +g -g >f Bak XBx8+ RDDf&_Nu(kCpdQDa mp"-``0&j"CfPf"BQe`H @"B8Ad8D` VfCLNudxLNuxLNuH @B@`k ae {d  `;QLNuAEEEIIIOOUUYAIOUAOH@"@a`QLNuHpAa"_"`QBLNuZ@/?<Ha\ @Jo R+HRX Nu``)*`PƄ 00HCNuHkO&_Nuaa7A6r'A'| aL&_NuxrRa\?</ ?<=aPjt߰fBg/ ?<`:`6`2`.`*`&`"`````` ```````<`H`D`ު`````````````````````````````````````````` `@`<`8`4`L`H`D`z`v`r`n`j`f`b`^`Z`\`t`v`r`n`p```````````````` `````L`N`J`F`V`R`N`J`F`B`>`:`L`H`D`Fp2<NuJAk@x`~gCCi(*H@<HBԆH@GBDHDԄGH@:BBHBЂk EрgUAiEчeNuTAiNup2<Nu+|d;| p AN0QR`a -+@+|;|;|a;m;m+|f;|;|;|-;|Na0-;@p0-4-r`ҀQ+ANu+|eBm`2AHA02AHA0NuJ-gta0A `J-gfa"A` J-gXaAa`NJ-gHA`pA??L`2AHAD02FAAHAE0Q<>NuJ-g0-aEA"C CN E Cd ps`+ Pg Vg Cg: Mg r`r`r`r@?/`2-kSAAtv d tv gtv g t fJVAG Skgx +Of(kr2+RAk f/ /??<@a8 BA7ALNuSPd8BP`4PPP`,@A gRP d4SP g g fBP?BVWS-NMR-fa\LNuJmgGFr-WfS-pa&pRa"+-va;0R-`#$@[\]^`{|}~?BVWNM\Nu#$@[\]^`{|}~ *(Jk#ERHC)ig$%0+ytusDI"/p aZ NuaeEiou^`aAeiou^aeiouaAeioOuUyaAnNoO/pa Jmg?-;ma;_NuHJmfJ-DgQ>`J-&g?S-a֚R-kaֈ0J->frJ-g6 -f(Aj"H4g6fJBJCg$IN`6Q`0S-`*J-f fP`& W`Q?/<`?/<a\LNuABCDEHIJKLMYbcdedfjjklopqvwPNuQNuUnprintable error Syntax errorRETURN without GOSUB Out of DATAIllegal function call OverflowOut of memoryUndefined StatementDivision by zeroType mismatchString too longRESUME without errorMissing OperandBreak Bus error Adress errorUnknown opcodeDivision by zero CHK error TRAPV errorPrivilege violationTrace!Out of memory or odd MALLOCationMatrix not regularFIELD overflowBad file numberFile not foundBad file modeFile already openFile not openTOS error #00File already existsFile type mismatch Bad disk Disk fullInput past endBad record numberBad file namePath not foundToo many files Write error Read errorDisk write protected RSVD. EX.Protocol violation Format errorUninitialized interruptFPU: Unordered conditionFPU: Inexact resultFPU: Division by zeroFPU: UnderflowFPU: Operand errorFPU: OverflowFPU: Sig. NANzfT8$,;3s`hOMIKRON.CompilerNPNNDN(NpFJg"NNG:\FERTIG\P_MAKER\NNNMnENP+mlhNN7JNN MAKEGEM.RSC/?N7\N/. .??<N~TX-_N/. .??<N~TX-_N/. .??<N~TX-_N/. .??<N~TX-_ NNNN/././<NOhP-_N .f N/././<NOhP-_N .f N/./. /<NOhP-_N".W .WAHHJgdN .fNN*.BLKENP+mlhN/.NProgramm-Skelett erstellen/?ClNl/?CNl/?CNl/?NIA1"_! #A1"_! #Ar1"_! #\-_+mlhNClNl6$rNVpWg +mlhN ./ ./N\PJg+mlhNp-@N ./ ./N\PJg&+mlhNp-@NrEBNP+mlhN ./ ./N\PJg+mlhNp-@N ./ .t/N\PJg.+mlhNp-@NNUser_EBNP+mlhN ./ .x/N\PJg+mlhNp-@N ./ .|/N\PJg+mlhNp-@N ./ ./N\PJg+mlhNp-@N ./ ./N\PJg+mlhNp-@N ./ ./N\PJg+mlhNp-@N". .̀". .JgNN*.RSCENP+mlhNCNlENP+mlhN/.Nzugehrige RSC-Datei whlen/?CrNl/?CNl/?CNl/?NIA1"_! #A1"_! #Ax1"_! #\-_+mlhNN BEARBEITE/?/./.NZjONCNl6$ClNlN/?/./.NZjO+mlhN .0? .NN#Die Bearbeitung wurde |abgebrochen./?NI\NNNNNN7.NNNErstelle Programm-Skelett/?N ACCESSORY/?N*O NpN\N COMPILER 6$p"NHN6$N=STACK 4096; BAS_MEM 4096; TROFF; NOEX; MBS; CUTLIB; NO_CRITICN6$p"NHNNpN\+mlhNpN\N LIBRARY Gem ,6$p"NHN6$N G:\GEM.LIBN6$p"NHN6$N: DIM Message(7)NNpN\+mlhNpN\NIF COMPILER THENNpN\NpN\N Accessory=1NpN\NpN\N Appl_InitNpN\NpN\N Menu_Register 6$p"NHN6$N ACC-MeldungN6$p"NHN6$N, Acc_idNNpN\+mlhN". .Ȁ". .JgfNpN\N Rsc_Init(6$p"NHN6$CrNlN6$p"NHN6$N)NNpN\+mlhN .Jg&NpN\N Wind_initNpN\NpN\N REPEATNpN\NpN\NI Evnt_Mesag(X$): FOR I=0 TO 7:Message(I)= CVI( MID$(X$,I*2+1,2)): NEXTNpN\NpN\N> IF Message(0)=Ac_Open AND Message(4)=Acc_Id THEN Acc_EventNpN\NpN\N UNTIL 1=2NpN\NpN\NELSENpN\NpN\N Appl_InitNpN\N". .Ȁ". .JgfNpN\N Rsc_Init(6$p"NHN6$CrNlN6$p"NHN6$N)NNpN\+mlhN .Jg&NpN\N Wind_initNpN\NpN\N Acc_EventNpN\NpN\NENDIFNpN\NpN\NGem_EndNpN\NpN\N'NpN\NpN\NDEF PROC Acc_EventNpN\NpN\N'NpN\NpN\N' PROGRAMMTEXTNpN\NpN\N'NpN\NpN\NEND_PROCNpN\NpN\N'NpN\NN,NNuNNNErstelle Programm-Skelett/?NPROGRAMM/?N*O NpN\NCLEAR:COMPILER6$p"NHN6$NTRON; MBS; CUTLIBN6$p"NHNNpN\+mlhNpN\NON ERROR GOTO FEHLERNpN\NpN\N LIBRARY Gem ,6$p"NHN6$N G:\GEM.LIBN6$p"NHN6$N: DIM Message(7)NNpN\+mlhNpN\N Appl_InitNpN\N". .Ȁ". .JgdNpN\N Rsc_Init(6$p"NHN6$CrNlN6$p"NHN6$N)NNpN\+mlhN". .ЀJgN .Jg$NpN\N Wind_InitNpN\N .Jg,NpN\NMenu_bar(menuadr)NpN\NpN\N Graf_mouse(0)NpN\NpN\NGet_Mesag(VAL(6$p"NHN6$N%110010N6$p"NHN6$N),1,1)NNpN\+mlhN .JgNpN\N'NpN\NpN\NDEF PROC Menu_EventNpN\NpN\N SELECT Message(4)NpN\NpN\N CASE InfoNpN\NpN\N CASE Ende:Gem_EndNpN\NpN\N END_SELECTNpN\NpN\NEND_PROCNpN\NN .JgxNpN\N'NpN\NpN\NDEF PROC Wind_EventNpN\NpN\N SELECT Message(0)NpN\NpN\N CASE Wm_Closed:Gem_EndNpN\NpN\N CASE Wm_FulledNpN\NpN\N CASE Wm_ToppedNpN\NpN\N CASE Wm_RedrawNpN\NpN\N END_SELECTNpN\NpN\NEND_PROCNpN\NNpN\N'NpN\NpN\NDEF PROC Keyb_EventNpN\NpN\N$' Tc=Scan Tc_Ascii=Ascii Ts=StatusNpN\NpN\N SELECT TcNpN\NpN\N! CASE 23: IF Ts=4 THEN i=1' ^iNpN\NpN\N% CASE 16: IF Ts=4 THEN Gem_End' ^qNpN\NpN\N END_SELECTNpN\NpN\NEND_PROCNpN\NpN\N'NpN\NpN\NDEF PROC Mouse_EventNpN\NpN\NEND_PROCNpN\NpN\N'NpN\NpN\NDEF PROC Inbox_EventNpN\NpN\NEND_PROCNpN\NpN\N'NpN\NpN\NDEF PROC Outbox_EventNpN\NpN\NEND_PROCNpN\NpN\N'NpN\NpN\NDEF PROC Timer_EventNpN\NpN\NEND_PROCNpN\NpN\N'NpN\`NpN\N'NpN\NpN\N' PROGRAMMTEXT...NpN\NpN\N'NpN\N". .Jg0NpN\NForm_All(0,D1Adr,Ret)NpN\NpN\NGem_EndNpN\NNpN\N'NpN\NN,NNuNNNErstelle Programm-Skelett/?NACCESSORY und PROGRAMM/?N*O NpN\NCLEAR:COMPILER6$p"NHN6$N2STACK 4096; BAS_MEM 4096; TROFF; NOEX; MBS; CUTLIBN6$p"NHNNpN\+mlhNpN\NON ERROR GOTO FehlerNpN\NpN\N(Program= LPEEK( LPEEK( SEGPTR +64)+36)=0NpN\NpN\NIF Program=0 AND COMPILER THENNpN\NpN\N Acc_Init(6$p"NHN6$N ACC-MeldungN6$p"NHN6$N)NNpN\+mlhN .JgfNpN\N Rsc_Init(6$p"NHN6$CrNlN6$p"NHN6$N)NNpN\+mlhN .Jg&NpN\N Wind_initNpN\N .JgVNpN\N; Rsrc_Gaddr(0,Dia1,D1adr) ' fr alle Dialoge erforderlich!NpN\NpN\N Get_AccNpN\NpN\NELSENpN\NpN\N Gem_InitNpN\N .JgfNpN\N Rsc_Init(6$p"NHN6$CrNlN6$p"NHN6$N)NNpN\+mlhN .Jg&NpN\N Wind_initNpN\N .JgVNpN\N; Rsrc_Gaddr(0,Dia1,D1adr) ' fr alle Dialoge erforderlich!NpN\NpN\N Acc_EventNpN\NpN\NENDIFNpN\NpN\NGem_EndNpN\NpN\N'NpN\NpN\NDEF PROC Acc_EventNpN\NpN\N ' hier steht Ihr ProgrammNpN\NpN\NEND_PROCNpN\NpN\N'NpN\NNuNN .JgNN(Binde Resource-Definitionen ein (HEADER)/?r/?N*O N .JgFNrIpHCNl6$H0CrNl6$N.xNT"L pErNN6$NBLKN6$LxRN+mlhNpN\NDEF PROC Rsc' vom 6$NNNpN\+mlhNpNFJgXNNpN`pNE$NPN+mlhNC$Nl6$N!xNT-@+mlhNJfNp0.(R-@+mlhNpN\N 6$".SpE$NNNpN\+mlhNC$Nl6$N form/dialogxNT-@+mlhNC$Nl6$NmenuxNT-@+mlhN". .Jg:N .JgVNND6$ .HN xSDHkЄDdBAN6$NadrNEpNpNpNpNpNN>NNA>xNNp-@\p/ .\`8NN-@HN .\ЀЮPм @ .H0N .\R-@\oXNA@,NNp-@\p/ .\`8NN-@HN .\ЀЮLм @ .H0N .\R-@\oXNAANNp-@\p/ .\`8NN-@HN .\ЀЮм @ .H0N .\R-@\oXNAC|NNp-@\p/ .\`8NN-@HN .\ЀЮXм @ .H0N .\R-@\oXNAE8NNp-@\p/ .\`8NN-@HN .\ЀЮTм @ .H0N .\R-@\oXNAFNNp-@\p/ .\`8NN-@HN .\ЀЮ@м @ .H0N .\R-@\oXNN`>pNN>N`>pNN>N`> <NN>N`> < 0NN>N`? <NN?N`? <NN?$N`?< < NN?@N`?X < NN?\N`?t < NN?xN`? < NN?N`? <NN?N`? <NN?N`? < 0NN?N`@ <NN@N`@pNN@N`@4pNN@8NN`@LpNN@PN`@dpNN@hN`@ <NN@N`@ < 0NN@N`@ <NN@N`@ <NN@N`@ <'NN@N`A <'NNAN`A( <'NNA,N`AD <'NNAHN`A` <NNAdN`A| <NNAN`A < 0NNAN`A <NNAN`ApNNAN`ApNNANN`BpNNBN`BpNNBN`B0pNNB4N`BHpNNBLN`B`pNNBdN`B| <NNBN`B <NNBN`B <NNBN`B <NNBN`B <NNBN`C <NNC N`C pNNC$N`C8pNNCNNuN-_8-_0-_,-_(-_$-_D-_@NuCA@/!AD/!A$/!A(/!A,/!A0/!A8/!HzN`-_-_H-_\Nu/.\/.H .8A/!HzNNN .\ @pBg/N .f?|N .^ @pN .м @".Ҽ "Arp N .м @".Ҽ "Arp@N .м @0HrVHgN .м @ .L `N .м @ .P N .м @".Ҽ "Arp N .f?|N .^ @pN .м @".Ҽ "Arp N .м @".Ҽ "Arp@N .м @0HrVHgN .м @ .T `N .м @ .X N .м @".Ҽ "Arp NN\N .м @prVHHJgN/.8 .0? .,? .(? .$? .D? .@?NgON .8-@NNN .\ @pBg/N .f:?|N .м @ LfNt .м $@N .f:?|N .м @ TfNt .м $@NN\N .м @prVHHJg0NNuNA$1$_! %-_8-_DNuCAD/!A8/!E Z/!?]2 NPHz+mlhN`-_\-_X-_T-_P-_LNu/.L/.P/.T/.X/.\HzN .D"ЀЁЮ8-@LN .Lм -@PN .P @ -@TN .T @ -@XNCNl6$pNHNENP+mlhNp-@\p0."/ .\`4N .\ЮXS @E .\N+mlhN .\R-@\oXNNuN-_8-_D-_`NuCA`/!AD/!A8/!HzN/.8/.D/.`/<N\ONNuN-_8-_D-_`-_tNuCAt/!A`/!AD/!A8/!HzN`-_-_|-_xNu/.x/.|/.HzN .D"ЀЁЮ8-@LN .Lм -@|N .| @0H-@N$.tE .`"Jf`%N .| @ .0NNuN`@-_8-_DNuCAD/!A8/!Hz .8/ .D/p/N]2O Nu+mlhN`>-_8-_D-_t+_lNuC/-l+mhlAt/!AD/!A8/!HzN`-_-_|-_xNu/.x/.|/.HzN .D"ЀЁЮ8-@LN .Lм -@|N .| @0H-@N .".tVHHNuNNNNrNNN GEMLIB 3.03NNNRelease 03.07.90NNNuNNNN`-_\-_0-_<-_(-_$Nu/.$/.(/.? x@ A B!C!(D!2E!6F!DG!H"I""J"0K"L"M"N#O#bP#Q$xR%S%0T%dU%hV%lW%X%Y& Z&x[&|\&]&^'_'`'a'b'c(d(e(f(g(h(i)*j)k)l)m)n*,o*p*q*r,s2vt6Du6Dv7*w7Fx7y8zH{Ih|M`}M|~MNtNONONPVxZP[[\]]\]]]]]hBITBLK_D;NORM_CIR>xSEL_CIRC@,SWAP_CIRANORM_BOXC|SEL_BOX_E8SWAP_BOXFf  V9!%b*!* -#!$+A!,.0#911111:          H) (! ln&h-I:Dt5 !SlK  C/!&/0B x^CS)Y4@.)@`@ fXA@0@ G3g!!L@b
jbi``#ڠG>3n~g6!>[s_;{ZtLiSǣQœщCŃiKAc3WcX G$!c *J" G<ZD@ZZ@ZZ\U:Z A(Ama5i[&섬ʊ=pxnc{7}Ż;pvb~(jk`Rhl`&&|pIicPK$tuU8BEFEHL/BEFEHLE/BA_LHAK.IMGc`dbF&Y[. , L l' cCB3cY'!HĂA"`gP`pDVx&x̏jK7|<%r~pu4TTre(~b$-%#GT~r8 ?ah8$(?QcTaNIH\fySQa T \gDE%7NI* 4A:T:]T:9ŀ:Ut6uv<\\{:C L@ L@@$@@=%GEM-Programmskelett erstellenStart!AbbruchHilfePROGRAMMTYPACCACC und PRGPRGLIBRARIES EINBINDEN[][][]MenuDialogFenster[]User-Objekte[]FileselectRESOURCE-DEFINITIONEN[]DEF-File einbinden()()GFA von ORCS()C-Header von RCSOmikron-BlockAktion--------------------------------------------------------------------------------------------------------------MAKEGEM 1.00 vom 6.04.1993Bernd SchieferdeckerEnzianstrae 476800 Mannheim 31OKPROGRAMMTYPWas mit Accessory und Programm gemeint ist, drfte jedemeinleuchten. Acc + Prg bedeutet, da das Programm durchUmbenennen als Accessory oder Programm verwendet werdenkann (noch nicht mglich).LIBRARIESDas Programm wird mit Prozeduren zur Menu-, (User)Dialog-,Fenster- und/oder Dateiauswahlverwaltung ausgestattet.RESOURCE-DEFINITIONENMenus und Dialogboxen erstellt man mit einem RCS-Programm.Dieses legt eine Definitionsdatei an, die in das eigeneProgramm eingebunden werden mu. MAKEGEM verarbeitet dieAusgabedateien des RCS fr C und die von ORCS fr GFA.Ebenso kann eine Header-Datei im ASCII_Format (Omi-Block)eingebunden werden.OKNach dem Start gibt man den Namen des Programms ein. Unterdiesem wird es in OM-BASIC mit LOAD BLOCK geladen.$BCAYef {    !AHIAJ88&' (ab9c88 ;<;=tu7v;8>?9@wx7y:  ; >?3-@)D" K S  )\g k w   x     <Xt " 3 F  9  7! 8T' >p 87< ; 4 6 P  l ;  7 889'5 : 02 L L yG˯WD&!V yPHTa%X+8C!F%ZM` * :Kw F_`mCT#g ܂V9jA WMl&MQ=4*+;Ӂ`3=Wߩ23-uf737n=o -Y)o6ǻ)W)ڢ#?< ' ' Mesaglib (C)1993 Bernd Schieferdecker ' ' MENU- UND FENSTEREREIGNISSE ABFRAGEN ' ' weitere Bearbeitung: PROC Menu_Event, PROC Wind_Event ' DEF PROC Get_Mesag REPEAT :Evnt_Mesag(X$): FOR I%L=0 TO 7:Message%L(I%L)= CVI( MID$(X$,I%L*2+1,2)): NEXT IF Message%L(0)=Mn_Selected%L THEN Menu_Event:Menu_Tnormal(Message%L(3),1) IF Message%L(0)>10 AND Message%L(0)<40 THEN Wind_Event:Menu_Tnormal(Message%L(3),1) UNTIL 1=2: END_PROC ' ' ALLE EREIGNISSE ABFRAGEN ' DEF PROC Get_Mesag(Mask$,Mc_Anz%L,Mc_Art%L) ' Mask$ fr Tastatur,Mausknopf,Nachricht = "%110010" Wind_Update(0) REPEAT Evnt_Multi( VAL(Mask$),Mc_Anz%L,Mc_Art%L,1,0,0,0,0,0,0,0,0,0,0,0,M$,M%L,Mx%L,My%L,Ms%L,Ts%L,Tc%L,Mc%L) Tc_Ascii%L=Tc%L MOD 256:Tc%L= INT(Tc%L/256) ' ' Mausposition: Mx,My ' Maus-Status: Ms Tastencode: Tc, Tc_Ascii ' Tastatur-Status: Ts Anzahl Mausklicks: Mc ' IF BIT(0,M%L) THEN Keyb_Event IF BIT(1,M%L) THEN Mouse_Event IF BIT(2,M%L) THEN Inbox_Event IF BIT(3,M%L) THEN Outbox_Event IF BIT(4,M%L) THEN FOR I%L=0 TO 7:Message%L(I%L)= CVI( MID$(M$,I%L*2+1,2)): NEXT IF Message%L(0)=Mn_Selected%L THEN Menu_Event:Menu_Tnormal(Message%L(3),1) IF Message%L(0)>10 AND Message%L(0)<40 THEN Wind_Event:Menu_Tnormal(Message%L(3),1) ENDIF IF BIT(5,M%L) THEN Timer_Event UNTIL 1=2: END_PROC ' ' TASTATUREREIGNISSE AUSWERTEN ' DEF PROC Keyb_Event 'Tc=Scan Tc_Ascii=Ascii Ts=Status Wind_Update(1) IF BIT(2,Ts%L) OR BIT(3,Ts%L) OR (Tc%L>58 AND Tc%L<65) OR Tc%L=98 THEN Hotkeys' mit Control oder Alternate oder F-Tasten ELSE IF Eingabe%L=1 THEN ' Text editieren T%L=0:Textedit(E$,T%L)' Eingabe bis Sondertaste, E$= Variable fr Text Set_Inp(0)' Texteingabe ausschalten ' ' Eingabe-Ereignisse T=1 - T=9 ' Set_Inp(1)' Texteingabe einschalten ELSE ' Keine Editiermglichkeit ' ' Tasten anders auswerten ' ENDIF ENDIF Wind_Update(0) END_PROC ' DEF PROC Hotkeys LOCAL Alt%L= BIT(3,Ts%L),Ctrl%L= BIT(2,Ts%L) SELECT Tc%L CASE 23: IF Ctrl%L THEN ' Info CASE 16: IF Ctrl%L THEN ' Ende END_SELECT END_PROC ' ' EINGABE-ROUTINE ' ' Taste= 1 RETURN Inp$: Rckgabe des Textes ' 2 CSR runter ' 3 CSR hoch wortweise springen mit Shift + CSR ' 4 CSR ber linken Rand ESC lscht die Eingabe ' 5 CSR ber rechten Rand CLEAR zum Zeilenende ' 6 Shift + CSR runter Shift + CLEAR zum Zeilenanfang ' 7 Shift + CSR hoch TAB mit Leerzeichen auffllen ' DEF PROC Textedit(R Inp$,R Taste%L) IF BIT(0,Ts%L) OR BIT(1,Ts%L) THEN LOCAL Shift%L=-1 ELSE LOCAL Shift%L=0 SELECT Tc%L: MOUSEOFF CASE 14 IF Inpcur%L<>0 THEN :Inp$= LEFT$(Inp$,Inpcur%L-1)+ MID$(Inp$,Inpcur%L+1):Inplen%L= LEN(Inp$) TEXT Inpx%L,Inpy%L+13,Inp$+"_"*(Inplang%L-Inplen%L):Setcur(Inpcur%L-1): ENDIF CASE 83 IF Shift%L THEN :Inp$= LEFT$(Inp$,Inpcur%L) ELSE :Inp$= LEFT$(Inp$,Inpcur%L)+ MID$(Inp$,Inpcur%L+2) ENDIF :Inplen%L= LEN(Inp$): TEXT Inpx%L,Inpy%L+13,Inp$+"_"*(Inplang%L-Inplen%L):Setcur(Inpcur%L) CASE 82 Inp$= LEFT$(Inp$,Inpcur%L)+" "+ MID$(Inp$,Inpcur%L+1,Inplang%L-Inpcur%L-1):Inplen%L= MIN(Inplen%L+1,Inplang%L) TEXT Inpx%L,Inpy%L+13,Inp$+"_"*(Inplang%L-Inplen%L):Setcur(Inpcur%L) CASE 1 Inp$="":Inplen%L=0: TEXT Inpx%L,Inpy%L+13,"_"*Inplang%L:Setcur(0) CASE 15 Inp$=Inp$+ SPC(Inplang%L-Inplen%L): TEXT Inpx%L,Inpy%L+13,Inp$:Inplen%L=Inplang%L:Setcur(Inplen%L) CASE 71 IF Shift%L THEN Setcur(0) ELSE Setcur(Inplen%L) CASE 75 IF Inpcur%L>0 THEN IF Shift%L THEN :P%L= INSTR(Inplen%L-Inpcur%L+2, MIRROR$(Inp$)," "): IF P%L=0 THEN Setcur(0) ELSE Setcur(Inplen%L-P%L+1) ELSE :Setcur(Inpcur%L-1) ENDIF ELSE :Taste%L=4 ENDIF CASE 77 IF Inpcur%L21 AND Inpcur%LInplen%L OR Inpcur%L<0 THEN Inpcur%L=Inplen%L IF An%L THEN : TEXT Inpx%L,Inpy%L+13,Inp$+"_"*(Inplang%L-Inplen%L):Curon ELSE :Curoff: TEXT Inpx%L,Inpy%L+13,Inp$+ SPC(Inplang%L-Inplen%L) ENDIF : MOUSEON END_PROC ' ' Cursor setzen neu: neue Cursorposition DEF PROC Setcur(Neu%L) Curoff:Inpcur%L= MAX( MIN(Neu%L,Inplen%L),0):Curon: END_PROC ' ' Cursor kurz aufblinken lassen DEF PROC Curinv Invert(Inpx%L+Inpcur%L*8,Inpy%L,8,16): WAIT .05:Invert(Inpx%L+Inpcur%L*8,Inpy%L,8,16): END_PROC ' ' Cursor an/aus schalten DEF PROC Curon MOUSEOFF : BITBLT Inpx%L+Inpcur%L*Zb%L-1,Inpy%L,1,Zh%L TO Inpx%L+Inpcur%L*Zb%L-1,Inpy%L,1,Zh%L,15: MOUSEON : END_PROC DEF PROC Curoff MOUSEOFF : BITBLT Inpx%L+Inpcur%L*Zb%L-1,Inpy%L,1,Zh%L TO Inpx%L+Inpcur%L*Zb%L-1,Inpy%L,1,Zh%L,0: MOUSEON : END_PROC '  ~ 4t~𰼊  ' 'Userlib ' 'Hier knnen Prozeduren zur Verwaltung benutzerdefinierter 'Objekte, eine eigene Form_Do Routine und hnliches stehen. ' 'Hingewiesen sei insbesondere auf die Prozeduren ' ' USER_RSC_LOAD ' USER_OBJ_DRAW ' USER_FORM_DO ' 'von Markus Stockhausen, OK! 20, S. 27. '(OK! ist die Zeitschrift des Omikron.User-Klubs) '  ; Ā.l ̅ x@ @F&V`Pas+0\x, @$XAưC(`!AX056 ,?7g~>|sEmlSjQRS3' GD )9UU6p9LldXɑR!R6!"J) \. *=@*;f`hi0pRslܳxy>|wɽy|@MEL00cԌ2 lV(ی؀X1PK& OBEFEHL/BEFEHLE/BA_AACUT.IMGc`dbF&3|.  @ (oĐ( !cd``p 53Xhp00@T50 AND Ah%L>0 Neu_Zeichnen(Bx%L,By%L,Bb%L,Bh%L) Wind_Get(Fenster%L,12,Ax%L,Ay%L,Ab%L,Ah%L) Punkte(Bx%L,By%L,Bb%L,Bh%L) WEND Wind_Update(0) END_PROC DEF PROC Neu_Zeichnen(X1%L,Y1%L,B1%L,H1%L) MOUSEOFF Wind_Get(Fenster%L,4,Wx%L,Wy%L,Wb%L,Wh%L) XBIOS (,5, HIGH(Neu_Scrn%L), LOW(Neu_Scrn%L),-1,-1,-1): CLS ' ' Bildschirmausgabe ' BITBLT X1%L,Y1%L,B1%L,H1%L TO Puffer%L XBIOS (,5, HIGH(Norm_Scrn%L), LOW(Norm_Scrn%L),-1,-1,-1) BITBLT Puffer%L TO X1%L,Y1%L,B1%L,H1%L MOUSEON END_PROC DEF PROC Punkte(R X1%L,R Y1%L,R B1%L,R H1%L) X1%L= MAX(Ax%L,Message%L(4)) Y1%L= MAX(Ay%L,Message%L(5)) B1%L= MIN(Ax%L+Ab%L,Message%L(4)+Message%L(6))-X1%L H1%L= MIN(Ay%L+Ah%L,Message%L(5)+Message%L(7))-Y1%L END_PROC '  N=ޣ0Dcz܆=yeC/ĺ0F*9T9 MAKEGEM.PRG (C)1993 BERND SCHIEFERDECKER ERSTELLT MIT OMIKRON.BASIC 3.60 Das Programm erstellt ein Programmskelett fr Omikron.Basic-Programmierer. Im selben Verzeichnis wie MAKEGEM mssen sich die ASCII-Dateien DIALLIB.BLK Dialogboxverwaltung FSELLIB.BLK Dateiauswahlverwaltung MESAGLIB.BLK Ereignisse auswerten USERLIB.BLK WINDLIB.BLK Fensterverwaltung befinden. Sie knnen in das Programmskelett eingebunden werden. Wenn erforderlich, fragt das Programm nach dem Pfad der zu dem neuen Programm gehrenden RSC-Datei. Im selben Pfad mu sich die Definitions- Datei befinden, wenn eine solche eingebunden werden soll. Das neue Programm ist im ASCII-Format gespeichert und kann in Omikron- Basic mit BLOCK LADEN geladen werden. MAKEGEM.PRG ist Public Domain. Es darf nicht verndert werden. Wenn jemand die Libraries verbessert, dann bitte ich um die Zusendung der neuen Dateien. Bernd Schieferdecker Enzianstrae 47 6800 Mannheim 31 (ab 1.7. 68309 Mannheim) 0621-722089 tw˰}8]t|]/;puxvf24yĘuJ)5mHc6B&'@/~uuN#?mxЦ׈a'KCf Tٳlqy41FqOouJlKjݩNw- ************************************************* . }.. ANLEITUNTXT @FUTURE TXT  ,HISTORY TXT GMANUAL TXT ɠSMULTDIALCPX &(]MULTDIALPRG ﹕@LMULTDIALUPL ѽTOLDMTOS TXT fvUTPROG_GERTXT ذWLqREADME 1ST tT MultiDialog fr Atari TOS-Rechner GEM-Dialoge und Multitasking Anleitung fr die Versionen ab 1.03 von Helmut Neukirchen Stand: 22. Dezember 1993 (c) 1992-93, alle Rechte vorbehalten Inhaltsverzeichnis: I. Schnellstart fr Neugierige II. Einleitung III. MultiDialog in der Praxis IV. Installation V. Konfiguration VI. Tastaturbedienung + VII. Einschrnkungungen und zuknftige Versionen VIII. GEM-Programmierer und MultiDialog IX. Fragen und Antworten X. Vertrieb, Rechtslage Zu dieser Anleitung: Eine Zusammenfassung erhalten Sie, indem Sie nur die Textstellen lesen, die eingerckt und rechtsbndig geschrieben sind. Inhaltliche Neuerungen in der Anleitung gegenber lteren Anleitungen sind + (wie hier) mit '+' am rechten Rand gekennzeichnet. + + : Neu seit 20.12.93 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I. Schnellstart fr Neugierige - MULTDIAL.PRG starten - Die Dialogboxen aller Programme sollten nun in Fenstern erscheinen. (Falls nicht, findet man die Grnde in Kapitel VII.) Dauerhafte Installation: + - MULTDIAL.PRG in den AUTO-Ordner kopieren + - wenn Tastaturbedienung gewnscht ist: + LETEMFLY.PRG (nicht im Programmpaket enthalten) + ebenfalls in den AUTO-Ordner kopieren + - MULTDIAL.CPX in den CPX-Ordner kopieren + >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> II. Einleitung Wir befinden uns im Jahre 1993 n. Chr. Das ganze Multitasking auf dem ST ist von Dialogboxen lahmgelegt... Das ganze Multitasking ? Nein! Ein von einem unbeugsamen Programmierer entwickeltes Programm hrt nicht auf, den Dialogboxen Widerstand zu leisten. Was wollen uns diese Worte sagen ? Sobald eine Dialogbox auf dem Bildschirm dargestellt wird, steht fr alle anderen Applikationen, die ebenfalls auf den Bildschirm ausgeben wollen, das Multitasking komplett!!! Aus dem - ach so schnen - Multitasking-Betriebssystem wird zu diesem Zeit- punkt wieder fast ein Singletasking-Betriebssystem, das wertvolle Zeit damit verbringt, tatenlos in einer Schleife zu warten, bis der Benutzer nun endlich den Dialog beendet! Doch das mu nicht sein: Was Atari bei der Implementierung des Multitasking-AES vergessen hat, wird nun durch MultiDialog nachgeholt: Dialogboxen vorhandener GEM-Applikationen erscheinen in GEM-Fenstern; MultiDialog ermglicht so uneingeschrnktes Multitasking unter GEM. (naja, ATARI wird es wohl nicht vergessen haben, sondern die Implementierung verworfen haben, da es Inkompatibilitten gibt (s. Kapitel VII.), die sich ATARI nicht leisten kann.) Mittlerweile drfte klargeworden sein, da MultiDialog hauptschlich fr ein Multitasking-TOS gedacht ist: Entsprechend wurde es auch unter MultiTOS getestet (auf ST, TT und FALCON). Unter MultiGEM und Mag!X 1.xx luft es wohl ebenfalls, mit Mag!X 2.xx + jedoch z.Z. definitiv nicht! + Hat jemand Erfahrung mit Geneva ? (Nein, nicht mit Genever! ;-) + Im brigen luft MultiDialog auch auf den altbekannten TOS-Versionen, allerdings drfte es dort nur im Zusammenspiel mit Accessories sinnvoll zum Einsatz kommen. Auerdem ist es dort nicht sehr gut getestet! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> III. MultiDialog in der Praxis Was macht MultiDialog ? MultiDialog verankert sich im Betriebssystem und sorgt bei beliebigen GEM- Applikationen dafr, da deren Dialoge komplett in Fenstern abgewickelt werden. Unter einem Multitasking GEM knnen daher andere Applikationen ungehindert weiterlaufen. Solche Dialoge kennen einige vielleicht bereits von anderen, neueren Applikatonen, wo Dialogboxen in Fenstern bereits "serienmig" vorzufinden sind. MultiDialog macht dasselbe, halt nur mit beliebigen GEM-Applikationen. Der Begriff "beliebige GEM-Applikationen" mu an dieser Stelle allerdings sofort wieder relativiert werden, da es tatschlich viele Programme gibt, bei denen MultiDialog keine Wirkung zeigt. Ist das bei einem Programm der Fall, so wird der entsprechende Dialog wie bisher gewohnt durchgefhrt, mit der Konsequenz, da das Multitasking lahmgelegt ist. (Nheres dazu in Kapitel VII. "Einschrnkungen und zuknftige Versionen") Was ndert sich in der Praxis ? Die Bedienung der Dialoge erfolgt wie gewohnt und doch gibt es einige Neuerungen: Die Dialogboxen mssen nicht mehr unbedingt in der Mitte erscheinen: Bisher erschienen die Dialogboxen genau in der Bildschirmmitte. Insbesondere auf Grobildschirmen ist das jedoch sehr lstig, da dann die Wege, die man mit dem Mauszeiger zurcklegen mu, sehr gro werden. MultiDialog bietet die Mglichkeit, die Dialogbox an anderen Positionen erscheinen zu lassen. Die Dialogboxen erscheinen in Fenstern: Je nach Einstellung (s. Kapitel V. "Konfiguration") heit das fr die Optik, da die Dialogboxen am oberen Rand den bekannten Bewegungs- und Namensbalken eines Fensters besitzen oder auch nur zustzlich den Fensterrand samt Schatten "verpat" bekommen. Das heit aber auch, da die Gesamtausmae einer Dialogbox grer werden knnen, so da sie evtl. nicht mehr komplett auf den Bildschirm pat. Im Extremfall ist dann die unterste Zeile im Dialog nicht mehr sichtbar. Dialog-Fenster, die von MultiDialog fr Dialoge geffnet wurden, besitzen also bei entsprechender Einstellung den Titel " MultiDialog: ", wobei der Name des Programms ist, von dem der Dialog stammt. (Wenn Sie kein MultiTOS benutzen, erscheint bei Accessories der Name "Accessory".) Da das Fenster bei entsprechender Einstellung einen Bewegungsbalken besitzt, kann damit die gesamte Dialogbox veschoben werden. Die Dialoge knnen auerdem verschoben werden, indem man auf den Hintergrund einer Dialogbox klickt, um diese dann mit gedrckter Maustaste zu verschieben. (Das funktioniert allerdings nur, wenn das betreffende Programm form_dial-Aufrufe benutzt.) MultiDialog macht somit FlyDials berflssig! Aber das Schnste ist: Whrend der Dialogbehandlung luft das Multitasking weiter: Das heit, die Menleiste ist weiterhin zugnglich. Man kann dann z.B. ein Accessory oder eine andere Applikation anwhlen und damit arbeiten. Ebenso ist es mglich, die Fenster oder das Desktop der anderen Applikationen zu manipulieren. Jegliche Aktionen mit der Menleiste oder den Fenstern der Applikation, die gerade den Dialog durchfhrt, sind jedoch nicht mglich. Man kann zwar deren Meneintrage auswhlen oder versuchen, deren Fenster zu verndern, allerdings erfolgt darauf keine Reaktion. Das ist erst wieder mglich, wenn der entsprechende Dialog abgeschlossen wird. Alle anderen Fenster der dazugehrigen Applikation knnen nicht aktiviert werden, solange dieser Dialog stattfindet. Kurz: Mit einer Applikation kann erst wieder gearbeitet werden, wenn deren Dialog beendet ist. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IV. Installation Die Installation von MultiDialog gestaltet sich sehr einfach: Kopieren Sie die Datei MULTDIAL.PRG in den AUTO-Ordner Ihres Bootlaufwerks. Beim nchsten Systemstart wird es dann automatisch eingebunden. Nach der Installation knnen Sie MultiDialog konfigurieren. Seit der Version 1.03 wird hierzu ein CPX-Modul fr das erweiterte + Kontrollfeld XCONTROL verwendet. Sie bentigen also das Programm bzw. + Accessory XCONTROL.PRG/XCONTROL.ACC, um das CPX-Modul MULTDIAL.CPX + aufzurufen. + Kopieren Sie die Datei MULTDIAL.CPX in Ihren + CPX-Verzeichnispfad. + Hinweis fr MiNT/MultiTOS-Benutzer: Ob Sie MULTDIAL.PRG vor oder nach MINT.PRG in den AUTO-Ordner kopieren, sollte eigentlich egal sein (die Programmflags fr die Memory-Protection mssen jedoch auf GLOBAL eingestellt sein). Ich empfehle jedoch, es nach MINT.PRG zu starten. Seit der Version 1.03 ist eine Tastaturbedienung der Dialoge, die + MultiDialog abgefangen hat, mglich. Hierzu mu auerdem das Programm + Let'em Fly von Oliver Scheel installiert sein. + Die Datei LETEMFLY.PRG sollte sich dazu + vor MULTDIAL.PRG im AUTO-Ordner befinden. + Schalten Sie bitte mit den zu Let'em Fly gehrenden Konfigurations- + programmen Let'em Fly aus und speichern Sie diese Einstellung. + (MultiDialog schaltet Let'em Fly zwar von selbst ab, aber sicher ist + sicher...) + Getestet wurde bisher Let'em Fly 1.20; es wird empfohlen, immer die + jeweils neueste Version zu verwenden. + Weitergehende Informationen zur Tastaturbedienung und Let'em Fly finden + Sie im Kapitel VI. "Tastaturbedienung". + >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> V. Konfiguration Seit der Version 1.03 ist MultiDialog nur ber + das erweiterte Kontrollfeld zu konfigurieren. + Wenn Sie - wie in Kapitel IV. "Installation" beschrieben - das CPX-Modul + MULTDIAL.CPX installiert haben, finden Sie im erweiterten Kontrollfeld + den Eintrag "MultiDialog", den Sie mit einem Doppelklick ffnen knnen. + Wenn MultiDialog installiert ist, erscheint nun der Konfigurationsdialog. + (Andernfalls mu zunchst MULTDIAL.PRG gestartet werden, um MultiDialog + zu installieren. Diesen Fall teilt das Modul dem Benutzer aber mit.) + Wie bei CPX-Modulen blich, erfolgen alle Auswahlen ber sogenannte + Popup-Mens. Sie werden bedient, indem man mit der Maus auf sie klickt + und dann den gewnschten Eintrag aus der daraufhin erscheinenden Liste + auswhlt. + In der obersten Zeile wird die Versionsnummer des installierten + MultiDialog angezeigt. (MultiDialog 1.02 wird aufgrund eines Fehlers + brigens noch als 1.01 gemeldet.) + "An/Aus": (MultiDialog ein- und ausschalten) Rechts daneben befindet sich ein Popup, mit dem MultiDialog abgeschaltet werden kann. MultiDialog ist dann zwar immer noch im Betriebssystem eingeklinkt, aber alle weiteren Aufrufe, die MultiDialog sonst abfangen wrde, werden ignoriert und einfach ans Betriebssystem durchgereicht. Whrend dieser Schalter von globaler Wirkung ist, knnen sich alle weiteren Schalter auf einzelne Applikationen beziehen (s.u.): (Die Bedeutung der einzelnen Einstellungen wird sich dem Nicht-Programmierer nicht so schnell erschlieen, da sie sehr technischer Art sind. Die meisten Einstellungen mssen aber sowieso nie verndert werden, da sie standard- mig auf der sinnvollsten Stellung stehen.) Da nicht alle Einstellungen gleichzeitig angezeigt werden knnen, kann mit + dem Rollbalken auf der rechten Seite der aktuelle Auschnitt verndert + werden. Im einzelnen sind das folgende Einstellungen: "FormCenter immer/Mitte/Maus/Ecke": (Position der Dialogboxen) Diese Schalter beziehen sich auf den Ort, an dem eine Dialogbox erscheint. (der Name stammt von der GEM-Funktion form_center, mit der Applikationen ihre Dialogboxen positionieren knnen.) Normalerweise erscheinen Dialogboxen immer in der Mitte des Bildschirms; auf Ganzseitenbildschirmen kann das aber auf Dauer ziemlich strend sein, da man die Maus erst mehrere Kilometer ;-) bewegen mu, um den Dialog bedienen zu knnen. MultiDialog kann dies lindern, indem es mehrere Alternativen anbietet, die Dialogbox zu positionieren. In der Stellung "Ecke" wird die Dialogbox in der linken oberen Ecke (also in der Nhe der Menleiste) erscheinen, in der Stellung "Maus" sucht die Dialogbox die Nhe des Mauszeigers. Ist "Mitte" eingestellt, so erscheint die Dialogbox - wie gewohnt - in der Mitte, allerdings merkt sich MultiDialog die Position der Dialogboxen, so da sie an der Stelle erscheinen, an der Sie sie zuletzt positioniert haben. Im Gegensatz zu den bisher aufgefhrten Mglichkeiten, verhlt sich "immer" nicht so. Hier erscheint die Dialogbox immer in der Mitte des Bildschirms, egal wo sie sich beim letzten Mal befand. Sollten Sie irgendwelche Probleme mit Dialogboxen haben, die nicht ganz sichtbar sind, weil sie z.B. aus dem Bildschirm ragen, stellen Sie hier "immer" ein. Dann wird die Routine benutzt, die auch ohne MultiDialog verwendet wrde. "FormDial Fenster/Normal": + ('saubere' Dialoge in Fenster legen) + Hiermit kann eingestellt werden, ob Dialoge die ber saubere Programmier- + aufrufe eingeleitet werden, in Fenster umgeleitet oder wie gewohnt dar- + gestellt werden sollen. + (Der Name stammt von der GEM-Funktion form_dial, mit der Dialogboxen angekndigt werden sollen.) Sollten Sie feststellen, da nach Beendigung eines Dialogs das Fenster "tot" zurckbleibt und nicht gelscht wird, so stellen Sie bitte den Schalter "FormDial" auf "Normal" und verwenden Sie stattdessen die Einstellung "FormDo Fenster", die dieses Problem nicht aufwirft. (Lesen Sie dazu auch das Kapitel VIII. "Fragen und Antworten".) "FormDo Fenster/Normal": + (auch 'unsaubere' Dialoge in Fenster legen) + Da es einige Programme gibt, die keine form_dial-Aufrufe ttigen,gibt es auerdem noch die Mglichkeit, mittels "FormDo" auch diese in den Genu von Fenstern kommen zu lassen. (mittels form_do knnen Programme einen Dialog bedienen lassen.) Dialogboxen, die erst durch die Einstellung "FormDo" in Fenster gelangen, sind allerdings nicht so bequem zu Bedienen, wie diejenigen bei denen "FormDial" gengt. Zum einen knnen deren Fenster nicht verschoben werden, zum anderen wird das Fenster zu Anfang jedes FormDo-Aufrufs geffnet und bei dessen Ende geschlossen. Daraus resulieren zwei Nachteile: In vielen Dialogen kann der Benutzer Eintrge in der Dialogbox ber Pfeile o.. scrollen (z.B. im IKONEN ANMELDEN Dialog der neueren Desktops, wobei dieser Dialog ein schlechtes Beispiel ist, wie weiter unten erlutert wird). Jedesmal wenn ein neuer Eintrag angezeigt wird, mu das Fenster geffnet und spter wieder geschlossen werden. Zum einen bentigt das jedesmal relativ viel Zeit, zum anderen kann es passieren, da dieser Dialog dabei von anderen Fenstern, die kurzzeitig aktiv werden, bermalt wird (was fr die Optik sicherlich nicht vorteilhaft ist). Der letztere Effekt kann evtl. mit der Einstellung bei "ObjcDraw bei FormDo" (s.u.) gelindert werden. Im Gegensatz zu FormDial-Dialogen knnen die Fenster der FormDo-Dialoge nicht verschoben werden! Es gibt auerdem noch eine dritte Art von Dialogen, nmlich solche, die weder einen form_dial-, noch eine form_do-Aufruf benutzen. Das sind in der Regel solche, die bereits eine besondere Form der Dialogbehandlung anbieten (z.B. verschiebbare (sog. FlyDials) oder ber Tastatur bedienbare Dialoge). Diese knnen von MultiDialog nicht abgefangen und in Fenstern dargestellt werden. "FormAlert Fenster/Normal": + (Alertboxen in Fenster legen) + Ist hier "Fenster" eingeschaltet, so erscheinen Alertboxen in einem Fenster. (Alertboxen sind daran zu erkennen, da sie maximal 3 Knpfe und 5 Zeilen Text, sowie evtl. ein kleines Warnsymbol besitzen.) Alertboxen sollten eigentlich keine Probleme bereiten, weshalb dieser Schalter immer aktiviert sein kann. (Naja, mit dem Redraw gibt es manchmal doch Probleme, die aber rein optischer Natur sind.) "ObjcDraw bei FormDo: Ja/Nein": (Inhalt der Dialogbox neuzeichnen) Diese Einstellung hat nur Wirkung, wenn bei "FormDo" "Fenster" gewhlt wurde ist, da sich diese Einstellung nur auf Dialoge bezieht, die bei einem form_do-Aufruf in ein Fenster umgeleitet wurden. Wie bereits oben erwhnt knnen dabei Probleme auftreten, weil der Inhalt der Dialogbox durch andere Fenster bermalt wird. Da das in der Regel der Fall ist, sollte hier "Ja" eingestellt werden. Manche Dialogboxen enthalten jedoch Grafiken (z.B. Bilder, Farbverlufe), die MultiDialog nicht ber den GEM-Aufruf objc_draw rekonstruieren kann; in diesem Fall ist "Nein" einzustellen. "Fenstertitel Ja/Nein": (Dialogfenster mit Titelbalken) Hiermit knnen Sie einstellen, ob die Dialogfenster, die MultiDialog anlegt, den von Fenstern gewohnten Titel- bzw. Bewegungsbalken besitzen sollen oder nicht. Bei "Ja" wird ein Fenster mit Titelzeile verwendet, so da man sofort ablesen kann, wozu der entsprechende Dialog gehrt. "Nein" unterbindet dies, was den Vorteil hat, da die Fenster nicht soviel Platz wegnehmen. (Defaultmig sind Fenstertitel abgeschaltet, da das den originalen GEM- + Routinen am hnlichsten ist.) + "Tastenkrzel Ja/Nein": + (Tastaturbedienung der Dialoge) + Wenn ein MultiDialog installiert ist, das Tastaturbedienung untersttzt, + kann ber diesen Eintrag dieses Feature deaktiviert werden. + (Zur Zeit hat diese Auswahl erst Wirkung, wenn auch Let'em Fly installiert + ist.) + "Default", "Neu", "Lschen": + (Liste fr automatische Umschaltung) Da das eine Programm eine andere Einstellung als das andere bentigt, besitzt MultiDialog eine automatische Umschaltung der Einstellungen. Das geschieht ber eine Liste, in der jedem Programm seine Einstellung zugeordnet ist. Mittels des "Neu"-Knopfes kann ein neuer Eintrag in der Liste angelegt werden. Tippen Sie dazu nach Drcken des "Neu"-Knopfes einfach den Namen des Programms, fr das eine spezielle Einstellung ntig ist, ein. (Nehmen Sie den Namen, wie er von MultiDialog im Fenstertitel angezeigt wird. Wenn Sie kein MultiTOS verwenden, kann der Name von Accessories nicht ermittelt werden; daher ist fr Accessories auch keine automatische Umschaltung mglich.) Mit den Popup-Men links neben "Neu" (nach dem Start ist es mit "Default" + beschriftet) knnen Sie durch die Eintrge blttern und nachtrglich deren + Einstellungen ndern. Da die meisten Programme mit derselben Einstellung laufen, gibt es den Eintrag "Default", dessen Einstellungen immer dann benutzt werden, wenn MultiDialog den Namen eines Programms nicht in der Liste, die Sie angelegt haben, finden kann. Wenn Sie Eintrge aus der Liste wieder lschen wollen, so knnen Sie dies mit dem "Lschen"-Knopf machen. Es wird dann der Eintrag gelscht, der im Moment angezeigt wird. Fr dieses Programm wird dann wieder die Default-Einstellung verwendet, die man nicht lschen kann. "Sichern", "OK", "Abbruch": Um die gemachten Einstellungen zu sichern, wird der "Sichern"-Knopf verwendet. Er speichert die Einstellungen dann in der Datei "MULTDIAL.INF" ab. Zunchst wird versucht, diese im AUTO-Ordner Ihres Startlaufwerks anzulegen (von wo sie MultiDialog auch beim nchsten Start ldt), scheitert dies, so wird sie im aktuellen Verzeichnis gespeichert. "OK" beendet den Dialog, "Abbruch" macht das gleiche, aber die zuletzt gemachte nderung wird ignoriert. (Das bezieht sich dabei auf nderungen, die an der im Moment sichtbaren Einstellung gemacht worden sind. Sobald Sie das Popup-Men links neben "Neu" (oder "Neu" bzw. "Lschen") benutzen, werden die nderungen, die Sie gemacht haben, sofort bernommen!) Auerdem fhrt der "Info"-Knopf zu einer Seite, in der alles wichtige aus dieser Datei kurz zusammengefat ist. Mit den Pfeilen, die sich dann unten links befinden, kann man den angezeigten Ausschnitt verndern. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> VI. Tastaturbedienung Zur Zeit ist die Tastaturbedienung von Dialogen ber Oliver Scheel's + AES-Erweiterung Let'em Fly realisiert. Das heit: + Damit MultiDialog Tastaturshortcuts untersttzt, + mu Let'em Fly installiert sein. + (siehe auch Kapitel IV. "Installation") + Let'em Fly ist - hnlich wie MultiDialog - FreeWare und in allen gut + sortierten Mailboxen erhltlich. Bezglich der Konditionen fr Benutzung + und Weitergabe lesen Sie bitte die zugehrige Dokumentation. + Stellen Sie sicher, da Let'em fly abgeschaltet ist + und speichern Sie diese Einstellung ab! + (MultiDialog schaltet zwar Let'em Fly auch selber ab, + aber man wei ja nie!) + Einen Dialog, der per Tastenkrzel zu bedienen ist, erkennen Sie daran, + da das entsprechende Krzel eines Dialogknopfes unterstrichen oder farbig + markiert ist. + ber die Kombination von ALTERNATE-Taste und diesem Krzel + kann nun ein Mausclick auf den jeweilige Knopf simuliert werden. + Falls der aktuelle Dialog keine Texteingabefelder besitzt, kann der + gleichzeitige Druck auf die ALTERNATE-Taste auch entfallen. Die Knpfe + von Alertboxen knnen auerdem auch ber die Funktionstasten F1 bis F3 + bedient werden. + Knpfe, die mit "Abbruch", "Cancel", etc. bezeichnet sind, knnen + zustzlich ber die UNDO-Taste bedient werden, ebenso wirkt + die HELP-Taste auf Objekte mit dem Text "Hilfe", "Help". + Die Tastenkrzel innerhalb eines Fensterdialoges sind nur wirksam, wenn + sich das entsprechende Fenster als oberstes auf dem Bildschirm befindet. + Ebenso werden die Krzel erst dann wieder neu eingezeichnet, wenn man + das Fenster zum obersten Fenster macht. + Auerdem mu natrlich in MultiDialogs XCONTROL-Modul "Tastenkrzel: Ja" + eingestellt. Bei der Verwendung lterer MULTDIAL.INF-Dateien mu beachtet + werden, da dort i.d.R. noch "Nein" eingestellt sein drfte. + Die Kennzeichnung der Tastenkrzel im Dialog kann ber die zu Let'em fly + gehrenden Konfigurationsprogramme eingestellt werden. + Weitergehende Informationen zur Tastaturbedienung entnehmen Sie bitte + der zu Let'em fly gehrenden Dokumentation. + >>>>>>>>>>>>>>>>>>>>>>>>>>>> VII. Einschrnkungen und zuknftige Versionen Frher stand an dieser Stelle: + Alle zur Zeit bekannten Fehler, die MultiDialog besitzt, sind rein optischer Natur und beintrchtigen in keiner Weise die Betriebssicherheit: Leider gibt es doch noch ein paar Fehler, die ich bisher nicht beheben + konnte (Mangels Spenden fehlt mir auch ein bisschen die Motivation, da + bei meiner Arbeit diese Fehler nicht auffallen.): + - Seit der Version 2.00 der Multitasking-Erweiterung Mag!X bringt + MultiDialog dieses System zum Stillstand. Abhilfe: MultiTOS verwenden :-) + - Es gibt wirkliche Schweineprogramme, die AES-Aufrufe vor einem + appl_init ttigen. Hierbei kann MultiDialog durcheinanderkommen und + die Mausbedienung blockieren. + In der Regel ignoriert MultiDialog aber diese Schweineprogramme. + Nun aber die kleineren (Schnheits-)Fehler, die nur bei Singeltask-Betriebssystemen auftreten: - Das Desktop benutzt keine TRAP #2 GEM-Aufrufe, deshalb kann MultiDialog die Dialogboxen des Desktop nicht abfangen. (Das Desktop des MultiTOS hingegen verwendet TRAP #2 Aufrufe, so da hier MultiDialog aktiv wird.) - MultiDialog kann die Namen von Accessories nicht herausfinden; aus diesem Grund ist auch keine automatische Einstellungsumschaltung fr Accessories mglich. (In AES Versionen < 4.0 gibt es keine Mglichkeit, nach Prozessen zu suchen.) - Bei installiertem WINX 2.X fllt auf, das dort fters falsche AES-Aufrufe+ gemeldet werden. MultiDialog scheint einige Programme zu verwirren. + Da MultiDialog MultiTOS kennt, gibt es hier nur einen speziellen Fehler: - MultiDialog benutzt den appl_search-Aufruf, um den Namen einer Applikation herauszufinden; dabei wird der interne Zhler von appl_search verndert. Ruft daher z.B. eine Applikation appl_search auf, benutzt dann einen Dialog und ruft anschlieend nochmal appl_search auf, so liefert der 2. Aufruf nicht den erwarteten Wert, da in der Zwischenzeit MultiDialog ebenfalls appl_search aufgerufen hat. Nun die Fehler, die in allen TOS-Versionen auftreten: - Programme, die eigene Dialogroutinen besitzen (z.B. fly-dials), profitieren nicht von MultiDialog, da sie keinen form_do-Aufruf benutzen, den MultiDialog aber bentigt. - Nicht immer ist ein Redraw fr die Fenster der Applikation, deren Dialog abgefangen wurde, mglich. MultiDialog kann nmlich nur den Teil eines Fensters neuzeichnen, der sichtbar war, als das Dialogfenster geffnet wurde. - hnliche Probleme gibt's bei Alertboxen. Die originalen GEM-Alertboxen retten den Bildschirminhalt und restaurieren ihn wieder; MultiDialog macht das nicht, da ja in der Zwischenzeit der Bildschirminhalt sich vllig verndert haben kann. - Wie bereits oben angedeutet, ignoriert MultiDialog Programme, die kein + appl_init aufrufen. Dies ist z.B. bei vielen CPX-Modulen fr das + erweiterte Kontrollfeld der Fall, so da diese nicht von MultiDialog + profitieren. (s. auch Kapitel VIII. GEM-Programmierung und MultiDialog) + - Einige Programme benutzen Alertboxen bei ausgeschaltetem Mauszeiger. Die originale Betriebssystemfunktion kann in diesem Fall ohne Probleme den Mauszeiger anschalten, MultiDialog hingegen nicht. (wenn mir jemand verrt, wie ich herausfinde, wie oft ich graf_mouse(M_ON) aufrufen mu, bis der Mauszeiger sichtbar ist, liee sich dieses Problem auch beheben.) - ltere Programme reservieren so ziemlich allen freien Speicher. MultiDialog bentigt aber Speicher, um Dialoge in Fenster zu legen, weshalb nach Start dieses Programms keine Dialoge mehr in Fenstern erscheinen. (Da diese Programme aber unter MultiTOS ebenfalls Probleme bereiten, drfte diese Unart aussterben.) - Dank MultiDialog kann man auf die Menleiste auch whrend eines Dialogs zugreifen. Das Programm kann aber auf keinerlei Ereignisse reagieren, weil es nur darauf wartet, da der Dialog beendet wird. Whlt man trotzdem eine Meneintrag an, so passiert nichts. (Man mu halt zuerst den Dialog beenden; aus genau dem gleichen Grund kann man auch nicht mit den Fenstern oder dem Desktop des betreffenden Programms arbeiten, man mu erst den Dialog beenden.) - Es ist gar keine gute Idee, ein Programm zu starten bzw. zu beenden oder die Auflsung zu wechseln, whrend ein Dialog, der von MultiDialog abgefangen wird, sichtbar ist. (Ersteres bezieht sich auf Singletask- Betriebs-systeme, letzteres auf MultiTOS.) MultiDialog kann zwar damit umgehen, aber dazu mu es die Dialoge gewaltsam beenden: Es tut so, als habe der Benutzer den Default-Knopf gedrckt (normalerweise ist das "OK" oder "Abbruch"). Wenn kein Default- Button existiert, wird ein Druck auf auf den letzten Knopf der Dialogbox simuliert, was hufig der "Abbruch"-Knopf ist. Aber dieser Knopf knnte genauso gut ein "Alles lschen/Formatiere Festplatte/Starte Atomkrieg"-Knopf sein, weshalb man besser erst die Dialogbox verlt und dann den Auflsungswechsel durchfhrt oder ein Programm startet bzw. beendet. - Das Dateiauswahl-Formular wird von MultiDialog nicht abgefangen. (So da bei einer Dateiauswahl die Bildschirmausgabe weiterhin stillsteht.) Gleiches gilt fr kritischen Fehlermeldungen des TOS. Kommen wir nun zu einem wirklich rgerlichen Problem :-( Macht ein Programm mehr form_dial(FMD_START)-Aufrufe als form_dial(FMD_CLOSE), so bleiben "Fensterleichen" auf dem Bildschirm zurck. Diese Fenster knnen weder geschlossen, noch bewegt werden - eine Mglichkeit ist, das Programm, zu dem der Dialog gehrt, zu beenden. Tritt dieses Problem auf, so sollte man man "FormDial: Normal" einstellen und stattdessen "FormDo: Fenster" aktivieren. (Aus diesem Grunde habe ich die automatische Umschaltung eingebaut - wahrscheinlich ist das auch der Grund, weshalb ATARI so etwas hnliches wie MultiDialog nicht ins MultiTOS eingebaut hat!) Lesen Sie dazu das Kapitel IX. "Fragen und Antworten"; dort wird erklrt, wie Sie ein "totes" Fenster wieder entfernen knnen, ohne das betroffene Programm zu beenden. Anmerkung: Solch ein Verhalten ist weniger ein Fehler in MultiDialog als ein echter Fehler der betreffenden Applikation, der auch den Entwicklern dieser Applikation gemeldet werden sollte. Aber es kommt noch besser: Ratet mal, welchen Fehler das Desktop in MultiTOS hat! Na? Genau: Alle Dialoge in denen ein "berspringen"-Knopf existiert, rufen jedesmal, wenn die Dialogbox fr die nchste Datei aufgebaut wird, form_dial(FMD_START) auf, machen aber nur _ein_ form_dial(FMD_FINISH), nachdem die letzte Datei dargestellt wurde. MultiDialog versucht daher, diese Fehler zu abzufangen, aber es funktioniert nur mit bekannten MultiTOS Versionen, dies kann bei zuknftigen MultiTOS Versionen scheitern. (Ich habe diesen Fehler Eric Smith gemeldet, leider ist er nicht behoben worden!) Fehler-Berichte, die MultiDialog betreffen, bitte an meine Adresse (s.u.). Am liebsten natrlich per e-mail (Emaille?)! Aber, nicht vergessen: Immer Versionsnummer von MultiDialog, sonstige residenten Programme, TOS-Version und bei MultiTOS das AES-Datum und Sprache des AES angeben. Was wird in den nchsten Versionen von MultiDialog kommen ? Nun zunchst einmal werde ich versuchen, die Zuverlssigkeit weiter zu erhhen und die bekannten Fehler zu beheben. Eine Programmierschnittstelle fr die kommende Version ist in Vorbereitung!+ Die neuen Releases von Let'em Fly und MultiDialog werden besser zusammen- + arbeiten, so da z.B. auch LTMF's erweiterte Edit-Funktionen zum Tragen + kommen! + Das neue Fensterhandling der kommenden MultiTOS-Versionen soll + untersttzt werden. + Es scheint einige Leute zu geben, denen das Aussehen der Alertboxen + nicht gefllt ("Wolpers!!!" Na wer hat's erkannt ?:-), + vielleicht mu ich das mal ndern. + Aber auch an eine VSCR-Untersttzung ist zu denken. + Eine Verschmelzung mit Let'em fly ist mglich. + Auerdem ist die Bereitstellung einer Online-Hilfe fr beliebige + Progamme ber MultiDialog denkbar. + >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> VIII. GEM-Programmierung und MultiDialog Die folgenden Ausfhrungen sind fr Programmierer gedacht, der Nur-Anwender kann getrost ber sie hinweg lesen: MultiDialog verbiegt ein paar Vektoren mittels XBRA-Strukturen (die Kennung ist "MDIA"). Es benutzt den TRAP #2 Vektor (GEM, um die AES-Aufrufe abzufangen), TRAP #13 (BIOS, um MultiDialog in den TRAP #2 Vektor einzu- klinken) und den GEM-Vektor 258 (etv_term, um bei einem Programmabbruch den angelegten Speicher korrekt zu entfernen). Um MultiDialog ein korrektes Arbeiten zu ermglichen, sollte es nur in Umgebungen eingesetzt werden, in denen fr den TRAP #2 und etv_term-Vektor ebenfalls XBRA-Strukturen verwendet werden! Wenn der cookie-jar existiert, wird auerdem ein cookie ("MDIA") angelegt: Der Cookie MDIA enthlt einen Zeiger auf ein Langwort, das die aktuelle Globale Konfiguration von MultiDialog enthlt. Das oberste Bit (31) entspricht dabei der Schalterstellung "MultiDialog: An/Aus" (Bit gesetzt: An, Bit gelscht: Aus). Alle weiteren Bits bleiben undokumentiert und drfen nicht verndert werden. Das diesem Langwort vorhergehende Wort enthlt die BCD-codierte Versionsnummer von MultiDialog (z.B. V1.01=$0101, V1.23=$0123). Versionen vor 1.01 enthalten in diesem Wort den Wert 0 (Version 1.02 gab sich brigens flschlicherweise als 1.01 aus). Also: IF Versionswort = $0000 THEN Version<1.01 ELSE Version=Versionswort Das diesem Wort vorhergehende Wort enthlt einen Bitvektor, der ver- schlsselt die Fhigkeiten der installierten MultiDialogversion enthlt (unabhngig davon, ob die jeweiligen Fhigkeiten vom Benutzer deaktiviert wurden): Bit 0: es existiert eine neue form_center-Routine Bit 1: Dialogboxen werden in Fenster umgeleitet Bit 2: Alertboxen werden in Fenster umgeleitet Bit 3: Dialogboxen knnen per Tastatur bedient werden Bit 4: Dialogfenster knnen ohne MOVER & NAMEn dargestellt werden (alle brigen Bits sind reserviert; gesetzte Bits bedeuten, da die entsprechende Fhigkeit vorhanden ist.) Dieses Wort existiert enthlt in Versionen vor 1.01 den Wert 0 und mu dann als $0007 interpretiert werden. Also: If Versionswort = $0000 THEN Fhigkeiten=$0007 ELSE Fhigkeiten=Fhigkeitenwort Zusammenfassung: Word: Fhigkeiten (Version=$0000=>$0007) Word: Version ($0000=>Version<1.01) Cookie Jar: MDIA Zeiger ----> Long: Konfiguration Dieser Speicherbereich hat den Protectionstatus GLOBAL. Fr jeden dargestellten Dialog wird Speicher ber den Malloc-Befehl ange- fordert: fr lokale Variablen, das Fenster (wird vom AES gemacht) und ziemlich viel Speicher fr Redraw-Anforderungen der nicht-Dialog-Fenster einer Applikation (bei ST-Auflsungen 32kB, aber mit True-Color und Ganzseitenbildschirmen kann's auch 0,5MB und mehr werden.) Wenn kein Speicher mehr frei ist, kann dann nicht mehr das Redraw ausgefhrt werden oder im Extremfall das Fenster nicht mehr geffnet werden, in diesem Fall wird dann die herkmmliche Routine ausgefhrt. (Durch die Benutzung von dynamischem Speicher ist MultiDialog voll reentrant und untersttzt beliebig viele Dialoge gleichzeitig.) Wenn auch Ihr Programm von MultiDialog profitieren soll, sollten Sie form_dial(FMD_START) zu Beginn eines Dialogs, form_do fr den eigentlichen Dialog und form_dial(FMD_FINISH) am Ende des Dialogs benutzen. Dabei mu unbedingt zu jedem form_dial(FMD_START) auch ein form_dial(FMD_FINISH) existieren, sonst bleiben Fensterleichen zurck. MultiDialog baut darauf, da auf jeden form_dial(FMD_START)-Befehl wieder ein form_dial(FMD_FINISH) folgt! Untersuchen Sie Ihre Programme, ob es zu jedem form_dial(FMD_START) auch ein form_dial(FMD_FINISH) gibt! Wenn nicht, luft Ihr Programm garantiert nicht vernnftig mit MultiDialog. Ich empfehle, die Dialogbehandlung nach dem Beispiel im "ST/STE/TT-Profibuch" auf Seite 777 durchzufhren. Eine Dialogroutine sollte dementsprechend folgendermaen aussehen: form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* wird neuerdings gefordert */ + form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* wird neuerdings gefordert */ + wind_update(END_UPDATE) Die Gre des Bereichs, der bei form_dial reserviert wird, sollte also den Ausmaen der Dialogbox entsprechen; sonst wird das Fenster, das MultiDialog ffnet, zu gro. Bei der Benutzung von "Spezial-Objekten", die mit objc_draw whrend des Dialogs neugemalt werden, sollten man die wirklichen Koordinaten des Objekts (die erhlt man ber objc_offset) als Clipping-Bereich verwenden - und nicht etwa den Bereich, den man von form_center zurckbekommen hat. Der Benutzer kann nmlich die Dialogbox aus dem ursprnglichen Clipping- Bereich herausbewegt haben. Auch wenn ich eigentlich dachte, es sei selbstverstndlich, so hat mich + die Realitt bei folgendem das Gegenteil gelehrt: + Die erste AES-Funktion, die eine Applikation aufruft, hat ein appl_init + zu sein und die letzte, die sie ttigt, ein appl_exit! + Bei CPX-Modulen sollte man ebenfalls in der cpx_init Routine ein appl_init + aufrufen (so wie es ATARI in seinen Beispiel-Sourcen auch macht). + Im Profibuch ist leider ein Beispiel-CPX abgedruckt, das kein appl_init + aufruft, ATARI hingegen sieht folgende Initialisierung fr CPX-Module vor: + (Interessanterweise ist kein appl_exit erforderlich und der + appl_int-Aufruf liefert immer dieselbe AP_ID!) + CPXINFO *cpx_init( Xcpb ) XCPB *Xcpb; { xcpb = Xcpb; appl_init(); /* Wichtig! */ + if( xcpb->booting ) { ... Einige Interna: Die neuen AES-Routinen, die MultiDialog installiert, laufen im User-Modus + der 68000-CPU ab. MultiDialog benutzt dabei den Stack der jeweiligen + Applikation. Im Gegensatz zu den originalen AES-Routinen werden daher + bei einem AES-Aufruf bis zu 500 Bytes auf dem User-Stack verwendet. + Es ist also darauf zu achten, da vor einem AES-Aufruf gengend freier + Stack vorhanden ist, da es sonst zu scheinbar unmotivierten Abstrzen + kommen kann. + Wer unbedingt AES-Aufrufe machen mu, die nicht von MultiDialog abgefangen + werden, sollte sich vertrauensvoll an den Programmierer wenden; auch + hierfr gibt es eine Lsung. + Zur Programmierschnittstelle, die in Vorbereitung ist, wird auf die Datei + PROG_GER.TXT verwiesen. + >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IX. Fragen und Antworten Frage: Warum erscheint bei mir keine einzige Dialogbox im Fenster ? Antwort: Entweder MultiDialog ist berhaupt nicht installiert (bei Start ber den AUTO-Ordner mu MultiDialog die erfolgreiche Installation melden), oder es ist abgeschaltet. Prfen Sie in der Konfigurationsdialogbox von MultiDialog nach, ob MultiDialog angeschaltet ist. Auerdem mu bei mindestens einer der Optionen "Alert", "FormDial" oder "FormDo" "Fenster" aktiviert sein. (Sollten Sie kein MultiTOS benutzen, so erscheinen die Dialogboxen des Desktops nie in Fenstern.) Frage: MultiDialog verursacht bei mir eine Memory-Violation. Was tun ? Antwort: berprfen Sie, ob die Memory-Protection-Flags von MULTDIAL.PRG auf GLOBAL gesetzt sind (z.B. mit dem Programm PRGFLAGS oder nehmen Sie CHPROT, das macht das automatisch). Auerdem knnen Sie versuchen, ob sich eine Verbesserung ergibt, wenn MULTDIAL.PRG vor oder nach MINT.PRG gestartet wird. Falls das immer noch keine Besserung bringt, schreiben Sie dem Autor mit genauer Beschreibung der Konfiguration. Vielleicht kann ich das Problem beheben, bis dahin wird man die Memory-Protection wohl oder bel abschalten mssen. Frage: Wieso strzen bei mir MultiDialog oder andere Programme immer ab ? Antwort: Es kann sein, da MultiDialog in Verbindung mit anderen residenten Programmen nicht funktioniert. Deaktivieren Sie nacheinander alle anderen Programme im AUTO-Ordner, um den Bsewicht herauszufinden (Hoffentlich ist nicht MULTDIAL der alleinige beltter!). Unter MiNT/MultiTOS spielt es evtl. auch eine Rolle, ob die Programme vor oder hinter MINT.PRG im AUTO-Ordner ausgefhrt werden. Im Extremfall mu man hier alle mglichen Kombinationen ausprobieren (whrend ich MultiDialog ausprobiert und auf Inkompatibilitten getestet habe, wurde MULTDIAL.PRG meistens als letzte Datei geladen.) MultiDialog vertrgt sich nicht gut mit aktiviertem Let'em'fly! Man mu sich also fr einen Dialogmanager entscheiden... Frage: Wieso werden bei manchen Programmen die Dialoge nicht in Fenstern dargestellt ? Antwort: Gegenfrage: Knnen Sie die betreffenden Dialoge ohne MultiDialog mit der Maus auf dem Bildschirm hin- und herbewegen oder die Knpfe mit der Tastatur bedienen ? Dann gibt es keine Chance, die Dialoge in Fenster zu verfrachten, da das Programm eine eigene Dialogverwaltung benutzt. Ansonsten knnen Sie mal probieren, in der MultiDialog-Konfiguration "FormDo" auf "Fenster" zu stellen, vielleicht klappt's dann. Frage: Dialogfenster, die sehr dicht unter der Menuleiste erscheinen, besitzen keine Titelzeile. Warum ? Antwort: Bei diesen Dialogen ist kein Platz fr den Fenstertitel, so da dieser in der Menuleiste erscheinen wrde. Um das zu verhindern, wird daher ein Fenster ohne Titel geffnet. Frage: Dialogfenster, die fast die gesamte Hhe des Bildschirms einnehmen, ragen mit dem untersten Teil aus dem Bildschirm, obwohl am oberen Rand noch eine Zeile Platz wre. Mu das sein ? Antwort: berprfen Sie, ob sie die Option "Fenstertitel" aktiviert haben. Wenn ja schalten Sie sie ab, dann mte der Dialog komplett sichtbar sein. Frage: Wieso erscheinen manche Alertboxen des MultiTOS (z.B. "Laufwerk antwortet nicht") nicht in Fenstern ? Antwort: Diese Alertboxen gehren zu kritischen Fehlern. Die sind selbst MultiDialog zu kritisch, so da hier die herkmmliche Routine benutzt wird. Frage: Bei einigen Programmen erscheinen Alertboxen auf dem Bildschirm, aber der Mauszeiger ist nicht sichtbar. Kann man das verhindern ? Antwort: Im Moment leider nicht. Programme, bei denen dieses Problem auftritt, verlassen sich auf die undokumentierte Tatsache, da das AES bei einer Alertbox immer den Mauszeiger einschaltet. Da MultiDialog dazu nicht in der Lage ist (zumindest zur Zeit nicht), mssen Sie die Alertbox entweder "blind" bedienen oder Sie deaktivieren "Alert" im Konfigurations- Dialog. (Bei Tastaturbedienung knnen die Tasten F1 bis F3 fr die 3 mglichen Auswahlen verwendet werden.) (Wenn mir jemand verrt, wie ich feststellen kann, wieviele graf_mouse(M_ON)-Aufrufe man machen mu, bis der Mauszeiger sichtbar ist, wre dieses Problem gelst...) Frage: Nach Beendigung eines Dialogs bleibt das Fenster dieses Dialogs weiterhin auf dem Bildschirm stehen. Ich kann es aber weder bewegen, noch schlieen. Wie kann ich das verhindern ? Antwort: Schalten Sie in der MultiDialog-Konfiguration den Option "FormDial" ab und benutzen Sie stattdessen "FormDo". Dann sollten Sie dieses Problem, das auf unsaubere Programmierung des betroffenen Programms zurckzufhren ist, nicht mehr haben. Am bequemsten ist es, wenn Sie fr dieses Programm einen eigenen Eintrag in der Umschalt-Liste von MultiDialog anlegen und dort die beste Einstellung fr dieses Programm angeben. (s. Kapitel V.) Das "tote" Fenster wird entfernt, wenn Sie das Programm verlassen. Hufig gelingt es auch, das Fenster zu entfernen, indem man MultiDialog zunchst abschaltet und dann das betreffende Programm eine Dialogbox anzeigen lt. Bei Beendigung dieses Dialogs wird dann das Fenster entfernt. Danach knnen Sie MultiDialog wieder einschalten. Frage: Ein Dialog erscheint zwar in einem Fenster und alle anderen Prozesse laufen weiter, aber ich kann das Dialogfenster nicht bewegen. Woher kommt das ? Antwort: Hierbei handelt es sich um einen Dialog, der nach einem form_do Aufruf in ein Fenster umgeleitet wurde. Solche Dialoge knnen grundstzlich nicht bewegt werden. Falls fr das betreffende Programm "FormDial" deaktiviert ist, knnen Sie probieren, diese Einstellung zu aktivieren, vielleicht knnen Sie das Fenster dann bewegen. (Dieses Phnomen kann auerdem bei unsauber programmierten Programmen auftreten!) Frage: Die Dialogbox erscheint zwar in einem Fenster, aber es trgt nur den Titel "Dialog" statt "MultiDialog". Woran liegt das ? Antwort: In diesem Fall benutzt das Programm zwar die form_dial-Funktion, aber es verwendet nicht - wie von MultiDialog erwartet - einen form_do-Aufruf. Das ist nicht weiter schlimm, der Dialog (so es denn berhaupt einer ist - manchmal erscheinen auch Statusmeldungen in so einem Fenster) blockiert dann halt die anderen Programme. Frage: Manchmal scheinen Scrollpfeile und andere Auswahlmglichkeiten in einer Dialogbox nicht mehr richtig zu funktionieren. Ist das normal ? Antwort: Wahrscheinlich haben Sie die Dialogbox verschoben, so da der Bereich, in dem das Programm die Auswahl darstellen will, sich nicht mehr an der erwarteten Position befindet. Die Auswahl funktioniert dann i.d.R. trotzdem, sie wird nur nicht angezeigt. Versuchen Sie, das Dialogfenster an die alte Position zurckzuschieben, dann mte es wieder funktionieren. Frage: Wieso werden die Alertboxen der CPX-Module nicht in Fenster gelegt ?+ Antwort: CPX-Module rufen hufig kein appl_init auf, in diesem Fall werden + sie ignoriert! Abhilfe: Programmierer des Moduls solange nerven, bis er + ein appl_init einbaut. + Frage: Ich habe Let'em Fly in den AUTO-Ordner kopiert, aber es werden + trotzdem keine Tastenkrzel angezeigt. Woran kann das liegen ? + Antwort: Falls Sie eine MULTDIAL.INF-Datei verwenden, prfen Sie unbedingt + mit dem CPX-Modul fr das erweiterte Kontrollfeld nach, ob auch + "Tastenkrzel: Ja" eingestellt sind. ltere MULTDIAL.INF enthalten nmlich + hufig die Einstellung "Tastenkrzel: Nein"! + Frage: Ich habe zwar "Tastenkrzel Ja" eingestellt, aber eine Tastatur- + bedienung ist nicht mglich. + Liegt das etwa daran, da ich auerdem noch Let'em fly installieren mu ? + Antwort: Ja! + Frage: Die Tastaturshortcuts werden bei Dialogen, die im Hintergrund + liegen, nicht kenntlich gemacht. Woran liegt das ? + Antwort: Die Routinen, die Momentan zum Einsatz kommen, knnen nur alle + Shortcuts auf einmal einzeichnen. Sie werden daher erst dann wieder + sichtbar, wenn das Dialogfenster das oberste Fenster ist. + Frage: Wenn Let'em Fly installiert ist, werden manchmal auf dem Bildschirm + Striche an Stellen gemalt, die gar nichts mit dem Tastenkrzel zu tuen + haben. Sachmal, ist das nicht ein richtiger Fehler ? + Antwort: Eigentlich schon. Let'em Fly scheint da (und auch bei 3D-Buttons) + ein paar Probleme zu haben. Daran kann ich aber im Moment nichts ndern. + Frage: Wieso tut's MultiDialog eigentlich nicht unter Mag!X 2.XX ? + Antwort: Das wrde ich auch gerne wissen. MultiDialog benutzt keine + schweinsen Tricks, so da es eigentlich funktionieren msste! Da ich mit + den eingegangenen Spenden noch kein Mag!X 2.XX finanzieren kann, bin ich + da noch auf externe Hinweise angewiesen; aber wir arbeiten daran... + Frage: Ich bin von MultiDialog richtig begeistert. Ist das normal ? Antwort: Ja. Verleihen Sie Ihrer Begeisterung Ausdruck, indem Sie die Arbeit des Autors mit einer Geldspende honorieren. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IX. Vertrieb, Rechtslage MultiDialog darf (und mu) kostenlos weitergegeben werden. (Bitte nur komplett; Mglichst nur das originale ZIP-Archiv uploaden.) Zur Zeit besteht MultiDialog aus folgenden Dateien: MULTDIAL.PRG: Treiber fr den AUTO-Ordner + MULTDIAL.CPX: Konfigurationsmodul fr das erweiterte Kontrollfeld XCONTROL + ANLEITUN.TXT: diese Datei MANUAL.TXT: englische Anleitung HISTORY.TXT: MultiDialog's Lebenslauf README.1ST: Bemerkungen zur jeweils neuen Version OLDMTOS.TXT: Informationen fr Benutzer lterer MultiTOS-Versionen FUTURE.TXT: Ausblick auf zuknftige Versionen MULTDIAL.UPL: Kurz-Beschreibung fr's Upload in die Mailbox + PROG_GER.TXT: Erster Entwurf einer Programmierschnittstelle + Jede Art kommerziellen Vertriebes ist untersagt. Der Vertrieb auf PD-Sammeldisketten, die verkauft werden, scheidet somit aus (auch wenn es sich dabei "nur" um sogenannte "Selbstkostenbeitrge" handelt: schon mal 'ne Leer-Diskette gesehen, die 8 DM kostet ?) Der Vertrieb zusammen mit kommerziellen Programmen ist nur mit Genehmigung des Autors erlaubt. Bitte setzen Sie sich bei Interesse mit mir in Verbindung. brig bleibt daher eigentlich nur der Vertrieb ber Mailboxen, sonstige Netze und direkt ber den Autor. Der Autor bernimmt keinerlei Haftung fr Schden, die durch Benutzung des Programms entstehen. Die Benutzung erfolgt auf eigene Gefahr. (wr ja noch schner, erst nix bezahlen, und dann auf diese Tour kommen.) Regelmigen Benutzern wird unbedingt nahegelegt, den Autor und die Weiterentwicklung von MultiDialog finanziell zu untersttzen! Der Betrag sollte sich dabei nach dem eigenen Einkommen richten (und danach, was einem das Programm wert ist). Damit sich der Verwaltungsaufwand auch lohnt, ist DM 10,-- als Untergrenze anzusehen (Die Obergrenze ist bei 60.000 Atair-Dollars anzusetzen). berweisungen bitte auf mein Girokonto: Helmut Neukirchen, Stadtsparkasse Krefeld, BLZ 320 500 00 Kontonummer 80 486 947 Geben Sie als Verwendungszweck "MultiDialog" an. Wenn Sie elektronische Post ins Internet schicken knnen, schreiben Sie mir am Besten auch noch eine Mail oder geben Sie Ihre e-mail Adresse auf der berweisung an. Dann gibt's automatisch Nachricht bei neuen Versionen! Untersttzen Sie MultiDialog, nur so ist dessen Weiterentwicklung gewhrleistet!!! (Eigentlich mssen hier 1000 Ausrufezeichen stehen, denn in MultiDialog habe ich ca. 1000 wertvolle Stunden investiert. Naja, fast jedenfalls. ;-) Die Entwicklungsgeschwindigkeit hngt mageblich von den eingehenden Spenden ab! Um dem Aufwand bei berweisungen aus dem Ausland aus dem Weg zu gehen, sollen Benutzer im Ausland (d.h. ohne Anbindung an den Deutschen Giroverband) stattdessen den Betrag an ihre jeweilige Greenpeace Organisation berweisen. Neueste Versionen von MultiDialog gibt's ber das Internet per FTP auf dem FTP-Server ftp.informatik.rwth-aachen.de im Verzeichnis /pub/atari/mint (oder so hnlich) und in der Mailbox MAUS Krefeld 2. Das Paket mte jeweils unter dem Namen mdial*.zip zu finden sein. Sollten Sie mit dem Begriff FTP oder MAUS nichts anfangen knnen, haben Sie auerdem natrlich die Mglichkeit, direkt ber den Autor an die neueste Version zu kommen. Schicken Sie mir dazu eine formatierte Diskette und einen ausreichend frankierten, selbstadressierten Rckumschlag. Wenn Sie dann noch angeben, welche Version Sie zur Zeit besitzen, bekommen Sie Ihre Diskette zurck- geschickt, sobald eine neuere MultiDialog Version existiert. Meine Adresse: Helmut Neukirchen e-mail (Internet): Bnnersdyk 63 hn@pool.informatik.rwth-aachen.de D-47803 Krefeld Deutschland Besonderer Dank fr konstruktive Beschimpfungen, Bug-Reports, Anregungen, Quelltexte, Zusammenarbeit und sonstige Untersttzung gilt: Andreas Alich, Dieter Fiebelkorn, Filipe Martins, Olaf Mootz, Oliver Scheel, Oliver Schildmann und Ihnen, sofern Sie sich zu einer Spende entschlossen haben! Was bringt die Zukunft? Neben der Bemhung, MultiDialog unter Mag!X 2.00 zum Laufen zu bringen, wird eine Programmierschnittstelle implementiert. Auerdem soll das erweiterte Fensterhandling des kommenden MultiTOS untersttzt werden. (Wenn ich dann immer noch keine grere Untersttzung erfahre, dann ist der ATARI-Gemeinde auch nicht mehr zu helfen.) Und in der fernen Zukunft ist eine Verschmelzung mit Let'em fly denkbar (Zunchst einmal soll aber LTMF an MD angepat werden, so da auch die erweiterten EDIT-Routinen zum Einsatz kommen.).History der MultiDialog-Versionen 21.12.1993 MultiDialog Version 1.03 vom 21.12.1993: Es wird jetzt ein weiterer, fehlerhafter NEWDESK-Dialog ("NEUER ORDNER") abgefangen. CPX-Version auf 1.00 gesetzt! MultiDialog Version 1.03 vom 20.12.1993: Behobene Fehler: MenuBar erkennt MultiTOS' MenuBar(-1,). FormDo behandelt FormDo(-1,) als FormDo(0,). (Nirgends dokumentiert, aber ausgerechnet ATARI verwendet es so: Ist ja schlimmer als Microsoft!) Interne Versionsnummer stimmt nun (die 1.02 gab sich als 1.01 aus). Kein ObjcDraw-Clipping fr oberstes Fenster (gab Probleme z.B. bei den Popup-Mens der Speedo ACC's) MultiDialog ruft bei seinen Alertboxen WindUpdate nicht nur fr Fenster sondern auch fr die Maus auf. Falls ein AES-Aufruf kommt, der die Rcksprungadresse eines abgefangen Aufrufs zerstren wrde, wird dieser direkt ans AES weitergereicht. Der EDIT-Cursor wird jetzt wie bei XCONTROL behandelt. Auerdem wird bei einem Redraw der Cursor nicht immer ans Ende der Zeile gesetzt. Workaround fr die fehlerhafte BIOS Setexc-Routine des VGA-Simulators. Neue Features: Wenn bei FormCenter CTRL-ALT gedrckt wird, wird die Position eines Dialoges neu berechnet. CPX-Modul fr Konfiguration (das ACC mute dabei weichen) Tastaturbedienung ber Let'em Fly AES-Aufrufe von Programmen, die kein ApplInit gettigt haben, werden komplett ignoriert (das sind z.B. viele CPX'e). Handbuch auf den neuesten Stand gebracht. Entwurf einer Programmierschnittstelle. MultiDialog Version 1.02 vom 30.5.1993: Behobene Fehler: Die Behandlung der wind_update-Semaphoren wurde stark verbessert: Bisher wurde davon ausgegangen, da jeder wind_update-Aufruf erfolgreich ist; auerdem wurden die neuen Modi des AES 4.0 nicht erkannt. Durch die Behebung dieses Fehlers sollten "klemmende" Dialoge nicht mehr auftreten. Neue Features: Es knnen nun alternativ Dialogfenster ohne Titel bzw. Mover dargestellt werden. Bei Dialogen, die sonst in der Menuleiste landen wrden, geschieht das automatisch. Dialogfenster knnen nun auch verschoben werden, indem man auf den Hintergrund eines Dialogs klickt und die Maus bewegt. MultiDialog Version 1.01 vom 25.5.1993: Behobene Fehler: Es wird nun auch unter MiNT/MultiTOS etv_term benutzt, so da MultiDialog interne Strukturen freigibt, wenn ein Prozess gekillt wird. Bisher kam es in so einer Situation zu einem lupenreinen Absturz. MultiDialog Version 1.01 vom 10.5.1993: Behobene Fehler: Bei Dialogen, die mit WIND_UPDATE(BEG_MCTRL) und WIND_UPDATE(END_MCTRL) geklammert sind, wird nicht mehr der 1. Mausclick verschluckt. Verschachtelte bzw. im Hintergrund liegende Dialoge werden nun weitaus besser untersttzt. Es wird jetzt auch ObjcDraw abgefangen und nur der Teil gezeichnet, der auch sichtbar ist. Alertboxen, bei denen die Buttonzeile das breiteste Element ist, sind nun breit genug, um auch 3D-Buttons aufzunehmen. Der Rckgabewert von Form_Dial ist nun 1 statt flschlicherweise 0. Neue Features: Der Cookie wurde erweitert und teilweise dokumentiert. Bei Menuauswahl whrend eines Dialoges werden die Menutitel wieder normal dargestellt. FormDial-Aufrufe, die einen Ausschnitt reservieren, bei dem der Mover des Fensters in der Menuzeile landen wrde, werden nicht mehr abgefangen, sondern ans AES weitergereicht. Benutzer alter MultiTOS-Versionen knnen dies MultiDialog mitteilen. MultiDialog Version 1.001 vom 4.4.1993: Es werden jetzt auch die Fehler bei nicht deutschsprachigem Desktop abgefangen und die betroffenen Dialoge werden trotzdem ins Fenster befrdert. MultiDialog Version 1.00 vom 31.3.1993: Mit Freigabe des MultiTOS nun auch MultiDialog in der Version 1.00: 2 Fehler behoben: Aufrufe des Screen-Managers werden nicht mehr abgefangen, die WindUpdate-Zhler werden nun vorzeichenbehaftet getestet. Auerdem wurde die Anleitung auf den neuesten Stand gebracht und einige Tippfehler beseitigt. Die mit der Programm-Datei identische Accessory-Datei ist nicht mehr in der Distribution enhalten, um das Archiv zu verkleinern; Legen Sie daher eine Kopie von MULTDIAL.PRG unter dem Namen MULTDIAL.ACC an, um die Accessory-Datei zu erhalten. MultiDialog Version 0.97 vom 21.3.1993 Nachdem die 0.97 fehlerfrei auf ST,TT und FALCON getestet wurde, ist sie zur 0.97 aufgestiegen. Einzige nderung: Versionsnummer MultiDialog Version 0.97 vom 16.3.1993: 1. Version, die zum greren -Test freigegeben wurde. Diese Version hat den Leistungsumfang der 1.00 Version. Wenn sich keine Fehler mehr finden, wird diese Version zur Version 1.00. MultiDialog (GEM-Dialogs in Windows) ========================================= Copyright (c) 1992-93 Helmut Neukirchen Bnnersdyk 63 D-47803 Krefeld Germany e-mail: hn@pool.informatik.rwth-aachen.de All rights reserved. Short english manual for MultiDialog >=V1.03 (12/21/93) --------------------------------------------------------- Any commercial distribution is strictly prohibited! (MultiDialog is a kind of Public Domain.) What does MultiDialog ? ------------------------- MultiDialog puts nearly any GEM-dialogbox into a GEM-Window. The result is that you can access the menu-bar or other applications while a dialog is running. This is especially VERY usefull for multitasking TOS-releases. Though MultiDialog was designed to work with Atari's MultiTOS it runs with all other TOS versions, too (i.e. TOS 1.0 - 4.xx and multitasking enhancements like MultiGEM). MultiDialog does not work with Mag!X 2.XX. I don't have reports about Geneva, so please tell me if they work together! Installation -------------- MultiDialog can be installed in two ways, because it can be started as a GEM-Applikation or as an AUTO-folder TOS-program (ACC not supported anymore!) Configure MultiDialog via XCONTROL and the MULTDIAL.CPX module. I suggest the following way of installation: 1. Copy MULTDIAL.PRG to your AUTO-folder. (MULTDIAL.PRG will display a message when it's started via the AUTO-folder.) 2. Copy MULTDIAL.CPX in your XCONTROL CPX path. If you don't want to reset (in order to load the AUTO-Folder), you can install MultiDialog just by starting MULTDIAL.PRG from the Desktop, too. MultiDialogs supports keyboard shortcuts, now. In order to use them you've to install the program Let'em Fly (LETEMFLY.PRG), too. I suggest to use versions >=1.20 of Let'em Fly; copy it just in front of MultiDialog into the AUTO-folder. Configuring MultiDialog ------------------------- You can configure MultiDialog using a CPX module. To do so you should have MULTDIAL.CPX in your CPX path installed and choose the entry "MultiDialog" from XCONTROL's scroll list. (If MultiDialog wasn't installed you will have to start MULTDIAL.PRG now in order to install MultiDialog.) A CPX dialog should appear now. (With non-german XCONTROL the messages should be in english. Please inform me if they are not!) In the first line the version-number of the installed MultiDialog is displayed. - On the right side there is a popup-menu with the possible selections "On"/"Off". When "On" is selected this means that MultiDialog does interfere in the AES-calls to handle dialogs. When " Off " is selected MultiDialog does not interfere in these calls (But still remains installed in memory and in several vector-chains.) The next items consider application specific configurations. - "FormCenter: Always/Center/Mouse/Corner" is the AES-routine which centers a dialogbox in the middle of the screen. Especially when using bigscreens it's annoying that a small dialogbox appears in the middle of the big screen, because you have to move the mouse quite far. MultiDialog can stop this. You can tell MultiDialog to put dialogboxes in the upper left corner, just at the mouse-pointers position or in the center of the screen. The options "Center", "Corner" and "Mouse" do remember the position a dialogbox had before, so you can move them at a position you like and they'll appear from now on at this position. If they are displayed for the first time they'll appear in the corner, the middle or at the mouse-position (just as you've configured). In contrast the item "Always" displays the dialogbox in the middle everytime (just as you are used to with the original GEM-routine). If you've got any problems with dialogboxes which are not completely visible try the "Always"-button, it's the most compatible. - The next line "FormDial: Window/Normal" tells MultiDialog wether to put a dialog at a form_dial-call in a window or not. This is the best time to redirect a dialog, but it works only with programs which use FormDial calls. - "FormDo: Window/Normal" Putting dialogs at a form_do in a window works with nearly any program, but it is not a very elegant way. A window is created at the beginning of a FormDo-call and deleted at the end of the FormDo call. There are two disadvantages: In a lot of dialogs the user can scroll or display different items (e.g. the "Install icon"-dialog of Atari's NEWDESK, but this is no good example as you will see later). In this case the window MultiDialog creates is opened and closed every time a new item is displayed. This slows down the dialog very much. The window MultiDialog creates is opened AFTER the dialog was drawn. When createing the window the dialog might get painted by other windows which are already visible. So the optic gets destroyed. - "FormAlert: Window/Normal" is used to decide whether alertboxes should be displayed in windows or not. I suggest to activate this because MultiDialog can handle alertboxes without any problems (well, in fact you might get problems with the redraw...). - "ObjcDraw on FormDo: Yes/No" tells MultiDialog how to handle the problem which was mentioned at the end of the "FormDo" explanation. You can choose whether to repaint the dialog or not. "Yes" will repaint the dialog if the window was created by FormDo. This can slow down the dialog handle once again. Furthermore some programs do paint some graphics (e.g. images, color ranges) in the dialog which MultiDialog cannot repaint. For those programs you should choose "No". - With the option "Window titles: Yes/No" you can choose between dialog-windows with or without a titlebar. In order to move a dialog-window without a titlebar you have to click at the background of the dialogbox and drag it around. - "Shortcut: Yes/No" If a MultiDialog which supports keyboard shortcuts is installed you may deactivate them with this switch. (At the moment shortcuts are only available if you have installed Let'em Fly and MultiDialog.) Because some programs need other configurations than other programs you can tell MultiDialog to take for specific applications specific configurations - MultiDialog switches automatically. - The "New"-button is used to create new entries in the auto- switch list. You can type in the name of the application in the edit field and MultiDialog takes the configuration you have chosen for that application (take the name which is displayed as window-name). - With the the popup on the left side of the "New" button (probably named "Default") you can scroll between the different applications which need a special configuration. Most of the application work with the same standard configuration. This configuration-entry has the name " Default "; MultiDialog takes it if it couldn't find the application's name in the list you've entered. - If you want to delete entries from the auto-switch list you have to use the "Delete"-button which deletes the entry which is visible at the moment. (You can't delete the "Default" entry!) - The "Save" button saves the auto-switch list in your AUTO-folder in a file named "MULTDIAL.INF" which will be loaded next time if it is is found in your AUTO-folder. - "OK" closes the dialogbox. "Cancel" does the same but it doesn't update the changes you have made (this only works with the changes you've made on the entry which is visible now. Whenever you select the popup on the left side of "New" (or "New", "Delete") the changes for that entry are updated at once.) - Furthermore the "Info" button displays a help page where you'll find a summary of this manual. How to handle MultiDialogs ---------------------------- Dialogs which profit of MultiDialog will appear in a window. Depending on your configuration this window might have the title " MultiDialog: " (where is the name of the application). If MultiDialog recognizes an accessory the app_name will be " Accessory " (using MultiTOS you'll see the names of accessories, too). You can manipulate the buttons of the concerning dialog as you're used to. But furthermore you can now access the menu-bar (e.g. the accessories) and the windows of other application which can do graphics in their windows even while the dialog is active. (Now that's what I call real Multitasking! :-) Though you can select items from the menu-bar the application which displays the dialog can't react to them because at this time it is waiting for the dialog and it isn't prepared to perform any other action. If the MultiDialog-window was opened by a FormDial call you can also move the dialog using the move-bar of the window or by dragging the backround of the dialogbox (this feature is similar to "fly-dial"). (If the program uses only FormDo and you have selected "Fenster bei: [FormDo]" you can't move it!) In the case a program calls FormDial but doesn't call FormDo a window is created too, but you can't access the menu-bar and all the other wonderfull things MultiDialog makes possible. In this case the name of that window is just " Dialog: " (only if window-titles are activated). Keyboard shortcuts -------------------- At the moment accelerator-keys are implemented using Oliver Scheel's AES enhancer Let'em Fly. So you have to install Let'em Fly, too. Let'em Fly is - similar to MultiDialog - FreeWare and available at least on german ftp-servers (search for ltmf*.*). Refer the LTMF documentation for copy conditions and further information. Though MultiDialog switches Let'em fly automatically of, you'd better switch Let'em fly manually of and save this setting! A dialog which supports shortcuts has additional marks on the accelerator key (depending on the Let'em Fly setting an underlined letter or the letter is printed in a different color). You may use the shortcut letter while pressing the ALTERNATE key to simulate a press on the according button. (When there's no editabe text field in the dialog you won't need the ALTERNATE key. Alertboxes support the function keys F1-F3, too.) Buttons named "Cancel", "Abort", etc. are mapped to the UNDO key, "Help" buttons on the HELP key. You can only use accelerator keys for dialogs which are displayed in the top window just as they are only redrawn if they are in the top window. Known Bugs/Restrictions ------------------------- In the past I didn't know any bugs which really cause a crash, most were just restrictions. But now, I know at least 2 real problems: - The multitasking-enhancement Mag!X 2.XX does not work with MultiDialog. - Some programm which don't call appl_init may irritate MultiDialog. Now, the smaller bugs: - First the ones concerning Singletask-TOS: The Desktop does not use TRAP #2-GEM calls so MultiDialog can't affect the Desktop's dialogboxes. (The Multitasking-Desktop of MultiTOS uses TRAP #2 calls, so it uses MultiDialogs.) MultiDialog can't find out the names of accessories, so auto- switch for accessories is not possible. (AES<4.0 has no possibility to search for processes.) - MultiDialog is aware of MultiTOS, so there's only one bug: MultiDialog uses the appl_search-call to inquire the name of an application; this changes the appl_search counter. So if an application does an appl_search, then a dialog and after that a second appl_search, the second appl_search returns not the expected values, because in the meantime MultiDialog used appl_search, too. - Now the problems you'll have with all TOS-releases: Programs which already use own dialog-handlers (e.g. fly-dials) won't use MultiDialog, because they don't make a FormDo call which MultiDialog needs. Sometimes redraw for the programs window(s) is not possible because MultiDialog has to do the redraw. MultiDialog can only redraw the area which was visible when the MultiDialog-window was opened. Some programs reserve almost any memory which is available. MultiDialog needs some space to put dialogs into windows. The dialogs of that programs won't appear in windows (that application won't run correctly under MultiTOS either)! With MultiDialog you can access the menu-bar even while doing a dialog. But the program can't react to any events, because it's just waiting for the dialog and nothing else: first you have to end the active dialog. (It's the same with the programs window(s) or desktop: you can't work with them until the dialog is ended.) It's not a good idea to start or terminate a program or to change the resolution while a MultiDialog is visible (The first case considers single tasking TOS, the last MultiTOS.). MultiDialog can handle this cases, but to do so it has to end a dialog by force: It ends the dialog by doing as if the user pressed the default-button (which is usually "OK" or "CANCEL") - if no default-button exists it simulates a press of the last button in the object-tree of the dialog (which is usually the "CANCEL"-button). But these buttons might be e.g. a "DELETE ALL/FORMAT HARDDISK/START NUCLEAR-WAR"-button or something similar, so you'd better end any MultiDialogs manually and do then the resolution change or start/terminate a program. The file-selector isn't displayed in a window. (So it still blocks screen output.) Now a really annoying problem :-( If a program makes more FormDial(FMD_START) calls than FormDial(FMD_FINISH) calls "dead" windows remain on the screen. These windows can't be closed or moved - a way to get rid of them is to terminate the program to which they belong. You should choose "FormDial: Normal" and use instead "FormDo: Windosw" if you have this problem. (This is the reason why I've implemented the auto-switch feature - and probably the reason why Atari didn't implement the MultiDialog stuff in MultiTOS!) Note: This behaviour is not a bug in MultiDialog, it's a real bug in the concerning application which should be reported to the developers of this application. Moreover MultiTOS' NEWDESK has exactly this bug: Any dialog which offers the " Skip "-option calls for each file a form_dial(FMD_START) but only one form_dial(FMD_FINISH) at the end. MultiDialog tries to fix this, but this might fail with new MultiTOS releases. (I reported this to Eric Smith, let's hope he fixes it!) If you're using an old MultiTOS (01/15/93) you have to add the entry "OLDMTOS" to the auto-switch list, to inform MultiDialog of this old MultiTOS. How to get rid of that dead windows ? After exiting the concerning program the dead window will be deleted. A method to remove dead window without exiting is the following way: 1. Switch MultiDialog off ("MultiDialog: Aus") 2. Let the concerned program open a dialog once again. Often this dialog catches the dead window. 3. Quit the dialog. Maybe the dead window will be closed, too. 4. Now you can switch on MultiDialog again. In case you encounter any program-crashes in combination with MultiDialog and other resident utilities you may try to change their positions in the AUTO-folder (while testing MULTDIAL.PRG was the last program in my AUTO-folder). Please send bug-reports concerning MultiDialog to the addresses mentioned above (e-mail prefered). Some notes for programmers ---------------------------- First: Don't Panic! Second: MultiDialog bends some vectors using XBRA-structures (the id is "MDIA"). It uses the TRAP #2 (GEM), TRAP #13 (BIOS) and the gem- vector 258 (etv_term). It is suggested to use MultiDialog only in environments which use XBRA-structures for TRAP #2 and etv_term. If available a cookie ("MDIA") is installed. The cookie MDIA points to a longword, which contains MultiDialogs default configuration: The highest bit (#31) is equivalent to the global MultiDialog "On/Off"-button (bit set: on, bit cleared: off). The other bits are not documented and mustn't be changed. The preceding word reflects the bcd-coded version of MultiDialog (e.g. V1.01=$0101, V1.23=$0123). Versions older than 1.01 are indicated by $0000 (due to a bug V1.02 appears as V1.01): IF versionword= $0000 THEN version<1.01 ELSE version=versionword The preceding word contains a bitvector, which shows MultiDialog's abilities (this might differ from the configuration the user has chosen): bit 0: a new form_center is implemented bit 1: form_dial and form_do open a window for dialogs bit 2: form_alert opens a window bit 3: form_do allows to use shortcuts bit 4: dialog-windows may have no NAME and no MOVER (all other bits are reserved) bits set mean that the according ability is implemented. In versions older than 1.01 this word contains $0000 and has to be read as $0007: IF version=$0000 THEN abilities=$0007 ELSE abilities=abilityword summary: word: abilities (version=$0000=>$0007) word: version ($0000=>version<1.01) cookie-jar: MDIA pointer ----> long: default configuration This memory-region has the protection-attribute GLOBAL. For any dialog displayed it needs memory via Malloc for local- variables, the window and quite a lot memory to save the screen for redraw requests (on ST's thats 32KB, but with true-color and bigscreen it can be 0.5MB and more. But it doesn't crash if there's not enough memory it just can't do the redraw or create the window!) (I've to use Malloc's because MultiDialog has to be fully reentrant and supports an infinite amount of dialogs at the same time.) If you want your program to profit from MultiDialog you should use FormDial(FMD_START) at the beginning of a dialog, a FormDo in the middle and FormDial(FMD_FINISH) at the end. Take care that any FormDial(FMD_START) has an corresponding FormDial(FMD_FINISH) - otherwise MultiDialog won't delete it's windows correctly. A dialog-routine should look like that: form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* now suggested */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* now suggested */ wind_update(END_UPDATE) When using special objects which are updated using objc_draw during the dialog you should take the objects real coordinates (e.g. with Objc_offset) as clipping area - not the area you've got from form_center. This is because the user might have moved the dialog out of the clipping area (remember MultiDialog allows to move the dialog - you get fly-dials for free!). Remember: any program, which uses the AES, has to call appl_init first! Otherwise MultiDialog does not catch their calls. Because there are a lot of CPX-modules which don't call appl_init (MultiDialog ignores them) here's ATARI's example CPX initialization: CPXINFO *cpx_init( Xcpb ) XCPB *Xcpb; { xcpb = Xcpb; appl_init(); /* Important! */ if( xcpb->booting ) { ... In contrast to the original AES, MultiDialog needs space on the user-stack. Be sure to provide ca. 0.5 KB free stack before calling AES-functions. Future Extensions ------------------- A Programmers Interface is in development (see the german document PROG_GER.TXT). I want to support the MTOS new window facilities, too. There is a demand for a TOS-like look of alert-boxes. I'm thinking on a VSCR support, too. MultiDialog and Let'em Fly might melt together. It is possible that MultiDialog provides an online-help in dialogs for other applications. Distribution --------------------- MultiDialog must be spread free of any charge. Commercial distribution (e.g. on PD-collections or with commercial programs) is strictly prohibited! So spread MultiDialogs on your local mailboxes. The author makes no warranty, the entire risk is with the user. You can get new versions directly from the author (by sending a formatted disk, a self addressed enveloped and sufficient International Reply Coupons) or maybe via FTP on the german ftp-server ftp.informatik.rwth-aachen.de in the directory pub/atari/mint (may change). It is suggested that non german-users of MultiDialog donate an amount equivalent to US $10 to their local Greenpeace-organisation. Credits: Andreas Alich, Dieter Fiebelkorn, Filipe Martins, Olaf Mootz, Oliver Scheel, Oliver Schildmann dMDIAMultiDialogdUSUӿe[))MultiDialogRK`#F6$H00$oa"0*gp`0G.0*fBC`?/ jN\ORC|\m#ZA&\ L NuH8&I8EZ, BBCI`T2H ЀЁЁЀ T40gDg62+0HA@52H ЀЁЁЀ T2+4JAB% RRC|l2H ЀЁЁЀ T"pUfLNuH<&H<*BCE/IUKZ`2H ЁЀ'BD`b0H>H$ԇԂ43(H"ҁ҂҂ҁ U"p Ug,".އނނއ"U±xf>H"҇ҁ' RD|mRCCn~L"J0HЅ KaHoPHo\p???HR l hNO>J@kP"o`20HЅ Ka2H҅ ЁЀ<H$ԂԆ T!( T?(?(?(4(0raF\OOdLNuH8(Ha$H La&HBC La(H` "K La(HRCg f fp`0LNuH>$H,I(o*o aVJ@fB@`BC JaT&HCXp2H ЀЁЁAaAYkaPCYk4H"ҁ҂҂Aa`6RCCXp2H ЀЁЁAa2H ЀЁЁC Ka2H ЀЁЁA-) Ja"H Ka&H fRC0L|NuH8O/H(I6EUGHk"Kp LaXO7l\7l^HoCB@ LaXO?l?lHWHSp? oa~??//6 yZ hNO6J@kH"J oaX"J ll Pa?,?,?,4,rp Lah\O0H o,"p oa*OLNuH8|g|0R@| b@0;NZh"pjBXnC$- rB@ ma`.C$- rp ma`C$- rp ma~`C$- rp mah` Ta>`  U"hl"Q Ta Ta&0- Ta^?|``  U"hl"Q Tab TaHmHm C TaPO< T0-a?|bBg m hDNTOJ@gjHo p? m hVN\Opa Ta4J@fHo Bg m hVN\Op? m hDNTO` oaH|)f~`|f~` o"U3P"U3h"U?)?)?)4)rB@ Ia\O` TaD`  U"hl"Q Tah Ta TaHmHm C TaPO<`V  U"hl"Q Ta4 Ta0|g Ta"H Ta"`(HmHm C Ta@PO<Hm Hm "U TaPO?|b`,C Ua`?|^`?|^HzLBgHm?Bg?/l?p ?r ?/ m h(NO`Ho p? m hVN\OpaHzHm?Bgp ?r ?/ m h0NOpЭ2-Hjt`tԭ0-H+B Ho Bg m hVN\O`dHSHSCd KaPOHoZ"Kp UaPXO0/\oZlvmzm Cn2`2;A`zmjB@`0;@zm jB@`0:B?Bg?-r ?t ?/ m h$NO6vm mjB@`0H+@ 2Hg0t"m U -"- av U?(?(?(4(rp ap\OHSHo\"K Ka&PO oXg*`h o)dgv odgt o5dfL oajgZ objg U?(?(?(4(rpa\O U?(?(?(4(rp a \O|g02H ЀЁ Up U?(?(?(4(0ra \O0/`gT mB( B@OtL"HA ax Ja/AaП Ja Ja JajLNuH8$H&I*aJ@gp KaZ&Jgl JaJ@fZ Jaa@( Ja(HJg0 JanC/ JaCHAa JaЄ Ja Ja"H K a  JaL8NuH&HB@ Ia &Jk88 Ka: Ka: Ka/ Ka,"0 _a& Kag 0aB@`0a6HJjB@`pLNu/ / $H&IaS@fCY Ka~`B@ Kaj Ja"Ka4&_$_NuB@`R@|mNu/ $H I"JaF$_Nu =fNu` =f"HRH INup`RHR =gfNueNuSHd =f`SHd  g  f  g  fRH"H`"H INu`RHc  g  f`RHc =fc`SH  g  fRH HNuNu// |p"aJ$H` MDIAg>$j fvJCfE XBRAfBC`vJCg |p-a $H` MDIAf j`&$j fvJCfE XBRAfBC`vJCg̑$_&Nu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"SefBJgSf ANuH0$H|g|$bG(rtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"Zp` 3!Zp& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!Z`0123456789abcdefghijklmnopqrstuvwxyz"HJg` INuJg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _Nu/$gSe40HB4 gxH_>"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu|A0|Nu|SHNu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#H瀠>NMPO @$_NuHRHP?< NA\O$_NuH>@NAO $_NuHR??<>NAXO$_NuHR?<NATO$_NuHR?HP?<%Z%v %  @W=@W?W&  % %  %D  WAWWWdW}WU'W&D  WW'W& D  WWWWX U'W&D  XX0'W& &X)p,X-0-.????X;XQXWX]XbUXgX}XUUUXX}XUUUX@X}XUUU@X`XXUUU XXXUUUX XXUUU UUUUUUX;YY YYUXgYXUUUXYXUUUX@YXUUU@Y$`Y:Y>UUU YAY:Y>UUUYV Y:Y>UUU UUUUUU Kostenlose Weitergabe erlaubt, jede Art kommerziellen Vertriebs untersagt! Bei regelmiger Benutzung wird um eine Geldspende gebeten! In der Praxis heit das: MultiDialog gibt's in den Netzen, bei Freunden und direkt beim Autor. (Sorry, aber PD-Hndler mag ich nicht!) Regelmigen Benutzern (aber auch Benutzerinnen) wird dringend nahegelegt, dem Autor eine Geldspende zukommen zu lassen (alles ab 10,- DM ist willkommen). Nur so ist eine Weiterentwicklung und diese Vertriebsform mglich! Meine Bankverbindung: Sparkasse Krefeld BLZ 320 500 00 Konto-Nr.: 80 486 947 Neueste Versionen gibt es per FTP auf ftp.informatik.rwth-aachen.de, in der Maus KR2 und natrlich direkt beim Autor. (Letzteres nur gegen Zusendung eines frankierten Rckumschlags, einer formatierten Diskette und Angabe der bisherigen Version.) Was macht das Programm? MultiDialog verfrachtet so ziemlich jeden GEM-Standarddialog in ein Fenster! Installation: Kopieren Sie MULTDIAL.PRG in den AUTO-Ordner! (Wenn Sie MultiDialog konfigurieren mchten, kopieren Sie MULTDIAL.CPX in ihr XCONTROL-CPX-Verzeichnis.) Erklrung der mglichen Einstellungen: - MultiDialog: Hiermit kann MultiDialog komplett an- oder ausgeschaltet werden, es bleibt aber installiert! - FormCenter: Position, an der die Dialogboxen er- scheinen: Immer in der Mitte, beim 1. Malin der Mitte, an der Mausposition, in der Ecke oben links. - FormDial: Dialoge, die mit 'FormDial' angekndigt werden, erscheinen in Fenstern. - FormDo: Dialoge, die nur mit 'FormDo' arbeiten, erscheinen in Fenstern. - FormAlert: Alertboxen erscheinen in Fenstern. - ObjcDraw bei FormDo: Diese Einstellungen hat nur Bedeutung, wenn 'FormDo: Fenster' eingestellt ist, da dann das Fenster nachtrglich geffnetwird; Hierbei mu dann evtl. der Inhalt neu gezeichnet werden: das geschieht bei 'Ja', bei 'Nein' unterbleibt dies. - Fenstertitel: Sollen die Dialogfenster eine Titelleistebesitzen ? Bei 'Nein' fehlt der Titel- und Bewegungsbalken; das Fenster kann be-wegt werden, indem man mit der Maus auf den Dialog-Hintergrund klickt und es dannmit gedrckter Maustaste verschiebt. - Tastenkrzel: Schaltet die Verwendung von Tastatur- shortcuts, die ber ALTERNATE und die entsprechende Taste bedient werden, an. Mit 'Neu' knnen fr Programme, die eine Sonderbehandlung bentigen, eigene Ein- stellungen festgelegt werden. Hierzu ist der Programmname einzugeben, es wird dannfr dieses Programm die jeweilige Einstellung verwendet. 'Lschen' entfernt ein Programm aus der Ausnahmeliste, so da fr dieses wieder die Default-Einstellung verwendet wird. Der aktuell bearbeitete Eintrag ist linksneben 'Neu' angegeben. Er kann durch Mauslick gewhlt werden. Ein Doppelclick macht den Default-Eintrag aktuell. Mit 'Sichern' lassen sich die Einstel- lungen abspeichern. 'Abbruch' verwirft die letzte nderung. Bug-Reports an den Autor, der im Internet und per Post ber obige Adressen zu erreichen ist. Distribution free of charge welcome, any commercial distribution prohibited! So you'll get MultiDialog from the networks, friends or directly from the author. It is suggested that non german-users of MultiDialog donate an amount equivalant to US $10 to their local Greenpeace organisation. You can get new versions via FTP on the german ftp-server ftp.informatik.rwth-aachen.de, via uuencoded e-mail (send mail-request to the author) or via snail-mail. (by sending a formatted disk, a self addressed envelope and sufficient International Reply Coupons and your current MultiDialog version-number.) What does MultiDialog? MultiDialog puts nearly any GEM-dialog box into a GEM-window! Installation: Copy MULTDIAL.PRG into your AUTO-folder! (If you want to configure MultiDialog, you have to copy MULTDIAL.CPX into your XCONTROL CPX-folder.) Explanation of the available switches: - MultiDialog: Use this popup menu to switch MultiDialogon or off. (In both cases it remains installed.) - FormCenter: Position where dialog boxes are placed: Always in the center of the screen, only at the first time in the center, at the upper left corner or at the mouse pointer's position. - FormDial: Dialogs which are announced using 'FormDial' are placed into windows. - FormDo: Place dialogs which use 'FormDo' only in windows. - FormAlert: Put alert boxes into windows. - ObjcDraw on FormDo: This switch is only relevant when 'FormDo: Window' is chosen, in this case the window is opened afterwards; at this point the dialog possibly has to be drawnonce more; this happens when choosing 'Yes'. - Window titles: Shall the dialog windows have a titelbar?With 'No' the titel and move bar is is missing; in order to move a dialog window you have to click at the background of a dialog box and drag it. - Shortcuts: Switches accelerator keys via ALTERNATE and corresponding key on or off. The 'New' button is used to create new entries in the auto-switch list. You can type in the name of the application, MultiDialog uses the configuration you have chosen for that application. Use 'Delete' to remove an entry from the auto-switch list. The current entry is shown on the left side of the 'New' button. The current entry can be chosen by clicking on it. A doubleclick selects the default entry. 'Save' saves the configuration you have made. 'Cancel' abandons the last change. Please send bug-reports to the addresses mentioned above. (e-mail preferred) YsY{YYYsY{YY MultiDialog Vx.xx12345678________FFFFFFFFInfo12345678901234567890von Helmut Neukirchen nur fr Bnnersdyk 63-Tester! D-47803 Krefeld e-mail: hn@pool.informatik.rwth-aachen.de(c) 1992-93 Alle Rechte vorbehalten.(c) 1992-93 All Rights reserved.D-47803 Krefeld (Germany)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXCPX-Routinenvon DieterFiebelkorn1234567NeuLschenSichernOKAbbruchMultiDialogMultiDialog ist nichtinstalliert!Starten Sie MULTDIAL.PRGdazu entweder jetztoder per AUTO-Ordner.MultiDialog wird bereitskonfiguriert!MultiDialog is notinstalled!Start MULTDIAL.PRGeither now orvia AUTO-folder.One config-dialogis enough! FormCenter ImmerMitteMausEcke FormDial FensterNormal FormDo FormAlert ObjcDraw bei FormDo JaNein Fenstertitel Tastenkrzel AlwaysCenterMouseCornerWindow ObjcDraw on FormDo YesNo Window titles Shortcuts Default On Off An Aus a:\auto\multdial.inf byDeleteNewSaveCancelMultiDialog12345678=00000000 Default kDkbklmm$J~ $zPLn ~\vX$FD(6*@z&F202:& ~n :$\20 00`H0H0HHHH                 (^`Fn`:V1.03PatchMe:NEWDESK &NEWDESK &NEWDESK 'NEWDESK NEWDESK %NEWDESK 'NEWDESK )NEWDESK NEWDESK #NEWDESK &NEWDESK NEWDESK %NEWDESK $NEWDESK 'NEWDESK 'NEWDESK $NEWDESK &NEWDESK ' XBRAMDIA|g/:Nug/:Nu0< gP0</,A,V VkgJ V*g V3g V2g V6gD Vg V4g Vg,_/:Nu0</:Nu/ab|gdat,@g, n4g$a, -_TH?-o=W/|Ns ,A,n Vg$ Vg Vg Vg,_/:Nu ,_/:NuNn-o=o,_/|TNs,A,n Vg Vg,_/:Nu/a :jl,A,n0.a,@g6 nkg ng`$ah -_TH?-o=W/|4NsNn -o=o,_/|bNs ,_/:PNu/a0aJ,@g$a -_TH?-o=W/|Ns ,_/:Nu/aa,@g2 n3g :jFa -_TH?-o=W/|jNs :jNn -o=o,_/|pNs ,_/:Nu/a| J jNn-o=o,_/|FNs,_/:jNu/aJ J jNn-o=o,_/|*Ns,_/:8Nu/a,A,n0.a(,@g( nrg -_TH?-o=W/| Ns ,_/:Nu/a,A,n0.a,@g$a -_TH?-o=W/| Ns,A,n0gNn -o=o,_/|8Ns ,_/:vNu XBRAMDIAgX O fJ/<6`D]/H><`6]/H><4`(]/H><k`]/H><3` ]/H><2Hz ?<&NN\Jy f/<?<HNA\`?<#/<?<DNAPJg,@A,"N <L ~H ~L ~H ~ C@Qa=G z-H -|# g!N`# B9 o h=h z-PJy gHH/--nB@a&*nBL0LDE@A@A$ ļL<gFnGn|L FGBmnCmjJnfd`HFHG*V-nB@a&|*nBL0LDE@Aa@AL FGznzn `<:n`>:na`P$ ļ|g|g.L0<>adFf,Gf( n *h :H+n`4LF|| n *h :H+n@A*nBH`DEDENuzmzmNu<:`>:` n "h-I"hJQg Qg`"h-Qj` aJgBjLDNB`R|a( N.(jg,`d h 0.gH MDIAg0 zp"|g MDIAg I`"H h`A `hf ` h `  @fB9 Nu n "h-I n "h=Q=iXL"h-Q-| a$0.nrg4JCgJDg`-|a$L0.ra n "h 2`-n@=n=nHa$ n "h 2` n "h-Iadga &ff n "h*Q"h:-M=EHz?<&NN\Jy f/<?<HNA\`?<#/<?<DNAPJg-@A"@ <2Qa# .-@ na n(h-L , H@|zH@)@ !9Q9|t"llB9|"lB9|"lB9|"lB9|"lB na 0g* 1f9`4 2f!`& 3f Q`0,X9@p9@9@9@9@a~K`"m $Iag ag`B2 4;BAd>Kx"m $Iabg avg`B2 4;BAd>K"m $Ia.g aBgh`B2 4;BAd>K"m $Iag ag6`B2 4;BAd>K"m $Iag ag`B2 4;BAd>RGa|zK"m $Iag ag`B2 |dr40.@@;B<zK "m $IaHg a\gH`B2 |dr40.@@;BAzK "m $Iag ag`B2 |dr40.@@;BAEXF0.<f`<f`<f `Nq ndl0.lpFe8`89D2FA@9Al@@9Al@@9A||#|$|%(n-L@)zjaV-n-n=|aL=|aB=|-n-na&(n-L@-|-n-na n Pe =|a=|a(n-L@=|a(n#0.| f0<`| f0<` | f0< n "h 2 n Pe =|a=|-n-nal=|ah=|a^/.?<INA\` FLDNB` 6 [fNu |gNu |gpNuR<|Nu ]gNu ]gpNuR<]Nu(HHHrrhh$ ( /HVdr'''' ' : I%X h  h 123456789012345678901234567890123456789123456789012345678901234567890123456789123456789012345678901234567890123456789123456789012345678901234567890123456789123456789012345678901234567890123456789123456789012341234567890123412345678901234??_o/7  ?`?@|>|>;\:l6/7 `` 7o;=|>?` ??7?o?????o?7? ?`|>=;o7 `` 7o 2e2e2e22 2}2}}}o7 ` :` :` :` :2` :`NqHABA"0<NBLNu$"H0(S@.ߑ(Y?a0QNu.$Lvx|p:4k Cc68T@QKz,HF0HHA:Q<, g8 g2 g,߬ g" g  g&l ߛ g gߛߓ, fI&JGHcpNu|a N>(g<`d h 0.gH MDIAg0 z"|g MDIAg I`"H h`A `hf ` h `  @fB9 0Nu n "h-Iag,al.. n hKP6"gtH0HBz械hf H@HHAz愰hfHa LHgf g nkg ng`afFa.. n hGhn,HGGhn a g/ah =|nf=| nBnp n "hL H=|=nnaLHt-|arL nvo0.n| g=|n`LtH=nna&=nrkxa=nr=|| zAz-Ha=nrLtHaJnf =nra`,a4=|3=| n "h 2/.DLNua=|rLDNB``-|aLH -|aga@=nAp 0Q0aJng=|a8.=DL =B=C=||H„=BԂJy fJy f/?<HNA\`?</?<DNAP`?</?<DNAPJgb-@-|=|A-HA-HL aHprL alH=|aXa=|aJ`aNu n3fn n "h-IJnrkZa=nra0=nra,=|ravJg/.?<INA\ah n "h 2=|k`LDNB n2g` n "h0H瀂LDNBLA"h JQgT @fRn`F @g @fRn`2 @g @fSn` @fSnNqJnf Jnf nkfl nnb nnXJjfP`NqaXg0.h0.h .jgBj!@j/.?.A/HLHY`/.DLNu|a^ N h 0.gH MDIAg0 z"|g MDIAg I`"H h`A `hf ` h `  @B9 Nua N|~hh h 0.gH MDIAg0 z:"|g MDIAg I`"H h`A `hf ` h `  @f=Ff=GhB9 =|`aJF_=|`aJG_Nu<.f>.hBnfBnh=|`aJF_=|`aJG_Nu n "h-I n3g*a4f a \ fLDNB`/a  n "h-QB"h=QF n3g<=|nf=|n*nBL-M@aH=|pL 02LFG@A@AH0H =|=nnaLHt-|aL nvo0.n| g =|n`tLtH=nnaL=nrkha=nr=||izAu-Ha@=nrLtHaJnf =nra`=|2=|a f=|`a>LDNB`*nB-M@L0aH0LL 02BC@A@AHF<HFHG>HGLtH=|=nnaLBnBCn>@mAmBCFG@nAn`LHF@HGAHHG8HF642`D=nra"=|=nnHa*LHt=nrHa=|` 0.r=|=|-nBa=| .izg=nr=||izAu-Haaxg*=nr=| a0.nrg=nr=| aa=@H=|J=|LBnBna Z g8=|-| aB0.nrf=|a: nBa=|a(0.HgnJg=@J=|Ha =|-|-|-|-|-|-|-|=|AN-H@a2=n^-n`=nd._g0.H@0.H@Jng*aJAg"-nB@=A=|a,=nHJng-nB@=nJ=nH=@a=nHJng0.g&-nB@=nJ=@=nL=|a=nL._g-nB@=|=|-n`ax0.=@H|ff=|HJnpfa怰gg?<?<?<NM\`LL`LtH=|=nna nBL0LDE@Aa^@AH/.-|a>=|=nnL H a4La H a 0.f-_La8:H-n=|=nna La$ " ļ悴f-A-@ .t-@a r .".HtH=nr=|a DE nBH`$-nB@>.H=G=nda =nHJng(nB04xf|AfJnpf>< n Pe=|a =Ga L0xH0-ntL D|ESCHa Jng^ .-@-@t".x-A=nr=|a =|=nn=nra nBL hhBC!nhh n Pe =|a 6`=|a *`Nq._g@0.N|fn0.Tnrg`b .V-@-@t".Z-A=nr=|a =|=nn=nra  nBL hhBC!nhh`0.N|(g|fl0.Tnrg`a&`-| a 0.nrga`=nr=| a za~Jng=|a l nBa 6=|a ZNu0.N|f0.TJnfnrgh0.TLV=|=|-nBa0.TnrfaJng2-| a 0.nrf=|a nBa =|a =|`0.N|)f( MDIAgNAa`*** MultiDialog *** Error: ACC block lost *** PROCESS HALTED *** d=n=|AN-H@a nBr0(f2ARAgASA0(( fffJAb2< n "h 2<.f>.h=|`a JFW=|`a JGW n hg=nra =nra =|rJg/.?<INA\a `h0.N|2f`$0.N| f aJg-@@=nT=|a`T0.N|f`F0.N|f40.Tnrf0a:Jng=|a ( nBa=|a `0.NNq0.HgDnJg>-| a0.nrf(-nB@=nJ=|=nL=|ad=|L`-nB@=nJ=|=nL=|a8=nL n2fJ=nran=nraj=|raJg/.?<INA\a n "h 2H=|k`a n "h 2H/.DLNu>H|=|aL H=G=| aLHJBgJCgACa^J@gA|CaLJ@gnrf$-n@=n=nLHa`fJg`-|=|A-HA-HLL0 DEa0HLa H=|a a=|a=G=| aLH`$=|aNuaJnJga=|a-| a0.nrfr0.J*nB2.L Ag<4 u PIB-M@=@=|=nL=|a*=nL`$-M@=@=|=|=|a=nL=|aXNu*nB-M@<.J=FaLL`[A| WB\D0.r=|=|-MaNuH n0 @dF hgJhfJ@f :L?JNuzA-H@A -HDaE J fS \g :ge`"JRfAg<.g`<A~RG f|dA<DF^F QA-H@a0.|g0 nhfA `ZAjCf>< `FAg`A-H@aT0.|g nhfA ``K(M&zܰ g*=$zܨ, ܫ J"Lag "Fae `af` :z Jj6.IX&zd g&$z`, ܫ J"La>g "FaLe ``.|a N h4f| h 0.gH MDIAg0 z"|g MDIAg I`"H h`A `hf ` h `  @fB9 JFj L?JNu n>(=|A-H@a ngB=|A-H@ang*=|A-H@a nfng `z~`A~RG  gJfzCaAp fQzAa`X<=gg ANue&< fe<=f < f ( fRRNuptk0<0e*<9c<Ae<Ed< <QDNuDNut<<0<9c<QNuAlANu0h2ia80(h2)ia:02a40(2)a6Bo CoHNAX zCafa6f# B. Nu??<>NAX :g /?<INA\ :*мJy f /?<HNA\`?<#/?<DNAP# gN,@A# | -E-z̎Cp z̄0< a: :ra  "zj-H-IB. Nu# # NuSQNu 8g @rR g MDIAgxP`/J@g, yKf"gHz.?< NA\Hz?< NA\BgNAByKfR3K yKgHz/<"NMP#Hz/<NMP#Hzb/<-NMP#Ba yKg`Hz?< NA\?</<;X?<1NA~/ Nu :0`D ::`> :8`8 :6`2 :<`, ::`& :H` :F` :D` :R` :P` :j`NqHABA"0<NBLNuBrABCCE p MultiDialog V1.03 vom 21.12.1993 q installiert. Helmut Neukirchen 1992-93, alle Rechte vorbehalten. MultiDialog V1.03 konnte nicht installiert werden! Es ist bereits eine Version von MultiDialog installiert!C:\AUTO\MultDial.INF MultiDialogDefault (@@$ (%  B   $     , H    d " 3     F\]^ij kyz{ ,)>?,@ MultiDialog Vx.xxBenutzen Sie MULTDIAL.CPXzur Konfiguration!Use MULTDIAL.CPXfor configuration!von Helmut Neukirchen nur fr Bnnersdyk 63-Tester! D-47803 Krefeld Das komplette MultiDialog (mdial*.zip) ist in der MAUS KR2 erhltlich.The complete MultiDialog (mdial*.zip) isavailable on ftp.informatik.rwth-aachen.de.` ``! !! ArڲqB"&ʉB""DEDMC5LxBP"NL&j  Tfp&D:@^D" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Vorab Allen Programmierern, denen die derzeitige Zusammenarbeit mit dem residenten Fensterdialog-Treiber MultiDialog (im folgenden MD genannt) zu unflexibel und zu Speicherintensiv ist, sollte durch die folgende Programmierschnittstelle geholfen sein! Es ist vorgesehen, die Aufrufe ber selbstdefinierte AES-calls durchzufhren. Dazu sollen die Nummern 240-249 verwendet werden. Mir ist natrlich klar, da es ein Risiko bedeutet, neue AES-calls einzurichten, aber es gibt mehrere Grnde, die mich zu diesem Entschlu fhrten: 1. Passen die Aufrufe von der Funktion her in die AES. 2. MD bentigt den AESPB der aufrufenden Applikation; fr beide Seiten drfte hier ein AES-call am bequemsten sein. 3. Ich mu lediglich den Trap #2-Dispatcher von MD erweitern. 4. Hat mir Eric Smith zwar nicht versichern knnen, da die Nummern 240-249 nicht fr andere Zwecke verwendet werden, allerdings hlt er es fr unwahrscheinlich. 5. Haben gerade MiNT und NVDI gezeigt, da es sinnvoll sein kann, das TOS um neue Aufrufe zu erweitern. Sollten trotz alledem Bedenken vorliegen, weil z.B. die Calls bereits anderweitig belegt sind, oder jemand bessere Ideen hat, so mge man mir das mitteilen. Nun jedoch in medias res: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Philosophie Ziel beim Entwurf der Programmierschnittstelle war es, das gewohnte Dialog-Handling beizubehalten, damit bei nicht aktiviertem MultiDialog keine vllig anderen Routinen zum Einsatz kommen mssen. D.h. die eigentliche Dialogbehandlung wird weiterhin ber form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* wird neuerdings gefordert */ wind_update(END_UPDATE) durchgefhrt. Zustzlich gibt es dann aber Aufrufe, um eigene Redraw-Handler Fenstertitel, etc. zu setzen, die dann vor Beginn der Dialog- Behandlung aufgerufen werden mssen. Hierbei kommen teilweise sogenannte Callback-Routinen zum Einsatz (s.u.). Abweichend vom Prinzip, die originale form_do-Routine aufzurufen, gibt es auerdem eine erweiterte form_do-Routine, die z.B. nicht-modale Dialoge (d.h. Fenster-Dialoge, auf die eine Applikation nicht warten mu) ermglicht. Programmiersprachen, die keine Callback-Routinen ermglichen (z.B. BASIC), sind ebenfalls auf diesen Aufruf angewiesen (hierbei mu man dann allerdings bei nicht aktiviertem MD auf ein anderes Dialoghandling ausweichen). Fr die Programmierschnittstelle existieren folgende Aufrufe, die mglichst in Anlehnung an die bestehenden AES wind_xxxxxx-Aufrufe gehalten wurden: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Neue Aufrufe Die Funktionen drfen nur aufgerufen werden, wenn ber den MDIA-Cookie und das Fhigkeiten-Wort festgestellt wurde, da ein MultiDialog installiert ist, das eine Programmierschnittstelle besitzt. int md_installed(); /* 0: MultiDialog nicht installiert; sonst: Installiert */ int mdprog_available(); /* 0: Programmierschnittstelle nicht vorhanden, sonst: Vorhanden */ (Dieser Aufruf ist kein AES-Aufruf, sondern bedient sich des MD-Cookies. Beispiel-Algorithmus hierfr wird nachgereicht!) Der Rckgabewert der Funktionen ist bei den kritischen Aufrufen unbedingt zu beachten. In vielen Fllen sind die Funktionen nur fr bereits geffnete Dialogfenster oder aktiviertes MultiDialog definiert! int mdial_create(void *md_credraw, int md_cresvd1, int md_cresvd2) Bereitet modifizierbaren Dialog vor und liefert dazu ein Dialoghandle zurck. Wenn MultiDialog installiert und nicht abgeschaltet ist, wird dieser Aufruf unabhngig von evtl. Benutzer-Einstellungen so interpretiert, da ein Dialog-Fenster bei FormDo geffnet werden soll! (Was allerdings nicht heit, da die weiteren Aufrufe alle erfolgreich sind.) Ergebnis: <0: Fehler (z.B. MultiDialog abgeschaltet), >0: Dialoghandle md_credraw: 0: Bildschirm puffern; !=0: Bildschirm nicht puffern, md_credraw als Zeiger auf Callback-Redraw-Routine md_cresvd1, md_cresvd2: reserviert, auf 0 setzen! int mdial_delete(int md_dhandle) Entfernt modifizierte Einstellungen, die zum Dialoghandle md_dhandle gehren. Ergebnis: 0: Fehler (z.B. ungltiges Handle) int mdial_get(int md_ghandle, int md_gfield, int *md_gw1, int *md_gw2, int *md_gw3, int *md_gw4) Liefert je nach Funktionsnummer verschiedene Information ber einen von MultiDialog abgefangenen Dialog. Ergebnis: 0: Fehler (z.B. ungltiges Handle, nicht definiertes md_gfield, aber auch evtl. wenn gar kein Dialogfenster geffnet ist!) md_ghandle: Handle des gewnschten Dialoges (in einigen Fllen kann hier auch 0 angegeben werden, wenn es sich nmlich um Aufrufe handelt, die nicht auf einem speziellen Dialog arbeiten.) md_gfield: Gewnschte Information, die Bedeutung der weiteren Parameter hngt davon ab: (Die Parameter md_gw1-4, die z.Z. bei den jeweiligen Funktionen noch nicht definiert sind, knnen in Zukunft eine Bedeutung bekommen. Deshalb darf man sich nicht darauf verlassen, da diese nicht verndert werden!) MF_VERSION (0): liefert Informationen ber die MultiDialog-Version md_gw1: Versionsnummer, BCD-kodiert ($0123=V1.23) md_gw2: Beta-Flag, Patchlevel md_gw3: Versionsdatum, GEMDOS-Format md_gw4: reserviert MF_GLOBONOFF (1): liefert globalen An/Aus-Schalter zurck md_gw1: 0: MD vom Benutzer abgeschaltet, 1: MD aktiviert MF_WKIND (40): Liefert von MultiDialog untersttzte Fensterkomponenten. md_gw1: Bitvektor, wie wi_crkind bei wind_create(wi_crkind,...) MF_WCURRXYWH (41): Gesamtgre und Position des Dialogfensters (nur fr geffnetes Dialogfenster definiert, sonst gibt es eine Fehler.) md_gw1: x md_gw2: y md_gw3: w md_gw4: h MF_WHANDLE (42): Liefert Fenster-Handle des Dialogfensters (nur fr geffnetes Dialogfenster definiert, sonst gibt es eine Fehler.) Nach Mglichkeit sollte man dieses Handle nur fr Ausknfte verwenden. Man sollte ber dieses Handle auf keinen Fall, den Zustand eines Dialogfensters (z.B. per wind_set) verndern, sondern entsprechende mdial_xxxx-Aufrufe verwenden. md_gw1: Fensterhandle MF_WISONTOP (43): Liefert zurck, ob Dialogfenster oberstes Fenster ist (nur fr geffnetes Dialogfenster definiert, sonst gibt es eine Fehler.) md_gw1: 1: Fenster ist oberstes Fenster, 0: Fenster ist nicht oberstes int mdial_set(int md_shandle, int md_sfield, int md_sw1, int md_sw2, int md_sw3, int md_sw4) Setzt je nach Funktionsnummer verschiedene Parameter fr einen Dialog. Ergebnis: 0: Fehler (z.B. ungltiges Handle, nicht definiertes md_gfield, aber evtl. auch wenn gar kein Dialogfenster geffnet ist!) md_shandle: Handle des gewnschten Dialoges (0=neuester) md_sfield: Gewnschte Information, die Bedeutung der weiteren Parameter hngt davon ab: (z.Z. noch nicht definierte Parameter md1-4 sind auf 0 zu setzen!) MF_GLOBONOFF (1): Schaltet MD global an/aus (Nach Mglichkeit nicht verwenden, diese Wahl sollte man dem Benutzer berlassen! Wenn Aufrufe gemacht werden sollen, die von MD nicht abgefangen werden sollen, ist zunchst die Frage zu beantworten, warum sie nicht abgefangen werden sollen. Die einzigen Situationen, die mir hier einfallen, sind solche, die man besser nicht ber Dialogroutinen, sondern ber richtige Fensterfunktionen abwickelt.) md_sw1: 0: MD abgeschalten, 1: MD aktivieren MF_REDRAWTYPE (20): Setzt von MD anzuwendendes Redrawverfahren md_sw1: 0: MultiDialog puffert den gesamten Bildschirm und erfllt damit Redraw-Anforderungen 1: MultiDialog erledigt nur den Redraw fr MultiDialoge, alle anderen Fenster werden von Applikation redrawt, so da der Bildschirm nicht gerettet werden mu, was einiges an Speicher spart. MF_EVNTTIMER (23): Sorgt dafr, da bei MultiDialogs evnt_multi-Aufruf auerdem auf einen Timer-Event gewartet wird (der dann selbst ausgewertet werden sollte. Ist keine PRE/POST-EVENT-Callbackroutine installiert, so wird der Dialog mit Rckgabewert md_sw3 abgebrochen.). Ntzlich fr Info-Boxen, die nach einiger Zeit von selbst verschwinden sollen, aber den Bildschirm nicht blockieren. (Es ist zu beachten, da - falls form_do nicht durch den Timer-Event beendet wurde - nach verlassen von form_do noch ein Timer-Event auftreten kann, falls die Applikation dann z.B. per evnt_multi auf einen solchen wartet!) md_sw1: wie ev_tlocount bei evnt_timer md_sw2: wie ev_thicount bei evnt_timer md_sw3: Rckgabewert, falls form_do durch den Timer beendet wird MF_CALLBACKSTYLE (25): Setzt Parameterbergabe-Konvention fr Callback md_sw1: 0: cdecl-style (Standard C) Default-Einstellung! (1: pascal-style (Pascal)) derzeit nicht untersttzt, Rckgabewert beachten! MF_CBREDRAW (26): Setzt Zeiger auf Callback-Routine fr Fenster-Redraw (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_CBPREEV (27): Setzt Zeiger auf Callback-Routine fr externe Event- Verarbeitung, bevor MultiDialog die Events auswertet (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_CBPOSTEV (28): Setzt Zeiger auf Callback-Routine fr externe Event- Verarbeitung, nachdem MultiDialog die Events ausgewertet hat (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_CBFORMKEYBD (29): Setzt Zeiger auf Callback-Routine fr externe form_keybd()-Routine (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_CBFORMBUTTON (30): Setzt Zeiger auf Callback-Routine fr externe form_button()-Routine (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_CBOBJCEDIT (31): Setzt Zeiger auf Callback-Routine fr externe objc_edit()-Routine (Default: 0, d.h. nicht aufrufen) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_WNAME (50): Setzt Fensternamen (Default: MultiDialog: ) md_sw1: High-Word des Zeigers md_sw2: Low-Word des Zeigers MF_WADDKIND (52): Fgt Fensterkomponenten hinzu md_sw1: Bitvektor, wie wi_crkind bei wind_create(wi_crkind,...) md_sw2: Return-Wert fr form_do, wenn ein WM_CLOSED-Event auftritt. (0: WM_CLOSED nicht auswerten) MF_WREMKIND (53): Entfernt Fensterkomponenten md_sw1: Bitvektor, wie wi_crkind bei wind_create(wi_crkind,...) int mdial_xformdo(int md_xdohandle, OBJECT *md_xdotree, int *md_xdostartob, int *md_xdopbuff) Fhrt Fensterdialog-Verwaltung durch. Bricht ab, falls ein EXIT-Objekt gewhlt wurde oder wenn ein Event aufgetreten ist, den MD nicht verarbeiten kann. Ergebnis: -1: Event aufgetreten, der md_xdopbuff zu entnehmen ist, sonst: angeklicktes Objekt. md_xdohandle: Dialoghandle, um Dialog zu bestimmen, auf den mdial_xformdo angewandt werden soll. md_xdotree: Zeiger auf Objektbaum des Dialogs md_xdostartob: Zeiger, der auf die Nummer des zu editierendes EDIT-Objekt zeigt. Bei einem Wert von 0 sucht sich die Routine das erste EDIT-Objekt und setzt den Cursor ans Zeilenende (wenn ein EDIT-Objekt berhaupt existiert), jeder andere Wert wird als Objektnummer aufgefasst, wobei der Cursor bei erneutem Aufruf an seiner vorherigen Position stehen bleibt. ber diesen Zeiger bekommt der Aufrufer auch mitgeteilt, welches Objekt momentan den Cursor besitzt (0: kein EDIT-Objekt vorhanden). md_xdopbuff: Zeiger auf einen Messagepuffer. Falls mdial_xformdo -1 zurckliefert, ist die dort enthaltene Nachricht auszuwerten. Hierbei handelt es sich um die blichen AES-Nachrichten. Hierber knnen auch Nachrichten an mdial_xformdo bergeben werden. Jeder Nachricht ungleich Null wird beim Aufruf von mdial_xformdo als erstes ausgewertet. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Callback-Routinen Bisher wurde immer von Callback-Routinen geredet, was ist damit berhaupt gemeint ? Nun, wenn eine Applikation whrend eines von MultiDialog abgefangenen Dialoges z.B. den Redraw der eigenen Fenster bernehmen soll, so mu MultiDialog die Redraw-Routine der Applikation aufrufen knnen. Dazu bergibt die Applikation vor dem ffnen des Dialogfensters einen Zeiger auf eine solche Funktion. Dieses Verfahren nennt man Callback. (es wird z.B. auch bei CPX-Modulen angewandt.) Da diesen Callback-Routinen auch noch Parameter bergeben werden, ist es ntig, festzulegen, auf welche Art das geschieht: z.Z. ist nur - Standard C (d.h. ber den Stack) mglich. Vorgesehen ist aber auch - Pascal - Assembler bzw. PureC Die Funktionen knnen auch Werte zurckliefern. Dabei handelt es sich um 16-Bit Integerwerte, die in D0 zurckgeliefert werden. Mglich sind zur Zeit folgende Callback-Funktionen: - Redraw: Zeiger auf eine Routine, die den Redraw der Fenster der Applikation erledigt. Es wird ein Zeiger auf den Message-Puffer mit der Redraw-Nachricht bergeben: int redraw(int *evnt_mesag) Der Rckgabewert hat z.Z. noch keine Bedeutung und ist auf 0 zu setzen. - PreEvent: Zeiger auf eine Routine, die die Events, die MultiDialog bei evnt_multi erhalten hat, auswerten kann. Dieser Routine wird ein Zeiger auf den Message-Puffer bergeben. Sie wird aufgerufen, bevor MultiDialog seine Events verarbeitet hat. Es mu zurckgegeben werden, ob MultiDialog diesen Event ebenfalls auswerten soll. (Dabei benutzt MultiDialog denselben Message-Puffer, so da dieser auch von der PreEvent-Routine modifiziert werden kann. Nachrichten, die MultiDialog nicht versteht, werden ignoriert). Eine 0 als Rckgabewert bedeutet dabei, da der Event weiterverarbeitet werden soll, eine -1 veranlat MultiDialog, diesen Event zu ignorieren. Jeder andere Wert bricht die Dialogverarbeitung ab und wird als FormDo-Rckgabewert zurckgeliefert (die Werte 0 und -1 sind also an dieser Stelle nicht mglich). int pre_event(int *evnt_mesag) - PostEvent: Zeiger auf eine Routine, die die Events, die MultiDialog bei evnt_multi erhalten hat, auswerten kann. Dieser Routine wird ein Zeiger auf den Message-Puffer bergeben. Sie wird aufgerufen, nachdem MultiDialog seine Events verarbeitet hat. Es mu zurckgegeben werden, ob MultiDialog den Dialog abbrechen soll. Eine 0 bedeutet dabei, da MultiDialog weiterarbeiten soll, jeder andere Wert veranlat MultiDialog, den Dialog abzubrechen und als Rckgabewert fr FormDo just diesen Wert zu verwenden (der Wert 0 ist an dieser Stelle also nicht mglich). int post_event(int *evnt_mesag) Falls das nicht reicht, kann man ausserdem eigene form_keybd, form_button und objc_edit Routinen installieren, die dann von MultiDialog verwendet werden: - FormKeybd: Setzt Zeiger auf eine Routine, die statt der GEM form_keybd()-Routine von MultiDialog verwendet werden soll. int form_keybd(OBJECT *fo_ktree, int fo_kobject, int fo_kobnext, int fo_kchar, int *fo_knxtobjct, int *fo_knxtchar) - FormButton: Wie FormKeybd nur fr form_button. int form_button(OBJECT *fo_btree, int fo_bobject, int fo_bclicks, int *fo_bnxtobj) - ObjcEdit: Weil's so schn war auch fr objc_edit. int objc_edit(OBJECT *ob_edtree, int ob_edobject, int ob_edchar, int *ob_edidx, int ob_edkind) In den jeweiligen Routinen sollte man kein allzugroen Faxen machen, sondern relativ schnell zur Sache kommen. Die Redraw-Routine ist fr's Redraw da, und fr nichts anderes! Ebenso sollte man z.B. in einer Event-Routine auch keine neuen Dialoge starten, stattdessen sollte man MultiDialog veranlassen, die FormDo-Routine zu beenden und dann erst z.B. den neuen Dialog starten. (Fr nicht-modale Dialoge ist mdial_xformdo da!) Da MultiDialog (z.Z. nur bedingt) reentrant ist, darf man aus den Callback-Routinen heraus beliebige GEM-Aufrufe starten. Die Bedingtheit von MultiDialog's Reentrance uert sich darin, da MultiDialog einige AES-Aufrufe, die aus den Callback-Funktionen stammen, nicht abfngt, sondern direkt ans AES weiterleitet (nmlich die, die von MD abgefangen werden)! Die mdial_set/get-Routinen knnen aber auf jeden Fall aufgerufen werden! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> einige Beispiele Ein Bild sagt mehr als tausend Worte: Deshalb sind an dieser Stelle einige Beispiel-Quelltexte (lauffhig unter Pseudo-C 1.1 ;-) abgedruckt. 1. Beispiel: Es soll ein Dialog garantiert von MultiDialog abgefangen werden und einen eigenen Fenstertitel sowie einen CLOSER, der ABBRUCH zurckliefert, besitzen: #define ABBRUCH 21 /* BUTTON in Baum DIALOG */ int dhandle; /* Variable fr Dialoghandle */ char *wname=" Fenster-Dialog "; /* Zeiger auf Fenster-Titel */ if mdprog_available() /* mdial_xxxx-Aufrufe erlaubt ? */ dhandle=mdial_create(NULL, 0, 0); /* Dialog anmelden, kein Redraw-Callback */ else dhandle=-1; /* Merken, da mdial_xxxx-Aufrufe nicht erlaubt sind */ if dhandle>0 /* mdial_create erfolgreich ? */ { /* Fenstername setzen */ mdial_set(dhandle, MF_WNAME, (int)(wname>>16),(int)wname, 0, 0); /* CLOSER, der dem Button ABBRUCH entspricht, hinzufgen */ mdial_set(dhandle, MF_WADDKIND, CLOSE, ABBRUCH, 0, 0); } /* Dialogbearbeitung wie blich */ form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* wird neuerdings gefordert */ wind_update(END_UPDATE) if dhandle>0 /* mdial_create erfolgreich ? */ /* Dialog abmelden, Modifikationen rckgngig machen */ mdial_delete(dhandle); 2. Beispiel: Eine Applikation mchte den Redraw der nicht-Dialog-Fenster selber erledigen, was u.a. sehr viel Speicher spart ist (sehr lobenswert!): int dhandle; /* Variable fr Dialoghandle */ int cdecl redraw_callback(int *evnt_mesag); /* Prototyp fr Redraw-Routine */ ^^^^^ (fr Turbo/Pure C, um Parameterbergabe auf dem Stack zu erzwingen) if mdprog_available() /* mdial_xxxx-Aufrufe erlaubt ? */ dhandle=mdial_create(redraw_callback, 0, 0); /* Dialog anmelden, Zeiger auf Redraw-Callback-Routine */ /* da ein Callback-Zeiger angegeben wurde, puffert MD den Bildschirm nicht, die Callback Parameterbergabe steht defaultmig auf Standard C */ else dhandle=-1; /* Merken, da mdial_xxxx-Aufrufe nicht erlaubt sind */ /* Dialogbearbeitung wie blich */ form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* wird neuerdings gefordert */ wind_update(END_UPDATE) if dhandle>0 /* mdial_create erfolgreich ? */ /* Dialog abmelden, Modifikationen rckgngig machen */ mdial_delete(dhandle); /* Und jetzt die Redraw-Routine, die per Callback aufgerufen wird und die nicht-Dialogfenster der Applikation redrawt. */ int cdecl redraw_callback(int *evnt_mesag) /* ber den Messagebuffer wird die Informationen bergeben, was zu redrawen ist */ { my_redraw(evnt_mesag[3], evnt_mesag[4],evnt_mesag[5], evnt_mesag[6],evnt_mesag[7]); /* persnliche Redraw-Routine */ return(0); /* z.Z. keine Bedeutung, auf 0 setzen */ } /* und das ist dann jeweilige Redraw-Routine der Applikation */ void my_redraw(int handle, int x, int y, int w, int h) { ... /* Beispiele fr Redraw-Routinen siehe z.B. Profibuch */ } 3. Beispiel: Eine Dialogbox (z.B. Info-Box) soll fr 5 Sekunden angezeigt werden: #define ABBRUCH 21 /* BUTTON in Baum DIALOG */ int dhandle; /* Variable fr Dialoghandle */ char *wname=" Fenster-Dialog "; /* Zeiger auf Fenster-Titel */ if mdprog_available() /* mdial_xxxx-Aufrufe erlaubt ? */ dhandle=mdial_create(NULL, 0, 0); /* Dialog anmelden, kein Redraw-Callback */ else dhandle=-1; /* Merken, da mdial_xxxx-Aufrufe nicht erlaubt sind */ if dhandle>0 /* mdial_create erfolgreich ? */ { /* evnt_timer auf 5000ms setzen und ABBRUCH als Rckgabewert fr form_do setzen, falls der Timer-Event auftritt */ mdial_set(dhandle, MF_EVNTTIMER, 5000, 0, ABBRUCH, 0); } /* Dialogbearbeitung wie blich */ form_center(dialog,size_x,size_y,size_w,size_h) wind_update(BEG_UPDATE) wind_update(BEG_MCTRL) /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h) rc=form_do(dialog,ROOT) form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h) wind_update(END_MCTRL) /* wird neuerdings gefordert */ wind_update(END_UPDATE) if dhandle>0 /* mdial_create erfolgreich ? */ /* Dialog abmelden, Modifikationen rckgngig machen */ mdial_delete(dhandle); /* Es kann jetzt evtl. noch der Timer-Event auftreten, falls form_do nicht durch den Timer-Event, sondern durch einen EXIT-Button beendet wurde! */ 4. Beispiel: Nun noch ein Fensterdialog mittels mdial_xformdo (Redraw fr nicht-Dialogfenster sollen von der Applikation bernommen): #define ABBRUCH 21 /* BUTTON in Baum DIALOG */ int dhandle; /* Variable fr Dialoghandle */ int msg_buff[8]; /* Buffer fr Nachrichten */ int edit_object; /* Speicherplatz fr Position des Edit-Cursors */ int message; /* Hilfsvariable fr eingetroffene Nachricht */ int whandle; /* Windowhandle des Dialogfensters */ BOOLEAN abort; /* Abortflag fr Schleife */ if mdprog_available() /* mdial_xxxx-Aufrufe erlaubt ? */ dhandle=mdial_create(NULL, 0, 0); /* Dialog anmelden, kein Redraw-Callback */ else dhandle=-1; /* Merken, da mdial_xxxx-Aufrufe nicht erlaubt sind */ if dhandle<0 /* mdial_create erfolgreich ? */ { /* Nein: normalen Dialog ausfhren */ form_center(dialog,size_x,size_y,size_w,size_h); wind_update(BEG_UPDATE); wind_update(BEG_MCTRL); /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h); objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h); rc=form_do(dialog, ROOT); form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h); wind_update(END_MCTRL); /* wird neuerdings gefordert */ wind_update(END_UPDATE); } else { /* mdial_create hat geklappt! */ /* Dialogvorbeitung wie blich */ form_center(dialog,size_x,size_y,size_w,size_h); wind_update(BEG_UPDATE); wind_update(BEG_MCTRL); /* wird neuerdings gefordert */ form_dial(FMD_START, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h); objc_draw(dialog,ROOT,MAX_DEPTH,size_x, size_y, size_w, size_h); /* Jetzt kommt mdial_xformdo mit externer Event-Verarbeitung */ edit_object=0; /* Am Anfang, das Edit-Objekt von Xformdo bestimmen lassen */ do { rc=mdial_xform_do(dhandle, dialog, &edit_object, msg_buff); /* Dialoghandle, Zeiger auf Dialogbaum, Edit-Objekt, Zeiger auf Nachrichtenbuffer */ if (rc!=-1) /* ungleich -1, d.h. Button gedrckt */ { rc&=0x7fff; /* Doppelklick ausmaskieren */ dialog[rc].state&=~SELECTED; /* Objekt deselektieren */ switch (rx) /* Buttons auswerten */ { case ABBRUCH: abort=TRUE; break; /* Dialogschleife beenden */ case ... } } else /* Message zu verarbeiten */ { message=msg_buff[0]; /* eingetroffene Nachricht merken */ msg_buff[0]=0; /* Default: nchster Xformdo-Aufruf erhlt keine Nachricht */ switch (msg_buff[0]) /* Nachrichten auswerten */ { case WM_REDRAW: my_redraw(msg_buff[3], msg_buff[4], msg_buff[5], msg_buff[6], msg_buff[7]); /* persnliche Redraw-Routine (vgl. 2. Beispiel) */ break; case WM_TOPPED: msg_buff[0]=WM_TOPPED; /* xformdo soll sein Dialogfenster toppen */ /* Handle des Dialogfensters besorgen: */ if (mdial_get(dhandle, MF_WHANDLE, &whandle, &dummy, &dummy, &dummy)!=0) /* whandle gltig ? */ { /* Ja! */ msg_buff[0]=WM_TOPPED; /* xformdo soll sein Dialogfenster toppen */ msg_buff[3]=whandle; /* Dialogfenster soll getoppt werden */ } break; case WM_MOVED: case WM_SIZED: wind_set(msg_buff[3],WF_CURRXYWH, msg_buff[4], msg_buff[5], msg_buff[6], msg_buff[7]); /* Position der eigenen Fenster verndern */ break; case ... } } } while (abort==FALSE) /* Dialognachbereitung wie blich */ form_dial(FMD_FINISH, size_x, size_y, size_w, size_h, size_x, size_y, size_w, size_h); wind_update(END_MCTRL); /* wird neuerdings gefordert */ wind_update(END_UPDATE); /* Dialog abmelden, Modifikationen rckgngig machen */ mdial_delete(dhandle); } 5. Beispiel: Und jetzt zwei nicht-modale Dialoge mittels mdial_xformdo: Ist zwar nicht sehr abgedreht, da es eine Erweiterung des 4. Beispiels darstellt, aber trotzdem fehlt es aus Zeitgrnden noch... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Abspann Wie bereits oben angedeutet, handelt es sich hierbei nur um einen ersten Entwurf. Verbesserungsvorschlge und Erweiterungen sind nicht nur willkommen, sondern erwnscht! Da diese Dokumentation unter Zeitdruck entstanden ist, drften viele Fragen offengeblieben sein. Es sollte daher niemand zgern, mir bei offengebliebenen Fragen zu schreiben, es sollten sich alle (Un)klarheiten beheben lassen... Wenn es die Zeit zult, wird die erste Realisierung dieser Aufrufe in MultiDialog 1.04 stattfinden, das (hoffentlich) Anfang '94 erscheinen drfte. Guten Tach, hier ist das Weihnachtsrelease von MultiDialog: Version 1.03 Fr alle die MultiDialog noch gar nicht kennen: MultiDialog befrdert die Dialogboxen vorhandener Programme in ein Fenster, was unter MultiTOS den enormen Vorteil hat, da das MultiTasking uneingeschrnkt weiterluft! (z.Z. jedoch nicht unter Mag!X 2.00) Die sprlich eingegangenen Spenden (an einer Hand abzuzhlen) konnten mich leider nicht motivieren, diese Version frher fertigzustellen. MULTDIAL.PRG gehrt in den AUTO-Ordner und MULTDIAL.CPX in den XCONTROL CPX-Ordner. Um in den Genu der Tastaturbedienung zukommen, ist auerdem ein Let'em fly erforderlich (am Besten eine Version >=1.20), das ebenfalls (vor MultiDialog) in den AUTO-Ordner gehrt. MultiDialog schaltet dieses ab und ruft es dann direkt auf. Alles weitere steht in der Anleitung. Tsch und: Schickt mir Bug-Reports (auch wenn Ihr nicht gespendet habt), nur so kann ich die Zuverlssigkeit erhhen. frohes neues Jahr auch, Helmut Neukirchen, Aachen, 21.12.1993