Swanman's Horizon

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

TIPS

macOSでDockメニューに独自項目を追加する。

サンプルコード uses ..., System.Messaging, Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.AppKit, Macapi.Helpers, FMX.Helpers.Mac; procedure TForm1.FormCreate(Sender: TObject); begin TMessageManager.DefaultManager.SubscribeToMessage(TApplic…

class or class = ???

1200万パワーだ! 昨日の記事の応用編。なんと演算子オーバーロードの代替表記を使えば、通常では組み合わせることのできない演算子オーバーロードとジェネリクスを同時に使えます。 サンプルコード https://gist.github.com/lynatan/673e574faa8343fa01d7a9…

Use operator overloading for classes with non-ARC compiler

はじめに 演算子オーバーロードはDelphi 2006で導入された機能で、自分が定義したレコードに+や-といった演算子の動作を実装できます。この機能はARC対応コンパイラであればレコードだけでなくクラスでも使えるんですが、非ARCコンパイラ、つまりx86向けのよ…

class helperで擬似的にインスタンス変数を追加する。

はじめに class helperは任意のクラスにメソッドや定数、クラス変数を追加する機能を持ちますが、インスタンス変数を追加することはできません。しかしインスタンスの実態が単なるポインタであり、任意のフィールドへのアクセスが「インスタンスアドレス+フ…

10.1 Berlinのclass helper仕様変更は全然改良じゃないと思った?

皆さんご存じかと思われますが、Delphi 10.1 Berlinがリリースされました。で、新機能の一覧の中にこんなことがさらっと書いてありました。 Delphi コンパイラのその他の改良点 (中略) 可視性のセマンティクスを実行するため、クラス ヘルパやレコード ヘ…

Component Initializerのちょっと便利な使い方。

Component Initializerとは? Component Initializerは、去年のAdvent Calendar用記事で紹介した、IDE上でコンポーネントを配置する際にちょっとしたコードを走らせることのできるプラグインです。 その「ちょっとしたコード」のサンプルとして、プラグイン…

新規利用でもJanetterの認証制限を回避して使う方法。(追記あり)

この記事は怒られたら前方伸身宙返り3回ひねり土下座をしつつ引っ込める予定ですのでご了承下さい*1。 あと当然ながら分かってる人向けの話なので、質問とかされてもわたしこまるあるよ。 これまでのおはなし 「Janetter」PC版がTwitterの認証数上限に到達、…

VCLアプリで新規フォームのデフォルトフォントをあらかじめ設定する。

こういうのあるならね、環境設定から弄らせろと。何のための設定だよと。 あと公式ブログも、日本語の音声も字幕も一切付ける気のない全編英語の動画記事にちょろっと日本語書き足して紹介するくらいなら、こういうの翻訳して載せてくれた方がみんな嬉しいと…

関数ポインタとメソッドポインタの相互代入のおはなし。

この記事はDelphi Advent Calendar 2012の参加記事です。今日で5日目! はい、まさかの1年ぶりの更新です。 基本的にここは「Delphiそのものを触るのが楽しい!」という時にしか更新する気が起きないので、 早く楽しくなるような新しい言語機能がたくさん搭…

ジェネリクスを使って少しだけ手軽に列挙型の値を文字列に変換する。

これとは関係ないネタを書いてたんだけど、全然まとまりそうにないのでわりとどうでもいいネタでお茶を濁す。 列挙型を文字列に 例えば列挙型の値をiniファイルなどに保存したい場合、Ordで整数値を取り出す、Integerでキャストする、という選択肢のほかに、…

RTTIによるプロパティの書き換え速度を比較してみた

TRttiProperty vs Set(Ord|Float)Prop Delphi 2010で拡張RTTIが導入されて、Rttiユニットでクラスやレコードの情報を調べたりプロパティを書き換えられるようになったんだけど、2009以前にもTypInfoユニットにあるSetOrdValueやSetFloatValueといった関数で…

カスタム属性とRTTIを使ったCSVファイルのロード@Delphi2010。

1月1エントリ 順調に達成してるな…!と思ったらすでに4月に破綻してた。 そんなことよりカスタム属性やろうぜ! 先日カスタム属性とRTTIを利用したCSV読み込みクラスを作る機会があったので、それらの利用サンプルとして多少汎用化しつつ公開してみる。C#は…

for-in-doにもっと頑張ってもらう。

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) …

クラスメソッド版TThread.Synchronizeの使いどころ。

無名メソッドの導入によってSynchronizeメソッドが拡張されたのは知ってる人も多いだろうけど、ついでにクラスメソッド版のSynchronizeも作られたことは俺以外に2人くらいは知らないかもしれない。宣言部を引用してみるとこんな感じ。 type TThread = class …

TStringListのささやかな新機能。

エターナルフォース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に無名メソッドが実装された時、きっとできるんだろうと甘く考えてたら…

無名メソッドをその場で呼び出す。

無名メソッドは変数に代入したり、関数に渡して使うものだから、その場で呼び出しちゃうってことは一度きりの使い捨て?再利用できなくね?何の意味があるの?という疑問をお持ちの方もいるかもしれないけど、例えばクロージャを作りたい場合なんかは「クロ…

基本の再確認2 CPUの数。

System.pas内にCPUCount変数が宣言されていて、これを参照することでCPUの数が取得できる。中身はGetSystemInfoで取得した値。 2006のソースを見たところまだ存在しなかったので、2009辺りで導入されたのかな?

基本の再確認1 for..in..doあれこれ。

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ブログを色々見てる時に、変数名だか関数名の頭に&記号が付いてるのを(どこでだったか忘れたけど)目にして、さっき何となくヘルプ見たらあれは拡張識別子というものだった。 拡張識別子(というか&演算子)は予約語を識別子としてコンパイラに…

いつの間にか動的配列は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>…

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…

nilの逆参照

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