indy IdTCP使用上の注意 Connected関数は例外を生成する。 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 の影響
注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が便利。 Delphi 11.3 備忘録 |