フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2 3 4 5
トピック: SynTaskDialog 改
DEKO
管理者
投稿数: 2690
SynTaskDialog 改
on: 2013/10/11 00:30 Fri

雑談で書いていた SynTaskDialog のさらなる改良版です。

ちょこちょこ問題があるので、ここで改良します。
何かお気付きの点がありましたらお知らせください (コード修正例歓迎)。

方針としては、
1.代替ダイアログとネイティブ TaskDialog の表示の差異を最小にする。
2.代替ダイアログに展開テキストを実装する。
3.代替ダイアログ (クラシック表示) とネイティブ TaskDialog (クラシック表示) の表示の差異を最小にする。
この順序で進めて行きたいと思っています。現在行っている作業は 1. です。

そういえば、雑談の方では "キャプション" とか書いてありますが、

キャプションバーにある文字列: タイトル
青文字: インストラクション
黒文字: コンテンツ

が正しいようですね。紛らわしい書き方をしちゃいましたが、スクリーンショットを取った後なので後の祭りです。

DEKO
管理者
投稿数: 2690
Mod1 の改良点
on: 2013/10/11 00:40 Fri

[Mod 0 (雑談版) での修正点]

  • フラグ tdfUseHIconMain 及び tdfUseHIconFooter が効かないのを修正。(アイコンは Application.Icon 固定)
  • tdfUseCommandLinksNoIcon を指定するとグチャるのを修正 (代替ダイアログの場合)

[Mod 1 での修正点]

  • フラグに tdfUseHIconMain が含まれる時、アイコンを MainIconHandle フィールドで指定できるようにした
  • フラグに tdfUseHIconFooter が含まれる時、アイコンを FooterIconHandle フィールドで指定できるようにした
  • tdfAllowDialogCancellation を指定しても [×] ボタンが表示されないのを修正 (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 2 の改良点
on: 2013/10/11 01:53 Fri

[修正点]

  • FooterIconHandle で指定したフッターアイコンが正常に表示されるようにした (代替ダイアログの場合)
  • アイコンが使われない時 (tiNotUsed) のテキストの位置を修正した (代替ダイアログの場合)
  • ダイアログで使われるフォントの指定方法を変更した (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 3 の改良点
on: 2013/10/11 03:17 Fri

[修正点]

  • TTaskDialogEx に Init メソッドを追加

説明:
SynTaskDialog には、TTaskDialogEx という TTaskDialog のラッパーがあります。TTaskDialogEx はExecute() の引数が少ないので使いやすいです。SynTaskDialog.pas には uses するだけで使える DefaultTaskDialog という TTaskDialogEx 型のグローバル変数があります。

しかし DefaultTaskDialog はグローバル変数であるため、使いまわすとグチャります。例えば、

  // カスタムボタンのタスクダイアログ 
with DefaultTaskDialog do
begin
Base.Title := 'タイトル';
Base.Inst := 'キャプション';
Base.Content := 'テキスト';
with TStringList.Create do
try
Add('イェース!'); // カスタムボタンを追加 (ID=100)
Add('ノォォォ!'); // カスタムボタンを追加 (ID=101)
Base.Buttons := Text;
finally
Free;
end;
ButtonDef := 101; // ID=101 (2番目のボタン) がデフォルト
DialogIcon := tiInformation; // 感嘆符アイコン
Flags := [tdfAllowDialogCancellation]; // [×] によるキャンセルを有効にする
case Execute of
100:
ShowMessage('Yes');
101:
ShowMessage('No');
mrCancel:
ShowMessage('Cancel (System)');
end;
end;

// ShowMessage() っぽいタスクダイアログ
with DefaultTaskDialog do
begin
Base.Title := 'タイトル';
Base.Inst := 'キャプション';
Base.Content := 'テキスト';
DialogIcon := tiNotUsed;
Execute;
end;

 
一見正しそうなこのコードは正しく動作しません…何故ならば、DefaultTaskDialog がグローバル変数であるため、最初の実行時に設定されたカスタムボタンが初期化されないからです。

では、TTaskDialogEx をローカル変数で定義して使えばいいかと言えばそうではありません。今度はローカル変数であるためにフィールドが初期化されないからです。例えば、以下のコードは正しく動作しません。

var
Task: SynTaskDialog.TTaskDialogEx;
begin
with Task do
begin
Base.Title := 'タイトル';
Base.Inst := 'キャプション';
Base.Content := 'テキスト';
DialogIcon := tiNotUsed;
Execute;
end;
end;

 
レコードのローカル変数は初期化できませんから、自前ですべてのフィールドを初期化しなくてはなりません…とても面倒ですね。そういう事で、レコードを適切に初期化するメソッド Init() を追加しました。

var
Task: SynTaskDialog.TTaskDialogEx;
begin
with Task do
begin
Init; // これを追加
Base.Title := 'タイトル';
Base.Inst := 'キャプション';
Base.Content := 'テキスト';
DialogIcon := tiNotUsed;
Execute;
end;
end;

 
これで、初期化が楽にできるようになりました (なんとなくですが record のコンストラクタは好きではないのです)。今度は Init() メソッドがあるので DefaultTaskDialog を使いまわしても大丈夫です。

DefaultTaskDialog を直接実行しない (Execute を呼び出さない) のであれば、

var
Task: SynTaskDialog.TTaskDialogEx;
begin
Task := DefaultTaskDialog;
with Task do
begin
Base.Title := 'タイトル';
Base.Inst := 'キャプション';
Base.Content := 'テキスト';
DialogIcon := tiNotUsed;
Execute;
end;
end;

 
このように初期化元として使う事ができます。DefaultTaskDialog は 名前からして初期化用途なのかもしれませんね。

なお、TTaskDialog の方を使えば (まず) 初期化処理は不要です。何故ならば Execute() メソッドの引数に初期値が設定してあるからです。しかしながら、個人的には引数が 10 個もあるメソッドは使いたくないですね。

DEKO
管理者
投稿数: 2690
Mod 4 の改良点
on: 2013/10/11 05:05 Fri

[修正点]

  • ボタン幅の計算方法を変更 (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 5 の改良点
on: 2013/10/11 06:52 Fri

[修正点]

  • フッターテキスト表示時のベベル表示位置を変更 (代替ダイアログの場合)
  • フッターアイコンの種類に "tfiNotUsed" を追加 (代替ダイアログの場合)
  • 位置調整の関連修正多数 (代替ダイアログの場合)

説明:
tfiNotUsed がないとフッターアイコンを消せない。消せたとしてもフッターテキストの位置がおかしくなってしまう。

DEKO
管理者
投稿数: 2690
Mod 6 の改良点
on: 2013/10/11 18:20 Fri

[修正点]

  • ボタン幅の計算方法を変更 (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 7 の改良点
on: 2013/10/12 01:54 Sat

[修正点]

  • インストラクション / コンテンツの表示位置を調整 (代替ダイアログの場合)
  • ボタン位置の計算方法を変更 (代替ダイアログの場合)
  • ボタン幅の計算方法を変更 (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 8 の改良点
on: 2013/10/12 02:18 Sat

[修正点]

  • ラジオボタンの表示位置を調整 (代替ダイアログの場合)
DEKO
管理者
投稿数: 2690
Mod 9 の改良点
on: 2013/10/12 04:50 Sat

[修正点]

  • ダイアログ幅の計算ロジックを変更 (代替ダイアログの場合)
  • [キャンセル] ボタンと [再試行] ボタンを同時に表示させた時の表示位置が逆になってしまう問題を修正 (代替ダイアログの場合)
  • インストラクション / コンテンツにトリミング処理を行うようにした (代替ダイアログの場合)
  • インストラクション / コンテンツに & を指定しても一方通行アクセラレータ文字として認識させないようにした (代替ダイアログの場合)

※ 続きは ↓ の Page [2] をクリック。

ページ: [1] 2 3 4 5
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.05 sec.