開発ブログ - Delphiカテゴリのエントリ
列挙型のプロパティのあるクラスを 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 が機能しないのは事実なので、これを使ってみました。
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
クラスからバインドして表示する
TAdapterBindSource と TDataGeneratorAdapter
(1) まずは二つを配置
(2) AdapterBindSource の Adapter プロパティに DataGeneratorAdapter をセット
(3) AdapterBindSource の OnCreateAdapter イベントで
TObjectBindSourceAdapter
または
TListBindSourceAdapter
を生成する
または
クラスにバインドできるってうれしい
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%9ATAdapterBindSource_%E3%81%A8%EF%BC%BBLiveBinding_%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%EF%BC%BD%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B
TAdapterBindSource と TDataGeneratorAdapter
(1) まずは二つを配置
(2) AdapterBindSource の Adapter プロパティに DataGeneratorAdapter をセット
(3) AdapterBindSource の OnCreateAdapter イベントで
TObjectBindSourceAdapter
または
TListBindSourceAdapter
を生成する
procedure TMain.AdapterBindSource1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
var
LEmployee: TEmployee;
begin
LEmployee := TEmployee.Create('John', 'Anders', 26, StrToDate('10/10/2011'), 'Developer', 'Adrian Hermann');
ABindSourceAdapter := TObjectBindSourceAdapter<TEmployee>.Create(Self, LEmployee);
end;
または
procedure TMain.AdapterBindSource1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter);
var
LList: TObjectList<TEmployee>;
begin
LList := TObjectList<TEmployee>.Create;
LList.Add(TEmployee.Create('John', 'Anders', 26, StrToDate('10/10/2011'), 'Developer', 'Adrian Hermann'));
ABindSourceAdapter := TListBindSourceAdapter<TEmployee>.Create(Self, LList, True);
end;
クラスにバインドできるってうれしい
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%9ATAdapterBindSource_%E3%81%A8%EF%BC%BBLiveBinding_%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%EF%BC%BD%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B
Delphi XE5 で OS X の接続プロファイルを作成しようとして、接続テストをしたところ
と表示されてしまいました。
何が起こっているのかよく分からずいろいろと調べてみました。
ホスト名などが正しくないときには正常に通常のエラーが表示されるので、どうも接続が成功した後にこれが表示されているようです。
と、ここで気が付きました。
Mac 側で起動していた PAServer が XE6 のものだったのです!
XE5 の PAServer を起動して接続プロファイルを作成し直したところ、正常に接続することができました。
気を付けなければ...
TDBXTypes.INT32 値型は TDBXTypes.WideString値型としてアクセスできません
と表示されてしまいました。
何が起こっているのかよく分からずいろいろと調べてみました。
ホスト名などが正しくないときには正常に通常のエラーが表示されるので、どうも接続が成功した後にこれが表示されているようです。
と、ここで気が付きました。
Mac 側で起動していた PAServer が XE6 のものだったのです!
XE5 の PAServer を起動して接続プロファイルを作成し直したところ、正常に接続することができました。
気を付けなければ...
XE5 で作った FireDAC を使ったプロジェクトを XE6 でコンパイルしようとしたところ、いくつかエラーになってしまったので、メモ
■TFDWideMemoField
FireDac を使ったデータモジュールで、TFDWideMemoField がないと言われてしまいました。
http://www.da-soft.com/anydac/embarcadero-firedac-xe6-released.html
どうやら TFDWideMemoField は TWideMemoField に変わったようです。
置き換えたいが、データモジュールを読み込むとエラーになって、対象の部分が消されてしまうのです。
仕方がないので、テキストエディタで DataModule の .dfm を直接開き、TFDWideMemoField をすべて TWideMemoField に置換しました。
同様に .pas も
これで一応OK
■TPolygon
TPolygon もない!
uses に System.Math.Vectors を追加したらOK
■TFDWideMemoField
FireDac を使ったデータモジュールで、TFDWideMemoField がないと言われてしまいました。
http://www.da-soft.com/anydac/embarcadero-firedac-xe6-released.html
どうやら TFDWideMemoField は TWideMemoField に変わったようです。
置き換えたいが、データモジュールを読み込むとエラーになって、対象の部分が消されてしまうのです。
仕方がないので、テキストエディタで DataModule の .dfm を直接開き、TFDWideMemoField をすべて TWideMemoField に置換しました。
同様に .pas も
これで一応OK
■TPolygon
TPolygon もない!
uses に System.Math.Vectors を追加したらOK
XE6 のバージョン番号は 13 ではなく 14 なんですね...
という状態からインストールを開始したのですが
「ディスクの空き領域が不足しています」
35,675MB用意しろと...
相変わらず謎なインストーラーです
結局
「ディスク領域が足りません」
必要な領域 16MB
利用可能な領域 10MB
と言われ...
どうすればいいんだ?!
仕方がないので一時ファイルの展開をするドライブを追加して、環境変数TEMP,TMPにそのドライブを指定してみましたが、やはり領域は足りない...orz
セットアップに使用する言語でjapaneseを選んでいるのに French と German の zip も展開されているのね...
これらは必要ないかと思って消してみたら、インストール時にエラーになってしまった(涙)やり直し...
結局システムドライブの領域を空けられなかったので、圧縮して対応。(あーあ)
再インストールして完了しました。
毎度インストールでは苦労します。
[関連記事]
Delphi XE5 update2 のインストールについて
必要な領域 18,282MB
使用可能なディスク領域 28,556MB
残りのディスク領域 10,273MB
という状態からインストールを開始したのですが
「ディスクの空き領域が不足しています」
35,675MB用意しろと...
相変わらず謎なインストーラーです
結局
「ディスク領域が足りません」
必要な領域 16MB
利用可能な領域 10MB
と言われ...
どうすればいいんだ?!
仕方がないので一時ファイルの展開をするドライブを追加して、環境変数TEMP,TMPにそのドライブを指定してみましたが、やはり領域は足りない...orz
セットアップに使用する言語でjapaneseを選んでいるのに French と German の zip も展開されているのね...
これらは必要ないかと思って消してみたら、インストール時にエラーになってしまった(涙)やり直し...
結局システムドライブの領域を空けられなかったので、圧縮して対応。(あーあ)
再インストールして完了しました。
毎度インストールでは苦労します。
[関連記事]
Delphi XE5 update2 のインストールについて
VCL ではアプリケーションのパスは Application.ExeName で取得していました。
FM では代わりに ParamStr(0) を使っていたのですが…