Delphi 10 備忘録

OpenDialog, SaveDialogをメインフォームの中央に表示する

   Delphi User's Forumページを参照したメインフォームの中央にダイアログを表示するサンプルソースです。


Delphi 10.3 Community Editionへの移行

1. 追加したパッケージを使用する場合
   パッケージをインストール後
   「ツール」→「オプション」→「言語」→「Delphiオプション」→「ライブラリ」をクリックして
   「ライブラリパス(B)」に各ライブラリーのソースパスを登録する。
   「選択したプラットフォーム」で「Windows 32ビット」と「Windows 64ビット」の両方に設定すること。

2. 出力フォルダの設定(アプリケーション毎)
   「プロジェクト」→「オプション」→「ビルド」→「Delphiコンパイラ」をクリックする。
   「ターゲット(T)」で「すべての構成 - すべてのプラットフォーム」を選択し
   「ユニットの出力ディレクトリ」と「出力ディレクトリ」を .\$(Platform)\$(Config) に設定する。

3. フォーム表示サイズの固定
   高DPIのディスプレイで縮小表示したくない場合は「プロジェクト」→「オプション」→「アプリケーション」の
   「マニフェスト」で「DPIの認識」を「対応せず」に設定する。
     注)「DPIの認識」が「なし」だと「システムDPIに対応」に自動変更される場合がある。

4. 高DPIで縮小表示する場合
   各フォームの Scaled と ParentFont プロパティをFalseに設定し、「アプリケーション」の「マニフェスト」で
   「DPIの認識」を「ディスプレイごとのDPIに対応 V2」などに設定する。
   フォントサイズを.iniファイルなどで指定する場合はターゲットのDPIに応じてサイズを調整する必要がある。
   例)Form1の標準(96DPI)でのフォントサイズが OrgSize の場合
       Form1.Font.Size := MulDiv(OrgSize, 96, GetDeviceCaps(Form1.Canvas.Handle, LOGPIXELSX));

フォームの表示位置について(Positionプロパティ)
   メインフォーム
      poScreenCenter: カレントスクリーンの中央に表示する。
   サブフォーム
      poMainFormCenter: メインフォームの中央に表示する(表示前の位置変更は不可、サイズ変更は可)。
      poDefaultPosOnly: 表示前に位置やサイズを指定する場合。


Delphi 10.2 Community Editionへの移行

1. 64bitプラットフォームが追加できない場合の対策
   .dprojファイルを削除してから .dprをダブルクリックしてDelphiを起動する。
   「プロジェクト」→「オプション」で「ユニットの出力ディレクトリ」と「出力ディレクトリ」を
   .\$(Platform)\$(Config) に設定する(各アプリケーション毎に設定が必要)。

2. 追加したパッケージを使用する場合
   アプリケーション毎に「プロジェクト」→「オプション」の「検索パス」に .dcu のパスを設定する。
   ターゲット構成(32/64ビットWindowsなど)と ビルド構成(Release/Debug)の組み合わせに対し
   それぞれのパス設定すること。

3. フォーム表示サイズの固定
   高DPIのディスプレイで縮小表示したくない場合は「プロジェクト」→「オプション」の「アプリケーション」で
   「マニフェストファイル」欄の「高DPIの有効化」のチェックを外す。


Delphi 10.1 Berlin Starter Update 2 と Delphi 10.2 Starter

1. StrToDateTime関数
   秒未満は小数ではなくmS単位の整数として処理される。
   このため秒未満を用いる場合は秒未満を常に3桁にする必要がある。
   '2016/01/23 12:34:56.567' → 2016/01/23 12:34:56.567
   '2016/01/23 12:34:56.56'  → 2016/01/23 12:34:56.056
   '2016/01/23 12:34:56.5'   → 2016/01/23 12:34:56.005
   '2016/01/23 12:34:56.006' → 2016/01/23 12:34:56.006
   '2016/01/23 12:34:56.06'  → 2016/01/23 12:34:56.006
   '2016/01/23 12:34:56.6'   → 2016/01/23 12:34:56.006
    対策:時刻文字列に少数点が含まれる場合は小数点以下が3桁になるように末尾にゼロを追加してから変換する。

2. FormatDateTime関数
   秒未満は小数ではなくmS単位の整数として処理され、上位ゼロサプレスで出力される。
   このため秒未満を出力する場合は常に3桁分の'.zzz'にする必要がある。
   値が 2016/01/23 12:34:56.005 の場合
   'yyyy/mm/dd hh:mm:ss.zzz' → '2016/01/23 12:34:56.005'
   'yyyy/mm/dd hh:mm:ss.zz'  → '2016/01/23 12:34:56.05'
   'yyyy/mm/dd hh:mm:ss.z'   → '2016/01/23 12:34:56.5'
   値が 2016/01/23 12:34:56.567 の場合
   'yyyy/mm/dd hh:mm:ss.zzz' → '2016/01/23 12:34:56.567'
   'yyyy/mm/dd hh:mm:ss.zz'  → '2016/01/23 12:34:56.567'
   'yyyy/mm/dd hh:mm:ss.z'   → '2016/01/23 12:34:56.567'
    対策:秒未満を1~2桁で出力したい場合は、変換後の文字列から不要な末尾を削除する。

3. グローバル変数FormatSetting.EraInfo の EraStartとEraEndの値が全て0.0になっている
   EraName[0]=令和, EraOffset=2019, EraStart=1899/12/30 (0.0), EraEnd=1899/12/30 (0.0)
   EraName[1]=平成, EraOffset=1989, EraStart=1899/12/30 (0.0), EraEnd=1899/12/30 (0.0)
   EraName[2]=昭和, EraOffset=1926, EraStart=1899/12/30 (0.0), EraEnd=1899/12/30 (0.0)
   EraName[3]=大正, EraOffset=1912, EraStart=1899/12/30 (0.0), EraEnd=1899/12/30 (0.0)
   EraName[4]=明治, EraOffset=1868, EraStart=1899/12/30 (0.0), EraEnd=1899/12/30 (0.0)
    対策:レジストリ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras を参照する。

4. AnsiString文字列に#0が含まれる場合
   Pos関数
     AnsiStrings.AnsiPos関数は #0以降の文字の検出が出来ない。
     AnsiStrings.PosEx関数は #0を超えて文字の検出ができる。
   Replace関数
     #0 を超える部分のReplaceは出来ない。
   テキストの表示
     Stringに変換後も TMemo, TEdit, TLabel等で #0以降の文字は表示されない。

5. プログレスバーの応答が遅い
   増加方向のSmoothプロパティをFalseにしても無視される。
   減少方向のSmoothReverseプロパティは有効。

6. Application.MainFormOnTaskbar の影響
   True(デフォルト)の場合サブフォームが前面に表示されてメインフォームが下に隠れる。

7. UpDownコンポーネント
   OnChangingイベントはPosition値が更新される前に発生するので、通常はOnMouseUpイベントを使用すること。

8. メッセージダイアログ
   グローバル変数 UseLatestCommonDialogs の影響
関数/手続名 UseLatestCommonDialogs = True UseLatestCommonDialogs = False
Application.MessageBox 横幅可変で文字列を全て表示する(外枠最大478pixcel)
ASCII文字のみでも折り返して全て表示する
途中にスペース文字が有れば折り返して表示する
UseLatestCommonDialogs = True
と同様
Vcl.Dialogs.ShowMessage 横幅固定(外枠362Pixcel) 注1)
超過したASCII文字の末尾は省略される
途中にスペースまたは全角文字が有れば折り返して表示する
横幅可変
文字列を全て表示する

Vcl.Dialogs.MessageDlgPos 横幅固定(外枠362Pixcel) 注1)
超過したASCII文字の末尾は省略される
途中にスペースまたは全角文字が有れば折り返して表示する
通知音有り
横幅可変
文字列を全て表示する 注2)

通知音無し
   注1)表示行数が10行を超えると横幅が拡張される。
   注2)マルチディスプレイの場合に表示位置が不正になる。

9. コンポーネントのアイコンが表示されない場合
   パッケージの .dpk .res 以外のファイルを削除する。
     例) Package1.dcu Package1.dproj Package1.dsk Package1.~dsk Package1.identcache Package1.local Package1.otares Package1.stat
   パッケージ.dpk(例:Package1.dpk)の{$R *.res}行の直下にリソース(.dcr)を追加してからビルド&インストールする。
     例)
     {$R *.res}
     {$R 'MMtimer¥MMTimeru.dcr'}
     {$R 'QRCode18¥QRCode.dcr'}


Delphi 10.1 Stater の問題点(Delphi 10.2で解決済)

1. Application.MainFormOnTaskbar の影響
   Falseの場合はTTaskbarコンポーネントが機能しない。

2. TTaskbarコンポーネント
   管理者モードで起動した場合にTTaskbarコンポーネントのサムボタンが表示できない。

3. IDEのHelp機能
   F1で起動したHelpで「キーワード(N)」の検索テキスト欄に文字を入力すると異常終了する
   (「ヘルプ」→「Delphiヘルプ」で開いた場合は問題ない)。


アイコンが原因でウイルス誤検出

アイコンのバイトパターンが偶然ウイルスパターンに近似してウイルスの警告が出ることが有る。
アイコン削除で警告が出なくなる場合はアイコンが原因なので、アイコンのパターンや色調を部分修正して対策する。
確認には Virus Totalが便利。


Home