またしても、Windows起動時に「環境のためのメモリが足りません」現象、発生。セーフモードからの再起動しか受け付けられない…。CONFIG.SYS、AUTOEXEC.BATをちょっといじっては再起動を繰り返し、何とか正常起動できるようになった。結果からすると、AUTOEXEC.BATに入れた「大量のREM文」が原因であったらしい。
Delphi6 UP1
Borland Delphi 6にUpdate Pack 1を適用。
Memo1.Lines.Add(BcdToStr(StrToBcd('0.1')));
で’1’と表示されていたのが’0.1’と表示されるようになった。
NormalizeBcd関数の第1パラメータがconst指定で、wsprintfがstdcall指定のままだが、ま、これは簡単にどうにかできるから良いか。
ZAURUS
今まで何とはなしに敬遠していたキーボード付きZAURUSを店頭で触る。うー、大きさのワリに打ちやすいじゃないか。グラグラ…。
ニッケル水素電池
SANYOのニッケル水素電池、HR-3Uが寿命を迎えて以降、Nikon E900にはアルカリ電池を使っていた。が、ここんとこまた少し使用頻度が上がってきたので、替えのニッケル水素電池を買いに行く。…HR-3U(min.1400mAh)はどこにもなかった。その次に出たと思しきHR-3US(min.1500mAh)すら僅少で、主流はすでにHR-3USV(min.1600mAh)。結局、N-M54S(HR-3USVx4本、NC-M54のセット品)を買って帰ったのであった。手元のNC-M43(急速充電器)があぶれたな。ていうか、地球にやさしくないぞ。
テレビ
・今クールのTVドラマ視聴リスト(お気に入り順/特撮モノ含む)。
「救命病棟24時」、「世界で一番熱い夏」、「ファイティングガール」、「恋がしたい恋がしたい恋がしたい」、「仮面ライダーアギト」、「できちゃった結婚」、「生きるための情熱としての殺人」、「ルージュ」、「百獣戦隊ガオレンジャー」、「非婚家族」、「フレーフレー人生!」、「ウソコイ」。
・今クールのTVアニメ視聴リスト(お気に入り順)。
「デジモンテイマーズ」、「機動天使エンジェリックレイヤー」、「も~っと!おジャ魔女どれみ」、「フルーツバスケット」、「スクライド」、「だぁ!だぁ!だぁ!」、「コメットさん★」、「NOIR(ノワール)」、「コスモウォーリアー零」、「ZONE OF THE ENDERS Z.O.E dolores, i」、「シャーマンキング」。
BCD
Delphi 6のFMTBcdルーチン。いたるところで精度の自動調整が行なわれるのだが、その際、絶対値が1未満の数値に対する処理が×らしく、小数点が行方不明に。例えば、
Memo1.Lines.Add(BcdToStr(StrToBcd('0.1')));
で’1’と表示されるし、
BcdDivide('1','10',B); // B := 1 / 10 Memo1.Lines.Add(FormatBcd('#.#',B));
も’1’、
if BcdToDouble(DoubleToBcd(0.1)) = BcdToDouble(DoubleToBcd(1.0)) then begin Memo1.Lines.Add('一致'); end;
が’一致’してしまう。1.111を10で割ると1111となり、
B := StrToBcd('1111'); for I := 1 to 50 do begin BcdDivide(B,10,B); // B := B / 10 Memo1.Lines.Add(BcdToStr(B)); end;
という処理では1.111から1111までの間を行ったり来たり…。
まあ、整数部が常に1桁以上となるよう調整、つまりは、
CurrToBCD(0.1,B); Memo1.Lines.Add(BcdToStr(B));
や
NormalizeBcd(StrToBcd('0.1'),B,64,32); Memo1.Lines.Add(BcdToStr(B));
とでもすれば良いのだが、そうするくらいなら通常の実数型を使うほうがマシというもの。また、上記の処理を
B := StrToBcd('0.1'); NormalizeBcd(B,B,64,32); Memo1.Lines.Add(BcdToStr(B));
とすると’0’になる。これはNormalizeBcd関数の第1パラメータがconst指定であるが故。あらかじめ、
function NormalizeBcd(InBcd: TBcd; var OutBcd: TBcd; const Prec, Scale: Word): Boolean; begin Result := FMTBcd.NormalizeBcd(InBcd,OutBcd,Prec,Scale); end;
とでもしておかないと危険。
にしても、精度が命のBCDにおいて、「自動調整」ってのは…?
varargs指令
Delphi 6。Windows.pasを覗いてみたが、wsprintfは相変わらずstdcallのままであった。D6からはvarargs指令が使えるので、ちょいと実験。
function wsprintf(Output: PChar; Format: PChar): Integer; cdecl; varargs; external user32 name 'wsprintfA'; var Buf: string; N: Integer; begin Memo1.Lines.Clear; N := 64; SetLength(Buf,1024); wsprintf(PChar(Buf),'N: %d %x',N,N); SetLength(Buf,StrLen(PChar(Buf))); Memo1.Lines.Add(Buf); end;
呼べた。確かに呼べた。うー、気色悪…。
ActionManager
Delphi 6。ActionManagerってのががどんなもんか、体感してみるべくチュートリアルにかかる。…私が使うような代物ではないな。まどろっこしくって。ていう前に、ちと不具合が多すぎるよ、これ。
Delphi6
Borland Delphi 6が届き、さっそくインストール。が、インストール後の再起動がよろしくない。AUTOEXEC.BAT内のタブが改行に置換えられ、しかもDelphi 6へのPATHが登録されていない。ま、手作業で編集したから良いけども。ファイル名をAutoExec.batに変えたのもインストーラの所業か? Delphi 5に比べ、Userリソースは抑え目だが、GDIリソースをかなり喰う。「インストール番号」、「インストールキー」に加え、「使用許諾コードの取得」が必要になってしまったってのが物悲しい。
レジストリ
レジストリがふっとんだ。再起動時の自動復旧により、どうやら2月頃の状態に戻った模様。にも関わらずたいして困らなかったりするあたり、結構意外。