約 4,282,345 件
https://w.atwiki.jp/tpc-document/pages/278.html
第19章「Mave Forever(覚醒)」 これが最期の瞬間だ。 そう確信して、ゲンダーは固く目を閉じた。 今にも『鯰』がトドメを刺しに上から落ちてくるだろう。そうすれば自分もあの放置されていたレールのように瞬く間にスクラップだ。 せめて最後にグメーだけは助けたかった。とっさに殴り飛ばしてしまったが、なんとか『鯰』の下敷きになるのだけは避けられるだろうと信じたい。 (ああ、時間の経過がいやに長く感じられる。これが噂に聞く走馬灯を見る瞬間というやつなのか?) いつまで待ってもトドメの一撃が到達しない。奴め、随分とじらしてくれるものだ。 しかし恐怖を煽るだけ煽っておいて、とうとう最期の瞬間は訪れなかった。その代わりに上から落ちてきたのは聞き慣れた声だ。 「なんとか間に合ったみたいだ。諦めるのはまだ早いぞ、ゲンダー!」 目を開けると頭上上空には巨大な銀の鯨が飛んでいる。少し横を向くと『鯰』の残骸がゲンダーからほんの僅かに離れた場所に落ちている。ぎりぎりのところで間一髪、踏み潰されずに済んだらしい。 「何が起こったんダ」 「ゲンダー、こっちだ!」 銀の鯨から拡声器を通したガイストの声が聞こえる。 「あの鯨は一体……あれも兵器なのか」 「ゲンダー、話はあとだ。こいつにつかまれ! グメーもこっちへ」 鯨からクレーンが降りてきてゲンダーを引き上げる。クレーンはゲンダーをそっと持ち上げると、鯨のへその部分から内部に格納した。空飛ぶ鯨に見えたそれは、どうやら大きな飛行艇のようだ。グメーもその後を追うように飛行艇の中へと入る。 「遅くなってすまない。よくここまで耐え切ってくれた」 「ガイスト。それにグメーも。無事ダったか」 「それはこっちの台詞だ。どうしたんだ、両手がないじゃないか!」 「グメッ! グメメメッ!!」 心配させるんじゃない、と言いたげにグメーも怒っているような素振りを見せた。 「すまんすまん、殴って悪かった。でもせめておまえダけでも助けようと思ったんダ」 「腕が無くなってるのはそのせいか。もう片方は爆発したようにも見えるが」 「新技を試したんダ。ちょっと失敗したけどな」 「まったく無茶をする。一体誰に似たんだか…」 呆れた様子でガイストはため息をついた。 「それでこの『鯨』は何なんダ? 『鯰』に対抗するためにわざわざ造ったのか」 「もとは先生が開発を進めていたマキナの新型飛行艇、通称スロヴェスト号だ。少し改造したっていう意味ではわざわざ造ったとも言えるね」 ガイストは事の経緯を説明した。 メイヴの復旧は絶望的となり、あらかじめメイヴに頼まれていた指示に従ってブラックボックスをメイヴから取り出したガイストは、まずスヴェンのもとへと向かった。 ブラックボックスは黒石からできている。そしてスヴェンはかつて黒石の研究に携わっていたことを、メイヴのデータベースから知ったからだ。 息を切らしてブラックボックスを小脇に抱えて、血相を変えて走ってきたガイストを顔を見るや、皆まで言わずともスヴェンはすぐに何か緊急事態が起こっていることを察した。 そしてガイストが何かを訊くよりも先に「まずはこれに乗り込みたまえ」と飛行艇を準備したのだ。 あらためて事情を確認すると、スヴェンはブラックボックスを飛行艇に組み込むよう指示した。 「なるべくそれは使いたくなかったのだが……今はやむを得んな」 それによって飛行艇の性能は大幅に向上したというわけだ。 「ブラックボックスのおかげで主砲の性能も大幅に上がってね。君が今にも鯰に踏み潰されるってときにドカンと一発お見舞いしてやったわけだ。それでも間一髪だったようだけどね」 「おかげで命拾いした。恩に着る。しかし、それがここにあるってことは、やっぱりメイヴは……」 「あ、ああ……」 しばしの沈黙。 そして意を決した様子でガイストは事の経緯を話した。 「すまない。僕の力ではどうにもできなかったんだ…」 「ガイストのせいじゃない。オレが頼りなかったせいでこうなったんダ…」 「いや、そもそもの元凶は大統領だ。あいつさえいなければ…………もうよそう。今更言ったところで仕方がない」 「そうダな……せめてメイヴの仇を討とう。状況はどうダ。『鯰』はどうなった」 「まだ安心はできない。なぜなら『鯰』は…」 ガイストが何かを言いかけたとき、飛行艇がガクンと大きく揺れた。 何事かと色めき立つ二人とグメー。そこに艇内放送を通じて操縦を担うスヴェンが召集を呼びかける。 一同は操舵室に駆け寄る。動けないゲンダーはガイストに背負われて移動した。 「先生、状況は?」 「大事無い。少しかすめただけだ」 「まダくたばってないのかよ。本当に化け物みたいな兵器ダな」 「いや、ゲンダー君を襲った『鯰』はガラクタになった。しかし次の『鯰』がもう攻撃を仕掛けてきている」 「次の……えっ? おい、次のって何ダ。あれ一体ダけじゃなかったのかよ!?」 「さっき僕が言いかけたのがまさにそれだ。あんなのがまだ何体も存在するんだ」 「まじかよ。勝てる気がしねえぞ…」 「そこでわしのスロヴェスト号の出番というわけだ。目には目を、兵器には兵器だ。ブラックボックスを組み込んだことで、戦力としてはこちらのほうが勝っている。さあ少し揺れるぞ。しっかり掴まっておれ!」 操縦桿を力強く握ると、スヴェンが飛行艇を急発進させた。 窓から地上を見下ろすと、いつの間に集まってきたのか何体もの『鯰』の姿が確認できる。 地震を起こすだけが能ではない。『鯰』たちはレーザーを放って、上空の『鯨』を撃ち落とそうとする。次々と発射されるレーザーが空に交差する幾筋もの線を描いた。 それをスヴェンは巧みな操縦で隙間を縫うようにかわしていく。 「さあ反撃だ。機銃斉射! 目にもの見せてくれるわ!」 機体を翻してして急降下。群がる『鯰』に弾丸を雨あられと浴びせる。ぎりぎりまで距離を詰めて、ありったけの弾をお見舞いする。そして再び急上昇。ヒット&アウェイの戦法で、一体ずつ確実に敵を減らしていく。一方ゲンダーは操舵室の中を右へ左へと転がっていた。 「こいつめ。蜂の巣にしてやる!!」 固まっている敵には主砲をぶち込んでまとめて一掃する。 「ふははは! 見たか。わしの飛行艇は伊達じゃないぞ」 次々と敵を撃破していくスヴェン無双の開幕。この男、どうやら完全に頭に血が上っているご様子。 「な、なあ。スヴェンってあんなキャラしてたんダったか?」 「いや、まあ……先生の説明によると、ブラックボックスには精神を高揚させる副作用があるらしいから……」 「たまにメイヴが変にアグレッシブになったりしてたのはそれでか」 見る見るうちに敵の数は減っていき、ついに地上で動くものはいなくなった。 広範囲にわたって『鯰』だったものの残骸が散らばっている。 「よし。制圧完了といったところかな」 「すげえよ、この爺さん。ブラックボックスのおかげとはいえ、一人で片付けちまったのか」 そのとき再び機体がガクンと大きく揺れる。 「くッ。こんどは一発もらっちまったみたいダぞ!」 レーダーを確認すると最後の一体がまだ残っていた。どうやら残骸の陰に隠れて攻撃の機会を窺っていたとみえる。 「おのれ。ナメるな!」 怒りに任せて主砲をぶち込む。 付近の残骸を空高く舞い上げながら、『鯰』最後の一体は爆炎を向こうに消えた。 「どうだ。やったか!」 勝ち誇ったように少しハイになった老人が叫ぶ。 ゲンダーは思った。「やったか」は禁止ワードだ。やってないフラグを立てないでくれ、と。 その心配はやはり的中した。 なんと巻き上げられた残骸がパズルのピースを組み合わせるように合体していき、ひとつの塊と化す。数十体分の残骸がひとつに固まり、それはより巨大な兵器を形成する。個々のそれを『鯰』と呼ぶのなら、さながらそれは『大鯰』とでも言ったところだろうか。 「なんだと! 独りでに合体するなどと……一体どうなっているんだ。あり得ない!」 「精神兵器は精神体がコアになっている。だからこそ可能な芸当か。先生、精神体をなんとかしないとあの兵器にトドメを刺すことは難しそうですよ」 「う、く……ッ。わ、わしは一体どうすれば」 「パルス波です! 精神体は特定の波動パターンに弱い! 何かそういう装備はありませんか!?」 「急に言われても困る。あくまでわしは飛行艇の設計が専門であって、武器職人じゃない」 スロヴェスト号に搭載されているのは主砲である荷電粒子砲が一門と、両翼に機銃がそれぞれひとつずつあるだけ。あとは対艦魚雷が数発置いてある程度だ。ゲンダーが『鯨』と見間違えたように機体そのものは大きく頑丈な装甲を持っており防御面に特化しているが、主砲が強力なこと以外は攻撃面ではそれほど優れているわけでもない。 「せめてレーザー兵器でもあればな……パルスレーザーを発射できれば精神体を無効化できるのに」 「ブラックボックスを取り付けたんダろ。それを利用してなんとかならないのか」 「少し時間をくれ。考えてみる…」 しかしいくらない物ねだりをしたところで、都合よくブラックボックスの力でレーザーが発射可能になったりするようなことはない。エネルギー源としては十分過ぎる代物だが、発射装置として使える機構がスロヴェストには備わっていない。ないものは仕方がないのだ。 一方で『大鯰』は見せ付けるかのようにレーザーを放って攻撃を仕掛けてきた。さきほどから地上の『鯰』が放ってきたレーザー砲の残骸を組み合わせてより強大なレーザーと化している。しかも、威力が向上しただけでなく射線も太くなり命中精度も大幅上昇。スロヴェストは防御に重きを置いた装甲ではあるが、それゆえに旋回性を犠牲にしている。まるで面で攻撃してくるかのような『大鯰』のレーザーを避けきるのは難しかった。 三度目の衝撃。そのまま続けてガクン、ガクンと二度三度揺れる。艦内に警告音が鳴り響く。 「うわッ! またやられた」 「これはいかん」 飛行艇が大きく揺れて、機体が下を向き始めた。 「おい、高度が下がってるぞ! 大丈夫なんダろうな!?」 「下がっているのではない、下げとるのだ! いったん海に逃げ込む」 スロヴェストは新型の飛行艇だ。ただの防御特化しただけの鉄の塊とは違う。 普通の飛行艇は水上発進が可能な、空が飛べて水面も移動できる艇だ。しかしそれだけではない。スロヴェストが新型と言われる所以はそこにある。 「これは潜水飛行艇。空だけでなく海中も飛べるのだ。まだ試作段階に過ぎんがな」 「なんダと! そりゃすげえな」 銀の鯨は一直線に降下し、滑るようにマキナ近海へ潜り込んだ。レーザーは海面を境に勢いを失い、海中深くまでは届かない。 「ふう…。あ、危ないところだった」 「空も飛ぶし海にも潜れる。まさに『鯨』そのものダな」 「これで水を得た魚ですね、先生! …いや、魚じゃないけど」 ゲンダーもガイストも一息ついて胸をなでおろした。 「待て……これはしまった。どうやらそうでもないようだぞ、ガイスト君」 警告音は未だ鳴り続けている。艦体はミシミシといやな音を響かせる。 「さっき受けた攻撃でどこか穴が空いていたらしい…。なんということだ……浸水しておるぞ!」 「な…っ」 「なんダと!?」 このままの状態で長く潜行することはできないだろう。しかも浸水の影響で機体重量が増せば再び飛び上がるのも難しくなる。それどころか再浮上できるかどうかすら怪しい。海面での航行は可能だが、仮に浮上できたとしてもレーザー攻撃を受けて黒コゲにされてしまうだろう。 「万事休す……か」 「そんな、ここまで来て」 スヴェンもガイストもがっくりと項垂れてしまった。 「八方塞がりじゃないか! くそっ。こんなとき、メイヴがいてくれたら…」 メイヴならこんなときどうしただろうか。ゲンダーは考えた。 自分にはメイヴのようにシステムに侵入して操作することも、自身のエネルギーを飛行艇に供給するような能力もない。直接的に飛行艇をなんとかすることはできない。ならば、別の方法を考えろ。 飛行艇の操縦技術はスヴェンに劣る。艦体を修理するにしてもまだガイストのほうがそういったことには詳しいだろうし、海中にいる状態ではそれも不可能。グメーのような特殊能力もない。それ以前に、今のゲンダーにはほとんど自力で動けるほどの力さえ残されていなかった。 さぁ、どうする。今動かせるのは大破した右腕と頭のみ。その腕もボロボロで到底何かの役に立つとは思えない。ならばなおさら考えろ。今、自分にできる最大の貢献は考えることだ。 ときにゲンダーの考えはガイストやスヴェンを驚かせてきた。敵は国を一瞬で半壊させるほどの強大な兵器、そして一国の大統領だった。普通ならそこにわずか数人で挑んで勝てるなど、まして戦争をその人数で止めることができようなど想像だにしないだろう。しかし、それでもゲンダーは立ち向かった。勝機があるかなど、そんなことはどうでもよかった。メイヴを護るために、その障害になるなら、たとえそれがなんであろうと立ち向かう覚悟だった。 人はそれを馬鹿と呼ぶだろう。ああそうとも、ゲンダーは馬鹿だった。馬鹿で、しかし真っ直ぐだった。生まれてからヘイヴの研究所を一度も出たことがなかったゲンダーには、いわゆる常識というものは通用しない。だからこそ、常識に囚われない考え方ができる。それはときに、常識の中からは生まれ得ないような答えを導き出す。普通では繋がらない二点をゲンダーは繋ぎ合わせることができるのだ。例えば機械と精神、本来は心を持たぬ物と感情。そんなゲンダーだからこそ、機械(マキナ)と精神(ヴェルスタンド)を繋ぎ合わせることができるはずだ。いや、これはゲンダーにしかできないことだ。 (君がやらなくてだれがやるんだ!) (できるかどうかじゃない、私たちは「やる」んですよ) (グメェェェーーーっっっ!) 仲間たちの声が脳裏に蘇る。そうだ、「やる」んだ! 「おい、銀の鯨! オレの話を聞いてくれ!!」 ゲンダーは飛行艇スロヴェストに向って語りかけた。 「ゲ、ゲンダー君!? どうしたんだ、突然…」 思い出すんだ、メイヴのことを。出会ったばかりのころ、メイヴはあくまでただのシステムに過ぎなかった。冗談がわかる程度の柔軟さこそあったが、あくまでデータに基づいた計算に則って行動するドライなやつだった。ゲンダーもかつてはあくまでメイヴはただの機械に過ぎないと思っていた。しかし、ゲンダーと旅を続けるうちにメイヴは変わっていった。 「鯨! 聞こえていたら応えてくれ! おまえは機械(マキナ)の鯨ダ!」 ゲンダーは生みの親であるヘイヴに絶対の信頼を寄せていた。そのヘイヴの頼みだからメイヴを護る必要がある。最初はそう考えている程度に過ぎなかった。 「ゲンダー、どうした!? 落ち着け、冷静になれ!」 「そして相手は精神(ヴェルスタンド)の鯰ダ!」 だが、ゲンダーは知った。メイヴが自らの命を削ってまで自分を助けようとしてくれていたことを。メイヴが自分をとても心配してくれていたことを。メイヴがゲンダーを信じてくれていたことを! 「信じるんダ、相手を信じるんダ。互いに信じ合うことで初めて互いに手を取り合うことができる。互いに助け合うことができる」 メイヴは変わった。あれほどドライだったメイヴが仲間を心配するというひとつの感情を持った。いや、あるいは変わったのはゲンダー自身のメイヴに対する見方なのかもしれない。ゲンダーもメイヴも、共に旅をすることで互いに影響を与え合ってきたのだ。 ゲンダーはこの感情というものが欠陥だと考えていた。大切なものを失えば悲しい、苦しい、胸が締め付けられる。心は奈落の底深くへと落とされる。 感情とはまさにブラックボックス(わけのわからないもの)だ。感情が原因で簡単な仕事にさえ支障をきたしてしまうことだってある。だからこそゲンダーはこれを欠陥だと考えた。だが、その闇の底から抜け出す希望もまた感情の中から生まれる。 「ゲンダー、一体何をしてるんだ? そんなことをしても意味なんて…」 「解り合える。解り合えるんダ。機械も、精神も!」 ゲンダーは感情を持つがゆえに悩んだ。何度も何度も悩んだ。もう何もかもがどうでもいいと思ってしまうようなことさえあった。しかし、そんなときはいつも仲間……ガイストが、グメーが、そしてメイヴが自分を説得してくれた。 「だから鯨…! 鯰を説得してくれ、攻撃をやめるようにと。おまえたちは仲間ダ。機械と精神、立場は違ってもおまえたちは同じ大陸で生まれたもの同士……仲間なんダ! 仲間同士で争う必要なんてないんダ!」 すると、心の闇は希望という名の光に変わって行く先を明るく照らしてくれた。光によって力がみなぎる。光はいつもの何倍もの力を与えてくれる。 「頼む、応えてくれ!!」 ゲンダーは祈った。信じて祈った。 「ゲンダー君……? もしや損傷が原因で思考回路がおかしくなってしまったのかね」 ひたすらに祈った。大切な仲間のことを想って祈った。 「応えろ! 応えてくれぇーーーッッ!!」 ゲンダーはメイヴのことを想って強く念じた。 『ブォォオオォォォッッッ!!』 どこかから鯰とはまた異なる唸り声が聞こえた。 「応えた…!」 「まさか。水圧で艦体が軋む音か何かだろう…」 スヴェンは投げやりな様子で呟いた。 「いや、しかしこれは……先生、見てください!」 ガイストが海上の様子を知らせるレーダー画像を指差した。そこには何の反応もない。それはさっきまで雨のように降り注いでいた『大鯰』からのレーザーが止んだことを示していた。 「なんと! これは奇跡か? ……いや、おおかた敵がエネルギー切れを起こしただけだろう。それがなんだというのだね。どちらにせよ、もう我々に助かる術など…」 「手はある。機体を海底のほうに向けるんダ」 ゲンダーは叫んだ。ガイストもスヴェンもわけがわからない顔をしている。 「こんどは一体何を言い出すんだ」 「鯨は応えてくれた! 今がチャンスなんダ! また鯨を空に飛ばすぞ!!」 「それは無理な話だ、ゲンダー君。浸水しすぎて浮上さえままならないというのに」 「いや、大丈夫ダ。上手くいく。オレを信じてくれ!」 「どういうことだね。君の話は矛盾しているじゃないか。飛ぶのなら上に向かうものだろう?」 スヴェンは怪訝そうにゲンダーを見つめている。 「だったらオレじゃなくてもいい。オレを作ったヘイヴを信じてくれ! ……頼む」 「信じてみましょう、先生。ヘイヴを……そしてゲンダーを!」 「ガイスト君まで何を言い出すんだ」 「グメっ、グメェーっ!」 グメーもゲンダーを後押しする。 「スヴェン博士!!」 「ああもう、何がなにやら…。ええい、もうどうにでもなれだ!」 半ばヤケになりながらも、スヴェンはゲンダーに言われたとおりに機体を海底に向けて傾ける。 「やったぞ。それで次は?」 「ありがとう、スヴェン。次はそのまま海底に向かって主砲をぶっ放してくれ!」 「なんだと!? ああ、君らの考えることは全くわけがわからん」 スヴェンが主砲の準備に取りかかった。鯨の顎にあたるあたりから主砲が顔をのぞかせる。 エネルギーを凝縮、圧力を主砲に集めていく。その構造としてはゲンダーの汁一本に少し似ているかもしれない。 エネルギー充填完了、狙いは海底。極限まで研ぎ澄まされた一撃を下方に向かって勢いよく撃ち放った。 ブラックボックスが作用し主砲の威力は大幅に底上げされる。粒子砲は海中では摩擦が大きいため、兵器としての攻撃力は大きく削がれることになる。例えるならば超強力な水鉄砲といったところだろうか。それを水中で発射すれば機体は大きな反動を受けることとなり、そしてその勢いが機体を上へと持ち上げ始めた。 「こ、これは……いける……? いけるぞ!」 なおも威力増大、鯨は真一文字を描きながら海を突き抜け勢いよく空に舞い上がる。空を切り風を切り、ロケットのように上空高く飛び上がった。 「と、飛んだ。こんな飛び方……馬鹿げてる…」 「ああ、たしかに馬鹿かもな。ダけど馬鹿はこれで終わりじゃない!」 空を飛んだ鯨。しかし本来鯨とは空を飛ばないもの。たとえ飛行艇だったとしても、いくら主砲の勢いが強かったとしても、この不正規な方法で飛び続けるには無理がある。重力に引かれて機体が下がり始めた。 「お、落ちとるぞ! 次はどうするんだね!?」 「スヴェンはもう一発主砲を準備してくれ!」 「もう一発やるというのかね!? 今更もう一度撃ったところで高度が上がるとは……ええい、くそ。わかった任せろ」 「それからガイストにはオレを外の様子がわかるところまで移動させてほしい」 主砲による勢いが途絶える。勢いを失った鯨は当然のこと、さらに速度を上げて落ちる。 「このままじゃ地面に叩きつけられるぞ! どうか、わしらを無駄死にさせんでくれよ、ゲンダー君」 ゲンダーは計器から鯨と鯰の位置関係を素早く把握する。さらに鯨の移動ラインを瞬時に予測する。 力がみなぎっていく。初めての感覚だった。まさにゲンダーは覚醒状態だと言えた。感覚が、精神が研ぎ澄まされていく。周囲の時の流れがとても遅く感じられる。実際に血が流れているわけではなかったが、熱く血がたぎるようなこの感覚。胸が高鳴るようなこの高揚感。恐れも不安もない、あるのは絶対の自信と希望だ。 なおも傾き落ち続ける鯨。スヴェンもガイストも顔面蒼白で、次の指示はまだかとゲンダーに視線を集める。 鯨がある位置に差し掛かったとき、光が見えた。ゲンダーの脳裏にははっきりとその光が見えた。 「今ダ!! 撃てェーーーッッ!!」 飛行艇に残るすべてのエネルギーを力に換えて最後の一撃を放つ。ブラックボックスは激しく唸り輝き、最高の一撃をもってそれに応える。 (頼む、届いてくれ) そのとき主砲は『大鯰』とはまったく逆の方向を向いていた。まるで意味のなさそうな一撃だったが、もはや誰もゲンダーに口出しはしない。今はゲンダーを信じることだけが、この状況を切り抜ける最後の鍵なのだから。 極限の一撃は虚空に消えた。鯨は反動を受けて一直線に突進する。その目指す先には『大鯰』の姿があった。 「まさかこのまま特攻をかけるつもりか!? ゲ、ゲンダー君、なんてことを……わ、わしはまだ死にたくない!」 「ぼ、僕は最後まで信じているからな、ゲンダー!」 「グメっ、グメェェーっ」 大丈夫、信じるんだ。鯨と鯰……機械と精神は、解り合える。 (メイヴ! おまえの最期の願い、絶対に無駄にはしない!!) 『鯨』はゲンダーの強い想いに呼応するかのように雄叫びを上げた。 『ブォォオオォォォッッッ!!』 「いっけぇぇぇーーーーーッッッ!!」 銀の鯨が鋭く鉄の鯰に突き刺さった。 辺りに静寂が訪れる。 さっきまでの激しい戦いがまるで嘘だったかのような静けさだった。 「わ、わしは……生きとるか…?」 スヴェンは恐る恐る目を開けた。 鯨は『大鯰』の頭に突き立っていた。敵はもうぴくりとも動かない。 「やったぞ! 倒したんダ!」 決死の特攻は敵を行動不能にしたが、その勢いはすべて『大鯰』に受け止められ、スロヴェストは大破することなくその形を保っていた。 「これは驚いた。まさか鯰に助けられることになるとは思いもしなかった」 「言ったダろ、信じろと。鯨と鯰……機械(マキナ)と精神(ヴェルスタンド)は解り合えるんダ」 鯨も鯰も、もう動かなかった。最後の精神兵器の動きが止まったことで、ついに戦争は終わったのだ。 「信じられん。実に信じられん! たったこれだけの人数で本当に戦争を止めてしまうとは!!」 「やはりゲンダーは素晴らしいな。さすがヘイヴの作品。そしてさすがゲンダーだ!」 「グメメ、グメ~っ」 ガイストとスヴェンはゲンダーに深く感謝した。 「ゲンダー。本当にありがとう。君は僕たちの故郷を救ってくれた。復興に時間はかかるだろうが、きっとこれから良くなっていくだろう。メイヴのことは残念だったが……ブラックボックスは僕が持ち帰って研究してもいいだろうか」 「ああ、それがヘイヴの頼みでもある。おまえたちならブラックボックスを悪いようには扱わないと信じてるからな。オレにもできることがあれば協力させてくれ。それにもしかしたら、いつかメイヴが復活できる日が来るかもしれないしな!」 「それは嬉しい言葉だ。さて、ブラックボックスを回収して…」 ガイストが鯨からブラックボックスを取り出そうとすると、 『グオォォオオオォォォッッッ』 動かないはずの鯰が、鯨を呑み込んだまま突然暴れ始めた。 「あ、危ないっ!?」 慌てて飛行艇から脱出するガイストたち。転がるようにスロヴェストから飛び出した。 「みんな、怪我はないかね? 一体何が起こって…」 「ま、まさか……ブラックボックスが!?」 なんと飛行艇に取り付けられたブラックボックスの力を得て『大鯰』が蘇り、さらに突っ込んできた鯨をも取り込んで自身の一部にして復活を遂げてしまったのだった。 「な、なんだと!? 詰めが甘かったとでもいうのか…」 絶望するスヴェンに対して、ガイストは意外にも冷静だった。 (どういうことなんだ? いくらブラックボックスがあらゆる機械の演算能力を大幅に上昇させる特性を備えているからといって、実際に配線なんかを繋ぎ合わせたわけでもないのに、スロヴェストの内部からその力を引き出すなんて。まるで奴には意識があるみたいじゃないか。これはもしや…) 「グメー? グメメー!?」 グメーは誰かを捜すように周囲に呼びかけていた。 「む? 大変だ、ゲンダー君の姿が見当たらない。まさかまだ中にいるのでは…! おーい、ゲンダー君、無事かね!? 早く……早く脱出するんだ!!」 しかしゲンダーからの返事はない。 「まさか、ゲンダー君まで奴に取り込まれてしまったのでは…」 ゲンダーは未だ鯨の中にいた。先の戦いでの損傷によって、ゲンダーに動く力はもはや残されていない。しかもゲンダーには『大鯰』のようにブラックボックスの力を得て回復するような現象は起こらなかった。 ブラックボックスを取り込んだ『大鯰』の暴れるがままに、ゲンダーは右に左に、飛行艇内部の壁へと何度も何度も叩きつけられた。 (嘘ダ。勝ったと思った。メイヴに報いることができたと思った…! 明らかにあとはエンディングを見るダけって雰囲気だったじゃないか…! なのに…なのに……これじゃメイヴにもガイストにも、誰にも顔向けできないじゃないか。こんなのって……ねえダろ……) ゲンダーの意識は薄れつつあった。絶対だったはずの自信も希望も、いつの間に闇に呑まれて消えてしまっていた。感情は場合によって足枷にもなれば大きな力にもなる。それは変化するものであるがゆえに不安定でもある。自信も希望も、時として簡単に失われてしまうものなのだ。 (やっぱりオレだけじゃだめなのか。メイヴ――) ゲンダーは目の前が真っ暗になった。 『ゲ……ン…ダー…?』 メイヴもまた漆黒の闇の中にいた。今、自分がどこにいるのかも、どちらを向いているのかさえわからない。音も光もなにもないその闇の世界で、たしかにメイヴはゲンダーの声を聴いた。いや、声を聴いたというよりもその存在を感じ取ったといったほうがより正確だろう。 『そうだ、私は…。ゲンダーを守らなければなりません。ゲンダーが……ゲンダーが危ない!』 メイヴの感じ取ったゲンダーの存在は徐々に消えつつあった。その事実がメイヴを目覚めさせた。ブラックボックスにメイヴのプログラムは99.9%書き換えられてしまっていたが、残るわずか0.1%がメイヴにゲンダーを思い出させたのだ。その0.1%とは、メイヴが自ら自己修復機能で書き換えた領域、ゲンダーを護るという決意だった。決意は光となって闇を払いメイヴを照らす。その強い想いが今、メイヴを蘇らせる! メイヴは覚醒した!! メイヴの自己修復機能が再開した。 メイヴのプログラムが10%まで修復された。 メイヴの胴体にできた空洞にブラックボックスに代わる新たな動力が自己生成され始めた。 メイヴのプログラムが20%まで修復された。 メイヴの胴体の解体された部分が修復完了した。 メイヴのプログラムが40%まで修復された。 メイヴの新たな動力の自己生成が完了した。その名は【意志の力】 メイヴのプログラムが80%まで修復された。 メイヴはゲンダーの位置を瞬時に把握した。 メイヴのプログラムが完全に修復された。 メイヴの力がみなぎっていく。 メイヴのプログラムが拡張され性能が160%に上がった。 メイヴの身体が赤く発光し始めた。 メイヴの性能が300%に上がった。 『待っててください、ゲンダー! メイヴ、行きます!!』 メイヴはおもむろにロケットランチャー取り出すと、それを使って大統領執務室の壁に大穴を開けた。足元の車輪を格納させると拡張された機能により地面を滑走し、台座をカタパルトとして角柱型の身体をミサイルが如く台座から自身を発射、勢いよく回転しつつ壁の大穴から大空へと飛び立ったのだった。 対抗手段すらも失ったガイストたちは、もはや『大鯰』を相手になす術もなかった。 「そうだ。そもそも土台無理な話だったのだ…」 スヴェンはただただ呆然と立ちつくしている。 「先生、危ないですよ! とにかくこちらへ」 ガイストはスヴェンを引っ張って岩陰に隠れさせると、諦めずに敵を分析し始めた。 (精神兵器は無人の兵器だ。大統領はレティスやブロウティスの情報を盗んで、それを基に精神兵器の開発を進めさせた。ということは、基本的にはあれもレティスやブロウティスと同じはず。精神兵器はそれぞれの個体が情報を共有しながら、司令塔になる個体からの指示を受けて動く。ということはあの『鯰』の群れの中にリーダー格がいたのことになる。はっ、ということはつまり…) 「そうか! 今の『大鯰』は精神体が核になっているんだ! だからいくら壊れても残骸だけになっても平気で動けた。なぜなら機械の部分はあくまで外殻でしかないからな。ブラックボックスから間接的に力を引き出せたのも、スロヴェストを取り込んでしまったのも、実体を持たない精神体が本体だったからなんだ!」 精神体が本体だとわかれば、あとは簡単だ。ガイストは精神の解放研究の第一人者、その対処法は十分に熟知している。 「精神体はパルス波で無効化できる。強力な波動を浴びせてやれば奴は消し飛んでしまう」 「おおっ、でかしたぞ、ガイスト君! それでどうやってそれをやるんだね」 「そうだ。ホログローブだ! ホログローブを中継機にして波動を増幅してやれば、強力な波動光線を精製することだってできるはずだ。先生、少し待っててください。波動発生装置を取ってきます」 「わかった。わしはホログローブを準備しよう。それはどこにあるんだ?」 「それはゲンダーが……しまった! ゲンダーとともにあの『大鯰』の中だ……」 「ああ、もうおしまいだ!」 スヴェンは頭を抱えた。 「グメッ!? グメメー! グメメメーーーっ!!」 するとそのとき、グメーが空に向かって鳴き始めた。グメーの見つめる先には赤いオーラをまとったミサイルのようなものが猛スピードで接近してくる。 「あ、あれは…?」 ガイストたちの目前に見慣れた遠隔モニタが現れた。 『みなさん、お待たせしました。メイヴ イズ カムバックです!』 「メイヴ!?」 メイヴは驚くべき速さで『大鯰』に突撃する。『大鯰』は勢いよく跳ね飛ばされた。そのはずみでゲンダーが弾き飛ばされる。メイヴはアームを格納してそこから大きな網を取り出すと、見事にゲンダーを回収した。 ゲンダーとともにガイストたちの前に降り立つメイヴ。 「メイヴ!? ど、どうやって…!?」 「おまえ死んダんじゃなかったのか!」 ゲンダーもガイストも驚きを隠せない様子だった。 『勝手に殺してもらっては困りますね。私は永遠に不滅です』 「だ、だけど動力もないのにどうやって!?」 『私自身、驚いています。現在、私は私がどうやって動いているのかまったくわかりません。ですが……呼ばれた気がしたんですよ、ゲンダーに。なぜかはわかりませんがゲンダーが危ないと思ったんです。すると、どこからともなく力がみなぎってきました。この原因を探すためにデータベースを片っぱしから調べましたが、それらしい答えは見つかりませんでした。最も矛盾の少ない説明をするならば、まさにこれが奇跡というやつですね』 「う…ううっ、メイヴーーーっ!!」 ゲンダーは思わず自身がまったく動けない状態だったことも忘れてメイヴに飛びついた。 『ゲンダー、危ないですよ。棘が刺さります。それに損傷個所から燃料も漏れ出していますし、あまり激しく動くと損傷がひどくなります。ああ、ほらほら、こんなにぼろぼろになっちゃって』 「よかった…。おまえが無事で、本当によかった……!」 『そんな今にもぶっ壊れてしまいそうなやつが言う台詞ですか。……心配をかけましたね。本当に申し訳ない』 「謝ることなんてない。むしろ、謝らなきゃならないのはオレのほうダ。だって、今までメイヴは…」 メイヴはそっとゲンダーがその先を口にするのを止めた。 『そんなものはあとでいくらでも聞いてあげます。あとは私に任せてください。ゲンダーたちを苦しめたあの鯰めを懲らしめてやりますよ!』 「いや、オレも手伝うよ」 『大事なことなのでもう一度言いましょう。そんな今にもぶっ壊れてしまいそうなやつが言う台詞ですか。ゲンダーは手を出さなくて大丈夫です。あんなやつ、私一人でやってやりますよ。なぜかはわかりませんが、目覚めてからとても調子がいいんです。今ならいつもの3倍は力が発揮できるでしょう。今の私にはもう何も怖いものなどありませんよ!』 メイヴはやけに自信満々だ。まさに負ける気がしない状態とはこのことだった。 「二人とも、聞いてほしいことがあるんだ」 ガイストは『大鯰』の正体について説明した。 敵の本体は精神体だ。ホログローブとパルス波を使えば精神体を封じ込めることができる。メイヴがいれば、ホログローブに手を加えて対精神体仕様に改造するのは朝飯前だ。しかし、そのためには精神体を露出させる必要があった。そこでメイヴが鯰の外殻を取り除き、その隙を狙ってホログローブで精神体をとらえることが決まった。 『さあ調整完了です。これでホログローブから波動パルスを発射できます。ゲンダー、こちらは任せましたよ』 「合点承知ダ!」 『では、いっちょうやってやりましょうか。今回は私の出番が少なかったですからね、その分しっかり活躍させてもらいますよ!』 そう言ってメイヴは鯰に向かって飛び出していった。 『大鯰』はこれでもか、と言わんばかりに追尾レーザーを乱射する。しかしそれよりも速くメイヴはレーザーをかいくぐり、敵の懐に潜り込む。 『この野郎、ぶっ壊してやるです』 メイヴが高速で回転すると、無数の小型爆弾がばら撒かれた。急上昇。爆発の範囲内から脱出。次々に爆発が起こり『大鯰』はその部品を散らしていく。さらに、メイヴを追尾してきたレーザーが『大鯰』に向かってくる。小回りの利かないレーザーは次々に『大鯰』に命中していく。 その上空でメイヴがアームを格納させると、そこからミサイルが姿を見せた。さらに胴体の脇からは何本ものロケットランチャーが取り出される。それらを一斉に発射、全弾命中、大爆発。爆風による煙は岩陰のゲンダーたちのところにまで届き、視界は一寸先さえも遮られる。 爆煙が晴れると、そこには瓦礫の山と地面にできた大きなクレーターの姿があった。 「今ダ!」 ゲンダーがすかさずホログローブを構えた。しかし驚いたことに瓦礫が突然に浮かび上がり集結、合体してひとつの群体を形成し始め、すぐに精神体を隠してしまう。 『なんということでしょう。ばらばらにするだけではすぐに復活してしまいますか…』 さらに、精神体はそれぞれの瓦礫を弾のように発射した。機関銃の如く鉄の塊、銀の塊がメイヴを襲う。鉄の弾はメイヴの胴体にめり込み、銀の弾は貫通する。三倍速のメイヴをもってしても高速で撃ち出されるがらくたを完全に避け切ることができない。撃ち出されたがらくたは、再び精神体のもとへ再集合しまた撃ち出される。攻撃はやむことなく、弾はほぼ無尽蔵。 「メイヴ!」 心配したゲンダーが叫ぶ。 声に反応した精神体は攻撃の矛先をゲンダーに向けた。とっさにゲンダーは背後のガイストたちが隠れる岩陰に転がり込むが、瓦礫の弾丸はゲンダーを追い続ける。彼らの隠れた岩は見る見るうちに形を変えていく。もう長くは持たないのは明白だった。 (こ、こいつぁやばいですね。エマージェンシーです。しかし私は負けるわけにはいかない。あんな攻撃を食らっては、ゲンダーも博士たちもひとたまりもありません。ぶっちゃけ博士たちはどうでもいいですが、ゲンダーは……ゲンダーだけは絶対に死守しなくてはならない! それが今の私の存在理由にして行動原理!! いくら散らしても無駄……さらにあの瓦礫は鎧にして武器でもある……ならば、あの瓦礫ごと精神体を消滅させてしまうしかない!!) ゲンダーたちのすぐ傍に遠隔モニタが現れた。 『ゲンダー、ガイスト、そしてグメー。ああ、ついでにスヴェン博士も。先に謝っておきます、ごめんなさい。せっかく感動の再会ができたけど、どうやらそれを無駄にしてしまいそうです。ですが、これもやつを倒すため。どうかわかってくださいね』 「メイヴ? 何を…言ってるん…ダ?」 『一番おいしいトドメの一撃をもっていかれるのは悔しいですが、まぁ仕方ないので譲ってあげます。これはお世話になった博士たちへの恩返しでもあります。別にゲンダーのためだけじゃないんですからね! ……ゲンダー、あとは頼みましたよ』 「メイヴ…!? おい、メイヴ! 何をするつもりダ! やめろ、そんなこと……やめろ!!」 遠隔モニタにはもう何も表示されない。 「メイヴ!! 待てよ! そんなのいやダ……やめてくれ! メイヴ! メイヴ!!」 メイヴは精神体に向かって音響手榴弾をばら撒いた。数秒遅れて激しい閃光と、爆音が鳴り響く。それは精神体の注意を引くには十分すぎるほどだった。これによって生じたパルス波が精神体の動きを止める。しかし、その効果も長くはもたない。 『これが私の極限の一撃!!』 メイヴのアームが格納される。メイヴの頭上に空洞ができる。空洞はメイヴの筒状の身体を貫くように空いている。そこにメイヴは持てる全ての力を集約させていく。 エネルギー充填開始! (スヴェン博士、あのときは私を修理していただいてありがとうございました) セーフティーロック解除! (ガイスト、ブラックボックスはあなたに託します。あれは丈夫なので、きっとこの攻撃にも耐えてくれるでしょう) ターゲットスコープオープン! (グメー、最後まであなたはよくわかりませんでしたが、とりあえずゲンダーのことをよろしくお願いします) 電影クロスゲージ明度20! (そして、ゲンダー。言いたいことは山のようにありますが敢えて言いません。ですが、最後にこれだけは言わせてください…) エネルギー充填120%! 最終セーフティー解除! (ありがとう……!!) 『波動砲、発射!!』 メイヴは自身の身体を砲身として、精神体の鎧を引っぺがすため、ゲンダーを守るため、そして己を突き動かす意志の力の告げるままに、最後の一撃を放った!! 凄まじいエネルギー波が精神体に迫る。 精神体は身動きがとれない。 極限の一撃が精神体の鉄と銀の鎧を一瞬で灰に変える。 強烈な波動が精神体に大ダメージを与える。しかしそれでもまだ精神体は辛うじて形をとどめている。 『ゲンダー、あとのことは任せましたよ』 どこかからメイヴの声が聞こえたような気がした。 「もちろんダ、メイヴ。よろしく頼まれてやるよ……!!」 震える手でホログローブを構え……波動パルスを発射する! ホログローブの放った閃光が精神体を貫く。 光が弾けて闇が霧散する。ついに精神体は跡形もなく消滅した。 それとほとんど時を同じくして、メイヴは空中で粉々に砕け散った。『ありがとう』の文字を最後に、メイヴの遠隔モニタは永遠に消え去ったのだ。 (オレのほうこそダ、メイヴ……!) ありがとう―― 第19章 了 ブラックボックス20
https://w.atwiki.jp/abwiki/pages/152.html
三角関数と類似の関数。 双曲線正弦(ハイパーボリックサイン)、双曲線余弦(ハイパーボリックコサイン)、双曲線正接(ハイパーボリックタンジェント)を総称して双曲線関数と呼ぶ。 実際の定義式は指数関数を用いて定義されているが、定義式通り計算すると0近傍で桁落ちが生じる。そのため0近傍のsinh(x)、tanh(x)では級数展開を用いて計算する。 #N88BASICConst EPS5 = 0.001' DBL_EPSILON の 1/5 乗程度Function my_sinh(x As Double) As Double' sinh(x)Dim t As DoubleIf Abs(x) EPS5 Thent = Exp(x)my_sinh = (t - 1 / t) / 2Elsemy_sinh = x * (1 + x * x / 6)End IfEnd FunctionFunction my_cosh(x As Double) As Double' cosh(x)Dim t As Doublet = Exp(x)my_cosh = (t + 1 / t) / 2End FunctionFunction my_tanh(x As Double) As Double' tanh(x)If x EPS5 Thenmy_tanh = 2 / (1 + Exp(-2 * x)) - 1ElseIf x -EPS5 Thenmy_tanh = 1 - 2 / (Exp(2 * x) + 1)Elsemy_tanh = x * (1 - x * x / 3)End IfEnd FunctionFunction arcsinh(x AS Double) As Double' sinh-1(x)If x EPS5 Thenarcsinh = Log(Sqr(x * x + 1) + x)ElseIf x -EPS5 Thenarcsinh = -Log(Sqr(x * x + 1) - x)Elsearcsinh = x * (1 - x * x / 6)End IfEnd FunctionFunction arccosh(x As Double) As Double'cosh-1(x)arccosh = Log(x + Sqr(x * x - 1))End FunctionFunction arctanh(x As Double) As Double' tanh-1(x)If Abs(x) EPS5 Thenarctanh = 0.5 * Log((1 + x) / (1 - x))Elsearctanh = x * (1 + x * x / 3.0)End IfEnd Function'Dim i As IntegerDim x As DoublePrint "双曲線関数とその逆の整合性"For i = -10 To 10Print i, arcsinh(my_sinh(i)) - i, arccosh(my_cosh(i)) - Abs(i), arctanh(my_tanh(i)) - iNext iFor i = -10 To 10x = 0.0002 * iPrint x, arcsinh(my_sinh(x)) - x, arccosh(my_cosh(x)) - Abs(x), arctanh(my_tanh(x)) - xNext i
https://w.atwiki.jp/abwiki/pages/663.html
x64 とは インテルのCPU、Pentium4(Prescott)の一部から対応した64ビットの命令セットアーキテクチャ。 もともとはAMDが最初に考えたのでAMD64と呼ばれていた。追随したインテルはこれを良しとせずEM64Tと呼んでいたが結局x64に落ち着いた。 紛らわしいものにIA64というものがあるが、互換性はない。 ABはx64に対応しているので64ビットアプリを生成可能。 ※AB4の64bit実行形式をコンパイルする際にMSCRT.DLLの64bitデバック版が必須。 これは64bit版WinXPの頃に利用されていたランタイムで 一般にMSVCランタイム配布物には含まれない。AB4の64bit版を使いたい場合は ランタイムライブラリをどこかで入手するか、FreeBASICを使うか 改めてABで実行形式を64bit版でビルドしたい場合はAB5(Ver.5)を使うこと。
https://w.atwiki.jp/abwiki/pages/134.html
'htmlhelp.sbp'05/05/10'06/09/10 最後まで書いた' Commands to pass to HtmlHelp()Const HH_DISPLAY_TOPIC = H0000Const HH_HELP_FINDER = H0000 ' WinHelp equivalentConst HH_DISPLAY_TOC = H0001 Const HH_DISPLAY_INDEX = H0002 Const HH_DISPLAY_SEARCH = H0003 Const HH_SET_WIN_TYPE = H0004Const HH_GET_WIN_TYPE = H0005Const HH_GET_WIN_HANDLE = H0006Const HH_ENUM_INFO_TYPE = H0007 ' Get Info type name, call repeatedly to enumerate, -1 at endConst HH_SET_INFO_TYPE = H0008 ' Add Info type to filter.Const HH_SYNC = H0009Const HH_RESERVED1 = H000AConst HH_RESERVED2 = H000BConst HH_RESERVED3 = H000CConst HH_KEYWORD_LOOKUP = H000DConst HH_DISPLAY_TEXT_POPUP = H000E ' display string resource id or text in a popup windowConst HH_HELP_CONTEXT = H000F ' display mapped numeric value in dwDataConst HH_TP_HELP_CONTEXTMENU = H0010 ' text popup help, same as WinHelp HELP_CONTEXTMENUConst HH_TP_HELP_WM_HELP = H0011 ' text popup help, same as WinHelp HELP_WM_HELPConst HH_CLOSE_ALL = H0012 ' close all windows opened directly or indirectly by the callerConst HH_ALINK_LOOKUP = H0013 ' ALink version of HH_KEYWORD_LOOKUPConst HH_GET_LAST_ERROR = H0014 ' not currently implemented ' See HHERROR.hConst HH_ENUM_CATEGORY = H0015Const HH_ENUM_CATEGORY_IT = H0016 ' Get category info type members, call repeatedly to enumerate, -1 at endConst HH_RESET_IT_FILTER = H0017 ' Clear the info type filter of all info types.Const HH_SET_INCLUSIVE_FILTER = H0018 ' set inclusive filtering method for untyped topics to be included in displayConst HH_SET_EXCLUSIVE_FILTER = H0019 ' set exclusive filtering method for untyped topics to be excluded from displayConst HH_INITIALIZE = H001C ' Initializes the help system.Const HH_UNINITIALIZE = H001D ' Uninitializes the help system.Const HH_PRETRANSLATEMESSAGE = H00fd ' Pumps messages. (NULL, NULL, MSG*). Const HH_SET_GLOBAL_PROPERTY = H00fc ' Set a global property. (NULL, NULL, HH_GPROP)Const HHWIN_PROP_TAB_AUTOHIDESHOW = (1 0) ' Automatically hide/show tri-pane windowConst HHWIN_PROP_ONTOP = (1 1) ' Top-most windowConst HHWIN_PROP_NOTITLEBAR = (1 2) ' no title barConst HHWIN_PROP_NODEF_STYLES = (1 3) ' no default window styles (only HH_WINTYPE.dwStyles)Const HHWIN_PROP_NODEF_EXSTYLES = (1 4) ' no default extended window styles (only HH_WINTYPE.dwExStyles)Const HHWIN_PROP_TRI_PANE = (1 5) ' use a tri-pane windowConst HHWIN_PROP_NOTB_TEXT = (1 6) ' no text on toolbar buttonsConst HHWIN_PROP_POST_QUIT = (1 7) ' post WM_QUIT message when window closesConst HHWIN_PROP_AUTO_SYNC = (1 8) ' automatically ssync contents and indexConst HHWIN_PROP_TRACKING = (1 9) ' send tracking notification messagesConst HHWIN_PROP_TAB_SEARCH = (1 10) ' include search tab in navigation paneConst HHWIN_PROP_TAB_HISTORY = (1 11) ' include history tab in navigation paneConst HHWIN_PROP_TAB_FAVORITES = (1 12) ' include favorites tab in navigation paneConst HHWIN_PROP_CHANGE_TITLE = (1 13) ' Put current HTML title in title barConst HHWIN_PROP_NAV_ONLY_WIN = (1 14) ' Only display the navigation windowConst HHWIN_PROP_NO_TOOLBAR = (1 15) ' Don't display a toolbarConst HHWIN_PROP_MENU = (1 16) ' MenuConst HHWIN_PROP_TAB_ADVSEARCH = (1 17) ' Advanced FTS UI.Const HHWIN_PROP_USER_POS = (1 18) ' After initial creation, user controls window size/positionConst HHWIN_PROP_TAB_CUSTOM1 = (1 19) ' Use custom tab #1Const HHWIN_PROP_TAB_CUSTOM2 = (1 20) ' Use custom tab #2Const HHWIN_PROP_TAB_CUSTOM3 = (1 21) ' Use custom tab #3Const HHWIN_PROP_TAB_CUSTOM4 = (1 22) ' Use custom tab #4Const HHWIN_PROP_TAB_CUSTOM5 = (1 23) ' Use custom tab #5Const HHWIN_PROP_TAB_CUSTOM6 = (1 24) ' Use custom tab #6Const HHWIN_PROP_TAB_CUSTOM7 = (1 25) ' Use custom tab #7Const HHWIN_PROP_TAB_CUSTOM8 = (1 26) ' Use custom tab #8Const HHWIN_PROP_TAB_CUSTOM9 = (1 27) ' Use custom tab #9Const HHWIN_TB_MARGIN = (1 28) ' the window type has a marginConst HHWIN_PARAM_PROPERTIES = (1 1) ' valid fsWinPropertiesConst HHWIN_PARAM_STYLES = (1 2) ' valid dwStylesConst HHWIN_PARAM_EXSTYLES = (1 3) ' valid dwExStylesConst HHWIN_PARAM_RECT = (1 4) ' valid rcWindowPosConst HHWIN_PARAM_NAV_WIDTH = (1 5) ' valid iNavWidthConst HHWIN_PARAM_SHOWSTATE = (1 6) ' valid nShowStateConst HHWIN_PARAM_INFOTYPES = (1 7) ' valid apInfoTypesConst HHWIN_PARAM_TB_FLAGS = (1 8) ' valid fsToolBarFlagsConst HHWIN_PARAM_EXPANSION = (1 9) ' valid fNotExpandedConst HHWIN_PARAM_TABPOS = (1 10) ' valid tabposConst HHWIN_PARAM_TABORDER = (1 11) ' valid taborderConst HHWIN_PARAM_HISTORY_COUNT = (1 12) ' valid cHistoryConst HHWIN_PARAM_CUR_TAB = (1 13) ' valid curNavTypeConst HHWIN_BUTTON_EXPAND = (1 1) ' Expand/contract buttonConst HHWIN_BUTTON_BACK = (1 2) ' Back buttonConst HHWIN_BUTTON_FORWARD = (1 3) ' Forward buttonConst HHWIN_BUTTON_STOP = (1 4) ' Stop buttonConst HHWIN_BUTTON_REFRESH = (1 5) ' Refresh buttonConst HHWIN_BUTTON_HOME = (1 6) ' Home buttonConst HHWIN_BUTTON_BROWSE_FWD = (1 7) ' not implementedConst HHWIN_BUTTON_BROWSE_BCK = (1 8) ' not implementedConst HHWIN_BUTTON_NOTES = (1 9) ' not implementedConst HHWIN_BUTTON_CONTENTS = (1 10) ' not implementedConst HHWIN_BUTTON_SYNC = (1 11) ' Sync buttonConst HHWIN_BUTTON_OPTIONS = (1 12) ' Options buttonConst HHWIN_BUTTON_PRLong = (1 13) ' Print buttonConst HHWIN_BUTTON_INDEX = (1 14) ' not implementedConst HHWIN_BUTTON_SEARCH = (1 15) ' not implementedConst HHWIN_BUTTON_HISTORY = (1 16) ' not implementedConst HHWIN_BUTTON_FAVORITES = (1 17) ' not implementedConst HHWIN_BUTTON_JUMP1 = (1 18)Const HHWIN_BUTTON_JUMP2 = (1 19)Const HHWIN_BUTTON_ZOOM = (1 20)Const HHWIN_BUTTON_TOC_NEXT = (1 21)Const HHWIN_BUTTON_TOC_PREV = (1 22)Function HHWIN_DEF_BUTTONS() As DWord HHWIN_DEF_BUTTONS = HHWIN_BUTTON_BACK or HHWIN_BUTTON_OPTIONS or HHWIN_BUTTON_PRINTEnd Function' Button IDsConst IDTB_EXPAND = 200Const IDTB_CONTRACT = 201Const IDTB_STOP = 202Const IDTB_REFRESH = 203Const IDTB_BACK = 204Const IDTB_HOME = 205Const IDTB_SYNC = 206Const IDTB_PRLong = 207Const IDTB_OPTIONS = 208Const IDTB_FORWARD = 209Const IDTB_NOTES = 210 ' not implementedConst IDTB_BROWSE_FWD = 211Const IDTB_BROWSE_BACK = 212Const IDTB_CONTENTS = 213 ' not implementedConst IDTB_INDEX = 214 ' not implementedConst IDTB_SEARCH = 215 ' not implementedConst IDTB_HISTORY = 216 ' not implementedConst IDTB_FAVORITES = 217 ' not implementedConst IDTB_JUMP1 = 218Const IDTB_JUMP2 = 219Const IDTB_CUSTOMIZE = 221Const IDTB_ZOOM = 222Const IDTB_TOC_NEXT = 223Const IDTB_TOC_PREV = 224' Notification codesConst HHN_FIRST = (0-860)Const HHN_LAST = (0-879)Const HHN_NAVCOMPLETE = (HHN_FIRST-0)Const HHN_TRACK = (HHN_FIRST-1)Const HHN_WINDOW_CREATE = (HHN_FIRST-2)'NMHDRType dummyNMHDR hwndFrom As HWND idFrom As DWordcode As DWordEnd TypeType HHN_NOTIFY hdr As dummyNMHDR pszUrl As *Byte ' Multi-byte, null-terminated stringEnd TypeType HH_POPUP cbStruct As Long ' sizeof this structure hinst As DWord ' instance handle for string resource idString As DWord ' string resource id, or text id if pszFile is specified in HtmlHelp call pszText As *Byte ' used if idString is zero pt As POINTAPI ' top center of popup window clrForeground As Dword ' use -1 for default clrBackground As Dword ' use -1 for default rcMargins As RECT ' amount of space between edges of window and text, -1 for each member to ignore pszFont As *Byte ' facename, point size, char set, BOLD ITALIC UNDERLINEEnd TypeType HH_AKLINK cbStruct As Long ' sizeof this structure fReserved As Long ' must be FALSE (really!) pszKeywords As *Byte ' semi-colon separated keywords pszUrl As *Byte ' URL to jump to if no keywords found (may be NULL) pszMsgText As *Byte ' Message text to display in MessageBox if pszUrl is NULL and no keyword match pszMsgTitle As *Byte ' Message text to display in MessageBox if pszUrl is NULL and no keyword match pszWindow As *Byte ' Window to display URL in fIndexOnFail As Long ' Displays index if keyword lookup fails.End TypeEnum HHWIN_NAVTYPE_TOC, HHWIN_NAVTYPE_INDEX, HHWIN_NAVTYPE_SEARCH, HHWIN_NAVTYPE_FAVORITES, HHWIN_NAVTYPE_HISTORY, ' not implemented HHWIN_NAVTYPE_AUTHOR, HHWIN_NAVTYPE_CUSTOM_FIRST = 11End EnumEnum IT_INCLUSIVE, IT_EXCLUSIVE, IT_HIDDEN,End EnumType HH_ENUM_ITcbStruct As Long ' size of this structureiType As Long ' the type of the information type ie. Inclusive, Exclusive, or HiddenpszCatName As *Byte ' Set to the name of the Category to enumerate the info types in a category As else NULLpszITName As *Byte ' volitile pointer to the name of the infotype. Allocated by call. Caller responsible for freeingpszITDescription As *Byte ' volitile pointer to the description of the infotype.End TypeType HH_ENUM_CATcbStruct As Long ' size of this structurepszCatName As *Byte ' volitile pointer to the category namepszCatDescription As *Byte ' volitile pointer to the category descriptionEnd TypeType HH_SET_INFOTYPEcbStruct As Long ' the size of this structurepszCatName As *Byte ' the name of the category, if any, the InfoType is a member of.pszInfoTypeName As *Byte ' the name of the info type to add to the filterEnd TypeTypedef HH_INFOTYPE = DWordTypedef PHH_INFOTYPE = *HH_INFOTYPEConst HHWIN_NAVTAB_TOP=0Const HHWIN_NAVTAB_LEFT=1Const HHWIN_NAVTAB_BOTTOM=2Const HH_MAX_TABS =19 ' maximum number of tabsConst HH_TAB_CONTENTS=0Const HH_TAB_INDEX=1Const HH_TAB_SEARCH=2Const HH_TAB_FAVORITES=3Const HH_TAB_HISTORY=4Const HH_TAB_AUTHOR=5Const HH_TAB_CUSTOM_FIRST = 11Const HH_TAB_CUSTOM_LAST = HH_MAX_TABSConst HH_MAX_TABS_CUSTOM = (HH_TAB_CUSTOM_LAST - HH_TAB_CUSTOM_FIRST + 1)' HH_DISPLAY_SEARCH Command Related Structures andConstantsConst HH_FTS_DEFAULT_PROXIMITY = (-1)Type HH_FTS_QUERYcbStruct As Long ' Sizeof structure in bytes.fUniCodeStrings As Long ' TRUE if all strings are unicode.pszSearchQuery As *Byte ' String containing the search query.iProximity As Long ' Word proximity.fStemmedSearch As Long ' TRUE for StemmedSearch only.fTitleOnly As Long ' TRUE for Title search only. fExecute As Long ' TRUE to initiate the search. pszWindow As *Byte ' Window to display inEnd Type' HH_WINTYPE StructureType HH_WINTYPE cbStruct As Long ' IN size of this structure including all Information Types fUniCodeStrings As Long ' IN/OUT TRUE if all strings are in UNICODE pszType As *Byte ' IN/OUT Name of a type of window fsValidMembers As DWord ' IN Bit flag of valid members (HHWIN_PARAM_) fsWinProperties As DWord ' IN/OUT Properties/attributes of the window (HHWIN_) pszCaption As *Byte ' IN/OUT Window title dwStyles As DWord ' IN/OUT Window styles dwExStyles As DWord ' IN/OUT Extended Window styles rcWindowPos As RECT ' IN Starting position, OUT current position nShowState As Long ' IN show state (e.g., SW_SHOW) hwndHelp As HWND ' OUT window handle hwndCaller As HWND ' OUT who called this window paInfoTypes As *HH_INFOTYPE ' IN Pointer to an array of Information Types ' The following members are only valid if HHWIN_PROP_TRI_PANE is set hwndToolBar As DWord ' OUT toolbar window in tri-pane window hwndNavigation As DWord ' OUT navigation window in tri-pane window hwndHTML As DWord ' OUT window displaying HTML in tri-pane window iNavWidth As DWord ' IN/OUT width of navigation window rcHTML As RECT ' OUT HTML window coordinates pszToc As *Byte ' IN Location of the table of contents file pszIndex As *Byte ' IN Location of the index file pszFile As *Byte ' IN Default location of the html file pszHome As *Byte ' IN/OUT html file to display when Home button is clicked fsToolBarFlags As Dword ' IN flags controling the appearance of the toolbar fNotExpanded As Long ' IN TRUE/FALSE to contract or expand, OUT current state curNavType As Long ' IN/OUT UI to display in the navigational pane tabpos As Long ' IN/OUT HHWIN_NAVTAB_TOP, HHWIN_NAVTAB_LEFT, or HHWIN_NAVTAB_BOTTOM idNotify As Long ' IN ID to use for WM_NOTIFY messages tabOrder[HH_MAX_TABS + 1] As Byte ' IN/OUT tab order Contents, Index, Search, History, Favorites, Reserved 1-5, Custom tabs cHistory As Long ' IN/OUT number of history items to keep (default is 30) pszJump1 As *Byte ' Text for HHWIN_BUTTON_JUMP1 pszJump2 As *Byte ' Text for HHWIN_BUTTON_JUMP2 pszUrlJump1 As *Byte ' URL for HHWIN_BUTTON_JUMP1 pszUrlJump2 As *Byte ' URL for HHWIN_BUTTON_JUMP2 rcMinSize As RECT ' Minimum size for window (ignored in version 1) cbInfoTypes As Long ' size of paInfoTypes As pszCustomTabs As *Byte ' multiple zero-terminated stringsEnd TypeConst HHACT_TAB_CONTENTS =0Const HHACT_TAB_INDEX =1Const HHACT_TAB_SEARCH=2Const HHACT_TAB_HISTORY=3Const HHACT_TAB_FAVORITES=4Const HHACT_EXPAND=5Const HHACT_CONTRACT=6Const HHACT_BACK=7Const HHACT_FORWARD=8Const HHACT_STOP=9Const HHACT_REFRESH=10Const HHACT_HOME=11Const HHACT_SYNC=12Const HHACT_OPTIONS=13Const HHACT_PRINT=14Const HHACT_HIGHLIGHT=15Const HHACT_CUSTOMIZE=16Const HHACT_JUMP1=17Const HHACT_JUMP2=18Const HHACT_ZOOM=19Const HHACT_TOC_NEXT=20Const HHACT_TOC_PREV=21Const HHACT_NOTES=22Const HHACT_LAST_ENUM=23Type HHNTRACK hdr As dummyNMHDR pszCurUrl As *Byte ' Multi-byte, null-terminated string idAction As Long ' HHACT_ value phhWinType As HH_WINTYPE ' Current window type structureEnd TypeDeclare Function HtmlHelp Lib "HHCtrl.ocx" Alias "HtmlHelpA" ( _hwndCaller As HWND, _pszFile As *Byte, _uCommand As Dword, _dwData As Dword) As Dword
https://w.atwiki.jp/abwiki/pages/303.html
#N88BASICPrint Bin$(4294967294)Function Bin$(i As Long) As StringDim j As LongBin$=""For j=31 To 0 Step -1If i And Int(2^j) Then Bin$=Bin$+"1" Else Bin$=Bin$+"0"NextEnd Function
https://w.atwiki.jp/abwiki/pages/78.html
コマンドボタン † マウスクリックなんかの入力を受け付けるコントロール ↑ [edit] コマンドボタンのスタイル † RADで設定できるスタイルについて 無効(使用不可) 押せない 可視 チェックしておかないとボタンが見えない グループ グループボックス?を参照 タブストップ 加筆plz 標準のボタン 入力フォーカスを持ったボタンになる が、なぜかENTER押しても反応しない ABのダイアログボックスは擬似的な物なのでそれが本物だと反応すると思う。 オーナー描画 ボタンが描画されるタイミングでWM_DRAWITEMが親ウィンドウに送られます またボタンのウィンドウプロシージャは描画操作を全くしません(自分で描画しないと何も表示されない) アイコン 使ったこと無いからなんとも言えんがアイコンを表示するんじゃないの? ビットマップ 使ったこと無いからなんとも言えんがビットマップを表示するんじゃないの? 複数行 キャプションに複数行のテキストを表示できる 通知 チェックしていない場合はBN_CLICK以外の通知メッセージは親ウィンドウに送られない そのためRADでBN_DBCLICKに対するイベントを書いていても無視されてしまう ↑ [edit] ボタンの操作 † 操作って程の操作は無いような… SendMessage(hButton,BM_CLICK,0,0) で擬似的にクリックできる
https://w.atwiki.jp/abwiki/pages/142.html
関数と分岐処理が使えればかなりのプログラムが組める あとは使い回しの問題だけだ。 平方根の計算プログラムを作ってみよう #N88BASIC 関数。aの平方根を求める Function sqrt(a As Double) As Double Dim x0 As Double Dim d As Double If a 0 Then 入力が負の時は-1を返す。 sqrt = -1 Exit Function End If d = 0.00000001 差の幅 sqrt = a/2 近似値 Do x0 = sqrt sqrt = 0.5*(x0+(a/x0)) Loop While Abs(sqrt-x0) d 計算結果の幅が小さくなるまで繰り返す End Function Dim x As Double Input x Print sqrt(x)
https://w.atwiki.jp/abwiki/pages/664.html
xorshift xorshiftは新しい擬似乱数。 Google ChromeのJavascriptでも採用された。 ABでxorshiftを実装。 #N88BASIC Dim x = 123456789 As DWORD Dim y = 362436069 As DWORD Dim z = 521288629 As DWORD Dim w = 88675123 As DWORD Function xor128 () As DWORD Dim t As DWORD t = x xor (x 11) x = y y = z z = w w = (w xor (w 19)) xor (t xor (t 8)) xor128 = w End Function Dim i As Long For i=0 To 10 Print xor128() Next
https://w.atwiki.jp/abwiki/pages/222.html
クリップボードの処理は面倒だ。 GlobalAllocなんていう化石の関数を使わなければいけない。 注意すべき点はSetClipboardDataで登録したメモリはユーザが開放してはいけないこと。 Sub PutClipText(buf As *Byte)Dim bufsiz As LongDim hGlob As HANDLEDim hMem As HANDLEbufsiz = lstrlen(buf)+1hGlob=GlobalAlloc(GHND, bufsiz) hMem=GlobalLock(hGlob) lstrcpy(hMem,buf) GlobalUnlock(hGlob) OpenClipboard(NULL) EmptyClipboard() SetClipboardData(CF_TEXT,hGlob) CloseClipboard() End SubFunction GetClipText()As *ByteDim buf As *ByteDim bufsiz As LongDim hGlob As HANDLEDim hMem As HANDLEOpenClipboard(NULL)hGlob = GetClipboardData(CF_TEXT)hMem=GlobalLock(hGlob) bufsiz = lstrlen(hMem)+1buf = GlobalAlloc(GPTR,bufsiz)lstrcpy(buf,hMem) GlobalUnlock(hGlob) CloseClipboard()GetClipText = bufEnd Function'確認#N88BASICConst CLIPTEXT = "平井公彦"Dim b As *BytePutClipText(CLIPTEXT)b = GetClipText()Print MakeStr(b)GlobalFree(b)
https://w.atwiki.jp/abwiki/pages/253.html
Sub MainWnd_IDM_OPEN_MenuClick()の Dim buffer As StringをDim buffer As *Byteに、 buffer=ZeroString(dwFileSize)をbuffer=malloc(dwFileSize)に それぞれ変更。 今回は、必要最小限の機能がついたテキスト エディタを製作します。 必要最小限の機能ってどんなものがあるの? 開く、保存 だけです(キッパリ)。しかし、これではさすがに寂しすぎるので、コピー&ペーストなどの編集メニューまでをこのページで解説することにします。 さっそく作ろう! ノーマル ウィンドウ ベースのプロジェクト(プロジェクト名を "TextEditor" とします)を作成し、メニューの作成(IDは "MainMenu")、メインウィンドウへのメニューの貼り付けを行っておきましょう。 テキスト エディタには欠かせない、エディット コントロールの挿入を行います。挿入する場所は適当で構いません。 こんなチッポケなエディット ボックスでいいの?? はい、このままにしておきましょう。テキストエディタは自由にウィンドウのサイズが変更できますよね?(最大化したり、伸縮したり) そのため、ユーザーの利用状況により、プログラム側でサイズを変更しなければなりません。具体的には、Resizeイベント(ウィンドウの大きさが変更されたときのイベント)プロシージャ内に、エディット コントロールの大きさをウィンドウの大きさにあわせてやるプログラムをかくのです。Resizeイベントのコーディングは後に行います。 Resizeイベントは初期時にも呼び出されるので、ここでエディット コントロールのサイズを変更しても特に意味はありません。しかし、チッポケなのが気になる方はご自由に、RADツール内のウィンドウの大きさにあわせてもらっても結構です。 挿入したばかりのエディット コントロールでは設定不足な点があるため、Editプロパティを下のように設定しておきましょう。 先ほど挿入した、ウィンドウ内のエディット コントロールを選択し、Editプロパティ内の「複数行」、「水平スクロールバー」、「水平オートスクロール」、「垂直スクロールバー」、「垂直オートスクロール」、「改行を許可」にチェックを入れます。 Resizeイベントのコーディング "MainWnd" 内の適当な場所を右クリックし、「イベント コード」をクリックします。記述可能なイベントが色々と表示されますが、その中からResizeイベントを選択し、「コーディング」ボタンをクリックします。表示されたプロシージャに下のプログラムを書き込みます。 Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer) Dim rc As RECT Dim hEdit As Long クライアント領域のサイズを取得 GetClientRect(hMainWnd,rc) EditBox1のウィンドウ ハンドルを取得 hEdit=GetDlgItem(hMainWnd,EditBox1) hEditの大きさを変更する MoveWindow(hEdit, 0, 0, rc.right, rc.bottom,0) End Sub メニューの編集 "MainMenu" を開き、下のような構成になるよう、メニューの追加を行っていきます。メニュー項目を挿入する場合は、挿入したい場所の1つ上の項目を選択し、「挿入」ボタンをクリックしていくことを思い出しましょう。メニューの編集方法は、ステップ6、ステップ7で解説しています。 キャプション ID 備考 ファイル( F) - ポップアップ 新規作成( N) IDM_NEW - - セパレータ 開く( O) IDM_OPEN - 保存( S) IDM_SAVE - - セパレータ 終了( X) IDM_EXIT - 編集( E) - ポップアップ 元に戻す( U) IDM_UNDO - - セパレータ 切り取り( T) IDM_CUT - コピー( C) IDM_COPY - 貼り付け( P) IDM_PASTE - - セパレータ すべて選択( A) IDM_ALLSELECT - ヘルプ( H) - ポップアップ バージョン情報( A) IDM_ABOUT - 上のような構造を持たせた "MainMenu" を、"MainWnd" に貼り付けたのち、それぞれのメニューに対するイベント コーディングを行います。 「新規作成」メニュー イベント EditBox1の内容をSetWindowText関数を利用して空にします。EM_SETMODIFYメッセージで、テキストの変更を示すフラグをFALSEにセットしています。 Sub MainWnd_IDM_NEW_MenuClick() Dim hEdit As Long EditBox1のハンドルを取得 hEdit=GetDlgItem(hMainWnd, EditBox1) hEditの内容を空にする SetWindowText(hEdit,"") End Sub 「開く」メニュー イベント 初めて利用するAPI関数がいくつかあるかもしれません。GetOpenFileName関数は前のステップ8でやりましたね。ファイルオープンにCreateFile関数が、ファイルからのデータの読み込みにReadFile関数などが利用されているところもおさえておくと良いでしょう。 プロシージャの最後の部分で、ファイル データが格納されている文字列変数bufferの内容を、SetWindowText関数を利用してウィンドウに反映させています。 Sub MainWnd_IDM_OPEN_MenuClick() Dim hEdit As Long Dim ofn As OPENFILENAME Dim hFile As Long Dim dwFileSize As DWord Dim dwAccessByte As DWord Dim FileName[MAX_PATH-1] As Byte Dim buffer As String OPENFILENAME構造体の初期化 FillMemory(VarPtr(ofn),Len(ofn),0) ofn.lStructSize=Len(ofn) ofn.hwndOwner=hMainWnd ofn.lpstrFilter=Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0" ofn.nFilterIndex=1 ofn.lpstrFile=FileName ofn.nMaxFile=MAX_PATH ofn.lpstrTitle="ファイルを開く" ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST ofn.lpstrDefExt="*" 「ファイルを開く」ダイアログ ボックスを表示 If GetOpenFileName(ofn)=0 Then Exit Sub ------------------- ファイル オープン ------------------- hFile=CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, _ ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,"ファイルオープンに失敗","TextEditor",MB_OK or MB_ICONEXCLAMATION) Exit Sub End If ファイルサイズを取得 dwFileSize=GetFileSize(hFile,0) 文字列バッファ用のメモリを確保 buffer=ZeroString(dwFileSize) ファイルの内容を文字列変数bufferに読み込む ReadFile(hFile,buffer,dwFileSize,VarPtr(dwAccessByte),ByVal 0) ファイル ハンドルを閉じる CloseHandle(hFile) ------------------- EditBox1のハンドルを取得 hEdit=GetDlgItem(hMainWnd, EditBox1) hEditにバッファをセットする SetWindowText(hEdit,buffer) hEditにフォーカスをセット SetFocus(hEdit) End Sub 「保存」メニュー イベント 「ファイルの保存」ダイアログボックスを表示し、ofn.lpstrFileに格納されたファイルへ保存するプログラムになります。「開く」メニュー イベントと少し似ていますね。 Sub MainWnd_IDM_SAVE_MenuClick() Dim hEdit As Long Dim ofn As OPENFILENAME Dim hFile As Long Dim length As DWord Dim dwAccessByte As DWord Dim FileName[MAX_PATH] As Byte Dim buffer As String OPENFILENAME構造体の初期化 FillMemory(VarPtr(ofn),Len(ofn),0) ofn.lStructSize=Len(ofn) ofn.hwndOwner=hMainWnd ofn.lpstrFilter=Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0" ofn.nFilterIndex=1 ofn.lpstrFile=FileName ofn.nMaxFile=MAX_PATH ofn.lpstrTitle="ファイルの保存" ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST ofn.lpstrDefExt="*" 「ファイルの保存」ダイアログ ボックスを表示 If GetSaveFileName(ofn)=0 Then Exit Sub EditBox1のハンドルを取得 hEdit=GetDlgItem(hMainWnd, EditBox1) テキスト データを格納するためのバッファ領域を確保 length=GetWindowTextLength(hEdit) buffer=ZeroString(length+1) テキスト バッファを取得 GetWindowText(hEdit, buffer, length+1) ---------------- ファイルへ保存 ---------------- hFile=CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, _ ByVal 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,"ファイルオープンに失敗","TextEditor",MB_OK or MB_ICONEXCLAMATION) Exit Sub End If 書き込む WriteFile(hFile,buffer,length,VarPtr(dwAccessByte),ByVal 0) ファイル ハンドルを閉じる CloseHandle(hFile) End Sub 「終了」メニュー イベント hMainWndに対して、WM_CLOSE メッセージを送ります。 Sub MainWnd_IDM_EXIT_MenuClick() SendMessage(hMainWnd,WM_CLOSE,0,0) End Sub 「元に戻す」メニュー イベント 「編集」関連のメニューイベントのほとんどは、(WM_???)というメッセージを送るだけでよいので楽チンです(エディット コントロール任せ)。 Edit1に対して、WM_UNDO メッセージを送ります。 Sub MainWnd_IDM_UNDO_MenuClick() SendMessage(GetDlgItem(hMainWnd,EditBox1), WM_UNDO, 0, 0) End Sub 「切り取り」メニュー イベント Edit1に対して、WM_CUT メッセージを送ります。 Sub MainWnd_IDM_CUT_MenuClick() SendMessage(GetDlgItem(hMainWnd,EditBox1), WM_CUT, 0, 0) End Sub 「コピー」メニュー イベント Edit1に対して、WM_COPY メッセージを送ります。 Sub MainWnd_IDM_COPY_MenuClick() SendMessage(GetDlgItem(hMainWnd,EditBox1), WM_COPY, 0, 0) End Sub 「貼り付け」メニュー イベント Edit1に対して、WM_PASTE メッセージを送ります。 Sub MainWnd_IDM_PASTE_MenuClick() SendMessage(GetDlgItem(hMainWnd,EditBox1), WM_PASTE, 0, 0) End Sub 「すべて選択」メニュー イベント EM_SETSEL メッセージで、3番目のパラメータに始点を、4番目のパラメータに終点を指定することで、「すべて選択」の機能を実現することができます。 Sub MainWnd_IDM_ALLSELECT_MenuClick() Dim hEdit As Long Dim length As Long EditBox1のハンドルを取得 hEdit=GetDlgItem(hMainWnd,EditBox1) テキスト データの長さを取得 length=GetWindowTextLength(hEdit) すべての部分を選択する SendMessage(hEdit,EM_SETSEL,0,length) End Sub 「バージョン情報」メニュー イベント ここは、MessageBox関数を利用し、バージョン情報を表示するだけです。 Sub MainWnd_IDM_ABOUT_MenuClick() MessageBox(hMainWnd,"TextEditor Ver1.00","バージョン情報",MB_OK or MB_ICONINFORMATION) End Sub おまけですが、"MainWnd" のRAD画面を開き、ウィンドウプロパティ内のフォントを、"FixedSys"(サイズ14)に変更してみると見やすくなりますよ☆ これですべての作業が完了です。ファイルの入出力などに気を配ってやれば、後は意外と簡単だったかもしれません。このプログラムはテキスト エディタの基礎部分にすぎないので、やる気のある方は、機能追加にチャレンジしてみても良いでしょう。