TIPS
サンプルコード uses ..., System.Messaging, Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.AppKit, Macapi.Helpers, FMX.Helpers.Mac; procedure TForm1.FormCreate(Sender: TObject); begin TMessageManager.DefaultManager.SubscribeToMessage(TApplic…
1200万パワーだ! 昨日の記事の応用編。なんと演算子オーバーロードの代替表記を使えば、通常では組み合わせることのできない演算子オーバーロードとジェネリクスを同時に使えます。 サンプルコード https://gist.github.com/lynatan/673e574faa8343fa01d7a9…
はじめに 演算子オーバーロードはDelphi 2006で導入された機能で、自分が定義したレコードに+や-といった演算子の動作を実装できます。この機能はARC対応コンパイラであればレコードだけでなくクラスでも使えるんですが、非ARCコンパイラ、つまりx86向けのよ…
はじめに class helperは任意のクラスにメソッドや定数、クラス変数を追加する機能を持ちますが、インスタンス変数を追加することはできません。しかしインスタンスの実態が単なるポインタであり、任意のフィールドへのアクセスが「インスタンスアドレス+フ…
皆さんご存じかと思われますが、Delphi 10.1 Berlinがリリースされました。で、新機能の一覧の中にこんなことがさらっと書いてありました。 Delphi コンパイラのその他の改良点 (中略) 可視性のセマンティクスを実行するため、クラス ヘルパやレコード ヘ…
Component Initializerとは? Component Initializerは、去年のAdvent Calendar用記事で紹介した、IDE上でコンポーネントを配置する際にちょっとしたコードを走らせることのできるプラグインです。 その「ちょっとしたコード」のサンプルとして、プラグイン…
この記事は怒られたら前方伸身宙返り3回ひねり土下座をしつつ引っ込める予定ですのでご了承下さい*1。 あと当然ながら分かってる人向けの話なので、質問とかされてもわたしこまるあるよ。 これまでのおはなし 「Janetter」PC版がTwitterの認証数上限に到達、…
こういうのあるならね、環境設定から弄らせろと。何のための設定だよと。 あと公式ブログも、日本語の音声も字幕も一切付ける気のない全編英語の動画記事にちょろっと日本語書き足して紹介するくらいなら、こういうの翻訳して載せてくれた方がみんな嬉しいと…
この記事はDelphi Advent Calendar 2012の参加記事です。今日で5日目! はい、まさかの1年ぶりの更新です。 基本的にここは「Delphiそのものを触るのが楽しい!」という時にしか更新する気が起きないので、 早く楽しくなるような新しい言語機能がたくさん搭…
これとは関係ないネタを書いてたんだけど、全然まとまりそうにないのでわりとどうでもいいネタでお茶を濁す。 列挙型を文字列に 例えば列挙型の値をiniファイルなどに保存したい場合、Ordで整数値を取り出す、Integerでキャストする、という選択肢のほかに、…
TRttiProperty vs Set(Ord|Float)Prop Delphi 2010で拡張RTTIが導入されて、Rttiユニットでクラスやレコードの情報を調べたりプロパティを書き換えられるようになったんだけど、2009以前にもTypInfoユニットにあるSetOrdValueやSetFloatValueといった関数で…
1月1エントリ 順調に達成してるな…!と思ったらすでに4月に破綻してた。 そんなことよりカスタム属性やろうぜ! 先日カスタム属性とRTTIを利用したCSV読み込みクラスを作る機会があったので、それらの利用サンプルとして多少汎用化しつつ公開してみる。C#は…
var s: string; for s in ['a', 'b'] do ... ふと何気なくこのようなコードを書いたら構文チェックが通ったので、「あれ?これ何気に便利じゃね?」と思ったら致命的エラーとやらでコンパイルは通らず。がっかり。でももしやと思い次のようなコードを試して…
事の発端 http://pc12.2ch.net/test/read.cgi/tech/1259667697/312-315n 312 :デフォルトの名無しさん:2010/02/26(金) 13:16:25 TBase = class public class const Value: Integer; abstract; end; TBaseClass = class of TBase; TExtend1 = class(TBase) …
無名メソッドの導入によってSynchronizeメソッドが拡張されたのは知ってる人も多いだろうけど、ついでにクラスメソッド版のSynchronizeも作られたことは俺以外に2人くらいは知らないかもしれない。宣言部を引用してみるとこんな感じ。 type TThread = class …
エターナルフォースOwnsObjects*1! type TStringList = class(TStrings) ... constructor Create(OwnsObjects: Boolean); overload; ... end; Create時にTrueを指定しておくと、Freeをしたその一瞬でObjectsプロパティに含まれるインスタンスを解放させる*2…
本来同名で複数定義することのできないプロパティを、default指定した場合に限りオーバーロードできちゃう、という小ネタ。 type TFoo = class private function GetItem(Index: Integer): string; overload; function GetItem(const Name: string): string;…
var func: TFunc<Integer,BOOL>; begin func := // NG function(Data: Integer): BOOL stdcall begin Result := True; end; このように書こうとすると、コンパイラに「互換性ねーよ糞が」とか怒られるんだけど、そもそもTFunc<>の宣言を見てみると、 type TFunc<T,TResult> = referenc</t,tresult></integer,bool>…
2ヶ月ちょっとくらい放置だったのはこの際忘れるとして。C#では次のように無名のイベントハンドラを記述できるので、 wahaa.Click += delegate { MessageBox.Show("わはー"); }; Delphiに無名メソッドが実装された時、きっとできるんだろうと甘く考えてたら…
無名メソッドは変数に代入したり、関数に渡して使うものだから、その場で呼び出しちゃうってことは一度きりの使い捨て?再利用できなくね?何の意味があるの?という疑問をお持ちの方もいるかもしれないけど、例えばクロージャを作りたい場合なんかは「クロ…
System.pas内にCPUCount変数が宣言されていて、これを参照することでCPUの数が取得できる。中身はGetSystemInfoで取得した値。 2006のソースを見たところまだ存在しなかったので、2009辺りで導入されたのかな?
var c: Char; s: string; arr: TArray<string>; begin s := 'Hello, Wahaa world'; for c in s do { 1文字ずつ取り出す }; for c in Copy(s, 8, Length(s)) do { 8文字目から1文字ずつ取り出す }; arr := TArray<string>.Create('Hello', 'Wahaa', 'world'); for s in arr do</string></string>…
レジストリの"HKEY_CURRENT_USER\Software\CodeGear*1\BDS\x.0*2\Globals"内に"CollectGarbageInterval"という文字列値を作って、ミリ秒で時間を指定するとその間隔でIDEで使ってる.NETに対して強制的にGCを発動してくれるみたい。 ガリレオIDE系で有効だと…
海外のDelphiブログを色々見てる時に、変数名だか関数名の頭に&記号が付いてるのを(どこでだったか忘れたけど)目にして、さっき何となくヘルプ見たらあれは拡張識別子というものだった。 拡張識別子(というか&演算子)は予約語を識別子としてコンパイラに…
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>…
普段から何かとデフォルト文字コードがShiftJISだったりして、DelphiでもShiftJISを扱いたい。だけどDelphiで使おうと思ったら、 var enc: TEncoding; begin enc := TEncoding.GetEncoding(932); try // ShiftJISを扱う処理 finally enc.Free; end; end; な…
ティファニーで朝食を、みたいな感じで書いたつもりが全然元ネタの香りもしない感じになったのは置いとくとして、Delphiにジェネリクスが実装されたのでスマートポインタも実装し放題な今日この頃、というか時期的にはもう旬は終わった感もあるくらいなので…
Delphi2010版というよりIndy10最新版でのやり方と言った方が正しいけど、以下のようにすればOK。 IdHTTP1.Response.CharSet := 'Shift_JIS'; これだけであとはGetを呼ぶと内部で変換した上で返してくれる。 もちろん決めうちなので自動で文字コード判別はで…
SyncObjs.pasを何気なく眺めていたところ、こんな記述が。 TCriticalSectionHelper = record helper for TRTLCriticalSection ... どうやらクラスヘルパーはレコードに対しても使える模様*1。ただ、VCL内でもたったの3箇所*2しか使われていない、"record hel…
nilもポインタなので逆参照できる。なので先日のnilを渡すサンプルは次のようにも書ける。 ReadProcessMemory(..., PDWORD(nil)^); // 前回の例 ReadProcessMemory(..., DWORD(nil^)); // 今回の例