Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

いつの間にか動的配列はCreateできるようになっていた。

type TIntArray = array of Integer; var IntArray: TIntArray; StrArray: TArray<string>; begin IntArray := TIntArray.Create(2, 3, 5, 7, 11,); // [2, 3, 5, 7, 11] StrArray := TArray<string>.Create('foo', 'bar'); // ['foo', 'bar'] end; 不覚にもこんな基本的な機</string></string>…

for-in-doを使ったC#のusingもどき。

先日書いたような、インターフェースの参照カウントを利用したスマートポインタは便利は便利なんだけど、基本的に参照カウントの変動は(nilなどを明示的に代入しない限り)手続きや関数を抜ける際に行われるので、使い終わったらさっさと解放して欲しいとい…

TEncodingを拡張する。

普段から何かとデフォルト文字コードがShiftJISだったりして、DelphiでもShiftJISを扱いたい。だけどDelphiで使おうと思ったら、 var enc: TEncoding; begin enc := TEncoding.GetEncoding(932); try // ShiftJISを扱う処理 finally enc.Free; end; end; な…

Delphiでスマートポインタを。

ティファニーで朝食を、みたいな感じで書いたつもりが全然元ネタの香りもしない感じになったのは置いとくとして、Delphiにジェネリクスが実装されたのでスマートポインタも実装し放題な今日この頃、というか時期的にはもう旬は終わった感もあるくらいなので…

TIdHTTP.Getで文字化けしない方法@Delphi2010。

Delphi2010版というよりIndy10最新版でのやり方と言った方が正しいけど、以下のようにすればOK。 IdHTTP1.Response.CharSet := 'Shift_JIS'; これだけであとはGetを呼ぶと内部で変換した上で返してくれる。 もちろん決めうちなので自動で文字コード判別はで…

既存のレコードにヘルパーメソッドを追加する。

SyncObjs.pasを何気なく眺めていたところ、こんな記述が。 TCriticalSectionHelper = record helper for TRTLCriticalSection ... どうやらクラスヘルパーはレコードに対しても使える模様*1。ただ、VCL内でもたったの3箇所*2しか使われていない、"record hel…

ジェネリックレコード(クラス)と無名メソッドの組み合わせでバグ。

まずは再現コード。 // 以下Project1.dpr program Project1; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var foo: TFoo<TObject>; proc: TProc; begin proc := foo.Bar(); // *1 proc; // *2 end. // 以下Unit1.pas unit Unit1; interface uses SysUti</tobject>…

なぜクラスヘルパーが使いたかったかというと。

TList.ToArrayメソッドが「コンパイラの対応待ち」ということで何故かコメントアウトされてたので、外部から同じコード流し込んで使えるかどうか検証してみようと思ったので。 結果的にクラスヘルパーは使えなかったけど、とりあえず同等のコードを書いて動…

ジェネリッククラスにクラスヘルパーを使う。

結論から言えば無理でした☆ E2508 型パラメータはこの型で許可されません。 とコンパイラに怒られます。 type TListHelper<T> = class helper for TList<T> ... TListHelper = class helper for TList<Integer> ... そのままでも、型引数を指定した上でもダメ。ただし後者は</integer></t></t>…

DiagnosticsユニットのTStopwatch。

時間計測用。かなり目立たない位置にいるけど、こんなのが追加されてた(ひょっとしたら2009からあったかもしれないけど)。 C#使いの人はすぐに分かっただろうけど、どうやら.NETのStopwatchクラスの移植みたい(ちゃんと確認したわけじゃないけど)。少な…

TTouchKeyboardをいぢ(め)る。

2010買ったので何か2010っぽいことをやってみようとした結果がこれだよ!というわけで、とりあえず今回から新たに付属してるコンポーネントであるTTouchKeyboardの描画周りを弄ってみる。 TTouchKeyboardにはDrawingStyleやGradientStart(End)といったプロ…

Delphiでリフレクションもどき その2 メソッド名の取得

Delphi2010で強化されたRTTIを使えばメソッド名の取得なんて超簡単なんだろうけど、まぁそれはそれで。 メソッド名の取得は、 publishedなメソッドであること 専用の関数などがなくUndocumentedな力技であること の2点を除けばわりとシンプルで汎用的に使え…

nilの逆参照

nilもポインタなので逆参照できる。なので先日のnilを渡すサンプルは次のようにも書ける。 ReadProcessMemory(..., PDWORD(nil)^); // 前回の例 ReadProcessMemory(..., DWORD(nil^)); // 今回の例

多次元配列の初期化。

Delphiの多次元動的配列は動的配列の動的配列という実装なので、メモリ上の配置は必ずしも連続しておらず(静的な場合は連続している)、Length(Hoge[0])の要素は10コだけど、Length(Hoge[1])の要素は2コ、というようにそれぞれ別の長さを設定してやることが…

参照渡しのパラメータにnilを渡す

動的配列の参照とほとんど同じだけど、例えばWin32APIのReadProcessMemoryの引数であるlpNumberOfBytesReadは本来オプションであり、nilを渡しても問題のないはずが、Windows.pasでは参照渡しとして宣言されているために直接nilが指定できなかったりする。 …

型なしパラメータに動的配列を渡す

動的配列や長い文字列をFillCharに渡してゼロフィルする、てのは日常的に行われる処理で、 FillChar(HogeArr[0], HOGE_LENGTH, 0); // HogeArr: array of Byte; FillChar(HogeStr[1], HOGE_LENGTH, 0); // HogeStr: string; というのがよく目にする記述だけ…

ヤクルトこわい

とりあえず一つ目はすでに溢れかえってるネタで濁しつつはてな記法の練習。 UTF-8になってるという情報は他にはたぶんないと思うけど、これも昔の日記ネタを掘り起こしただけだったりする。 次回以降はメソッド名を取得する方法、メソッドの引数の名前や型を…

Delphiでリフレクションもどき その1

Delphiでコンパイルされた実行ファイルには「実行時型情報(=RTTI)」と呼ばれるデータが埋め込まれる*1。これは主にIDEが使うために生成されるもので、普段はほとんど使う機会がないんだけど、TypInfoユニットにはこれらを参照する関数が実装されていて、…