Future BASIC II-J Mailing List

- fb-ml:1000〜1049まで -

注意
この色の文字は「引用」を表しています。また、連絡メール等は削除してあります。

Subject: [fb-ml 1000] Re:ScriptManager
yukiです。

なんとURLつけ忘れていました。ごめんなさい。

http://devworld.apple.com/ngs/lpp/adrpub/docs/dev/sdk.html
です。

原 幸久(akiyuki@alles.or.jp)

Subject: [fb-ml 1001] Re: PICTHANDLから色深度をPICTの扱い方
At 3:03 PM 97.10.7, Yuji Isomura wrote:
> LOCAL FN readPicsFile
> pictError = _false
> resFileRefNum% = FN OPENRFPERM (gFileName$,gfileVol%,_fsRdWrPerm)
> LONG IF resFileRefNum% <> -1 ' -1 = エラー
> pictCount% = FN COUNT1RESOURCES(_"PICT") 'PICT リソースの数を数える
>
> LONG IF pictCount% = 0
> pictError = _true
> XELSE
> k%=2 '1行2PICTの指定
> pictWith%=FN getPictWith 'PICTの大きさを得るFN
> pictHight%=INT(pictWith%*1.41)
> FOR j%=1 TO pictCount%
> pictLine%=INT(j%/k%)
> pictColumn%=j% MOD k%
> IF pictColumn%=0 THEN DEC(pictLine%)
> IF pictColumn%=0 THEN pictColumn%=k%-1 ELSE DEC(pictColumn%)
> pictHandle&=FN GETINDRESOURCE(_"PICT",j%)
> pictHandle$="&"+MKI$(pictHandle&)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  (中略)

> PICTURE FIELD# j%,pictHandle$,(x1%,y1%)-(x2%,y2%),_framed,_scaledPict

^^^^^^^^^^^
 棒点部は注意が必要ですね。こまったことに、ハンドブックの例ではこのように書いてあるのですね。しかし、たしか単に &pictHandle& というように、ロング長変数のあたまに & をつけてわたしてやるだけで動作したはずです。(つまりわざわざ文字列に変換する必要はない) Reference Manual にはそーかいてあるのだなあ。
 もしアプリケーション内のリソースを使うなら、PICTURE FIELD の第2引数に %resID% を送ってやれば、かってに取ってきて表示してくれますね。

 さて、再描画の件ですが、ピクチャフィールドに表示している PICT ハンドルは自前では破棄しないでください。この場合はリソースなので、ResEdit でパージ可能にセットしてあればリソースマネージャが_必要な時に_自動で破棄してくれるので、普通はほっとけば問題ないんです。(必要なときは破棄されないのが基本仕様です)

 しかし今回はアプリケーションではなく他のファイルからリソースを読み込んで、すぐに CLOSERESFILE しているのが問題です。CLOSERESFILE すると、そのファイルに属するリソースがパージ(破棄)されてしまうのです。破棄されてしまうと、再描画しようにも描画する絵が無い、ということになってしまいます。

 一番いい方法は、PICTリソースを取ってきたあとすぐに ToolBox の CALL DETACHRESOURCE(resHandle) で、PICT ハンドルをリソースマネージャの管轄からはずしてしまうことです。自動での破棄や書き戻しがされなくなります。つまり普通のハンドルとして扱われるのです。

 リソースの扱いはマックでも難しいところですが、要するに「リソースは常にリソースファイルと結びつけて管理されている」ということを覚えておくと良いでしょう。結びつけられているファイルが閉じられたら、リソースのほうも一緒に「閉じられる」わけです。

Subject: [fb-ml 1002] パフォーマとMacOS 8
 ベン/矢野勉 です。

 え、パフォーマで MacOS 8 を使うとモデムが動かなくなる件で助言をありがとうございます。>根来さん
 アップル・テレコムをバージョンアップする必要があるのですね。

 パフォーマはどうもそれ以外にもいろいろ問題があるようで、一部機種ではちょっと妙なキャッシュを使っているために、機能拡張が読み込まれないとか、起動できないとかの症状がでるようです。ちょっと Nifty とか NetNews とか覗いてみたら、そんなことが書いていました。

 それを確認するのが 5xxx-6xxx Tester 1.0 というやつで、Archie で検索したら見つけました。さっそく試してみたところ、我が Performa 5430 は問題なしとのこと。いやあ、いいマシンを買った。おりを見て MacOS 8 にバージョンアップだ!

Subject: [fb-ml 1003] REGISTER(A5)の顛末
根来でございます。

システムパターンを扱う場合のToolboxへの引き数の記述方法の件ですが,ベンさんより以下のように教えていただいておりました。

>DIM ltGray.8 >'" 指定アドレスから8バイトを変数ltGrayにコピーする。
>ltGray;8 = REGISTER(A5)+_ltGray
>CALL FILLRECT(rect, ltGray) '"それを渡す

これで無事うまく動いておりましたが,次のように簡略化できましたのでご報告いたします。

CALL FILLRECT(rect, #[REGISTER(A5)]+_ltGray)

どうやらハンドブックの記述には,[]が欠落しているようです。
校正ミスでしょうか。英語版が気になります。

Subject: [fb-ml 1004] Re:Window fnについて
どうも、Ottyこと乙坂です。

フローティングパレットを使おうとすると、Buildしたときにうまくいかない件ですが、

COMPILE 0,_IncludeWDef

をつけると、うまく動きます。

それにしても、不親切なマニュアルですねー。一応、リファレンスとハンドブックは全体にさらっと目を通したつもりなんですが。この手のwindowを使うためには、Compile文のフラグの細かいところを読んでおかないといけないというのは、ちょっといただけません。

先日のメールで、サンプルのWindoid Testerでも同じようになってしまうと書きましたが、今日やってみたらちゃんと動きました。何が悪かったのかな?

Subject: [fb-ml 1005] Re: しあわせなベン
お久しぶりです。葛原です。(^_^;;
ベンさん、おめでとうございます。
PPC仲間に入りましたね。\(^_^)/
私も、今年の6月にPPCにやっと移行したのですが、いかんせん、603eの100MHz、2次キャッシュなしのPowerBook duo2300cですから、メモリ最大56Mにしても、68040、25MHzの660AVに68Mのせた状態と相対してかわりません。(;_;)

なおかつ、以前のEudraの環境が壊れてしまったため、仮にMSのIEについてきたメーラーを使ってます。もし変なメールになっていたら、教えて下さい。m(v_v)m

Subject: [fb-ml 1006] Re: REGISTER(A5)の顛末
 ベン/矢野 です。

At 6:02 AM 97.10.8, sendai_5300LTB wrote:
> >DIM ltGray.8
> >'" 指定アドレスから8バイトを変数ltGrayにコピーする。
> >ltGray;8 = REGISTER(A5)+_ltGray
> >CALL FILLRECT(rect, ltGray) '"それを渡す
>
> これで無事うまく動いておりましたが,次のように簡略化できましたのでご報告いたします。
>
> CALL FILLRECT(rect, #[REGISTER(A5)]+_ltGray)
>
> どうやらハンドブックの記述には,[]が欠落しているようです。

 ううむ、おかしいですね。実はぼくのほうでもこの件で実験をしました。次のようなプログラムを使用しました。

DIM rect;0, top, left, bottom, right
DIM gray.8

WINDOW OFF
WINDOW 1

CALL SETRECT(rect, 10, 10, 50, 50)
CALL FILLRECT(rect, #REGISTER(A5)+_ltGray)

CALL SETRECT(rect, 60,60,100,100)
gray;8 = REGISTER(A5)+_ltGray
CALL FILLRECT(rect, gray)

STOP

 #マークを使った値渡し(参照変換の禁止)による FILLRECT と、BLOCKMOVE(gray;8 = ○○ってのは、BLOCKMOVE ○○, @gray, 8 と等価です)を使ってパターン情報を変数に収めてから FILLRECT に渡す方法の両方を試しているのですが、どちらも上記のように REGISTER(A5)+_ltGray としたときのみ、正確な50%グレイの四角が描画されました。一方で REGISTER(A5) を [] で囲った場合は、エラーメッセージはでませんが、50%グレイではない怪しげなパターンが描画されたあと、フリーズしました。

 HANDBOOK の P370 をみると、パターンの使用例では REGISTER(A5)+_dkGray となっているのに、_thePort を得るときには [] で囲って [REGISTER(A5)]+_thePort となっている、と、なにやらまちまちですね。ほんとに根来さんのほうでは[]で囲って50%グレイが表示されますか?

 REGISTER命令は、指定レジスタの値を返す命令なので、返ってくる値は A5 グローバル領域へのポインタ(つまり先頭アドレス)のはずなんですよ。だとしたら、[]でかこっちゃうと、先頭アドレスから4バイト読み込んでしまうんですが...

 なぞだ...

Subject: [fb-ml 1007] Re: REGISTER(A5)の顛末
ベンさん

>ほんとに根来さんのほうでは[]で囲って50%グレイが表示されますか?
 す,すいません。CALL FILLRECT(rect, #[REGISTER(A5)]+_ltGray)では落ちますね。下ので動きます。+4を書き忘れてしまいました。

 CALL FILLRECT(rect, #[REGISTER(A5)]+_ltGray+4)
                       ~~
 しかし,ベンさんのソースでは[]で囲わずともちゃんと動きますね。
 FB2上での書き方が違うだけで,同じことですよね。
 どおして私のソースではコンパイルでエラーになるのかなぁ(T T...
 ソースを一から点検してみます。昨日はReleaseResource()が使えないのでえらい悩みました。FB2にはなかったんですね。もっと早く気付けばよかった...
                              根来

Subject: [fb-ml 1008] Re: REGISTER(A5)の顛末
古籏一浩です。

At 1:38 97.10.8 +0900, Tsutomu YANO wrote:
> HANDBOOK の P370 をみると、パターンの使用例では REGISTER(A5)+_dkGray となっているのに、_thePort を得るときには [] で囲って [REGISTER(A5)]+_thePort となっている、と、なにやらまちまちですね。ほんとに根来さんのほうでは[]で囲って50%グレイが表示されますか?
 以前画面キャプチャーの時に[REGISTER(A5)]+_thePortを試みましたが全然うまく動作しませんでした(泣)
 どうも、ここらへんかなり怪しいのではないかと。
 実は先頭アドレスを得ることが出来ずに変なアドレスを示しているとか。
 ここらへん、詳しくしりたい所です。

Subject: [fb-ml 1009] Re: しあわせなベン
古籏一浩です。

At 23:07 97.10.7 +0900, Yasuo Kuzuhara wrote:
>なおかつ、以前のEudraの環境が壊れてしまったため、仮にMSのIEについてきたメーラーを使ってます。もし変なメールになっていたら、教えて下さい。m(v_v)m
 Content-transfer-encoding: 7bit
 になってますが、なぜかちゃんと読めます(^^;

Subject: [fb-ml 1010] Re: Window fnについて
yukiです。

乙坂さん wrote:
> COMPILE 0,_IncludeWDef
> をつけると、うまく動きます。

さっそく試させていただき、うまくBuildすることができました。有難うございました。

> それにしても、不親切なマニュアルですねー。一応、リファレンスとハンドブックは全体にさらっと目を通したつもりなんですが。この手のwindowを使うためには、Compile文のフラグの細かいところを読んでおかないといけないというのは、ちょっといただけません。
ほかの部分ではかなりいいソフトだとおもうんですがねぇ。FB3に期待しましょう。

原 幸久(akiyuki@alles.or.jp)

Subject: [fb-ml 1011] RE:PICTの扱い方
ベンさん、こんにちわ。磯村@埼玉です。

 丁寧な解答、ありがとうございました。

>> 一番いい方法は、PICTリソースを取ってきたあとすぐに ToolBox の CALL DETACHRESOURCE(resHandle) で、PICT ハンドルをリソースマネージャの管轄からはずしてしまうことです。
とのアドバイスの通りにやってみたらあっさり行けてしまいました。ううむ。「下手な考え休むに似たり」ってホントだなぁ(笑)。
 これで一歩野望に近づきました。
 つまり「リソースフォークにあるデータは、リソースマネージャの要求したときのみファイルからメモリに読み込まれ、普段はメモリには存在しない」という風な理解の仕方で良いんでしょうか?

 今度は、並んでいるPICTの順番を入れ替える、っていう作業にかかろうと思いますので、しばらくまたハンドブック(とリファレンス)を読み漁ろうと思います。
 でもきっとまた泣きつきに来ると思いますが(笑)。

I should be happy to be of any service to you!!

Subject: [fb-ml 1012] Re:しあわせなベン
Takaomi です。

>う〜ん、ついにこのMLで68kメインユーザーは私だけになってしまったのでしょうか?
ご心配なく。僕も当分68kユーザーです。
ちなみにLC520です。でもでも、アクセラレータ(040/25)つけてるから結構いけてるんですよ。FB使う分にも全く支障ありません。まあ、コンパイルしたソフトをPowerMacで遊ぶと(wait考えよ……)と寂しくなりますが。

あ、でも今日アップルのホームページで8600/250が卸値を26%下げるという記述があって、すごく心引かれました。今、40万強くらいだから値下後は30万強くらいになるんでしょうか。すごい時代ですね、僕のマシンと一緒の値段です。

Yukiさんのお使いのマックはなんでしょうか?

Subject: [fb-ml 1013] アプリが前面に移動で自爆
根来です。
今とっても困っております。知恵を貸して下さい。
次のような複数ウインドウのアプリがあります。
アクティブなウインドウにカーソルが入っていればクロスカーソルとし,範囲外なら矢印カーソルにしています。

WINDOW OFF
DIM myPoint.4
WINDOW 1,"test 1",(40,40)-(200,100),_docZoom
PRINT "Quit is command-."
WINDOW 2,"test 2",(240,40)-(400,100),_docZoom

DO
HANDLEEVENTS
CALL GETMOUSE(myPoint)
LONG IF ( (myPoint.h >=0 ) AND (myPoint.h < WINDOW(_width)) ) AND ( (myPoint.v >= 0 ) AND (myPoint.v < WINDOW(_height)) )
CURSOR _crosscursor 'front window
XELSE
CURSOR _arrowCursor 'back window
END IF
UNTIL _false

このアプリ単体では問題なく動作しているのですが,一度ファインダーなど他のアプリを前面に出し,このアプリに戻る場合に不具合があります。
現象としては,アクティブでないウインドウのタイトルバーをクリックしてこのアプリを前面にすると,タイトルバーがアクティブでないウインドウをアクティブなウインドウとしてクロスカーソルになります。

これはなんでなんでしょう。
実際のソースは非常に複雑ですが,このサンプルのアイドリング処理の部分でオフスクリーンからCOPYBITSしているのですが,アクティブなウインドウと描画先のポートが異なるのでえらいことになっています。
_mfResumeイベントでWINDOW(_activWnd)してみましたがうまくいきません。
きっと基本的な事かとは思いますが,なんとも難しいです。
よろしくお願いいたします。
                               根来

Subject: [fb-ml 1014] 文字列変数の扱い
こんにちわ。重松です。

今日は文字列変数についてです。
よくサンプルソースなどを見ていると、

A$=""
B$="テスト"
BLOCAKMOVE @B$,@A$,LEN(B$)+1

というようなプログラムを見かけるのですが、これは、A$という文字列の変数が宣言されたら、256バイトの格納領域が確保されるということを意味するようにとれます。実際のところはどうなのでしょうか?

私は心配なので、
A$=SPACE$(LEN(B$))
を実行してから、BLOCKMOVEしているのですが。

よろしくお願いします。

P.S.
いつの間にか、1000件を超えていましたね。

Subject: [fb-ml 1015] PICTからGIFまたはJPEGに変換
こんにちわ。重松です。

今、手っ取り早くPICTをGIF、またはJPEGに変換する方法を探しています。
QuickTimeをつかえば、JPEGは簡単にできそうな気がするのですが。。。

変換する画像は、いわゆるWebpage用のカウンター画像なので、GIFの方が向いているとは思うのですが、GIFって保存ができるアプリケーションを作るとUNISYSかどこかが著作権を持っていて、ライセンスを払わないといけないというのをNIFTYで聞いたことがあります。実際はどうなんだろ。。。

Subject: [fb-ml 1016] Re:しあわせなベン
yukiです。

takaomisさんwrote:
> ご心配なく。僕も当分68kユーザーです。
> ちなみにLC520です。でもでも、アクセラレータ(040/25)つけてるから結構いけてるんですよ。FB使う分にも全く支障ありません。まあ、コンパイルしたソフトをPowerMacで遊ぶと(wait考えよ……)と寂しくなりますが。
> Yukiさんのお使いのマックはなんでしょうか?

なんとMacintoshIIvi 16MHzです。とりあえずハードディスクは110Mもあるので毎日ダイエットに励んでいます。そんなときにtakaomiさんと同様、デジタルカメラに手をだしてしまったばかりにすでに20MBがJPEGに蝕(むしば...みなさん読めましたか?わたしは読めなかった...)まれています。

一応年末には脱68kからを8万円程度で計画中です。

Subject: [fb-ml 1017] Re:アプリが前面に移動で自爆
yukiです。

根来さん wrote:
> アクティブなウインドウにカーソルが入っていればクロスカーソルとし,範囲外なら矢印カーソルにしています。
私には原因を解明する力はありませんが、以下のような方法でしたら以前に試したことがありますので、参考までにお知らせいたします。

原 幸久(akiyuki@alles.or.jp)
(以下ソースコード)
'===============
DIM gProgEnd
END GLOBALS
'----
CLEAR LOCAL
LOCAL FN initProg
CLEAR
gProgEnd =0
WINDOW 1,"W1"
WINDOW 2,"W2"
END FN
'-----
CLEAR LOCAL
DIM myPoint;4
LOCAL FN doDialog
evnt = DIALOG(0)
id = DIALOG(evnt)
'----
PRINT "EVNT,ID ";evnt,id
SELECT evnt
CASE _cursOver
id = DIALOG(_cursEvent)
PRINT "_cursOver";evnt,id
LONG IF id=WINDOW(_activeWnd)
CURSOR _crosscursor 'front window
XELSE
CURSOR _arrowCursor 'back window
END IF
CASE _cursEvent
CURSOR _arrowCursor
END SELECT
END FN
'---- main
FN initProg
ON DIALOG FN doDialog
DO
HANDLEEVENTS
UNTIL gProgEnd

Subject: [fb-ml 1018] Re:アプリが前面に移動で自爆
yukiさん,こんばんわ。

頂いたサンプルを試してみましたが,カーソルはちゃんと更新されますが,イベントが表示されるのが背面のウインドウになりますよね。これが困っている部分なのです。アイドリング処理で毎回WINDOW関数やGetPortするにしても正常な値が得られず自爆しております。(^^;
いやはや,困りました。

カーソルの変更部分を参考にさせていただきます。
ありがとうございます。
                           根来

Subject: [fb-ml 1019] Re: PICTからGIFまたはJPEGに変換
古籏一浩です。

At 15:15 97.10.9 +0900, Osamu Shigematsu wrote:
>今、手っ取り早くPICTをGIF、またはJPEGに変換する方法を探しています。
>QuickTimeをつかえば、JPEGは簡単にできそうな気がするのですが。。。

 一番速いのはFuture BASIC Toolsを使うことでしょう。
 GIF,JPEG,TIFFなどを指定して保存できます。

>変換する画像は、いわゆるWebpage用のカウンター画像なので、GIFの方が向いているとは思うのですが、GIFって保存ができるアプリケーションを作るとUNISYSかどこかが著作権を持っていて、ライセンスを払わないといけないというのをNIFTYで聞いたことがあります。実際はどうなんだろ。。。
 大手はちゃんとライセンスを取得しているようですが・・・
 日本円で100万円くらいでしたっけ?

Subject: [fb-ml 1020] Re: 文字列変数の扱い
重松さん,こんばんわ。

文字型変数は標準でいきなり256確保されます。
ですから,a$ = "" でも256バイト消費されます。
もったいないですね。

DEF LEN 命令で文字型変数の確保量の変更ができますのでマニュアルをご参照下さい。
                        根来

Subject: [fb-ml 1021] Re: PICTからGIF またはJPEGに変換
重松です。

> 一番速いのはFuture BASIC Toolsを使うことでしょう。
> GIF,JPEG,TIFFなどを指定して保存できます。
私もそれはそうだと思うのですが、あれだと、ダイアログが開いてファイルを指定してディスクに保存しますよね?(JPEGだとさらに圧縮率まで入れないといけない。)普通のアプリならいいのですが、CGIなので、ダイアログで指定する、ということができないし、カウンタのファイルをディスクに書いていたらディスクスペースがどんどんなくなってしうし、速度も遅くなるし、またほとんど同時に複数作業することがあるので、共通のファイル名でワークファイルを作ってRedirectすることもできません。

>>変換する画像は、いわゆるWebpage用のカウンター画像なので、GIFの方が向いているとは思うのですが、GIFって保存ができるアプリケーションを作るとUNISYSかどこかが著作権を持っていて、ライセンスを払わないといけないというのをNIFTYで聞いたことがあります。実際はどうなんだろ。。。
> 大手はちゃんとライセンスを取得しているようですが・・・
> 日本円で100万円くらいでしたっけ?
100万円とは!またまた豪勢ですね。PixelCatがGIFを読めて書けないのは上記の理由からでしょうかね?STAZのToolsをつかってお絵書きソフトを作っても上記ライセンスがチャージされるとしたら、恐ろしいことになりますね。

Subject: [fb-ml 1022] Re: 文字列変数の扱い
重松です。

>文字型変数は標準でいきなり256確保されます。
>ですから,a$ = "" でも256バイト消費されます。
>もったいないですね。

さっそくありがとうございます。そういう仕組みだったのですね。
しかしまた、256バイトも確保するとなると、プログラム中でやたら文字列を扱う場合には、注意が必要ですね。

まだFBの仕組みが良く分かってないんですが、普通はたとえ1バイトであってもメモリが足りないとプログラムは動かないと思いますが、たとえば、A$という変数が宣言されたとして、メモリに空きがないとどうなるんでしょうか?

メモリ不足エラーになると考えるのが順当だと思うんですが、それだと、プログラムが終了してしまいませんか?そうなると、サーバなどのプログラムでは致命的ですよね?私は、CGIを書いているのですが、CGIは同時に複数が使うので、メモリ不足の場合は最後の処理だけ、メモリ不足だよ!と返事をして、他の処理に影響がでないようにする必要があるんですが、CGIの引き数を

DIM RECORD sdoc
DIM sdocpath$ '"path_arg
DIM sdockfor$ '"searcg_arg
DIM sdocuser$ '"user
DIM sdocpass$ '"pass
DIM sdocKcip$ '"client-ip address
DIM posthndl& '"post_arg
DIM postsize& '"post_arg
DIM END RECORD .sdoc

というふうに処理しているんですが、これだとここで1Kくらい使う勘定になりますよね。まあ、たいした量でないといえばたいした量でないのですが、同時に50とか処理を行うとDIM www.sdocを実行したときにメモリ不足がでる可能性も高い気がするんです。

万一そのような状態になりモーダルのウインドウを出してしまうと、他の処理をしなくなるので、サーバが停止してしまうのですが、あとどれくらいそのアプリケーションがメモリを利用できるかでかい配列を利用する前には、確認するしかないのでしょうか?

AppleScriptの場合なんですが、

on myFN(arg)
try
ここにメインの処理を書く
on error
エラー処理
end try
end myFN

というふうに関数ごとにエラートラップというのでしょうか、例外処理をできるので、非常に重宝しているのですが、FBでもON ERRORで似たことができそうな気がするのですが、どこに飛ぶかの指定がいまいち良く分かりません。

いつもは、AppleScriptの場合には、

on mainFN
try
set myResult to myFN(arg)
return http_header & myResult
on error
return http_header & "An error occured!"
end try
end mainFN

というふうに入れ子にして処理しています。

皆さんは、こういう例外処理はどう処理されているのでしょうか?

Subject: [fb-ml 1023] Re: アプリが前面に移動で自爆
At 5:39 PM 97.10.9, sendai_5300LTB wrote:
> 今とっても困っております。知恵を貸して下さい。
> 次のような複数ウインドウのアプリがあります。
> アクティブなウインドウにカーソルが入っていればクロスカーソルとし,範囲外なら矢印カーソルにしています。

 (中略)

> このアプリ単体では問題なく動作しているのですが,一度ファインダーなど他のアプリを前面に出し,このアプリに戻る場合に不具合があります。
> 現象としては,アクティブでないウインドウのタイトルバーをクリックしてこのアプリを前面にすると,タイトルバーがアクティブでないウインドウをアクティブなウインドウとしてクロスカーソルになります。
> これはなんでなんでしょう。
> 実際のソースは非常に複雑ですが,このサンプルのアイドリング処理の部分
> でオフスクリーンからCOPYBITSしているのですが,アクティブなウインドウと描画先のポートが異なるのでえらいことになっています。

 下線部がポイントです。根来さんのいう「アイドリング」部分って、マックのイベント分岐をしている HANDLEEVENTS と平行して書かれているのが問題なんです。

 DO
HANDLEEVENTS
マウスの処理
UNTIL 〜

 となっているでしょ。これはダメです。必ずOSのイベントに対して反応する形で記述してください。この例でいえば、アプリケーションのウインドウがあるうちはいいんですが、他のアプリから復帰したときなどに、いきなり「マウス処理」部分が実行されてしまいます。これがレシュームとかウインドウ・アクティベートのイベントより早く実行されてしまう危険があります。つまり、アクティベート・イベントがおきてないからクリックされたウインドウが一時的にアクティブなウインドウと認識されるとか。(内部の処理がどうなっているかまでは僕も知りませんよ。あくまで例です)

 マックおよび FB でいう「アリドリング状態」というのは、Macintoshの「null」イベント状態ことを指します。メインループで勝手に繰り返し処理をしてはいけません。単なる計算ならともかく、ユーザーの処理にかかわる部分を記述するのはバグの温床となります。
 Macintoshの null event もハンドブックの p63 に記述があるように ON EVENT FNでとらえられます。あるいはてっとり早く、ON TIMER(-1) FN とすれば、60分の1の割合(基本的には null event と同じ割合です)で指定した関数が呼び出されます。イベントを捕えて処理を行っている限り、今回根来さんが体験しているような状態はありえないはずです。かならずイベントを介して処理を行うのがマッキントッシュの「イベントドリブン」なプログラムの鉄則です。

 まあ、実際には今回の処理の場合、原さんがすでに書いているように、ON DIALOGでイベントを引っかけて、_cursEvent を利用するのがいいですね。_cursEvent は、カーソルがウインドウ内部に入った時に発生して、そのウインドウの ID を返しますので、その ID とアクティブウインドウの ID とを比べて一致すればクロス・カーソルに、一致しないとき及び _cursEvent が0を返しているときは矢印カーソルにセットすればいいでしょう。こっちの方が楽でしょう。

#なんか原さんは _cursOver イベントも使ってますが、これってボタンやらフィールドにカーソルが入ったときに発生するんだよね?

Subject: [fb-ml 1024] Re:アプリが前面に移動で自爆
At 6:04 AM 97.10.10, sendai_5300LTB wrote:
> yukiさん,こんばんわ。
>
> 頂いたサンプルを試してみましたが,カーソルはちゃんと更新されますが,イベントが表示されるのが背面のウインドウになりますよね。これが困っている部分なのです。アイドリング処理で毎回WINDOW関数やGetPortするにしても正常な値が得られず自爆しております。(^^;いやはや,困りました。

 あやや、こっちが書いているあいだに解決しちゃったのね。
 イベントが表示されるウインドウが固定なのなら、OUTPUT WINDOW で指定できませんか? COPYBITS するなら、あらかじめグローバル変数にウインドウの GrafPortをとっておくとか。

 そもそも描画って、ウィンドウへのアップデートイベントで処理しないと駄目ですよ。FB なら _wndRefresh だったかな。アップデートイベントまで描画を遅らせるのも、Macintoshプログラミングの重要な技術の一つですね。

Subject: [fb-ml 1025] Internet Configの件について
InternetCongifですが、FB用のAPIを見つけましたので報告いたします。
mel@intergate.bc.caさんのものです。
http://www.geocities.com/SiliconValley/Lakes/8064/icAPI.sit からダウンロードできます。

参考になれば幸いです。

Subject: [fb-ml 1026] Re:アプリが前面に移動で自爆
yukiです。

ベンさんwrote:
> #なんか原さんは _cursOver イベントも使ってますが、これってボタンやらフィールドにカーソルが入ったときに発生するんだよね?
すみません。実は私も教えて頂きたいのですが、なぜかWindowからカーソルがでるときは、_cursEvent= 20、入るときは_cursOver= 21でイベントが発生するようなのです。で、こうしているわけなのですがもっとうまい方法はあるのでしょうか。

原 幸久(akiyuki@alles.or.jp)

Subject: [fb-ml 1027] FNの引き数について
yukiです。

また基本的な質問があるのですが、いま以下の関数(Pascal Interface)への引き数で悩んでいます。

LOCAL FN GetMaxCompressionSize(src&,@srcRect&,colorDepth%,quality&,
                1^^^^^^^^^
cType&,codec&,@size&)
  2^^^^^^
@マークがついているということは、1、2ともポインタを要求されていると思うのです。で、

DIM srcRect;8
DIM size&

と定義し、

FN GetMaxCompressionSize(src&,@srcRect,......@size&)

で呼ぶと双方ともエラーが発生してしまいます。どこに問題があるのでしょうか。よろしくお願いいたします。

原 幸久(akiyuki@alles.or.jp)

Subject: [fb-ml 1028] Re:アプリが前面に移動で自爆
At 2:56 AM 97.10.11, 原 幸久 wrote: > > #なんか原さんは _cursOver イベントも使ってますが、これってボタンやらフィールドにカーソルが入ったときに発生するんだよね?
> すみません。実は私も教えて頂きたいのですが、なぜかWindowからカーソルがでるときは、_cursEvent= 20、入るときは_cursOver= 21でイベントが発生するようなのです。で、こうしているわけなのですがもっとうまい方法はあるのでしょうか。

 ううむ、僕も確認しました。どうもウインドウ内にカーソルが入ったときは、_cursOver イベントしか発生しませんねえ(^^;)

 いろいろ試して見たところ、次の用になってますね。

・ウインドウ内にカーソルが入る
_cursOverが発生
   DIALOG(_cursOver) は、ボタンやフィールドではなく、ウインドウ内部に侵入したことを表わす0になる
   しかしここでDIALOG(_cursEvent) で、侵入したウインドウのウインドウIDを得ることができる。

・ウインドウ外部にカーソルが出る
  _cursEventが発生
   DIALOG(_cursEvent) では、マニュアルどおり0が得られる。

 結局、原さんのやっているように、_cursOver と _cursEvent を併用するしかないでしょう。推測するには、ウインドウにカーソルが侵入した場合、_cursOver (ID=0)と _cursEvent (ID=window id) が同時に発生してしまうため、イベントしては _cursOver のほうが優先的に発生するのでしょう。しかし _cursEvent がまったく発生していないわけではないので、_cursOver をキャッチした段階で DIALOG(_cursEvent)してやることで、侵入したウインドウのIDを得られる、ということではないかと。

 まあ、同時に同じイベントが発生するなら、どっちかを優先するしかないですね。
いやあ、いい勉強をしました。感謝感謝。

Subject: [fb-ml 1029] Re: FNの引き数について
At 3:09 AM 97.10.11, 原 幸久 wrote:
> また基本的な質問があるのですが、いま以下の関数(Pascal Interface)
> への引き数で悩んでいます。
>
> LOCAL FN GetMaxCompressionSize(src&,@srcRect&,colorDepth%,quality&,
>                 1^^^^^^^^^
> cType&,codec&,@size&)
>   2^^^^^^
> @マークがついているということは、1、2ともポインタを要求されていると思うのです。で、

 いや、関数定義の引数に @ がついているところも、アドレスではなく実体を要求します。実体を渡すと、コンパイラが自動的に変数の先頭アドレスをとって、srcRect& にいれてくれます。これはどういうことかというと、「参照渡し」「値渡し」の違いを理解する必要があります。解説は後半に。

 さて、ポイントは実体が何バイトの変数なのかわからない、という点です。srcRect& は名前からして実体は Rect レコードで間違いなかろうと思うので、実体は8バイトですね。size& の実体のサイズはわかりません。 Pascal Interfaces の Pascalの定義を見てみるしか、C言語の解説書または Inside Macintosh を見るしかないですね。(なんか4バイトのような気がする...)



 さて、解説。

 まず、上記でいえば、src&, colorDepth%, quality& は「値渡し」という手法がとられます。これは、引数に与えた変数の「値」が、src&, colorDepth%, quality& に_コピーされて_渡されることを差します。

 一方、@ がついている srcRect& には「参照渡し」という手法がとられます。この手法では、実体を渡したら、その値のコピーではなく、変数の先頭アドレスが渡されます。(アドレスは4バイトなので、受け皿である srcRect& には & がつくわけです) つまり変数への「参照」が渡されるわけです。
 なんというか、変数を渡すとコンパイラが勝手に頭に @ がついているものとして処理してくれる、と考えると分かりやすいかと。

 もしこの定義に @ がついていない場合は、原さんのいうように頭に @ をつけて自前で参照に変換してやる必要があります。これがC流の「すべてを値渡しで処理する」手法です。

 最近はC言語が主流ゆえにあまりしられてませんが、実は ToolBox は4バイトより上のサイズの引数にはすべて「参照渡し」が適用されます。Pascal の手法なのです。C言語には参照渡しという手法が存在しないので、必然的に自前で参照に変換してから渡すことになります。しかし FB には Pascal と同じように参照渡しの機構がありますので、ToolBox も Pascal と同じ使い方になります。

 CALL SETRECT(rect, 0,0,20,20)

 のとき、なんで @rect としなくていいんだろう、と思ったときはないですか? C言語ではそうしなくちゃいけないんですが、FB ではそのまま渡せば勝手に参照に変換してくれるわけです。これを自分の関数で実現するのが、引数定義の頭に @ をつける、というやり方です。僕は多用します。(他の Toolbox の使用法と共通にしたいからです)

(注)
この理由から、C言語の本でポインタを渡すようになっているところには FBではのきなみ実体を渡すようになっています。C言語の Toolbox 定義を鵜呑みにしてはいけません。逆にいえば、ポインタを渡すところはすべて参照渡しになっていると考えていいでしょう。SETRECT なんかはその典型ですね。みなさまご注意を。



 さらに。関数の定義の仕方ではなく、引数の渡しかたの問題ですが、ちょっと前に話題になった「変数の頭に # をつけて渡す」というやり方ですが、これは逆に「コンパイラに強制的に値渡しをさせる」手法です。アドレスが自前で用意できているときは、わざわざコンパイラに参照(アドレス)に変えてもらわなくても、それをそのまま渡せばいいんですよね。その時は、自前で用意したアドレスの頭に # をつければ、参照渡しになっているところでも、参照渡しではなく値渡しが行われます。極端な例を出せば:

 CALL SETRECT(rect, 0, 0, 10,10) は
 CALL SETRECT(#@rect, 0,0,10,10) と同じです。

 下のほうは、@ で rect の先頭アドレスを得て、それを # で強制的に値渡しにしています。上は勝手にアドレスに変換されて渡されます。

まとめ。

 @ は同じマークでも、変数の頭につけた場合と、関数の定義で使用した場合とでは意味がちがうってことです。

Subject: [fb-ml 1030] 初心者
はじめまして、ハイノと申します
FBはじめて、まだ1日めの初心者です

質問させていただきます
まず第一
  FBとVBは、根本的な違いはあるのですか?
  あと、それぞれの特徴はなんですか(具体的ではなく)
次に第二
  マニュアルを持ってないのですが、それに取って代わることができ初心者に優しい、参考書はありますか、あったら教えてください

これから頑張って、最終的にRPGを作りたいと思っています(4年後計画)
もし、このMLにRPGを作ったことがある人や、ゲーム会社に勤めている人がいたらプログラムの志などを教えていただければ、これからの励みになるので、是非送ってください
これから、よろしくお願いします

ハイノ

Subject: [fb-ml 1031] Re: 初心者
ハイノさん,はじめまして。

FBとVBの差ですが,詳しいことは大先輩からレスが付くとしてプログラムスタイルのイメージ的な事では,FBがC風の組方でVBがC++風となります。どちらも両方できれば良いのですが,初心者のうちは平行して勉強すると頭がこんがらがります(^^; 今までのハイノさんのプログラム経験と今後の希望を考えて両方のチュートリアルを終えた時点で馴染みやすい方を重点的に勉強してはどうでしょう。FBもVBも全く別のものというわけではなく,密接に関連がありますので,片方に慣れてくると他方もなんとなくわかってきます。(本当か?>わし)
とりあえず,付属のチュートリアルを終えてみてはどうでしょう。
具体的な疑問が出れば,気楽に聞いてください。
私の答えられる範囲で大うそを教えてしんぜましょう(笑)
これからもよろしく。
                          根来
追伸
マニュアルがないということは,正規購入ではなく友人から購入されたわけですね。それなら購入した友人からマニュアルをもらってください。ユーザー登録の変更もお忘れなきよう。そうしないとあなたか友人の方のいずれかが不正コピーをした事になりますから気を付けてください。

Subject: [fb-ml 1031] Re: 文字列変数の扱い
重松さん,こんばんわ。

>A$という変数が宣言されたとして、メモリに空きがないとどうなるんでしょうか?
 A$がローカル変数とすれば,スタックオーバーフローということですよね。もしくは,スタックとヒープの衝突ですか。  こいつは難しいなー。FB2自身が内部的にスタックを最大に拡張してくれていると仮定すると,残りメモリをチェックするしかないのではありませんか。ここらへんは良く知らないのですが。

 話がややこしいので,大きい構造体はアプリケーションヒープに確保してはどうでしょう。これなら確保時にエラーの戻り値がありますからお望みの動作も可能かと思います。
 せっかく DIM END RECORD .sdoc と書かれているのですから,DIM www.sdoc にせず,wwwHandle& = FN NewHandle(_sdoc) とするとアプリヒープに確保で,wwwHandle&がゼロならメモリ不足なので,wwwHandle& = FN NewHandleSys(_sdoc) と懲りずにシステムヒープに確保にいくのはどうでしょう。これでだめなら雨の日の為のメモリを解放してはどうでしょう。(^^これでだめなら気分はシンジ君ですね。(笑;)
                            根来

Subject: [fb-ml 1032] Re: アプリが前面に移動で自爆
ベンさん,返事が遅くなりました。

私のアイドル処理に問題があったのですね。(T_T
良い勉強をさせてもらいました。ON MOUSE FN 〜を使う事でマウスイベント発生前にマウス処理に突入するという不具合は直りました。ありがとうございます。
実は今日一日,新たにリソース周りのエラーが出ていて苦労していたのですが,先ほど解決した次第です。ですから,カーソルに絡むアプリ前面時の問題は明日調べるつもりです。
なんか言いだしっペの私が遅れているので焦ります。(^^;

その他,イベント周りで調査中なのが,二つのウインドウが開いている場合のアクティブとリフレッシュイベントの組合わせです。ウインドウ同士が重なっている場合は,アクティブ->リフレッシュとなりますが,重なっていない場合はアクティブのみです。ここで,ウインドウの再描画をどちらのイベントでもすると重なっている場合に更新が二回も起ってしまいます。せっかくオフスクリーンを使っていてもちらつくような遅いようなでなんとか一度限りに抑えたいのです。フラグを作るか何か方法を考えようと思っています。

丁寧なレスをありがとうございました。
                         根来

Subject: [fb-ml 1033] Re: 初心者
古籏一浩です。

At 0:43 97.10.11 +0900, Satoshi N wrote:
>まず第一
>  FBとVBは、根本的な違いはあるのですか?
>  あと、それぞれの特徴はなんですか(具体的ではなく)

 FBはMac用BASIC, VBはWin用BASICといった所でしょう。
 FB、VBともに持っていますが、同じBASICでも文法も違いますが一番異なるのはプログラムの組み立て方が違う所でしょうか。FBは付属のPascal Converterで最新のToolboxを使用できますが、VBだとVC++が必要だったり肝心なポイントが大抵こけてます(笑)。VBでシューティングゲームを作るのはあかんというのも定説です。VB5ではVB4と比べて多少マシになったみたいですが。

>次に第二
>  マニュアルを持ってないのですが、それに取って代わることができ初心者に優しい、参考書はありますか、あったら教えてください
 参考書はありません(笑)
 が、私のページやFB−MLの方々のページを参考にすれば十分参考書に匹敵すると思います。おまけに電話代だけですし(^^;

>これから頑張って、最終的にRPGを作りたいと思っています(4年後計画)
>もし、このMLにRPGを作ったことがある人や、ゲーム会社に勤めている人がいたらプログラムの志などを教えていただければ、これからの励みになるので、是非送ってください

 ゲームは私は毎週1本ペースで作成していますがf(^^;
 プログラムの志(?)は簡単で「作りたい」という情熱だけです。
 技術よりも情熱の方が大事という事です。
 私は過去にRPG作って面倒くさくて辞めてシューティングゲームやキャラクターゲームなどリアルタイムアクションがほとんどです。
 FBでもスペースハリアーくらいは作成できます。
 RPGは速度を問わないので、そうい点では楽ですね。

Subject: [fb-ml 1034] Re: アプリが前面に移動で自爆
 ベン/矢野勉 です。

At 11:26 AM 97.10.11, sendai_5300LTB wrote:
> その他,イベント周りで調査中なのが,二つのウインドウが開いている場合のアクティブとリフレッシュイベントの組合わせです。ウインドウ同士が重なっている場合は,アクティブ->リフレッシュとなりますが,重なっていない場合はアクティブのみです。ここで,ウインドウの再描画をどちらのイベントでもすると重なっている場合に更新が二回も起ってしまいます。せっかくオフスクリーンを使っていてもちらつくような遅いようなでなんとか一度限りに抑えたいのです。 > フラグを作るか何か方法を考えようと思っています。
 え? 他のウインドウと重なっていない場合は、そもそも再描画の必要がないんじゃないですか? 重なってないってことは、もともと描かれていたものは消えてないわけですから。
 どちらにせよ、描画は意地でもリフレッシュ時に行います。なんらかの事情で描画を強要したくなったら、自分で描画するのではなく、描画したい領域を CALL INVALRECT(rect) で「無効化」します。そうすればシステムが自動的にリフレッシュイベントを起こし、無効になっている部分を描画しようとします。リフレッシュに反応するようになっていれば、あとはほっといても描画されますね。オフスクリーンを使っているなら、かなりスムーズな描画が期待できます。

 描画はリフレッシュでのみ行い、必要なときは、描画を直接行うのではなく、リフレッシュを強要する、というのがMacintosh流の描画法です。(なんか「マニアーナの法則」とかいうたいそうな名前がついているらしい)

 ハンドブックの p72 にも「ウインドウの内容は _wndRefresh イベントを受け取った時のみ描画されるべきです」というようなことが書いてありますね。

Subject: [fb-ml 1035] Re:アプリが前面に移動で自爆
yukiです。

ベンさんwrote:
>  ううむ、僕も確認しました。どうもウインドウ内にカーソルが入ったときは、_cursOver イベントしか発生しませんねえ(^^;)
中略
>  結局、原さんのやっているように、_cursOver と _cursEvent を併用するしかないでしょう。推測するには、ウインドウにカーソルが侵入した場合、_cursOver (ID=0)と _cursEvent (ID=window id) が同時に発生してしまうため、イベントしては _cursOver のほうが優先的に発生するのでしょう。しかし _cursEvent がまったく発生していないわけではないので、_cursOver をキャッチした段階で DIALOG(_cursEvent)してやることで、侵入したウインドウのIDを得られる、ということではないかと。

なるほど、そういうことでしたか。以前悩んだときに窮地の策として使ったものです。
調べていただいてどうも有難うございました。

原 幸久(yuki@alles.or.jp)

Subject: [fb-ml 1036] Re:FNの引き数について
yukiです。

ベンさんwrote:
>  いや、関数定義の引数に @ がついているところも、アドレスではなく実体を要求します。実体を渡すと、コンパイラが自動的に変数の先頭アドレスをとって、srcRect& にいれてくれます。これはどういうことかというと、「参照渡し」「値渡し」の違いを理解する必要があります。解説は後半に。
>
中略
>  @ は同じマークでも、変数の頭につけた場合と、関数の定義で使用した場合とでは意味がちがうってことです。

詳しい解説を有難うございました。5回ぐらい読み返してやっと理解できました。
雲が晴れたような感じです。本当に有難うございました。

原 幸久(yuki@alles.or.jp)

Subject: [fb-ml 1037] Re: アプリが前面に移動で自爆
ベンさん,こんばんわ。

>他のウインドウと重なっていない場合は、そもそも再描画の必要がないんじゃないですか? 重なってないってことは、もともと描かれていたものは消えてないわけですから。
 いやあ,ごもっともです。説明をしていなかった私の落度ですが,実は例のスクロールバーの件の続きでして,独自のコントロールが付いているのです。ウインドウが背面に廻った時に,スクロールバーと同様に独自のコントロールもディアクティブにしたいのが,リフレッシュ以外のイベントで再描画している理由です。しかし,実際の描画が分散するのはまずいと思いまして,教えて頂いたCALL INVALRECT(rect)を使用することで実にすっきりとしたコードになりました。動作も正常です。ただ,CALL INVALRECT(rect)を多用するとアップデートイベントがたくさん発生するので,もう少し絞り込みたいと思います。例外として,Tile Switcher でのアプリ切り替えでは,アップルイベントでの呼び出しのせいかアクティブになったウインドウの独自コントロールをアクティブなものに差し替えることができていません。これは今後の課題として勉強したいと思います。

 先日来お騒がせしていたカッチョイイウインドウの件ですが,今回CALL INVALRECT(rect)を教えて頂いたおかげで,完全な動作をするものが完成しました。
 ありがとうございました。
                                   根来

Subject: [fb-ml 1037] SetPortとSetGWorldの疑問
古籏さん,いつもお世話になります。

古籏さんのサンプルソースを見ていて気付いたのですが,古籏さんはウインドウに描画する場合もSetGWorldを利用されていますね。私もそのまま真似をさせてもらっていますが,ハンドブックのサンプルでは,SetPortを使っています。どちらでもうまく動いているようですが,実際のところSetPortとSetGWorldは違うものというか使い分けが必要なものなのでしょうか。インサイドマックを読んではみましたが,個別の機能はわかるのですが,使い分けというか利用の上での差がわかりません。お手数ですが,教えてはいただけないでしょうか。
                              根来

Subject: [fb-ml 1038] PICTの属性を得るには?
皆様こんにちわ。磯村@埼玉です。

 またまた、教えを乞いに来ました。今度は、「PICTURE FIELDの属性はどうやったら得られるのか?」です。

 PICTURE FIELDを作ってそこにPICTを貼り込むには、
   PICTURE FIELD ID%,&pictHandle&,(x1%,y1%)-(x2%,y2%),_framedNoCR,_scaledPict
 とやれば良いことは分かっています。表示されているPICTを反転させるには、
   PICTURE FIELD ID%,,,_statFramedInv
とやれば、出来ることも何とか分かりました。

 しかし、ここから詰まってしまいました。
 やりたい事を手順にすると、
1)クリックされたフィールドのPICTを反転する。
2)クリックされたフィールド以外の属性を調べ、
3)反転されていたら元に戻す。
4)反転されていなければそのまま。
となります。このときに3)を実行する方法が分かりません。TEHANDLEを使うのかとも思いましたが、どうやらそうでもないみたいですし。

 どうすりゃいいでしょう。むぅぅん。

I should be happy to be of any service to you!!

Subject: [fb-ml 1039] Re: PICTの属性を得るには?
古籏一浩です。

At 11:20 97.10.13 +0900, Yuji Isomura wrote:
> やりたい事を手順にすると、
>1)クリックされたフィールドのPICTを反転する。
>2)クリックされたフィールド以外の属性を調べ、
>3)反転されていたら元に戻す。
>4)反転されていなければそのまま。
>となります。このときに3)を実行する方法が分かりません。TEHANDLEを使うのかとも思いましたが、どうやらそうでもないみたいですし。
>
> どうすりゃいいでしょう。むぅぅん。

 人にもよりますが、私のやり方では、あらかじめPICT FILEDの状態を保存しておく配列または変数を用意します。
 反転を切り替えるには(変数がaとした場合)

a = a XOR 1

 で反転できますので手軽にできるのではないかと思います。
 あとはa = 0なら普通の表示、1だったら反転表示にすればよいのではないでしょうか。

Subject: [fb-ml 1040] Re: SetPortとSetGWorldの疑問
古籏一浩です。

At 21:49 97.10.12 +0000, sendai_5300LTB wrote:
>は,SetPortを使っています。どちらでもうまく動いているようですが,実際のところSetPortとSetGWorldは違うものというか使い分けが必要なものなのでしょうか。インサイドマックを読んではみましたが,個別の機能はわかるのですが,使い分けというか利用の上での差がわかりません。お手数ですが,教えてはいただけないでしょうか。
 単にグラフィックデバイスを指定するかしないか、といった当たりだと思います。ここらへんは、あまり私は詳しくないのですがFB1.0.2の時にSetPortでどうしても動かなかったので、仕方なくSetGWorldで指定したら無事に動作したという経緯があって、それからSetGWorldを使ってます。
 ここらへんは他の人の方が詳しそうですf(^^;