RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/025/
INDEXに戻る

新しい装い

今週はREALbasic Universityのいくつかの変更に気づくでしょう。私はカスケーディング・スタイル・シート(CSS)についてのを買い、今までのHTMLファイルをCSSにより作り直すことによりRBUを改訂しました(訳注:翻訳版では最初からCSSを用いています)。

(CSSに精通してい人のために:それはあなたのウェッブの表示スタイルの定義を可能にするHTMLの素晴らしい拡張です。したがって、あなたはスタイル定義ファイルを編集することで、ウェブ・ページあるいは全サイトの外観を容易に修正することができます。)

CSSを使えば以下のような多くの利点があります:

変更例

このページを組む根本的なHTMLコードが相当に変わりましたが、読者のあなたはすこしの微妙な点に気が付くだけでしょう:

予想される問題点

最初のうちは少数のブラウザーしかCSSをサポートしていなかった(そして幾つかはうまくサポートしていなかった)ので、私は長い間CSSの学習を遅らせていました。最近はほとんど誰でもCSSをサポートする最新のウェブ・ブラウザを持っていますので、私は今が移行する時であると決心しました。

より古いブラウザー(あるいは、それほど一般的でないブラウザー)を使っている読者は新しいフォーマットのいくつかの非互換性を経験するかもしれません:あなたが異常と思ったことを知らせてください。CSSはそれをサポートしないブラウザーでは余分なコードとして単に無視されはずです。しかし、問題はすべてのブラウザーがCSSを全面的に、あるいは同じ方法でサポートするとは限らないということです。私は問題を回避するのためにタグを単純にしました、そして最も一般的なブラウザー上でのテストでは何の問題もありませんでした。しかし、それらを意図されているように見るためには、最新のブラウザー(MacではIE 5のような)を使用してください。

現時点では、私はこのコラムだけをCSSフォーマットにしましたが、このフォーマットが大多数の読者にとって上手く機能することが確かになった後で、私は全ての古いコンテンツも変換していこうと考えています。どうかこのフォーマットの変更についてあなたの意見(肯定的か否定か)をお聞かせください!

改善点についてもご意見を募ります -- CSSと私のRBU-to-HTMLプログラムを用いれば、フォーマットの変更が非常に容易ですので、他のやりかたでレイアウトを強調することが可能です(例えば、別のサイトへのリンクとRBUのリンクを区別する、あるいはプロジェクトのダウンロード・ファイルを特別のやり方または色付けで強調するなど)。あなたが重要だと思う点を知らせてください。

私のことに関しての話は十分です。では今日のレッスンを始めましょう!

既存クラスの利用

モジュール化プログラミング言語の最も良いことの1つは、それがコードの一部分の再利用を容易にするということです。例えば、整数の配列を並び替えるルーチンを書いたならば、「車輪を再び発明する」時間を節約して別のプログラム中でそれを再利用することができます。

REALbasicはモジュール化プログラミング言語です、そしてそれはプログラムから別のプログラムに容易にルーチンを移す事をを可能にしてくれます。モジュールの内部にコードを置けば、そのモジュールをデスクトップにドラッグすることでそのファイルを作ることが出来ます。その後、そのファイルは別のプロジェクトにドラッグすることができます:それらのルーチンはすべて別のプログラムで即座に利用可能になります!

追記

あなたは再利用したいルーチンを作る時には注意が必要です。ルーチンは、あなたのプログラムのその他の部分に完全に依存しないようにしなければなりません:それは、ウィンドウのコントロールあるいはあなたのデータ構造について知ることはできません。さらに、ルーチンがカスタム・クラスあるいはもとのプログラム内の他の定義に依存する場合には、それはまた複雑になります;それらも同時に新しいプログラムに移されなければ、あなたのルーチンはコンパイルできないでしょう。

例えば、私が少し前に言及した並替えルーチンを見てみましょう。あなたのプログラムがユニークなデータ構造(例えばオブジェクトの配列)を持っている場合、あなたの並替えルーチンはそれをソートするためにその構造について知らなければならないでしょう。それは別のプログラムに並替えルーチンを移して、それを再利用することを困難にします。1つの代替手段は、あなたの並替えルーチンを単純なデータ・フォーマット(文字列あるいは整数の配列ような)で機能するようにし、並替えに先立って、そのルーチンを呼ぶどんなプログラムも特別なデータ構造をその単純な配列フォーマットに一時的に変換し、並替えが完全に終わった後で、逆のプロセスを行なうというものでしょう。

もちろん、よりよい方法はあなたのデータ構造体それ自身を並替えるオブジェクトにすることです(それはオブジェクト指向のプログラミングの真髄です)。

オブジェクト指向プログラミングは別のレベルでのコードの再利用が可能です。あなたがオブジェクトを正しく作成すれば、別のプログラムへ全オブジェクトを単純に移動させて、あたかもそれが組込みのオブジェクトのように再利用することが可能です!

これは実に素晴らしい点です。文字入力欄のような既存のREALbasicのオブジェクトを変更し、新しいタイプの文字入力欄として変更されたオブジェクトを容易に配布できます。例えば、多くの人々が「数値限定の」文字入力欄オブジェクトをリリースしています。それらを自分のプロジェクトに単純にドラッグすれば、あなたは数値のみを受付る文字入力欄を使うことができます。

これらのオブジェクトは既存のREALbasicオブジェクト(文字入力欄リストボックスのような)のカスタマイズされたクラスですので、それらはカスタム・クラスと呼ばれます。

REALbasicコードの塊はネット上に漂っていて、あなたが使うのをただ待っているのです。今週のレッスンはあなたにそれをどのように使うかを教えてくれるでしょう。

私自身がリリースした少数のクラスおよびプロジェクトで始めていくことにしましょう。これらは私のREALbasicのページからダウンロードすることが可能です。私がそれらを数年前に書き、そしてそれらをREALbasicのコミュニティーへリリースすることを決心しました。 それは他の人の提供しているものから私も多くを学び、習得したからです。

(私のページはこれらのクラスに関する有用な情報を持っていますので、それは読む値打ちがあります。しかし、あなたにとってより簡単なように、私は、3つのプロジェクトすべてのダウンロードをRBUウェブサイトに設けました。)

カレンダー・ポップアップ

第1のものはカレンダー・ポップアップと呼ばれ、ユーザがプログラムに日付を入力することを容易にする方法です。テキストベースのインターフェース、あるいはクリックして一度に1つづつ日付を変更するための小さな矢印の代わりに、それはユーザが日付を簡単にクリックすることのできるカレンダーをポップアップします。それは1500-2399の間の年を扱うことができ、Y2K(2000年問題)に適合しています。

カレンダー・ポップアップはそれがどのように動くかを見るために動かしたりテストしたりすることが出来るサンプルプロジェクトを含んでいます。カレンダー・ポップアップはクラスではありません -- それは複数の部分から成るモジュールです。それをあなたのプログラムで利用するには以下のファイルをあなたのプロジェクトにインポートする(プロジェクトウィンドウにドラッグする)必要があります:

最初の3つはカレンダー・ポップアップで使われる単純な画像です(好みで自由に他の画像に置き換えてもらっても結構です)。その次はカレンダー・ウィンドウ、およびカレンダーのコードを含んでいるモジュールです。もし、あなたが望む場合には、それらがあなたのプロジェクトを雑然としないように、すべてをあなたのプロジェクト・ウィンドウの内部のフォルダー内に置くのもいいでしょう。

次に、カレンダーの形のベーベルボタンをウィンドウに作らなければなりません(これはユーザがクリックしてカレンダーを表示するためのボタンです)。次のようにその属性をセットしてください:

ベーベルボタンのActionイベントで、以下のコードを入力してください:

 
   CalendarWindow.showModal 
if gReturnDate <> nil then
msgBox "You chose: " + gReturnDate.longDate
end if

これが最初に行うことはカレンダー・ウィンドウを開くことです--それはshowModalコマンドで開かれるので、カレンダー・ウィンドウが閉じられるまで、あなたのプログラムは停止します。

ユーザが日付を選んだならば、それはグローバル変数gReturnDateで返されます。この例では、私たちは単純にダイアログ・ボックスにそれを表示します。しかし、文字入力欄に結果を入れるというような、あなたのニーズに合わせてどのようなことをしてもかまいません。

gReturnDateは日付(date)オブジェクトですので、それを使用する前に私たちはそれがnilではないことをチェックします(オブジェクトは存在するかもしれないし、存在しないかもしれませんので、それを使用する前に確かめなければならないということを覚えておきましょう)。

Tip: あなたがCalendarWindowを開く前に特別の日付にgReturnDateをセットすれば、カレンダーはあなたが渡した日付で開きます。

これがあなたのアプリケーションにカレンダーを加えるためにしなければならない全てのことです! クールでしょう? 私はあなたのための仕事をすべて行いました。あなたは私がどのようにカレンダーを書いたかに関して何も知る必要はなく、あなたは返された日付で何を行うべきかを考えるだけでいいのです。

もちろん、カレンダー・ポップアップがREALbasicで書かれているので、コードをあなた自身で編集することができます:表示をよりきれいにする、より速くするためにコードを書き直す、あるいはあなたが見つけた何らかのバグを修正するなど(プロジェクトにそれらを組み入れることができるようにそれらのことを私に連絡してください)。

GrayEdit

カレンダー・ポップアップが単純なモジュールである一方、GrayEditはより複雑なカスタムクラスです。あなたはREALbasicが変数名およびキーワードの入力を完了する「自動補完」機能を持っているのを知っていますね? あなは自分のプログラム中にその機能があったらと思ったことはありませんか。今や、あなたもそれができるのです!

GrayEdit文字入力欄のテキストの入力を完成する特別な文字入力欄のクラスです。それは、ワープロのようにテキストを編集するスクリーン内の多数の項目ではなく、一つのフィールド内の単一の項目に対して動くように設計されています。それはリスト中の項目(フォント名のような)を自動補完するのに最も適しています。

自分のプロジェクトの中でGrayEditを利用するのは簡単です。あなたのプロジェクト・ウィンドウの中へGrayEditClassを単にドラッグするだけです。その後では、どのような文字入力欄も属性パレットでその "super" を "GrayEditClass"に変更することができます。

次に、文字入力欄のgrayList属性を初期化する必要があるでしょう。GrayListGrayEditClassで定義されている文字列の配列です。それはプログラムがあなたのために行う「自動補完」のキーワードのリストを含んでいます。あなたはこのリストをできるだけ早く初期化すべきです--文字入力欄が開かれる時がよいタイミングです。あなたのキーワードのリストが変化する場合には、常にgrayListを更新する必要があるでしょう。最後に、キーワードは順次に検索されますので、grayListをソートする必要があるでしょう(これで、2つの似通った単語が互いの隣りにくることになります)。並替えはREALbasicの配列のsortメソッドにより容易に実行できます。

例えば、ここにフォント名を自動的に入力する文字入力欄のための初期化コードがあります(フォントが既にアルファベット順になっているので、私たちはわざわざその並替えを行いません。しかし、もし並替えを行いたいならば、nextの後にeditField3.grayList.sortを加えることもできます)。

   redim editField3.grayList(FontCount) 
for i = 0 to FontCount-1
editField3.grayList(i + 1) = Font(i)
next

"editField3"が初期化されたならば、あなたはもう何もする必要はありません。それはユーザのためにうまく働いてくれるでしょう。文字入力欄のtext属性を調べることによって、入力欄にあるテキストを知ることができ、従ってi>GrayEditはその情報を使うことが出来ます。

では、GrayEditはどのように働くのでしょうか? そうですね、それは少し複雑ですが、本質的には文字入力欄に属する2つの文字列を監視しています:「黒い」テキストと「灰色の」テキストです。黒いテキストは、ユーザが現実に入力した文字から構成されますが、灰色のテキストはプログラムによる提案です。個々の新しい文字が入力される(あるいは文字が削除される)ごとに、GrayEditは、対応するものがあるかどうか確かめるために配列grayListを走査します -- 対応するとは、入力された文字がgrayList要素の項目の最初の数文字と一致することです。

もし対応した場合には、クラスはgrayList要素の全ての文字を文字入力欄の中に入力し、最初の数文字を黒色にそして残りを灰色にします。最後に、テキストの色付けがカーソルを移動させるので、最後の文字が入力された後ろにカーソルを戻します。

私たちが行っているのが少しごまかしであることが判るできるでしょう:文字入力欄は実際には単語全体を含んでいます。しかし、示唆された部分を灰色にすることによって、ユーザにその部分が実在しないと思わせているのです。ユーザが入力すると、私たちは飛び回って、適切な新しい言葉を挿入し、そして適切に色付けをします。それは少し狂気じみていますが、それはうまく行くのです!

GrayEditの最も巧妙な部分は、ごまかしがうまくいくように、ユーザに彼らが既に入力した点をこえてカーソルを移動させないようにするところです。これを明らかにするために例を使用しましょう。例えば、私たちがフォントを自動補完する文字入力欄で、「Mo」を入力したとしましょう -- 入力欄は次のように灰色で「naco」を付け加えるでしょう:

Monaco

ユーザのテキスト・カーソルは最初の「o」の後にあるべきです -- 結局、それはユーザが入力したところです。灰色のテキストは「霧のようなテキスト」と考えられます。それはまだ存在していませんので、ユーザはその部分へカーソルを移動させることを許されるべきではありません。

さて、SelChangeイベントをチェックして、ユーザがテキスト・カーソルの位置を移動させたかどうか判るので、それを止めることはかなり容易です。私たちは、カーソルが入力された最後の黒色の文字を越えたかどうか調べ、もしそうであれば、カーソルを後方に移動させます。

しかし、その時、私たちは問題に直面します。我々のルーチン(それはテキストの色を変更します)はテキストを選択し、かつそれに色をつけるためにカーソルを移動させなけれはなりません。これは大きな問題です! というのは、我々のSelChangeルーチンは我々が望むところにカーソルを移動させれてくれません。

どのようにこの問題を解決できるでしょうか? 単純です:私はEditInProgressと呼ばれる倫理変数のプロパティを作りました。これにより、ユーザのカーソル動作と自分の行なっているカーソルの移動を識別することができます。私のSelChangeルーチンはEditInProgressのチェックによって包まれています。これはもし私がカーソルを移動させているのであればカーソル位置を変更せず、それがユーザで移動させているならばカーソルを移動させることを意味します。

GrayEditの中のコードを見てください:あなたはそれを興味深く、そして教育的だと思うと信じます。もちろん、あなたのプロジェクトで自由に使ってください(ただし、このプログラムについて(About Box)の中に私へのクレジットを明記してください)。

リストボックスのカラム幅の変更

あなたがREALbasicのリストボックスを使ったことがあれば、それらが非常に強力なことを知っているでしょう。しかし、それらはいくつかの重要な制約(内蔵されるべきもの欠如を含む)を持っています。例えば、ヘッダーをクリックされた時にカラムを並替えるのは道理にかなっています。しかし、ドラッグすることによりカラムの順序を変更できる、またドラッグすることにより各カラムの幅を設定することができるべきです。

良いニュースです:このクラスはこれを可能にします。それはこの魔法のようなことをどのように行うのでしょうか? さて、それは容易ではありません、そしてちょっとした策略を必要とします。

最初の問題はユーザがクリックやドラッグしている場所を知るために、MouseDownイベントを受け取る必要があります。不幸にも、リストボックスコントロールをチェックすれば、それがMouseDownイベントを持っていないのがわかるでしょう。したがって、私のクラスはリストボックスコントロールの変形ではなく、特種なキャンバスなのです!

もしそれらの中に何も描かなければ、キャンバスは透明であることを思い出してください:したがって、リストボックスを覆っているキャンバスはリストボックスの機能に全く影響しません。それは素晴らしいことです:リストボックスがそれについて何も知らなくても、我々はMouseDownMouseMoveイベントについて知ることができるのです。

このアプローチの不利な点は、キャンバスがどのリストボックスを覆っているか知っていなければならないということです:ユーザがクリックを始める前に、あなたはそれを知らせる必要があります。この初期化は非常に単純です。

最初に、あなたのプロジェクトにResizeListClass2クラスをドラッグします(同様にhandCursormoveColumnCursorもドラッグしてきます)。新しいキャンバスを作成して、それを正確に同じ大きさ(幅、高さおよび位置)のリストボックスの上に置きます。キャンバスのsuperを"ResizeListClass2" に変更してください。それから、キャンバスOpenイベントに、以下のものを入力します:

 me.theList = listBox1 

listBox1をあなたのリストボックスの名前で置き換えてください。ここでは、我々は単純にキャンバスの属性(theList)にlistBox1を割り当てています。これはそれらを結びつけており、非常に重要です:あなたがこれをしなければ、プログラムはクラッシュするでしょう!

私たちが作成したキャンバスは従来のキャンバスの変形ですので、我々はそれを自分の必要とするように自由に変形できます。ですから、私はいくつかの「ユーザ・プロパティ」と「ユーザ・メソッド」を作成しました -- それらはユーザがあたかもそれらがREALbasicのリストボックスの設定であるかのように、自由に使用することができる設定とルーチンです。

例えば、以下は変更することのできるユーザ・プロパティです:

次は使用できるユーザ・メソッドです:

ResizeListClass2のサンプル・プロジェクトは、これらの異なる設定をセットするための単純なチェックボックスとreturnHeaderメソッドのデモを含んでいます。

最後に、このクラスは完全ではないことを言っておきたいと思います:私が完全には解決することができなかった幾つかの問題があります(また、私はそれを終了していんせん)。これらの潜在的な問題に関しては私のウェブサイト上にさらに多くの情報があります。しかし、これは自分のプログラムにサードパーティのクラスを組み入れる方法を説明する適当なクラスだと思います。

次週

他の人と共有することができる、あるいは自分のプログラムで再利用できる自分のカスタムクラスを作成する方法を学習するでしょう。

Letters

今週はSanta Cruzの私と同じ通りをすこし上がったところのJamesから便りをもらいました。彼は多くの面白い質問を送ってくれました。

Marcさん、

あなたの偉大なカラムに感謝します。それらは本当に2冊のRealBasicの本(あなたの2冊の本の書評では、それらはホープです)の間にある重要なすきまを満たしています。

私と私の息子は、曲目リストとチャット機能(そして、将来はファイル共有機能も)をもつMP3プレーヤーを作ろうとしています(QuickTimeを利用して)。私たちは次のようなことに関して困難に陥りました。私たちは2冊の本、あなたの以前のコラム、RBのドキュメント、およびRBに関連する様々なウェブサイトを調べましたが、私たちの問題に関して特に述べているものは何も見つかりませんでした。とにかく、問題は次のようなものです:

1.私たちはIDEの中の適切な場所にアプリケーションのクリエータとタイプのコードをセットしました。保存された曲目リスト用の書類アイコンもあります。しかしながら、曲目リストを保存した場合、常にそれは、クリエータがR*ch、タイプがTEXTのBBEditのアイコンとしてデスクトップに現われます。デスクトップの再構築は効果がありません。私たちは保存ルーチンにMacCreatorおよびMacTypeを指定するためのコードさらに付け加えもしました。これも効果がありません。私たちはコンピューターからすべてのBBEditアプリケーションを取り除きました。それでもまだ、同じことが起こります。何が起こっているのか、そしてなぜかを教えて下さい。

2.私たちは、歌を再生している時に、経過タイムを表示するために静的なテキストボックスを使用しています。不幸にも、フィールドが更新されるときに(1秒毎に)幾らかちらつきがあります。私たちは、文字入力欄のちらつきをおさえるか除去するための方法を見つけました。しかし、静的なテキスト欄に関しては方法が判りません。何か提案がありますか?

3.私たちは、保存された曲目リストのダブルクリックでプログラムと曲目リスト自体を開く"open document"イベント(appクラスの)の書き方がよく判りません。プログラムは開きますが、曲目リストは開きません。曲目リストはそれ自身には2つのリストボックスがあります。1つは歌タイトルを備えた可視のもの、他方はmp3の完全なパス名を含んでいる不可視のものです。私たちは、新しいウィンドウの作成、位置決めおよび表示するコードを追加すれば、保存された曲目リストをロードするために使用する同じルーチンを使えるだろうと思っていました。しかし、それはうまくいきません。アプリケーションが開く時に、現われるウィンドウは浮かんでいるツールバーだけであることは重要なの兆候なのかもしれません。曲目リストのウィンドウはボタンがツールバー上で押された後にだけ現われます。

4.コンパイルされたアプリケーションを最初に起動したときには、ボタンがツールバー上で押されるか、メニューバーでマウスを押さえるまでファイルメニューは薄くなっています。終了項目はデフォルトで選択可能ですので、私たちは"file"はメニューでいつもアクティブなものとして現われるだろうと思っていました。私たちは様々な場所に"EnableMenuItems"を入れてみましたが、うまくいきませんでした。

質問が多くてすみません。

ところで、私たちは今後のコラムでnoteplayerがもっと解説されるのを期待しています。エラー処理に関する議論もまたいいテーマでしょう。

あなたの困難な仕事に感謝します。

あなたの親切な言葉に感謝します、Jamesさん。喜んでお手伝い致しましょう。私は逆の順序(最簡単なものから複雑なもの)であなたの質問に対処しましょう。

#4:薄暗くなっているFileメニューは、一時的にダイアログ(スプラッシュスクリーンのような)を表示し、それを閉じるたときに一般的に発生します。起っていることは、メニューがスプラッシュスクリーンのためにそれ自体を選択不能にし、次に、選択可能にされるべきですが、適切にリフレッシュされていないのです。この解決法はあなたが考えたものです:"EnableMenuItems"コマンドを付け加えることです。しかし、重要なことは、これを適切なところでしなければならないということです。あなたのコードを見ないでそれはどこかであるは言えませんが、恐らくそれはあなたがダイアログを閉じた直後でしょう。色々と試してみて下さい、そうすれば、私は、あなたが正しい場所を見つけるだろうと確信します。

#3:ダブルクリックされたドキュメントを開くアプリケーションの作成は少し巧妙です。これに関してもあなたは間違っていません:あなたはユニークなクリエータコードが必要で、そしてあなたの保存された書類はカスタム・アイコンを必要とします(カスタム・アイコンなしでは、RBは書類にリンクしません)。

あなたはアプリケーションクラスを作成されているようです(新しいクラスを追加し、そのsuperを"application"にセットする)。これは正しいことです。ダブルクリックされたファイルは、OpenDocumentのイベントに渡されるなければなりません:それらは通常のfolderItemsです。したがって、それらのファイルを開くために自分のオープンルーチンにそれらを送ることができます。(理想的には、あなたのオープンルーチンはパラメーターとしてfolderItemを受け付けるべきです。)

上記のことはあなたが既に行ったことで、それがうまく機能していないようなので、私はその問題がどこにあるか正確に判りません。先ず最初に、そしてすぐに思いつくのは、これをスタンド・アロンのコンパイルされたアプリケーションでテストしているかということです。このようなファイルのオープンはREALbasicのIDEの内では働きません。

あなたはそれをしていて、それでもまだうまくいかないのであれば、デバッグが必要です。私が最初に試みることは、次のコードをOpenDocumentへ入れることです:

 msgBox item.absolutePath 

そこにある他の全てのコードをコメントアウトしてください。これはあなたのプログラムにダブルクリックされたファイルのパスを表示させます。そして問題の原因を限定するでしょう:ダブルクリックされたファイルを取得できていないか、それとも、あなたのプログラムがファイルを正しく開いていないのか? あなたが見つけたことをか知らせてください。そうすれば、私は恐らくさらにお手伝いができるでしょう。

#2:テキスト要素のちらつきは長年のRBの問題です。私の簡単な解決法はキャンバスを使うことです(それをdisplayCanvasと命名しましょう)。文字列のパラメーターを必要とするあなた自身のメソッド...例えば、updateDisplayを作成してください。そのメソッド内で、以下のようにdisplayCanvasに文字列を描かせます:

 sub updateDisplay(s as string) 
dim g as graphics

g = displayCanvas.graphics
g.clearRect(0, 0, g.width, g.height)
g.textSize = 12
g.textFont = "Geneva"
g.drawString s, 2, 15
end sub

テキストがカットされないように、drawStringが描く位置を調節する必要があるかもしれません(それは使用するフォントに依存します。ルーチンを柔軟にしたけれが、フォントの垂直位置を計算するために.textHeightプロパティを使用することもできます)。

このように、staticText1.textに文字列を割り当てる代わりに、単にupateDisplayへ文字列を渡します。

#1:最後に、保存されたファイルがBBEditファイルとして現われる問題です。私は、ファイルを保存するためにあなたがTextOutputStreamを使用していると断言します。REALbasicでのテキストファイルのデフォルトではBBEditファイルとしてそれらを保存します。

あなたはほとんどの物事を正しく行っているようです:あなたのアプリケーションはタイプおよびクリエータを持っています。また、ファイルタイプのダイアログで書類のアイコンを定義しています。しかし、それはまだうまく動作していません。私を本当に悩ませることは、あなたはファイルのタイプおよびクリエータのコードを実際に手で変更しても、それでもまだうまくいかないと言っていることです;それは信じられないようなことです。

私が考えることができるただ1つのことは、あなたがあまりにも早くコードを変更しているのではないかということです:タイプとクリエータのコードを修正するに、TextOutputStream閉じる必要があります。

次の例を見てください( f はルーチンに渡された有効なfolderItemであると仮定しています):

   dim out as TextOutputStream 

out = f.createTextFile
if out <> nil then
out.writeline "This info is saved in the file."
out.close
f.macType = "TYPE" // Use your file Type
f.macCreator = "MYCR" // use your Creator code
end if

上記のコードはうまくいくはずです -- 私は、多くのプログラムの中でこのようにしています。別のやり方はBinaryStreamを使用することです;そこでは、ファイルを作成するときにファイル・タイプを指定します("myfilekind" が定義されたファイル・タイプであると仮定しています):

   dim b as binaryStream 

b = f.createBinaryFile("myfilekind")

これがお役に立つことを望みます。このような手紙をお寄せ下さい。私はあなたの質問に直ぐには答えないかも知れませんが、たぶん今後のコラムで取り扱うでしょう。(もし、あなたの手紙が公表されるのを望まない場合には、その旨を明記して下さい。そうでなければ、公表してもいいものとして取り扱います。)


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る