4D-jp 4D Japan Technical Support Team

自動と黒は違う

2025-04-30

例題

Macでシステムオブジェクトに「自動」の色を割り当てると,その塗りつぶしや線の色はいわゆる「まっ黒」つまり#000000ではありません。

ライトモードの場合,OBJECT GET RGB COLORSは「自動」に対して#000000を返しますが,印刷やPDFで確認すると,実際には「まっ黒」ではないことに気づきます。

var $fg; $bg; $ag : Text
OBJECT GET RGB COLORS(*; $object; $fg; $bg; $ag)

以下の例では,上のページのオブジェクトは線の色が「自動」に設定されているため,若干,薄い黒が出力されています。

対照的に,下のページのオブジェクトは線の色が「black」に設定されているため,完全な黒が出力されています。

プレビューのカラーピッカーでPDFの色を確認すると,黒に見える色は#272727,つまり「とても暗いグレー」です。

自動の代わりに黒を使用する方法

HTMLでは,メディアクエリを使用して,デバイスのメディアタイプに応じて異なるスタイルを適用するのが一般的です。

4DにもCSSメディアクエリが用意されていますが,唯一サポートされているメディアフィーチャーはprefers-color-schemeだけです。

以下のCSSはエラーになるわけではありませんが,4Dでは効果がなく,画面と印刷でスタイルが切り替わることはありません。

@media print {
	text.normal  {
		stroke: red;		
	}
	input.normal {
		stroke: red;
	}	
	line.normal  {
		stroke: red;
	}
}

代替策として,フォームをオブジェクトに読み込み,使用する直前にcssプロパティを変更することで,スタイルシートを切り替えることができます。

/SOURCES/フォルダーに以下のファイルが存在する場合:

  • screen.css
@media (prefers-color-scheme: light){
	text.normal  {
		stroke: automatic;		
	}
	input.normal {
		stroke: automatic;
	}	
	line.normal  {
		stroke: automatic;	
	}
}

@media (prefers-color-scheme: dark){
	text.normal  {
		stroke: automatic;		
	}
	input.normal {
		stroke: automatic;
	}	
	line.normal  {
		stroke: automatic;	
	}
}
  • print.css
text.normal  {
	stroke: black;		
}
input.normal {
	stroke: black;
}	
line.normal  {
	stroke: black;
}
  • form.4DForm(抜粋)
{
	"$4d": {
		"version": "1",
		"kind": "form"
	},
	"css": [
		"/SOURCES/screen.css"
	]
}
FORM LOAD("black")

とすれば,画面用のCSSが使用されます。一方,

$form:=JSON Parse(File("/SOURCES/Forms/black/form.4DForm").getText(); Is object)
$form.css:=["/SOURCES/print.css"] 
FORM LOAD($form)

とすれば,印刷用のCSSが使用されます。

もちろん,印刷専用のフォームであれば,CSSを切り替えたりせず,はじめから自動の代わりに黒を全面的に使用したほうが合理的でしょう。


関連記事

リンク