フォーラム


ゲスト  

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

ページ: 1 2 3 [4] 5
トピック: SynTaskDialog 改
DEKO
管理者
投稿数: 2691
Mod 29 の改良点
on: 2013/10/19 18:30 Sat

[修正点]

  • 展開ボタンの改行を有効にした
  • チェックボックスの改行を有効にした
  • チェックボックスを TExpandButton で作り直した
  • ダイアログ幅の計算方法を変更した (代替ダイアログ)

説明:
TaskDialog でのチェックボックスはチェックボックスではないので、TExpandButton を流用してチェックボックスを作りました。TaskDialog のチェックボックスの表示に限りなく近いハズです。これをやらないとチェックボックスの改行も不可能 (描画内容が異なる) だったので仕方なく作りました。

"いつもの残念な方" が何か言っていましたが…
https://twitter.com/delfusa/status/391470464603680768
気にせずに平常運転で更新しております。

DEKO
管理者
投稿数: 2691
Mod 30 の改良点
on: 2013/10/20 01:15 Sun

[修正点]

  • 展開ボタンとチェックボックスの位置とサイズの調整 (代替ダイアログ)

説明:
テーマなし、クラシック (テーマはある)、テーマ有、テーマ有 (Vista 以降) でコントロールのサイズと位置が変わってしまうので、「1ドットでも違っていたら腹を切る *1 なんてカッコいい事は言えません。展開ボタンはデフォルトで 高さ 21px なのに、チェックボックスと一緒の時はチェックボックスとの差が 20px しかありません。1px カブっていますので、代替ダイアログ (Vista よりも前) の場合には 1px 欠ける事になります。これを回避しようとすると、当然の事ながらオリジナルの位置とは若干ズレる事になりますが仕方ありません。

*1 X68000 (初代) 付属のグラディウスの移植に関して開発元である SPS の方が言ったとされている。後に「1ドットくらいは違うかも…」と言ったとも。

DEKO
管理者
投稿数: 2691
Mod 31 の改良点
on: 2013/10/20 04:34 Sun

[修正点]

  • 展開ボタンとチェックボックスの位置とサイズの調整 (代替ダイアログ)

説明:
先に仕様があってその通りに作るのではなく、挙動から仕様を導き出すのは難しいですね。数学ではなく物理学といった趣です。

DEKO
管理者
投稿数: 2691
大体落ち着いたのでヨタ話
on: 2013/10/20 07:50 Sun

Delphi の (Vcl.)dialog.TTaskDialog はちょっぴり残念なトコがあります。何が残念かって、

XE 以前の TTaskDialog はテーマが有効でないとエラーになる

って事です。XP 以前で動作しないのはともかく、Vista 以降でもデスクトップがクラシック表示だとエラーになります。

…こんな感じで。XE2 以降でこの制限がなくなっているのが救いといえば救いです。「クラシックになんかにしないから別にいい」と仰るかもしれませんが、Server 2008 / R2とかのサーバ OS はクラシック表示ですよ?

TaskDialog の必須条件は「Vista 以降の OS かつアプリケーションマニフェストが組み込まれている (= ランタイムテーマ有効)」です。つまりクラシック表示であるか否かは本来関係ありません。ここで改良を加えている代替ダイアログにはその制限がありません。但し、Comctrl32.dll のバージョンが 6 未満だとハイパーリンクが使えなかったり、マーキーが使えなかったりといった制限があります。

大体落ち着いたと書きましたが、コマンドリンクが残っていますね。これはカスタムコンポーネントを作らないと実現できませんので、もう少し後になるかと思います。Vista 以降で動作させるのであれば Delphi 標準のコマンドリンクボタンが使えるのですが (Delphi 2009 以降) 、用途が代替ダイアログなので結局は使えません。

「Delphi にコマンドリンクボタンなんてあったっけ?」と思った方はフォームに TButton を貼って、Style プロパティを bsCommandLink に変更してみましょう。

DEKO
管理者
投稿数: 2691
Mod 32 の改良点
on: 2013/10/21 03:45 Mon

[修正点]

  • コマンドリンクの処理を差し替えた (代替ダイアログ)
  • 展開ボタン&チェックボックスコントロールの修正 (代替ダイアログ)

説明:
コマンドリンクボタンの挙動 (仕様) にちょっと悩みましたが、あっけなくできてしまいました。画像は Windows 7 での代替ダイアログです。静止画なので区別が付きませんね。コマンドリンクの水色の枠はデフォルトである事を示していますが、本物の枠はアニメーションにより明度が増減します。リアルで動作させると代替ダイアログなのかどうかすぐに判ります。

ともあれ、これで XP や 2000 でもちゃんとした (?) コマンドリンクが使えるようになりました…見た目こそ異なりますが。XP での描画はちょっと野暮ったいのでそのうちどうにかしたいと思っています。

DEKO
管理者
投稿数: 2691
Mod 33 の改良点
on: 2013/10/21 06:06 Mon

[修正点]

  • Delphi 2007 でコンパイルしたものを実行するとエラーになる事があるのを修正。
  • コマンドリンクと (コモン) ボタンを併用できないバグを修正。 (ネイティブダイアログ)

説明:
Delphi 2007 の GetThemeFont() の定義が間違っており、ここで取得した LOGFONT を CreateFontIndirect に渡すとコケます。

[GetThemeFont (MSDN)]
http://msdn.microsoft.com/en-us/library/windows/desktop/bb759745%28v=vs.85%29.aspx

GetThemeFont() の pFont は LOGFONTW で、GetThemeFontA() なんて API もないハズです。Delphi 2007 の TLOGFONT は TLOGFONTA なので、

  GetThemeFont: function(hTheme: HTHEME; hdc: HDC; iPartId, iStateId, iPropId: Integer;
var pFont: LOGFONTW): HRESULT; stdcall;

 
コレが正しいと思われます (GetThemeSysFont も同様)。LOGFONTW でデータを受けると CreateFontIndirect() も CreateFontIndirectW() にしなくてはならないのでそのように修正してあります。

DEKO
管理者
投稿数: 2691
Mod 34 の改良点
on: 2013/10/21 19:09 Mon

[修正点]

  • Delphi 2007 でのプログレスバーの挙動を変更。(代替ダイアログ)
  • アイコンを指定している時のプログレスバーの幅がおかしいのを修正。(代替ダイアログ)
  • tdfQueryFieldFocused が指定されている場合には入力ボックス及び選択リストを優先してフォーカスするようにした。(代替ダイアログ)
  • コモンボタンとカスタムボタンが同時に指定されている時の問題を修正。(代替ダイアログ)

説明:
Delphi 2007 絡みはイロイロありますね。

DEKO
管理者
投稿数: 2691
Mod 35 の改良点
on: 2013/10/22 00:44 Tue

[修正点]

  • プログレスバーの全体から見た位置をネイティブダイアログと合わせた。(代替ダイアログ)
  • 正しいフラグの組み合わせでもプログレスバーが表示されない事があったのを修正。(代替ダイアログ)
  • 展開テキストがフッターエリアにあり、ダイアログアイコンが表示されている時の展開テキストの位置をネイティブダイアログと合わせた。(代替ダイアログ)
  • 不正なフラグの組み合わせでエラーを吐いて落ちるのを回避するようにした。(ネイティブダイアログ)

説明:
フラグの組み合わせ × OS の数 (通常テーマ/クラシック) × Delphi のバージョン数の検証は大変です。

DEKO
管理者
投稿数: 2691
Mod 36 の改良点
on: 2013/10/23 01:42 Wed

[修正点]

  • コマンドリンク / 展開ボタン / チェックボックスのキーボード操作を可能にした。(代替ダイアログ)
  • コマンドリンク / 展開ボタン / チェックボックスのキャプションのアクセラレーターキーの表示方法を変更した。(代替ダイアログ)
  • フォーカス矩形の表示方法の修正。(代替ダイアログ)

説明:
コマンドリンク / 展開ボタン / チェックボックスを

  • スペースキーでトグル (展開ボタン / チェックボックス)
  • Alt キーを押すとアクセラレーターキーのアンダーバー表示
  • Alt キーによるアクセラレーターキー押下処理

できるようにしました。平たく言えば、スペースキーとアクセラレーターキーによるクリックが行えるようになりました。これに伴い、アクセラレーターキーの表示ロジックも若干変更してあります。

DEKO
管理者
投稿数: 2691
Mod 37 の改良点
on: 2013/10/23 17:56 Wed

[修正点]

  • コマンドリンク / 展開ボタン / チェックボックスのアクセラレーターキー/フォーカス矩形周りの処理を見直した。(代替ダイアログ)

説明:
コマンドリンク / 展開ボタン / チェックボックスのオーナードローで参考にしたのは TBitBtn のソースコードなのですが、TBitBtn はキャプションに &Caption と指定すると常に C にアンダーバーが表示されます。これは通常のボタンのアクセラレータキー表示とは異なります。試行錯誤してみましたが Windows 2000 以降を対象とするのであれば Mod 37 の処理でいいようです。TBitBtn は Win9x でも動作するコードのようですね…だからアクセラレーターキー表示の処理が違うのでしょう。

ボタンのオーナードローに必要なのは、

  • CreateParams のオーバーライド (Params.Style にBS_OWNERDRAW を追加)
  • SetButtonStyle のオーバーライド (空でもいいのでオーバーライドが必要)
  • 適切なフォーカス矩形処理とアクセラレーターキー処理

突き詰めればこれだけのようです。

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

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