フォーラム


ゲスト  

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

ページ: 1 2 3 4 [5]
トピック: SynTaskDialog 改
DEKO
管理者
投稿数: 2691
続・大体落ち着いたのでヨタ話
on: 2013/10/24 07:07 Thu

今度こそ本当に落ち着いたと思います。仕様としては、

  • 対象 OS は Windows 2000 以降。
  • Vista またはそれ以降ではクラシック表示であっても TaskDiallog() が呼び出される。
  • XP またはそれ以前では代替ダイアログが呼び出される。
  • ランタイムテーマが有効でない (Comctl32.dll < 6) 場合、ハイパーリンクやマーキーは使えない。
  • 問い合わせダイアログまたは選択ダイアログの機能を使うと代替ダイアログが呼び出される。
  • 対応するコンパイラは Delphi 2007 またはそれ以降 (フル機能は 2009 以降)。
  • Delphi 2007 の場合、ハイパーリンクは使えない。
  • 64bit アプリケーションでも利用可能。

このようになっています。

DEKO
管理者
投稿数: 2691
Mod 38 & 39 の改良点
on: 2013/10/24 08:40 Thu

[修正点]

  • tdfPositionRelativeToWindow が指定された時のダイアログのセンタリング処理を見直した。(代替ダイアログ) <- Mod 38
  • XP かつテーマ有効時のコマンドリンクボタンの描画処理を変更した。 <- Mod 39

説明:
Mod 38 はありていに言えば FireMonkey 対策です。意外 (?) かもしれませんが、SynTaskDialog は FireMonkey アプリケーションからも使えます…もちろん Windows 限定ですが。

uses
..., FMX.Platform.Win, Winapi.Windows, SynTaskDialog;

var
Task: SynTaskDialog.TTaskDialogEx;
begin
with Task do
begin
Init;
Base.Title := 'タイトル';
Base.Inst := 'インストラクション';
Base.Content := 'コンテンツ';
CommonButtons := [cbOK, cbCancel];
ButtonDef := mrCancel;
DialogIcon := tiInformation;
Flags := [tdfPositionRelativeToWindow, tdfAllowDialogCancellation];
if Execute(FmxHandleToHWND(Self.Handle)) = mrOk then
ShowMessage('OK')
else
ShowMessage('Cancel');
end;
end;

 
こんな感じで。ユニットスコープによるコンパイルエラーが出る場合にはプロジェクトオプションのユニットスコープ名に vcl を追加してください (或いはソースコードを書き換えて下さい)。

tdfPositionRelativeToWindow を使う場合には、Execute() の引数に Self.Handle ではなく、FmxHandleToHWND(Self.Handle) を渡します。従来ですと FMX フォームのウィンドウハンドルを渡しても親ウィンドウの中央に位置しませんでした。これは VCL 内の処理で親が TCustomForm (の派生) であるかを判断しているためです。この処理を変更し、本当の意味で親ウィンドウの中央に表示されるようにしました。あ、もちろんこれは代替ダイアログの話です。Vista またはそれ以降の場合には本物の TaskDialog が呼び出されますので、従来のものでも問題はありませんでした。

無責任だとは思うのですが、SynTaskDialog を FireMonkey から使って本当に副作用がないかどうかは判りませんし、動作保証もできない事をお断りしておきます。

Mod 39 はイマイチだった XP でのボタン描画 (ホバー時) を変更してみました。よっぽど変なテーマじゃない限りは大丈夫かと思われます。

DEKO
管理者
投稿数: 2691
Mod 40 の改良点
on: 2013/10/27 02:47 Sun

[修正点]

  • XE2 以降でユニットスコープの問題が出るのを修正
  • XE2 以降でThemeServices のワーニングが出るのを修正

[SynTaskDialog Mod 40]
https://ht-deko.com/software/SynTaskDialog_Mod40.zip

説明:
XE2 以降、ユニットスコープが変更されているので、ユニットスコープに vcl を追加するなりしないとコンパイルできなかったのですが、これを修正しました。

ThemeServices のワーニングですが、ThemeServices() というのは Themes に含まれる関数で TThemeServices を返します。XE2 以降でもこの関数は非推奨ですが存在し TCustomStyleServices を返します。推奨されているのは StyleServices() という関数でこちらも TCustomStyleServices を返しますが、中身はどちらも全く同じです。

ちなみに、テーマで描画するための列挙型 TThemedElement に TaskDialog のための teTaskDialog が登場するのは XE2 以降なので、それよりも前でTaskDialog をテーマ描画しようとすると OpenTheme() しなくてはなりません (SynTaskDialog 改のソースはそうなっています)。

テーマでどのように描画されるのかを知りたいのであれば Theme Explorer を使うと便利です。

[Theme Explorer]
http://sourceforge.net/projects/mctrl/files/

定数等を知ることができて非常に便利です…似たようなツールは幾つかありますけどね。テーマで描画できるパーツと状態については MSDN にあります。

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

ただ、OS のどのバージョンでどれが描画可能なのかは Theme Explorer を走らせて実際に確認した方がいいと思います。

普通のダイアログ: ◎
カスタムボタン: ◎
コマンドリンク: ◎
ラジオボタン: ◎
AboutBox: ◎
CheckBox: ◎
フッターテキスト: ◎
展開テキスト: ◎
問い合わせダイアログ: ◎
選択リストダイアログ: ◎
進捗ダイアログ: ◎

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