4D」カテゴリーアーカイブ

2つの画像を比較する

今回は画像サイズの話。フォームに表示した画像変数がコピペやドラッグ&ドロップで変更された場合をキャッチしようとしていました。
On Data Changeを使うと同じ画像をペーストされた場合を識別できません。
リファレンスにEqual picturesというコマンドがありました。これだと思って使ってみるとうまく動いてくれません。
単純化して調べてみると、同じ画像を代入した2つのピクチャー変数を比較するとFalseが返ってくるのです。同じ画像を代入したのに等しくないと。マニュアルが間違っていて戻り値が逆?、変数の領域が異なる?とか、いろいろ考えてはまりました。
どうやら画像が空の場合にFalseになるのだと気づきました。そこでサイズを調べてみたら、サイズがゼロの時にEqual picturesはいつもFalseを返す、のでした。

//関数名:BL03_PIC_load
//20150206 wat
//画像をロードしてフォームに表示、途中で変更されたかどうかを調べようと、
// 4D v13で実装されたEqual picturesを使ってみる。

C_LONGINT($1;$pic_id)
$pic_id:=$1

C_PICTURE($mask)
C_BOOLEAN($isEqual)
C_TEXT($m)

READ ONLY([PIC_SET])
QUERY([PIC_SET];[PIC_SET]PIC_ID=$pic_id)
$numOfRecs:=Records in selection([PIC_SET])
If ($numOfRecs=1)

//同じ画像フィールドから2つの変数にピクチャーをロード
vBL03_varPIC_LOGO:=[PIC_SET]PIC_LOGO
vBL03_varPIC_LOGO_onload:=[PIC_SET]PIC_LOGO

//画像を比較すると
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
ALERT($m)
// Falseが返ってくることがある????  そこでサイズを調べてみた

C_LONGINT($picSize;$picSize_onload)

$picSize:=Picture size(vBL03_varPIC_HEAD)
$picSize_onload:=Picture size(vBL03_varPIC_HEAD_onload)
$isEqual:=Equal pictures(vBL03_varPIC_HEAD;vBL03_varPIC_HEAD_onload;$mask)

$m:=”BL03_PIC_load: ”
$m:=$m+”PIC_HEAD $isEqual=”+String($isEqual)+”,”
$m:=$m+” $picSize=[“+String($picSize)+”]”
$m:=$m+” $picSize_onload=[“+String($picSize_onload)+”]”
ALERT($m)

End if

リファレンスをよく読んでみたら書いてありました。Equal picturesは空のピクチャを与えると正しく実行されなかったとしてシステム変数OKにゼロを返す、と。要はEqual picturesは正しく実行されたかどうかを判定してから比較結果を評価しなくてはならないのでした。
ここで2者択一問題が発生しました。

1)OK変数が1の時だけ比較値を評価する
2)画像サイズがゼロの時はそもそもEqual picturesを実行しない

さてどちらでしょうか。サイズがゼロ以外にOK変数がゼロになることがあるのでしょうか?

「サイズがゼロでもゼロ以外でもEqual picturesがエラーの場合、アプリは画像は変化しなかったと見なす」

として問題は無いように思えます。いやもとい、片方の画像サイズがゼロでもう片方がゼロじゃなかったらエラーになる、という意味でしょうから

今回は次のコードを正解としました。

//Jiro_pic_isEqual
//20150207 wat
//2つの画像を比較して同じかどうかを調べる

C_PICTURE($1;$pic1)
$pic1:=$1
C_PICTURE($2;$pic2)
$pic2:=$2

C_PICTURE($mask)
C_LONGINT($pic1Size;$pic2Size)
C_BOOLEAN($0;$isEqual)

$isEqual:=Equal pictures($pic1;$pic2;$mask)
If (OK=0)

// OK変数の値がゼロの場合はサイズがゼロの可能性がある
//どちらか一方だけがゼロの場合:OK変数がゼロ、比較結果はFalse
//または両方ゼロじゃない場合:OK変数が1、比較結果は画像が同じならTrue画像が違えばFalse

//失敗の場合、画像サイズが同じゼロならツゥルー
$pic1Size:=Picture size($pic1)
$pic2Size:=Picture size($pic2)
If (($pic1Size=0)&($pic2Size=0))

$isEqual:=True

Else

//現時点では失敗の場合フォルスが返されているが念のため
$isEqual:=False

End if

End if

$0:=$isEqual

Date 関数がv13.3からv13.4で変わった

いいのです。よくあることなのです。

マニュアルにも書いてありました。12月の次が1月であるという保証はない、と。

しかし動いていたんです。v13.3までは。

Date(‘2014/13/1″)

v13.3までは、このコードは2015年1月1日を返してくれていました。それがv13.4でDate関数が大幅に変更になりました。このとき動きがマニュアル通りになりました。13月という月は無いのだと。プログラマが制御せよと。

問題はその月の最後の日を返すところで起こりました。次の月の1日から1日引いて求めます。正解は次です。

C_LONGINT($1;$year)

$year:=$1

C_LONGINT($2;$month)

$month:=$2

C_DATE($0;$date)

$date:=Date(String($year)+”/”+String($month)+”/”+String(1)) //当月の1日

$date:=Add to date($date;0;1;0) //翌月の1日

$date:=Add to date($date;0;0;-1) //当月の末日

$0:=$date

4D v14と日本語入力

次のようなお知らせが来ました。覚えとこうと思いましたので、ポストしておきます。

v14製品ラインの最新アップデートをお知らせいたします。

 

11月18日に公開しましたv14.3をインストールされた方は、お手数ですが本日より公開されている新しいv14.3を再インストールしていただきますようお願い申し上げます。

「フォーム・エディターでフォームを修正した後、異なる言語のOSで使用」した場合のフォント名保存に関するエラーは修復されています。

http://www.4d.com/jp/blog/14-3-first-release.html

Yosemite側のCarbonフレームワークの問題で漢字変換が正しく表示されないケースは、OS側の修正までお待ちください。詳細は下記のブログをご参照ください。

http://www.4d.com/jp/blog/yosemite-and-japanese-input.html

バックアップ

4D データベースは稼働中にバックアップすることができます。バックアップスケジュールに「毎日」「朝の3時に」とか指定して、どこに保存するか、いくつ前までのバックアップを残すかを指定します。

バックアップファイル作成時刻から次のバックアップファイル作成時までの間にトラブルが起こった場合は、ログファイルを使って復元を試みることができます。ログファイルはどこに書き出すかを指定することができます。通常は内蔵ディスクを指定します。ストラクチャーファイルと同じディスクに保存する場合はパッケージの中に保存するのが一般的です。

出力されるファイル名には「.journal」が付いています。パッケージフォルダが大きくなって困るときはパッケージの隣に出力するように設定しておくと良いでしょう。