○追加
・バイナリからの文字列生成
・暗黙の文字列変換
○更新
・コンポーネント・ライブラリ対応状況
・コントロール文字列と{$HIGHCHARUNICODE}スイッチ
2記事追加+2記事加筆修正です。
暗黙の文字列変換を書いていてやたらと疲れましたぜよZzzz
またしても落ちましたorz
今年は合格者数が激減しますたorz
結局専門学校のボーダーは釣りでしかなかったわけですな。
まぁ、70%とれてないヤツがギャーギャー抜かすな!
と言われてしまえばそれまでです。
いい加減潮時だとは思っていますが、
時勢を考えると就活などしたところで職はないでしょう。
ということは試験勉強をしていた方がマシというものです。
ただ、そんなノリでは受からないので、
今一度よく考えてから行動しようと思います。
TListViewのViewStyleを変更するとDeletionが発生する
MLでのネタですが、これはかなり恐ろしい不具合です。
ListViewでViewStyleやMultiSelectプロパティを変更すると、
内部的にRecreateWndが呼ばれています。
これには実は妙な副作用があって、
ウインドウを一旦破棄する際にアイテムがある場合にはその全てを削除してしまうのです。
そして破棄されるアイテムはMemoryStreamとして保持され、
ウインドウが再生成された後にまた挿入されます。
この際に、DeleteメソッドやInsertItemメソッドが、
アホなことにRecreate中であってもOnDeletionイベントやOnInsertイベントを呼ぶようになっています。
このため、実行時にアイテムがある場合にViewStyleやMultiSelectを変更してしまうと、
不必要なOnDeletionイベントやOnInsertイベントを発生させてしまうのです。
実際例をご紹介すると、

これがViewStyle変更前です。
ボタンをクリックするとViewStyleをvsReportに設定します。

首尾良くvsReportになりました。
ちなみに右側のメモはこの変更で発生したイベントです。
(OwnerDraw、OwnerData系は除いていますが、恐らく発生していると思います。)
現状での回避策は、暴発するイベントの冒頭に、
if (csRecreating in (Sender as TListView).ControlState) then Exit;
と記述するしかありません。
一応QCも登録しましたが、なぜかUpdate3のレポートがいまだβレポート扱いなので、
一般の人には見えないというレポートになってしまいましたorz
先の記事ではDelphi 2009での文字列処理の流れの基本を書きましたが、
RawByteStringについても誤解が多いみたいなのでここで書いておこうと思います。
○RawByteStringの想定利用方法
RawByteStringは、「コードページを変換しない特殊なAnsiString型」です。
もう一度言います。
「コードページを変換しない特殊なAnsiString型」です。
このうち、「コードページを変換しない」
というのが最も大事なところです。
特集のRawByteStringのところでも書きましたが、
AnsiStringはデフォルトのコードページになるため、
関数や手続きの引数、または関数の戻り値として使ってしまうと、
意図しないコードページ変換が行われてしまいます。
これを防ぐためにコードページを変換しないRawByteStringが必要になったのです。
つまり、RawByteStringが使用される局面は、
・関数、手続きの引数
・関数の戻り値
が基本です。
○世間の誤解・誤用・濫用の有様
ところが、世間的には上記のような理解はあまり得られていません。
あたかも、RawByteString=万能のAnsiString型とでも言うような誤解があります。
原因のひとつは、SetCodePageの存在です。
これはRawByteStringのコードページを変更するというルーチンですが、
こいつを利用することでどんなコードページにでも変換できる便利な型という誤解が生まれているんだと思います。
もともと、RawByteStringを変数として宣言したり、変数パラメーターとして渡すことは想定外の利用方法です。
このことについてはNickがDelphi Unicodeワールド パートII: RTLの新機能と、UnicodeをサポートするクラスというEDNの記事で触れています。
-引用(RawByteString)
RawByteString型の目的は、コードページによる変換を一切行わずに任意のコードページの文字列を渡せるようにすることです。これは、バイト単位での文字列検索のように、特定のエンコーディングにこだわらないルーチンに極めて便利です。一般的に、文字列のコードページに無関係に文字列を処理するルーチンのパラメータにはRawByteStringを使用すべき、ということになるでしょう。 RawByteString型のインスタンスを宣言すると、未定義の動作やデータの欠落を引き起こしかねないので、滅多に使うべきではないでしょう。
-引用(SetCodePage)
SetCodePageは、十分に注意した上で、控え目に使うべきです。もしそのコードページが既存の文字列データに実際に適合しない場合には(例えばConvertがFalseに設定された)、予測できない結果が生じます。また、もし文字列の既存データが変換され、その新しいコードページが元の文字を表現できない場合には、データの欠落が発生します。
本当に重要なことが、しれっと書いてありますねw
また、もう一つの原因が、RTMのヘルプにRawByteStringの記載がないことです。
EDNの記事自体は2008/09/16に公表されていますが、
読み落としているとRawByteStringの使い方に気づくのは難しいでしょう。
とりあえずRawByteStringが万能な型だという認識をしている人は、
今すぐ間違いだと再認識して下さい。
正しい使い方は引数または戻り値です。
それ以外で使うと大抵はまともな結果を得られない物だと思って下さい。
RawByteStringあくまで特殊なAnsiString型です。
どう間違っても万能ではありません。
UnicodeStringとAnsiString
一番最初の記事を更新しました。
UTF8String絡みのことです。
最近Delphi 2009絡みの質問も多くなりましたが、
ところどころで根本的なことが分かっていない発言が散見されます。
躓いている人の多くがAnsiString、UTF8String、RawByteStringという単語を並べていますが、
そもそもDelphi 2009での文字処理の基本はUnicodeStringを使うことです。
文字処理の流れを可視化すると以下のようになります。
○Step.1
テキストファイル、DB、メール等のデータ(様々なエンコーディングで記録されている)を読み込み、
これをUTF-16LE(UnicodeString)に変換する。
○Step.2
UnicodeStringを用いて各種文字列操作を行う
(アプリケーション内部での処理)
○Step.3
UTF-16LEのデータから任意のエンコーディングに変換して、
テキストファイル、DB、メール等のデータに書き出す。
この際のエンコーディングはアプリケーションユーザーが指定したものでOKなので、なんでも良いことになる。
(仮に欠損が生じたとしてもそれはユーザーの選択である)
以上を見てもらえれば分かるように、
UTF-16LE以外のエンコーディングはファイル等の入出力以外では出てきません。
内部処理をすべてUTF-16LEにすることで、GUIを通してもAPIを通してもRTLを使ってもパフォーマンスは落ちません。
(無変換なので)
また、EAWを算出する際にUnicodeコードポイントを求める事になりますが、
この場合の変換オーバーヘッドはUTF-8より圧倒的に少ないです。
つまりUnicode=UTF-16LEですべてを処理することで、変換の回数を最小限にできるので、パフォーマンスの劣化を防げます。
また、不用意な変換がないので、文字化けや欠損などを防ぐことが出来ます。
Delphi 2009の文字列処理で躓いている人は、
まず一連の処理の流れを確認してみて下さい。
内部処理を全てUnicodeStringで統一してしまえば、
あとはUnicode特有の問題をどうするか?というより高度なレベルに至るはずです。
・Delphi 2009でのグラフィック
・特定のOSでのみ利用可能なVCL
久しぶりの追加です。
特定のOS〜はヘルプにあるやつをちょっと詳しくしたものです。
グラフィックは32ビットビットマップやPNGを中心に書いてます。
サンプルのプロジェクト一式も用意してます。
ちょっと前に録画しておいたヤツを晩飯時に見ることにした。
ちなみにテレビは地デジの液晶になり、
録画のデバイスはHDD&ブルーレイのレコーダーになりましたよ。
(以前はブラウン管+VHSのデッキ[S-VHS非対応])
○Moto GP
数年ぶりに見たので、メンバーは結構替わってますな。
それでもカピロッシやジベルノーは健在でしたが。
レースは終始ヤマハの2台が圧倒的でした。
終盤の攻防は尋常じゃなかった。
特に最終ラップのロッシはとんでもなかった。
まさかあそこで抜くとは・・・。
とりあえず永久保存レベルのレースでした。
すごかった。
○GP250
日本人ライダーの青山博一が2位という結果。
マシントラブルがなければ青山は1位争いができてたような。
でも、2位入賞はめでたいぜ。
ランキングは現在12ポイント差の2位なので、
加藤大治郎以来のチャンピオン目指して頑張ってほしいですな。
ちょっと気になったので、
Dual Vision TrimmerのDL数を累計してみましたよ。
DL Counter:13784
v1.00:1491
v1.01:9938
v2.00:130
v2.01:3362
v2.03:2940
Total:31645
※DL Counter以外は全てVectorの数字
※自サイト、Vector以外のものはカウントに含めていない
何気に30kヒットを超えていたりする罠。
DLして頂いた皆様、ありがたいばかりです。
まだまだアップデートしなければならないことがたくさんありますが、
今後もよろしくお願いします。
VectorでもDual Vision Trimmer 2.05がリリースされました。
2.04のリリースはVectorではスキップしているので、
VectorからDLして起動できねー!!っていう人は、
今度のヤツをDLすれば問題なくいけると思います。
とまぁ、ここを見てる人は既にDL済みだとは思いますけどね。
Dual Vision Trimmer 2.05
Dual Vision Trimmer Version 2.05のリリースです。
今回は機能追加だけです。
○追加内容
・環境設定に起動時のトリミングオプションを選択する設定を追加
起動時のトリミングモードを、
・前回終了時のモード
・スタンプモード
・フリーセレクトモード
・カットオフモード
の4つから選べるようになりました。
デフォルトは前回終了時のモードです。
G.S.F.N. for Human
それは人間が生きる上で欠かせない4要素。
Game
Sleep
Food
Net
のことである。
というわけでようやくNが復活したわけですよ。
しかも今回からは光ファイバーになったり。
ギガビットですってよ。
でも絶対400Mbpsすら出ねーだろうなw
とりあえずたまっているメールの返信に着手します。
ちなみに冒頭のネタはクレイジーコロシアム2でごわす。
再び携帯からカキコ。
ネットは6/12に開通予定です。
開通後はDVTの2.05をリリースし、
Vectorに差し替え申請をする予定です。
メールやBBSのレスが遅れますが、何卒ご了承くだされ。
ちなみにチェックだけならすぐにできるので、
ソフトの不具合や感想、機能要求などはバシバシ送ってもらって構いません。
とりあえず現在までに報告されたものはすべて管理用のリストに入れてあります。
Dual Vision Trimmer 2.04
Dual Vision Trimmerの2.04のリリースです。
一部環境で起動できない不具合を修正しました。
Vistaで起動できない人、
XPでエラーが発生する人はこいつで試してみて下さい。
明後日が回線移行なので、プロバイダのメールアドレスにメールが届くのは明日までです。
が、引っ越しの関係もあるので、明日の昼過ぎくらいからは多分受信できません。
ご用の方はメールフォームから是非おねがいします。
ちなみにプロバイダのアドレスは今回で抹殺するので、
再開通時に受信は無理でござる。
Delphi 2009 Update 3/4/5(Boost Update)
やっと出ましたな。
まぁ、遅れた理由については突っ込まないことにしておく(NDAだし)
今回はジェネリクスのFixが多いと思います。
あとは結構いろいろ直ってるところがあるかと。
自分のQCもこっそり修正が入っていたりするし。
ちなみにバグフィックスリストのQCは、FTerじゃないと全部閲覧できない可能性があるので、
その辺は諦めるしかない。
DEKOさんのところでは、Vistaで自動アップデートすると
「インストールプログラムには、ファイルを修正する特権がありません」
が出たそうですが、うちのXP SP3でも出ましたね。
主としてdcuファイルの更新中に出てますが、
こちらも再試行で問題なくアップデートできてます。
ただ、放置が出来ないのが難点ですな。
○追加
・Unicodeにおける全角・半角とEastAsianWidth
・ライブテンプレートの作り方
○更新
・アップデート情報
・コンポーネント・ライブラリ対応状況
・Quality Centralの基礎知識
久しぶりの特集更新です。
追加記事はEAWに関するものとライブテンプレートです。
更新はアップデート情報とコンポーネント対応状況、QC基礎知識です。
アップデート情報にはUpdate 3/4/Boostを追記しました。
コンポーネントはバージョン情報を最新にしただけです。
QC基礎知識はVote Limit Exceededへの対応方法を記載しました。
去年と同じくらいでしたorz
こりゃまた微妙な・・・。
やれやれだぜまったく。
ただ、諦めたところで職がないので強制的に続行です。
また学費稼ぎか・・。
遂に決戦前夜でござる。
やることはやったので後は神威クラッシュをぶち込むだけです。
あまり簡単すぎる問題は出て欲しくないなぁ。
ボーダーラインが上がって乙!
みたいなことになりかねん。
まぁ前半三科目でどれだけ稼げるかと、
最終科目でどこまで拾えるかが勝負ですな。
とりあえずがんばります。
日曜日は雨らしい。
今年もかよorz
ちなみに去年は傘がぶっ壊れましたよ。
教室の掲示が1箇所しかなかったために、その人ゴミでね。
ちょうど関東でもインフルちゃんに感染しただのなんたらとかになってるので、
人がうじゃうじゃと集まる早稲田大学もおそらくとってもデンジャラスでしょうな。
マスクの着用率がどえらいことになっていたら面白いなw
まぁ、一応自分も付けていきますがね。
とりあえず残り2日ですが頑張ります。
GENOウイルス(ジェノウイルス)とは、
株式会社GENOが発案した、いままでにないSEO手法である。
トップページにウィルスを仕込み、2chやブログで取り上げられることによる集客効果、被リンク数の増大を目的としている。
>>出典:アンサイクロペディア
クソワロタww
"GENOがエクストリーム・謝罪へ参加を目指しており"とかもねw
とりあえずまともな対策方法はDEKOさんところに書いてあるので、
そこを見ておくといいですよ。
参考:DEKOのアヤシイお部屋 - 雑談09/05/13
http://homepage1.nifty.com/ht_deko/ft0905.html#090513