RealBasic University

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

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

OOP University: パート 15

前回は、SuperDrawにオブジェクトをさらに追加していきました。その間に、一般的な概念がつかめたことと思います。そこで今回は、いくつかの欠かすことのできない機能を追加しながら、SuperDrawの仕上げに入りましょう。

この最後の2回のSuperDrawのレッスンでは、さらに磨きをかけていきますので、コラムではすべてを詳述することはしないでしょうが、最終版のSuperDrawの完全なソースコードにアクセスできます。そういうわけで、もし私が早く進んでも、我慢してついてきてください。今回はカバーする範囲がたくさんあるのです。

インターフェースの改良

SuperDrawに、未完成のインターフェース要素がありますので、まずそれを完成しましょう。最初は標準的な「すべて選択」コマンドです。

すべて選択

プロジェクトのmenuオブジェクトを開き、separatorと「すべて選択」メニュー(名前はEditSelectAllとしてください)を追加します。それにCommandKeyを「A」(括弧は必要ありません)としてください。

さて、window1のコード・エディターを開き、Eventsセクションに行ってください。EnableMenuItemsイベントで、次のコードを入力してください:

  
if canvas1.objectCount > 0 then
editSelectAll.enabled = true
end if

それから、新規のメニュー・ハンドラーを追加します。編集メニューに行き、「新規メニューハンドラー」を選び、EditSelectAllを選択してOKを押します。作成されたハンドラーの中に、次のコードを入力してください:

  
canvas1.editSelectAll

ここで行ったことは、メニューを追加し、描画領域にあるオブジェクトがゼロより多ければ、そのメニューを利用可能にします。そして、そのメニューが実行されたときには、drawCanvasClassオブジェクトにすべてを選択するよう伝えます。

しかしちょっと待ってください!drawCanvasClassはどうやってすべてを選択すればよいかまだわかりません。よって、そのメソッドを追加していきましょう。

drawCanvasClassを開き、editSelectAllという名前の新規のメソッドを追加(編集メニューの「メソッドの追加」)してください。そこに次のコードを入力します:

  
dim i, n as integer

n = objectCount
for i = 1 to n
objectList(i).selected = true
next // i

me.refresh

見ての通り、これはシンプルなコードです。ここでは、データ構造にあるすべてのオブジェクトのselectedプロパティをtrueに設定します。それからキャンバスをリフレッシュ(強制的に再描画)するので、その結果すべてのオブジェクトが選択ハンドルとともに再描画されることになります(そうすることで、ユーザは選択されたことがわかります)。

オブジェクトの削除

次のまだやり残している重要なインターフェースは、オブジェクトを削除する方法です。これを導入するいちばん簡単な方法は、ユーザがDeleteキーを押すと、選択されているオブジェクトを削除するやり方です。簡単なように見えますが、実際には機能するまでにふたつのステップを踏む必要があります。

最初に、drawCanvasClassを開き、2つの新規イベントを追加(編集メニューの「新規イベント」)します。ひとつ目は、単純なOpenイベントで、それにはパラメータもありませんし、何も返しません。2つ目は、keyDownで、それはパラメータとしてkey as stringを持ち、論理型を返します。

これらを追加する理由は、そこにコードを入力することでオリジナルを上書きしようとしているのですが、一方でクラスの外部で必要とされる場合には、オブジェクトはそのイベントを維持し続けるのが望ましいからです。

openイベントで、次のコードを入力してください:

  
// キー入力受付に必要
me.acceptFocus = true

// openイベントに進む
open

drawCanvasClassがキーボードのイベントを受け付けるように、フォーカスの設定をします。それから、openイベントに進むことで、canvas1オブジェクトがopenイベントを受け付けます。

次に、keyDownイベントにコードを入力する必要があります。次のコードでは、ユーザがDeleteキーを押したかを確認します:

  
dim i, n as integer

n = objectCount
// ユーザがDeleteキーを押すとき
if key = chr(8) then
// while/wendループを使用することで
// 動的にループを再スタートできます。
i = n
while i > 0
if objectList(i).selected then
objectList.remove i
n = n - 1 // オブジェクトがひとつ減ります
i = n // ループを再スタート
else
i = i - 1
end if
wend
me.refresh
return true
end if

// イベントを次に渡す
return keyDown(key)

ご覧のように、このコードは少し複雑です。複数のオブジェクトを削除する可能性があるので、あなたが考えているようにはfor-nextループは使用できません。10のオブジェクトがあるとしましょう――ひとつを削除します。しかしfor-nextは10までループを繰り返し、objectList(10)を参照したところで、プログラムは強制終了してしまいます。したがって、その代わりにwhile-wendループを使い、最後のオブジェクトから降順でカウントしていきます。この方法をとれば、ループの回数は動的となります。

オブジェクトを削除したら、canvasをリフレッシュしてtrueを返します。他のキーが押された場合、イベントを新しいkeyDownイベントに渡すことで、canvas1がそれを処理できます(そうしたい場合には)。

すばらしい!これで、プログラムはユーザにすべてを選択させて、オブジェクトを削除することができます。しかしまだこれで終わりではありません。

オブジェクトの機能拡張

まだ充分に取り上げていないもののなかに、オブジェクトの機能拡張があげられます。新しいオブジェクトを追加してきましたが、そのオブジェクトは実際きわめて基本的なものばかりです。我々が設定、変更できる機能はまだまだたくさんあります。たとえば、カラー設定、線の太さの設定、塗りつぶし設定をオブジェクトに持たせることができるでしょう。textClassのようないくつかのオブジェクトは、ボールドやイタリックのような独自の設定があるでしょう。それらすべてを導入することは、私がRBUでやりたい範疇を超えていますが、ひとつだけ機能を追加しますので、それがどのように行われるのか参照してください。他の機能も同様に追加できるでしょう。

線の太さ設定機能の追加

ユーザが手を加えることのできる設定のひとつの例として、オブジェクトに線の太さを変える設定を追加しましょう。これにはやることがたくさんあるように見えますが、実はきわめて簡単です。

shapeClassを開き、新しいプロパティ(編集メニューの「新規プロパティ」)をlineSize as integerとして追加してください。それを「プライベート」(このオプションはRB 5では「プロテクト」と呼ばれています)に設定します。これは現在の線のサイズを保存します。外部からは、データ構造に修正を加えられたくありませんので、shapeClass以外からは設定の変更をさせないようにします。そこで、外部から設定値を取得したり、設定するためのルーチンの作成が必要になるでしょう。

2つのメソッドを追加(編集メニューの「新規メソッド」)する必要があります。ひとつ目は、integerを返しますがパラメータを持たないgetLineSizeです。2つ目は、何も返しませんが、パラメータとしてnewSize as integerを持つsetLineSizeです。次に、これらのルーチンのコードを示します:

  
function getLineSize() as integer
return lineSize
end function

  
sub setLineSize(newSize as integer)
if newSize > 0 and newSize < 25 then
lineSize = newSize
end if
end sub

これらのメソッドは、外部からのlineSize値の取得や設定を可能にします。この方法で、我々のデータ構造(今回はとても簡単なもの)は、外部から見えなくなります。我々は、外部コードに手を加えることなしに、この値が保存される方法を変更することができます。setLineSizeルーチンでは、その値が任意の範囲内(ゼロより大きく25未満)であることを保証していることに注意しましょう。

さて、描画ルーチンが正しいラインサイズで描画する手立てを知らないことから、新しいlineSizeプロパティを追加したことで、すべてのオブジェクトの描画メソッドを変更する必要があると思うかもしれません。

オブジェクトを拡張した場合の多くは、その通りです。たとえば、塗りつぶし設定を追加した場合、オブジェクトの描画ルーチンを現在の設定に応じて塗りつぶしするかしないように修正する必要がでてきます。

しかし幸運なことに、どのオブジェクトも描画ルーチンにおいてラインサイズを実際には指定していません。そのことから、我々はこのオブジェクト構造の利点を生かし、たった2行のコードだけで、新しい描画機能を追加できます!

shapeClass内で、drawメソッドを開いてください。そこに次のように入力してください:

  
g.penHeight = lineSize
g.penWidth = lineSize

paint g
drawSelection(g)

見ての通り、線の太さを設定するためにたった2行しか追加しませんでした。drawはオブジェクトの描画前に実行することから、線の太さの設定はオブジェクトが描画し始める前に設定されます。オブジェクトがその線の太さの設定を上書きしない限りは、我々が明記した線の太さ(lineSize)で描画します。いい方法でしょう?

しかし、ここでSuperDrawを実行してみると、何の変化も見られないでしょう。それは、ユーザにオブジェクトの線の太さを変更させる方法を、まだ追加していないためです!

drawCanvasClassを開き、KeyDownイベントに行ってください。end ifreturn keyDown(key)行の間に、次のコードを入力してください:

  
if key = "-" and currentObject.selected then
currentObject.setLineSize(currentObject.getLineSize - 1)
me.refresh
end if

if key = "+" and currentObject.selected then
currentObject.setLineSize(currentObject.getLineSize + 1)
me.refresh
end if

おわかりかと思いますが、これはユーザがマイナスあるいはプラス・キーを押すことを監視し、それにしたがって線の太さを調整します。

しかし、SuperDrawを実行してみると、新しい問題に出くわすでしょう。なんとオブジェクトが何も表示されません!「すべて選択」ではオブジェクトを選択したのですが、そこには何もありません!

どうしたのでしょうか?ここで立ち止まって考えてみれば、何が起きたのか理解できるでしょう。新しいプロパティであるlineSizeは、プログラムが立ち上がった初期の設定では、値がゼロになっています。我々はどこでそれを設定したわけでもないので、すべてのオブジェクトは線の太さがゼロで描画されているのです!

これは2段ステップで簡単に修正できます。はじめに、shapeClassを開き、initという新規メソッド(パラメータ、返し値はなし)を追加してください。その中に、次のコードを入力します:

  
lineSize = 1

次に、このメソッドを呼び出す方法が必要です。そして、それはメソッドが作成された直後に実行されなくてはなりません。よって、drawCanvasClassを開き、addObjectメソッドに行ってください。そこでn = uBound(objectList)となっている行を探し出してください。その行の直後に、次を追加します:

  
objectList(n).init

さて、プログラムを実行してみれば、オブジェクトが選択できて、+や−キーを押すことで線の太さを太くしたり細くしたりすることができるはずです。

おや、ところでこれは何でしょうか?オブジェクトを太くしていくと、画面はこんな感じになりませんか?

ちょっとしたバグが見つかりました。drawCanvasClassはその周りに境界線を書いているので、境界線も同時に太くなってしまいます!

しかし、境界線はもう必要ありません。我々はdrawCanvasClassがフォーカスを受け付けるようにしたので、オブジェクトはシステム側から自動的に境界線が与えられます。よって、その箇所をコメントアウトしてしまいましょう。drawCanvasClassのpaintイベントを開いて、最終行へ行ってください。Command+' (あるいは' か、または//を行の先頭にタイプする)を押し、コメントアウトしてそれを無効にします。

これでSuperDrawを実行すればちゃんと動きます!textClassのようないくつかのオブジェクトは、線の太さの機能は使用しないことに気づくでしょう。pictClassオブジェクトは、画像がないときにその機能を使用しますが、変に見えるのでそれはしない方がよいでしょう(画像のないことを示すのx印の箱は、グラフィクスではなく、場所を示しているだけです)。しかし、pictClassの描画ルーチン内にpenHeightpenWidthの設定を追加することで、これを簡単に置き換えることができるでしょう。

これらのオブジェクトに追加できうる拡張設定は、無数に存在するでしょう。すでにいくつかについては述べましたが、便利な機能のひとつとして、drawCanvasClassにズーム機能を追加することがあげられます。これは、オブジェクトにどの程度の割合でそれらを描画したらよいか伝えるプロパティ(おそらくdouble)です。たとえば、zoomLevelが1.0であれば、それは100%となります。zoomLevel0.5であれば、それは50%です。zoomLevelが2.5であれば、それは250%となります。

もちろん、画像が拡大されたら、キャンバスにはスクロール機能がなければならないので、まだやることが少しあります。そこで、drawCanvasClassgraphicsプロパティに直接描画する代わりに、picturegraphicsプロパティに描画します。それから、そのpictureをdrawCanvasClassのpaintイベントで表示すれば、picturedrawPictureコマンドによって拡大したり縮小したりできます。

その可能性には限りがありません!実は、私は読者が作るものに興味津々です。よって、コンテストを開催しましょう!下記のお知らせと公式ルールに目を通してください。

今週のチュートリアルの完全なREALbasicプロジェクト(リソースを含む)を手に入れたい場合は、ここからダウンロードできます。

次週

ファイルの保存と読み出しのコマンドを追加して、SuperDrawを完了します。

SuperDrawオブジェクト・コンテスト

オブジェクト指向によりデザインされたSuperDrawでは、新しいオブジェクトの追加や現機能の拡張が容易に行えます。その可能性に限りはありません。もうすでにSuperDrawに独自のオブジェクトを追加しましたか?新しいオブジェクトや、現存のオブジェクトの拡張についてのアイデアを何かお持ちですか?それをこちらまでお送りください!

REALbasic Universityではコンテストを開催します!あなたのSuperDrawオブジェクト、機能拡張したものを送ってください。それらを審査し、すばらしい作品には賞品や特典を差し上げます。REALbasic Developerマガジンの定期購読権、RBDのTシャツ、そのほか、すてきな賞品が待っています!〔訳注:2003年3月31日のコラムです〕

コンテストのルール

受賞者は2003年5月に発表予定ですので、いますぐ作成に取りかかりましょう!

REALbasic Developer 1.5 予告編

RBDの次号は現在印刷中ですので、ここでは内緒で予告を行います!

今回のメイン特集はREALbasic 5で、それもひとつではなく、2つもの詳細な記事が掲載されます。

REAL Software社の技術者であるJoe Strout氏が、今回の新しい環境の心臓部分に当たる、新たなコンパイラーについて説明します。そして、Matt Neuburg氏が、RB5の新機能の詳細なまとめをし、あなたも知らないいくつかの秘密を明らかにします。

Joe氏はさらに、経路探索のアルゴリズムのまったく新しい利用方法を提供してくれました。明らかな使い道は、迷路で道を探し出すことですが、この記事を勉強することによって、他の多くのユーザにとっても有益なテクニックとなり得ることがわかるでしょう。

「事後分析」では、Jacob Lauritzen氏がSmartLaunchについて述べ、私はSpamfire(現在のマーケットでもっとも成功しているREALbasic製の製品)の作者であるMichael Herrick氏にインタビューしました。

他のニュースについては、私は雑誌にすこしユーモアを取り込みたかったので、Dan Wilson氏(第1.2号の表紙制作者)によるRBDのために制作されたオリジナルの漫画、Hackerを掲載することをお知らせいたします。

これは熱狂的なREALbasicプログラマーの日常を描いています。これから毎号、新しい漫画を掲載していく予定です!

さらに、コラムやトピックス、ニュースやレビューも通常通りです。まだ定期購読されていない場合は、今すぐ申し込んで、お見逃しのないように!

Letters

今週は、ニュージーランドからおもしろい質問をいただいています。

こんにちは、Marcさん。

あなたのすばらしいチュートリアルに大変感謝申し上げます。私がMacで使っているプログラムのほとんどはとても古く、MacOS Xには移植されずに、何年間もアップデートされていないものがほとんどなので、私はREALbasicをはじめることにしました。それらはClassicではよく動くのですが、いくつかの機能(カラーなど)が欠けています。それでまったく素朴に「自分で書いてやろう……」という気持ちになりました。これはプログラミングを最初から勉強することを意味します。HyperCard(途中で挫折しましたが)から始めて、私はREALBasicを選びました。その理由はコードが読みやすい(Cには我慢できません)、いくぶんクロスプラットフォームである、現在ベクトル・グラフに対応している(これがRB5を購入する決め手となりました)ということです。

ところで、私は概念を示すプログラムや例はよく目にするのですが、実用的なものはほとんどお目に掛かれません。そして、電卓シミュレータとして知られているシェアウェアやフリーウェアのプログラム、「NAC : Not Another Calculator」にもしばしば同じことがいえます。いま必要とされているものは、実際の仕事の手助けをしてくれるソフトウェア、そしてこのソフトウェアをどのようにプログラムすればよいかのアドバイスです。

私の立場からいえば、DNAとたんぱく質のシークエンス解析のプログラム(お気に入りのものは1997年にアップデートされたGeneJockyです)、そしてプラスミドの描画アプリケーション(いまでも広く一般に使用されているMacPlasmapが最後にアップデートされたのは1990年です)を作成したいと思っています。後者のためにはSuperDrawのチュートリアルは、まさに機を得たものでした(私はどうやってオブジェクトに境界線を引いて色を塗りつぶせばよいかわかりました)。

私の最大の悩みは、「曲がった矢印」を作ることです(とくにマップ上で様々に曲がったもので、おそらくある種のグループ化が必要になるのではないかと思います。そうしないと、塗りつぶしすると2つの矢印のあいだに色が広がってしまいます)。そして私は、次にどんなタイプのオブジェクトが紹介されるのか、楽しみにしながらチュートリアルを待っています。:-)

これからのプロジェクトに関してですが――私の頭にとっさに思い浮かんだのが、スタイル・テキストの操作についてです。最近のアプリケーションのすべてにおいて、フォントとカラーがサポートされるべきであると思いますが、私が文字入力欄で文字列の操作――たとえば、ReplaceAll(Editfield, "a", "z")――を行うと、フォーマット情報をすべて失ってしまいます。

これが起こらないように、クロスプラットフォームに対応した方法で行うには、どのように処理すればよいのでしょうか?私は行きづまってしまい、残念なことにREALBacisの説明書もあまり役に立ちません(「REALBasic for Dummies」「REALBasic: The Definitive Guide (2版)」も購入したのですが、必要な情報を得ることはできませんでした)。いま考えているのは、ReplaceAllStyledTextメソッドで可能なのではないかということです――いくつかのREALBasicプログラムはそれを行っている(ワープロのように)という事実は、それが可能であることを示しています。しかし、どうにも行きづまってしまいました……。

今回はこのへんにします――あなたのすばらしいチュートリアルに改めて感謝申し上げます。私のプログラムがうまく行くようなことがあれば、それはほとんどRBUのおかげでしょう……。

敬具

Dr. Markus Winter

はじめに、SuperDrawがあなたのお役に立っていて嬉しいです。これを書くにあたり、確かにたくさんのことを学びました――オブジェクト指向のデザインは、本当に便利で時間の大きな節約になります。

それから、具体的な例が欠けているというあなたのご指摘には賛成します。私のチュートリアルでは、自分自身で使用するために書いたプログラムに基づいていることが多いのですが、これもその理由のひとつです。昔ながらの「Hello world」のデモは的はずれで、あなたの文字入力欄のスタイルでのコメントに寄せられたように、最近のプログラムはすべての機能を備えるべきで、そうでなければあとは廃れていくだけでしょう。「OOP University」が完了して、通常のチュートリアルのスケジュールに戻ったときには、あなたの意見を念頭に、有用で実用的なプロジェクトを作成しようと思います。

曲がった矢印に関して言えば、それほど難しいようには思えません。ただし、いくらかの計算(めんどう…)が必要になるでしょう。ひとつの方法は、RBのベクトル・グラフを使う方法で、arcShapeクラスのサブクラスを作成し、終端に矢印の先端を描画できるような機能を追加します。別の方法は、あらかじめ描かれた矢印の先端を使い、それをobject2Dオブジェクトの中に入れ、object2Dのrotationプロパティを使って曲がった矢印と同じ方向を向くように矢印の先端を回転させます(矢印の頭を置く方向と位置を決めるためにいくらか計算が必要になるでしょう)。

それでうまく行くと思います。もしこれに興味がある人が他にもいれば、将来のコラムで取り上げるかもしれません。あるいは、だれかがSuperDrawコンテストでこれを行ってくれるかもしれませんね!

文字入力欄のスタイルに関しては、よいところに気がつかれました。私は、個人的にこれはREALbasicに取り入れられるべき機能であると考えているのですが、現時点ではそうではありません。この回避策は難題です。私は自分でこれを行いましたが(私が書いたワープロ、Z-Writeはスタイル化されたテキストの操作をいくつも処理します) 、それは簡単ではありません。私のルーチンを公表することも考えましたが、他社との競合面で躊躇しました。結局のところ、私は多くの時間とエネルギーを、どうすればよいか考えることに費やすことになりました。しかし、まだ最終判断は出ていません。スタイル化されたテキストの解析については、いつかRBUシリーズで行うかもしれません。

それは別にして、いくつかのヒントとコツをお教えしましょう。スタイル化されたテキスト(太字、色、その他)では、その情報を保存する方法がなければなりません。従来からMac OSでは、スタイル情報をそのテキストとは別のところに保存していました。この利点は、そのスタイル情報をどのように処理したらよいかわからないアプリケーションにとって、テキストだけを受け入れればよいので処理が簡単であることです(たとえば、「クリップボードへコピー」のコマンドなどで)。

ところが、スタイル情報の取り扱いは面倒です。それぞれの「スタイル文字列」(同一のスタイル設定をもつテキストの並び)では、文字番号にもとづいたスタイルの開始場所を知る必要があります。たとえば、次の文はスタイル化されたテキストであるとしましょう:

This is some test text.

第一のスタイルは、文字番号1から始まります。第二のスタイルは、文字番号10から始まります。第三(太字でない設定に戻る)のスタイルは、文字番号14から始まります。

第一のスタイルの間に、文字を挿入したとします:

This is NOT some test text.

さてこれですべてが変わってしまいました。スタイルの開始場所は以前と異なり、挿入された文字に合わせてアップデート(それぞれの番号に4を加える)しなければなりません。

もちろん、REALbasicでは、プログラムはeditField中で、我々の気づかないうちにこれをすべて処理します。我々は直接そのスタイルをいじる必要はありません。

しかし、あなたの指摘された検索/置換の操作は、それがeditFieldのテキストで行われた場合にはスタイル情報を失ってしまいます。その解決方法は、スタイルデータそのものを解析し、必要に応じて(たとえば、置換によって文字が挿入されたり、削除されたりした場合)、そのデータを調整することです。

REALbasicでは、texttextStyleDataプロパティによって、テキストとスタイルに個々にアクセスすることが可能です。textStyleDataの解析はmemoryBlockで行われるべきなので、これは難解です(この複雑なオブジェクトの情報についてはREALbasicの説明書をご参照ください)。

memoryBlockによる取り扱いは、もっとも速く、もっとも効率的ですが、クロスプラットフォームではありません(Windowsのシステムでは、異なるテキスト・スタイルの情報を使用します)。

スピードが重要でない場合の、より簡単なアプローチは、隠れたeditFieldを使用し、プログラム的にテキストを検索・置換することです。そうするならば、editFieldそれ自体がスタイル情報の管理を行ってくれるでしょう。それは不可視なので、可視のeditFieldにくらべるとはるかに速いでしょう。そして当然ですが、ユーザは検索・置換の最中に起こるテキストのちらつきを目にすることはありません。

次のプログラムは、特別なFRStyledEditClassクラスの一部として私が作成した簡単なルーチンです:

  
function styledReplaceAll(e as editField, theFind as string, theReplace as string) as integer
dim i, count as integer

// パラメータのエラーをチェック
if theFind = "" or e = nil then
return 0
end if

// テキストとスタイルを自身に埋め込む
me.setTextAndStyle(e.text, e.textStyleData)

// 検索・置換の実行
i = inStr(me.text, theFind)
while i > 0
me.selStart = i - 1
me.selLength = len(theFind)
me.selText = theReplace
count = count + 1

i = inStr(i + len(theReplace), me.text, theFind)
wend

// オリジナルのテキストとスタイルの置き換え
e.setTextAndStyle(me.text, me.textStyleData)

// 置き換えた数を返す
return count
end function

見ての通り、これはきわめてシンプルです。はじめに自分自身にスタイル化されたテキストをコピーし、それからそのテキストの文字列を検索します。検索文字列が見つかったときは、それを選択して、置き換える文字列で選択されたテキストを置換します。最後に、変換されたテキストをオリジナルのeditFieldにコピーし直します。

使用するには、インスタンスをメインウィンドウまでドラッグし、そのvisibleプロパティをfalse(チェックなし)に設定します。私はhiddenEditという名前をつけたので、それを次のように呼び出します:

  
n = hiddenEdit.styledReplaceAll(editField1, findField.text, replaceField.text)

変数nは、置換した数を示しています(theFindが見つからなかった場合は、ゼロとなります)。

プログラムが実行されているときの様子(置換後)は次のようになるでしょう:

クラスとデモプロジェクトはここから入手することができます。

これは、置換が多いときには遅いですが(画像にある「e」の置換では、2、3秒かかりました)、あなたに必要な状況のおそらく75%はカバーできるでしょう。残りをカバーする改善策がいくつか考えられます。

たとえば、theFindtheReplaceが同じ長さである場合をテストしてみて、どうなるか確認したあとに、その対策としてREALbasic標準のreplaceAllルーチンを使用してみてください。置換前のテキストと置換後のテキストの長さが同じであれば、置換テキストの長さに関係なくスタイル情報の位置は変わらないので、それでも問題ありません。

また、このルーチンは現在のところ大小文字の区別がつきません。REALbasicのstrComp関数を使えば、大小文字の区別がつくように書き直すことができます。


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

INDEXに戻る