開発ブログ - 技術メモカテゴリのエントリ
Delphi から MacOS や iOS の文字列定数を使いたい時にどうすればいいのかわからなかったので、調べてみました。
こんな風にするみたい...
from iOSapi.CoreVideo
こんな風にするみたい...
interface
const
libCoreVideo = '/System/Library/Frameworks/CoreVideo.framework/CoreVideo';
function kCVPixelBufferPixelFormatTypeKey: CFStringRef;
implementation
function kCVPixelBufferPixelFormatTypeKey: CFStringRef;
begin
Result := CFStringRef(CocoaPointerConst(libCoreVideo, 'kCVPixelBufferPixelFormatTypeKey')^);
end;
from iOSapi.CoreVideo
教訓!
Win32API に文字列バッファを渡す時には AllocMem ではなく SetLength すること
久々に WMDropFiles を使ったプログラムを書いていました。
日本語名のファイルをドロップすると、なんだか変なことに...
Win32API に文字列バッファを渡す時には AllocMem ではなく SetLength すること
久々に WMDropFiles を使ったプログラムを書いていました。
日本語名のファイルをドロップすると、なんだか変なことに...
変数定義をするときに、下のようなコードを書いたらエラーが発生しました。
var
hWnd: HWND;
[dcc32 エラー] xxxx.pas(26): E2007 定数または型が必要です
HWND は定義されているのになんでだよ!
みたいに怒っていました。
しまいにはこのコンパイラ壊れている!!!なんて...
FireMonkey にも VCL にも TBitmap というクラスがあり、
それぞれ VCL.Graphics, FMX.Graphics に入っています。
同じ名前なので同じようなものと思ってしまうのですが、だいぶ違うんです。
列挙型のプロパティのあるクラスを TCustomAdapterBindSource などでバインドソースにしたのですが、列挙型のプロパティは LiveBindingデザイナに出てきませんでした。
仕方がないので、Integer にキャストしたプロパティを作って、そこから値をマップしました。
もしかしたら * と Owner を使った技で回避できるかも?
と思ってやってみましたが、うまくいきませんでした。
そもそも FindField で見つけることができませんね。
Object ならアクセスできるのですが...
LiveBindings CustomFormat で * と Self を使う
仕方がないので、Integer にキャストしたプロパティを作って、そこから値をマップしました。
もしかしたら * と Owner を使った技で回避できるかも?
と思ってやってみましたが、うまくいきませんでした。
そもそも FindField で見つけることができませんね。
Object ならアクセスできるのですが...
LiveBindings CustomFormat で * と Self を使う
Delphi XE5
なぜか FireMonkey on Windows では poOwnerFormCenter が効かないんですよね?
必ず poScreenCenter になってしまうのです。
ネットで情報を検索してみたら、とりあえずこんなのが見つかりました。
http://stackoverflow.com/questions/8195106/firemonkey-and-showing-modal-dialog-center-of-the-owner-form
と書いてあります!!
それはないでしょう?と思ったのですが、poOwnerFormCenter が機能しないのは事実なので、これを使ってみました。
なぜか FireMonkey on Windows では poOwnerFormCenter が効かないんですよね?
必ず poScreenCenter になってしまうのです。
ネットで情報を検索してみたら、とりあえずこんなのが見つかりました。
http://stackoverflow.com/questions/8195106/firemonkey-and-showing-modal-dialog-center-of-the-owner-form
Position is not implemented in FireMonkey by ShowModal.
と書いてあります!!
それはないでしょう?と思ったのですが、poOwnerFormCenter が機能しないのは事実なので、これを使ってみました。
古い人なので、デスクトップにマイコンピュータがないと落ち着かないのです。
でも、Windows 8.1 や Windows Server 2012 R2 などでは簡単ではありません。
あちこち探しまわっていつも疲れてしまうのです。
というわけで、いつも忘れちゃうので、書いておきます。
以下のコードで設定ダイアログが表示できます。
でも、Windows 8.1 や Windows Server 2012 R2 などでは簡単ではありません。
あちこち探しまわっていつも疲れてしまうのです。
というわけで、いつも忘れちゃうので、書いておきます。
以下のコードで設定ダイアログが表示できます。
rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
LiveBindings のカスタム書式ではいくつかのデフォルトの LiveBinding メソッドが使えますが、これだけではなかなかきついですよね。
そんな時には独自のカスタム LiveBinding メソッドを作ることができます。
決まった書き方で関数を作成してパッケージとしてインストールする必要がありますが...
カスタム LiveBinding メソッドの作成
作成したカスタムメソッドがデザイン画面では使えるのに、実行時にエラーが発生する場合には uses に追加すれば使えるようになると思います。
そんな時には独自のカスタム LiveBinding メソッドを作ることができます。
決まった書き方で関数を作成してパッケージとしてインストールする必要がありますが...
カスタム LiveBinding メソッドの作成
作成したカスタムメソッドがデザイン画面では使えるのに、実行時にエラーが発生する場合には uses に追加すれば使えるようになると思います。
TListBindSourceAdapter などを使ってオブジェクトをバインドして使うときに
TBindExpression の SourceExpression で、単純にフィールド名を書くとエラーになってしまいます。
と書く必要があるんですね。
LiveBindings 書式設定式に書けるメソッドには
Format(<書式文字列>, <引数 1>, <引数 2>, …)
IfThen(<条件>, <真の場合の値>, <偽の場合の値>)
Lookup(<スコープ ルックアップ>, <キー フィールド>, <キー値>, <結果フィールド>)
など、その他使える式は以下にあります。
デフォルトの LiveBinding メソッド
http://docwiki.embarcadero.com/RADStudio/XE6/en/Default_LiveBindings_Methods
TBindExpression の SourceExpression で、単純にフィールド名を書くとエラーになってしまいます。
FieldName.Value
と書く必要があるんですね。
LiveBindings 書式設定式に書けるメソッドには
Format(<書式文字列>, <引数 1>, <引数 2>, …)
IfThen(<条件>, <真の場合の値>, <偽の場合の値>)
Lookup(<スコープ ルックアップ>, <キー フィールド>, <キー値>, <結果フィールド>)
など、その他使える式は以下にあります。
デフォルトの LiveBinding メソッド
http://docwiki.embarcadero.com/RADStudio/XE6/en/Default_LiveBindings_Methods
BindSource に対して Locate を使う?
Locate(KeyField, KeyValue)
この時 LiveBindings の設定は
ComboBoxのSynch <-> BindSourceの *
ComboBoxのItem.Text <- BindSourceの 表示フィールド
となっていなければならない
Delphi XE5
Locate(KeyField, KeyValue)
この時 LiveBindings の設定は
ComboBoxのSynch <-> BindSourceの *
ComboBoxのItem.Text <- BindSourceの 表示フィールド
となっていなければならない
Delphi XE5