複数のClientDataSetを使用して
マスター/ディテイルになっているようなデータの
更新処理を行うときの方法がよくわかりません。
CDS1がマスター CDS2がディテイルだとして
下記のようなプログラムを実行します。
try
if CDS1.ChangeCount <> 0 then
if CDS1.ApplyUpdate(0) <> 0 then
Abort;
if CDS2.ChangeCount <> 0 then
if CDS2.ApplyUpdate(0) <> 0 then
Abort;
Session.COMMIT;
Except
Session.Rollback;
end;
このような場合、CDS2でエラーが発生した場合に
Rollbackをするのですが、
画面上で、CDS2の内容を修正し再度更新をかけるときには
CDS1は、ChangeCountがリセットされているために
(実際には変更ログがクリアされている)
ApplyUpdateが実行されません。
実際には、RollBackを行ったときにChangeCountを元に戻すか
または、Commitを行ったときにChangeCountをリセットするかを行いたいのですが
何か方法がありますでしょうか?
よろしくお願いします。
メーリングリストの確認をちゃんとやってなかったみたいで申し訳ありません。
dangan109さんの質問で中村さんがお答えになってましたね。
中村さんのレスで確認したところ。一応、対処できました。
どうもありがとうございます。
これからもよろしくお願いします。
作成中のお絵かきソフトで、クリップボードのやり取りをしているのですが、
32bit画面で[PrintScreen]で撮るスクリーンショットをクリップボードからCF_DIBで取得すると
4bit目が 0 と 255 の所があり、 一部が透明になってしまいます。(ほとんど0なのでほぼ透明)
そこでお絵かきソフトから CF_DIB だけコピーして CF_BITMAP を優先にて読み込ませれば
(ペイントでは CF_DIBを優先で読み込ませているみたいです)
スクリーンショットの時は CF_BITMAP を読み込み、お絵かきソフトからコピーの時は
CF_DIB を
コピー出来るかなと思いきや CF_DIB だけをコピーすると CF_DIB をコピーする前にクリップボード
にある CF_BITMAP が残ってしまっています。
クリップボードをクリアーしてから CF_DIB をコピーすると CF_BITMAP が自動的に作成されてしまっています
(この自動に作成された CF_BITMPを取得すると画像が少しずれていますが)
そこで
① クリップボードに入っている画像が [PrintScreen]で撮るスクリーンショットかどうか判別する方法 (無理でしょう)
判断できればスクリーンショットの時だけ 4bit 目を強制 255 にできるのですが・・・
② CF_DIB だけコピーする (これも無理?)
出来たとしても他のアプリで CF_BITMAP しか読み込まない場合には画像をコピーできなくなりますが)
の方法がわかれば回避できそうなのですが、わかる方はいらっしゃいますか?
メニューで分けるしかなさそうですが・・・・・
------------------------------
http://khe00221.image.coocan.jp/
------------------------------
[PrintScreen]で取った DIB の形式はどうなっていますでしょうか?
おそらく V3 形式になっていると思います。これはアルファチャネルを
サポートしていません。
お絵かきソフト側でアルファチャネルをサポートする V4/V5 形式の
DIB を使用していれば、区別が付くと思います。
#ヘッダサイズが違います。
Quoting khe00221 <khe0...@vesta.dti.ne.jp>:
----------
(株)ブレーン 中村拓男
> #ヘッダサイズが違います。
[PrintScreen] でとった場合もソフト側でクリップボードにコピーした場合も
40byte
になっていますので判別する事は出来ません。
http://en.wikipedia.org/wiki/Windows_and_OS/2_bitmap を見ると40バイトは
V3 のようです。
ソフト側でクリップボードへのコピーを変えるべきなのでしょうか・・・
借りに変えたとして、他のアプリケーションで対応しているのかどうかが気になるところです。
クリップボードへのコピーは [43015] Re: SetDIBits の
procedure BitmapToDIB(Bitmap: TBitmap; var DIBHandle: THandle);
を使用して
OpenClipBoard (Self.Handle);
try
if BitmapToDIB(SaveBitmap,MemHandle) = True then
begin
SetClipBoardData(CF_DIB,MemHandle);
end;
finally
CloseClipBoard;
end;
のようにコピーしているだけです。
----- Original Message -----
From: <tknak...@brain-tokyo.jp>
To: <Del...@ml.users.gr.jp>
Sent: Wednesday, November 07, 2007 9:47 PM
Subject: [Delphi:90042] Re: スクリーンショットの4ビット目
> 中村@ブレーンです。
>
> [PrintScreen]で取った DIB の形式はどうなっていますでしょうか?
>
> おそらく V3 形式になっていると思います。これはアルファチャネルを
> サポートしていません。
>
> お絵かきソフト側でアルファチャネルをサポートする V4/V5 形式の
> DIB を使用していれば、区別が付くと思います。
>
ちょこっと自己レスです
> 借りに変えたとして、他のアプリケーションで対応しているのかどうかが気になるところです。
ですが
PaintShopPro7 Photoshop Elements 4.0 共にソフト内でのコピー&ペーストにはAlphaBlendを含めてコピーできますが、
交互にコピー&ペーストを行なうとAlphaBlendを含まないでコピーされてしまうみたいです。
とういことはクリップボードにコピーする際には
CF_DIB(AlphaBlendを含まない)と独自フォーマット(AlphaBlendを含む)をにコピーして、
クリップボードから読み込む場合には
独自フォーマットがある場合には32bitコピー、無い場合には24bitコピーしてたりするのでしょうか?
他のアプリケーションへの対応は考えなくてよさそうです
----- Original Message -----
From: "khe00221" <khe0...@vesta.dti.ne.jp>
To: <Del...@ml.users.gr.jp>
Quoting khe00221 <khe0...@vesta.dti.ne.jp>:
> とういことはクリップボードにコピーする際には
> CF_DIB(AlphaBlendを含まない)と独自フォーマット(AlphaBlendを含む)をにコピーし
て、
>
> クリップボードから読み込む場合には
> 独自フォーマットがある場合には32bitコピー、無い場合には24bitコピーしてたりす
るのでしょうか?
>
32 か 24 かは関係ないと思いますよ。V3 の 32Bit BI_RGB 形式では上位一バイト
は unsused なので何が入っているか不明ですから無視しないとまずいはずです。
何が入っていても文句は言えません。これを独自にアルファチャネルに流用した
としても、あくまで独自なので、アプリケーション間の互換性はありません。
----------
(株)ブレーン 中村拓男
クリップボードにコピーする際に
//他のアプリケーション向け AlphaBlend はコピーされない
ClipBoard := TClipBoard.Create;
ClipBoard.Open;
ClipBoard.Assign(SaveBitmap);
ClipBoard.Close;
ClipBoard.Free;
//自分向け AlphaBlend はコピーされる
OpenClipBoard (Self.Handle);
try
if BitmapToDIB(SaveBitmap,MemHandle) = True then
begin
SetClipBoardData(CF_DIB32,MemHandle);
end;
finally
CloseClipBoard;
end;
のようにコピーをして、
クリップボードからコピーする際には
if IsClipboardFormatAvailable(CF_DIB32) = True then
begin
//自分でコピーしたクリップボードの場合 CF_DIB32 が存在するので優先(AlphaBlendを含めコピーされる)
end
else
if IsClipboardFormatAvailable(CF_BITMAP) = True then
begin
//CF_DIB32 が無ければスクリーンショットや他のアプリでのスクリーンショットなのでこちらで処理
Bitmap := TBitmap.Create;
ClipBoard := TClipBoard.Create;
try
ClipBoard.Open;
try
Bitmap.Assign(ClipBoard);
finally
ClipBoard.Close;
end;
finally
ClipBoard.Free;
Bitmap.Free;
end;
end;
とすることにより区別する事にしました。
意図的にやっているのかも知れませんが、以下の様に
やったほうが楽だと思います。
■2個のデータをクリップボードに一括登録
Clipboard.Open;
try
ClipBoard.Assign(SaveBitmap);
ClipBoard.SetAsHandle(CF_DIB32, MemHandle)
finally
Clipboard.Close;
end;
■データの有無
if ClipBoard.HasFormat(CF_BITMAP) then
begin
:
:
if ClipBoard.HasFormat(CF_DIB32) then
begin
:
:
■メモリハンドルの入手
ClipBoard.GetAsHandle(CF_DIB32)
補足:
・TClipBoard のインスタンスは ClipBoard 関数で
シングルトンとして入手できます。オーナも設定済みです。
・Open から Close までの間に複数のデータを登録できます。
・Open後、Assign や SetAsHandle 等でデータを最初に
登録する際、クリップボード上のデータは TClipBoard が
自動的にクリアします。
後、大きなお世話だと思いますが、32ビット=Alphaチャネルの
サポートではないので、名前の付け方がちょっと...(^^;
Quoting khe00221 <khe0...@vesta.dti.ne.jp>:
----------
(株)ブレーン 中村拓男
今手元に Delphi for .NET がないのですが、
BDS2006 での記憶では
1) ツールパレットを右クリック
「インストール済み .NET コンポーネント」を選ぶ
2) しばらくするとダイアログが開くので、
GAC に登録されているコンポーネントを選んでチェックを付ける。
でうまく行ったような気がします。
Quoting 井上 茂 <inou...@hitachi-mc.co.jp>:
----------
(株)ブレーン 中村拓男
----- Original Message -----
From: <tknak...@brain-tokyo.jp>
To: <Del...@ml.users.gr.jp>
Sent: Monday, November 12, 2007 1:23 PM
Subject: [Delphi:90059] Re: ODP.NETのツールパレットへの登録方法
> 中村@ブレーンです。
>
> 今手元に Delphi for .NET がないのですが、
> BDS2006 での記憶では
>
> 1) ツールパレットを右クリック
> 「インストール済み .NET コンポーネント」を選ぶ
> 2) しばらくするとダイアログが開くので、
> GAC に登録されているコンポーネントを選んでチェックを付ける。
>
> でうまく行ったような気がします。
教えて頂いた方法を参考に、以下のことを行いましたが登録できない(エラーも出ない)ようです。
1) ツールパレットを右クリック
「インストール済み .NET コンポーネント」を選ぶ
2) しばらくするとダイアログが開くので、
GAC に登録されているコンポーネントを選んでチェックを付ける。
・「.NETコンポーネント」タブより、下記のコンポーネントを追加
名前 名前空間
OracleCommand Oracle.DataAccess.Client
OracleCommandBuilder Oracle.DataAccess.Client
OracleConnection Oracle.DataAccess.Client
OracleDataAdapter Oracle.DataAccess.Client
上記DLLは、C:\Oracle\
<<補足>>
・.NETのコンポーネント(System.Data.OracleClient等)を選択しても登録されません。
・「.NETコンポーネント」タブではなく、「.NET VCLコンポーネント」タブに追加できるも
のしか、
パレットに登録できないのでしょうか。
・OSは、Vistaを使用しています。
・Delphi2007より、Delphi for .net Winformをサポートしなくなった影響でしょうか。
以上、よろしくお願い致します。
そういえば、Rad Stdio では WinForm はサポートされないんですよね。
すっかり忘れていました。
#まだ買ってないし...
とすると、BDS2006から類推して
「WinForm コントロールインポートウィザード」
を使うことになると思います。
「WinForm コントロールパッケージ」を新規作成して、取込む
.NET アセンブリを指定してパッケージを作成、
これを「.NET VCLコンポーネント」に登録する
手順になると思います。
ほとんど使ったことはないのですが、BDS2006 では全ての
インポートされたコンポーネントは同じプロパティ、同じイベントを
持っていて、固有のものを使うにはプロパティ経由で内部に鎮座している
本物にアクセスするという非常に使いにくいものだったと記憶してます。
ODP.NET だったら、コードから生成したほうが楽かも。
BDS では WinForm がサポートされていたので、あくまでちょっと触った
くらいです。Rad Studio でウィザードの生成結果がどんな具合か
レポートして下さるとありがたいです。
#リフレクションして published なプロパティを半自動生成とかなら
#実用性があると思うのですが...
Quoting 井上 茂 <inou...@hitachi-mc.co.jp>:
----------
(株)ブレーン 中村拓男
VB.NETのクラスライブラリ(サードパーティ製を含む)をDelphi.NETで、自由に使用できないなら
ば、
Delphi.NETを使用するメリットが、ほとんど無いような気がしてきました。
exeサイズは小さくなりますが・・・。
元々、VISTAでBDEが使用できないことから、ODP.NETの使用 >Delphi.NETでの使用という
経緯となったので、Delphi.Win32+別のDBアクセスの方向も含めて再検討してみます。
ご協力ありがとうございます。
Delphi 2007 のマニュアルには載っているみたいですが
ありませんでしょうか?
ファイル⇒新規作成⇒その他⇒WinForm コントロールパッケージ
でウィザードが立ち上がる気がします。
Quoting 井上 茂 <inou...@hitachi-mc.co.jp>:
----------
(株)ブレーン 中村拓男
中村様ご指摘のようにマニュアルには、載っているようですが、
「WinForm コントロールパッケージ」が存在しません。
この件についてCodeGearに問い合わせを考えています。
回答をもらえたら報告します。
ただし・・・、ActiveXラッパーでラップすると使用できますと言う説明が気になりますが。
BDS2006 で ODP.NET をツールパレットにインストールする
実験をしてみました。 が・・・ 出来ないですね。
ウィザードがコントロールにしか対応してないみたいです。
#R9 も R10 も駄目でした。
RAD Sudio でも駄目なのかなー
Quoting tknak...@brain-tokyo.jp:
----------
(株)ブレーン 中村拓男
ODP.NETのツールパレットへの登録方法をCodeGearに問い合わせを行ったところ
以下の回答がきました。
1.Delphi.netにおいて、ODP.NET(オラクル)の使用はサポートされているのでしょうか?
: 申し訳ございませんが、弊社での動作確認は特に行われておりません。
: .NETライブラリとして利用可能と考えられます。
2.ツールパレットにODP.NETを登録したいのですが、実現可能でしょうか?
: 残念ながらツールパレットへの登録はできません。
3.VisualStadioで作成された(3rdパーティー製含む).NETコントロール及びクラスライブラリは、
Delphi.netで使用可能でしょうか?
: ODP.NET と同様に使用可能です。ただ、弊社で個々のライブラリについて
: 動作確認を行っているということではございませんので、予めご了承くだ
: さい。なお、.NETコントロールをツールパレットに登録することはできません。
過去のdelphiの資産を生かしつつ、.NETの恩恵を受けるのは、難しそうな状況ですね・・・。
----- Original Message -----
From: "井上 茂" <inou...@hitachi-mc.co.jp>
To: <Del...@ml.users.gr.jp>