From 89f731e4636458b9aaa538d00f5096eefac900c6 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 29 Jun 2009 15:42:26 +0000 Subject: [PATCH] git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.TMSSoftware@15 ccf39c52-e665-a648-be6a-52d81bcb5567 --- .../1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dpr | 13 + .../1/Demo/AdvInputTaskDialogDemo.dproj | 113 + .../1.5.1.6/1/Demo/AdvInputTaskDialogDemo.res | Bin 0 -> 5280 bytes .../1.5.1.6/1/Demo/AdvMsgBoxExplorer.dpr | 14 + .../1.5.1.6/1/Demo/AdvMsgBoxExplorer.dproj | 41 + .../1.5.1.6/1/Demo/AdvMsgBoxExplorer.res | Bin 0 -> 4396 bytes .../1.5.1.6/1/Demo/TaskDialogExplorer.dpr | 14 + .../1.5.1.6/1/Demo/TaskDialogExplorer.dproj | 41 + .../1.5.1.6/1/Demo/TaskDialogExplorer.res | Bin 0 -> 4396 bytes .../1/Demo/UAdvInputTaskDialogDemo.dfm | 100 + .../1/Demo/UAdvInputTaskDialogDemo.pas | 69 + .../internal/1.5.1.6/1/Demo/Unit1.dfm | 130 + .../internal/1.5.1.6/1/Demo/Unit1.pas | 125 + .../internal/1.5.1.6/1/Demo/fmMain.dfm | 310 ++ .../internal/1.5.1.6/1/Demo/fmMain.pas | 293 + .../1.5.1.6/1/Lib/D12/PictureContainer.dcu | Bin 0 -> 32143 bytes .../1.5.1.6/1/Lib/D12/SpanishConsts.dcu | Bin 0 -> 1095 bytes .../1.5.1.6/1/Lib/D12/SpanishContst.dcu | Bin 0 -> 1095 bytes .../internal/1.5.1.6/1/Lib/D12/TaskDialog.dcu | Bin 0 -> 135630 bytes .../internal/1.5.1.6/1/Lib/D12/TaskDialog.res | Bin 0 -> 20004 bytes .../1.5.1.6/1/Lib/D12/TaskDialogDE.dcu | Bin 0 -> 2250 bytes .../1.5.1.6/1/Lib/D12/TaskDialogPkg.bpl | Bin 0 -> 170496 bytes .../1.5.1.6/1/Lib/D12/TaskDialogPkg.dcp | Bin 0 -> 112914 bytes .../1.5.1.6/1/Lib/D12/TaskDialogPkg.dcu | Bin 0 -> 3651 bytes .../1.5.1.6/1/Lib/D12/TaskDialogRegDE.dcu | Bin 0 -> 715 bytes .../1.5.1.6/1/Source/SpanishConsts.pas | 22 + .../internal/1.5.1.6/1/Source/TaskDialog.pas | 4814 +++++++++++++++++ .../internal/1.5.1.6/1/Source/TaskDialog.res | Bin 0 -> 20004 bytes .../1.5.1.6/1/Source/TaskDialogDE.pas | 84 + .../1.5.1.6/1/Source/TaskDialogEx.pas | 300 + .../1.5.1.6/1/Source/TaskDialogPkg.dpk | 40 + .../1.5.1.6/1/Source/TaskDialogPkg.dproj | 91 + .../1.5.1.6/1/Source/TaskDialogPkg.res | Bin 0 -> 3008 bytes .../1.5.1.6/1/Source/TaskDialogRegDE.pas | 49 + .../internal/1.5.1.6/1/Source/htmlengo.pas | 2353 ++++++++ .../1.5.1.6/1/Source/picturecontainer.pas | 241 + .../internal/1.5.1.6/1/Source/tmsdefs.inc | 214 + .../internal/1.5.1.6/1/Source/wiif.pas | 257 + .../internal/1.5.1.6/1/Source/wiimpl.pas | 908 ++++ 39 files changed, 10636 insertions(+) create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dpr create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dproj create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dpr create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dproj create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dpr create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dproj create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.dfm create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.dfm create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.dfm create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/PictureContainer.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/SpanishConsts.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/SpanishContst.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogDE.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.bpl create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.dcp create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogRegDE.dcu create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/SpanishConsts.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogDE.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogEx.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dpk create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dproj create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.res create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogRegDE.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/htmlengo.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/picturecontainer.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/tmsdefs.inc create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/wiif.pas create mode 100644 TAdvTaskDialog/internal/1.5.1.6/1/Source/wiimpl.pas diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dpr b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dpr new file mode 100644 index 0000000..ea78c08 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dpr @@ -0,0 +1,13 @@ +program AdvInputTaskDialogDemo; + +uses + Forms, + UAdvInputTaskDialogDemo in 'UAdvInputTaskDialogDemo.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dproj b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dproj new file mode 100644 index 0000000..cbce3c2 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.dproj @@ -0,0 +1,113 @@ + + + {40ed30c4-44b3-4d9c-8bf7-596b00214c5a} + Debug + AnyCPU + DCC32 + AdvInputTaskDialogDemo.exe + AdvInputTaskDialogDemo.dpr + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + + + + False + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + + + AdvInputTaskDialogDemo.dpr + + + + + + + MainSource + + +
Form1
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.res b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvInputTaskDialogDemo.res new file mode 100644 index 0000000000000000000000000000000000000000..be94ddf25bdb844df2435f4a878210f039e9ba4f GIT binary patch literal 5280 zcmbVQO>Y}j6n#+^AS9p?EZBME6^fLvHZ4#km?(TGf&wZvEJvkw8OSLK0bDNmWgNE?Dyx-UAxtGT%&%e)~=7+ zeC6N7hZu%!o@2%%pXM@OfLETiT@DU)6F##SuFZ8*B$Mq~p?$2q>SGvfAD3~AOCDxU z$2Aw^MQrBb90!aEKC!dhxies&83(ixbKZwIw0v6ST5<~L-UOJmOvaFg}gg%yF4#w2gy!^kp66A&%r<_AviTB@b$pGeQn>tR)BG zadufhbIO>agX{&^CS8Z zPxMa70qq&EY1nVMFV1jYvlq@dkP|T#n{hop*0Ju1$vV(BbL@FG;9J-iDhFyLhMd3Q z&O8UyC+8%mMd8Rn+PEJaXAXq}v1tuGf58NIa$=iYB?rKgS_C)s>|fPJ?y-+Jyu&3n z;^~=s{l=kH>1WOz;!;2J!#k}!D*nbxJoFGlv>`rm^=)B(ao>nvH^kE#_PRsQr2)=} zC1>vS+Zo9@G0#{_9O{y@2S2{Ka!-NFabh!uwCCV+zvR0GelT)TL;Zmp@3X!Es$Xh@ zILt@r&uGdu$bUwyo&(y3uYSIM$vF?d$nqFY#f- zG~+zmynp9%@6SQ&j_(&aYAnX1emQ@%saNt8B0kn}USiG^OXjiH-bT*ZePCPq*?fGh zY3lZ8$N121_!8UWE4I$(nXg~O)%=4S#te&|-x27|81rHdw)cT=5eh1<`mvQv@PL;I@UR*NZmss-NcwDPNV)J8M=HYXUwJ7;+ zRr$8OpYtv1R_%6odC!Pla>%sJT+~0D=e>FzhqC4y#2}ZtKab5ESMMy_6$fHn{BVpm z?=Bc8o)Oo`JJT|}%Ip6S-TDy*6tze=i`Tc=LF7ka?yyk?luk$euud9bkyvVoYaq90R zIou4}_!$R!(RPhI$hw)&1$6UlERMy!ski;~%*SiFoSw=&*V(?C;$5}g;$7EY73bo3 zapGKo!GB@@z+S;#!cM#$!_#j1ImXWpv=iqRX)m373$fn^Mgv$aU>3#6V)3DKZVgrx z@3{wV+wHpVVLR>zc>C0U*Wj-i_&p;C`_b3SpEiSZ+=+XgK@vw>&7&x7wmyINoy|^~M#IO0 zqW}TobgMZT#rMWGCrG-$b2J@NoOf;HUAV*H8R>B?L-VZhy9R zdu4rX;}d}E{)17{jnXt3ZI8N7`s1iOo{SK1sky2=deK1?gG2X7`e0@w<880kPh3fQ zK5>pJ`3IJpm0$XCFL|1->?Ffs5-;y0@pzOBQZI!&N;&tS27k4wgURDTzx!=;^eFi? z!pYsc``O*c_cqoyHoD!t_1<1>>7WzuPdfXeQ`5lMZ%767tGWCg*1 z16$2bx*H!NH=|l6f?(3$?y>^5ntPo=8u@c)J}9`1ehGYY^&HjB)lxIqZLZp7K*zcN E06`ulwEzGB literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dpr b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dpr new file mode 100644 index 0000000..bc37470 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dpr @@ -0,0 +1,14 @@ +program AdvMsgBoxExplorer; + +uses + Forms, + Unit1 in 'Unit1.pas' {Form1}; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dproj b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dproj new file mode 100644 index 0000000..79dd07c --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.dproj @@ -0,0 +1,41 @@ + + + {3be14241-b500-4048-b206-8a73172c37f9} + AdvMsgBoxExplorer.dpr + Debug + AnyCPU + DCC32 + AdvMsgBoxExplorer.exe + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + +FalseTrueFalseFalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0 + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + AdvMsgBoxExplorer.dpr + + + + + MainSource + + +
Form1
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.res b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/AdvMsgBoxExplorer.res new file mode 100644 index 0000000000000000000000000000000000000000..42a5081b0f34660600159e4ef01b88cf6d6e4558 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0YtD8>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oJR6I0&l~X06BD`mLFLFRAq_`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2AiiCQ9h literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dpr b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dpr new file mode 100644 index 0000000..e1ac7bc --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dpr @@ -0,0 +1,14 @@ +program TaskDialogExplorer; + +uses + Forms, + fmMain in 'fmMain.pas' {MainForm}; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dproj b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dproj new file mode 100644 index 0000000..9ae7939 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.dproj @@ -0,0 +1,41 @@ + + + {15a8d16e-1063-4b59-8cb3-07496f176779} + TaskDialogExplorer.dpr + Debug + AnyCPU + DCC32 + TaskDialogExplorer.exe + + + 7.0 + False + False + 0 + RELEASE + + + 7.0 + DEBUG + + + Delphi.Personality + VCLApplication + +FalseTrueFalseFalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0 + Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + TaskDialogExplorer.dpr + + + + + MainSource + + +
MainForm
+
+
+
\ No newline at end of file diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.res b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/TaskDialogExplorer.res new file mode 100644 index 0000000000000000000000000000000000000000..42a5081b0f34660600159e4ef01b88cf6d6e4558 GIT binary patch literal 4396 zcmbW5y^ice5QS^C0YtD8>OhncYij4bkxI`SUKc$3L2~0G z4YcQTpML1=@$u27Qd~1m`TfHO>$~2t3H`7cZ|8G;)&Iu_jKogOT=JO4$=9oRO{KR< z9Jb;r0;xCR}WxtJm8Xnv>Vt-cbiktZ1FiOkc<%53&Y;wHhS>xp3 zTJLU$Kl$`gG1!i*9w@DrX!}{(3e(c#p-ye$v@+KZ`w94sukAENCp7^IS`8)ZxqB>wRfSnxB4fhON9C+7S;u9;r(avLTvEx&7{Sa}x z%^Y)Z;GOzA_9*NFJf#Qe1N$O=E8Ez?m#|i-dHDJC*B`-Q4i0{1i~LAz0AD@!R2NL% z;p+IKY_J`qyAbl@@ynmbJHkQZS=fm7XYT7s^_rh8Ilu|bz{YRGmmPf%CVdcNa@=?x zq&w{!f&(#v;q_14xp7c`vgSFh)!^V`oe$>8p>qHmIYj*(Q{3Ui7_OcJVR| zjg@=t1BWxbV9Q_Bw8ftsx;1`sZt_d~Q-9N#GKq{u4LO zbKC(DzxM_>$Qo&Rv&%UHd*M)GOfI$$>zu3CI4nJX00S;teU43z*L#-n$^op)hdE^LEF>pt zgpJ=bUE-}ee)k%V`XRp~Q)j=sk4pl2XC6tstNIkbCG-X{k~i)|-r?xIr1|Z)oY%kQ zUS^x9iQwvMTuNhj-258El+ZItsh?Sg73oPshvqUybnA1B?q*} z_J%yT-Q04axT#J0Nx$#axgSkFUgh%i+kk&k9y$oJR6I0&l~X06BD`mLFLFRAq_`^A2=pY2!4PxhO1 XKHL8__%}oUXWZZWzZ(1ta%2AiiCQ9h literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.dfm b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.dfm new file mode 100644 index 0000000..685effd --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.dfm @@ -0,0 +1,100 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'TAdvInputTaskDialog demo' + ClientHeight = 225 + ClientWidth = 406 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 264 + Top = 22 + Width = 91 + Height = 13 + Caption = 'Preset input value:' + end + object Label2: TLabel + Left = 264 + Top = 103 + Width = 34 + Height = 13 + Caption = 'Result:' + end + object RadioGroup1: TRadioGroup + Left = 16 + Top = 16 + Width = 233 + Height = 161 + Caption = 'Select input control' + ItemIndex = 0 + Items.Strings = ( + 'Edit' + 'Combo editor' + 'Combo list' + 'Memo' + 'Date picker' + 'Custom control (spin editor)') + TabOrder = 0 + end + object Button1: TButton + Left = 264 + Top = 72 + Width = 121 + Height = 25 + Caption = 'Show inputdialog' + TabOrder = 1 + OnClick = Button1Click + end + object Edit1: TEdit + Left = 264 + Top = 45 + Width = 121 + Height = 21 + TabOrder = 2 + Text = 'preset' + end + object Edit2: TEdit + Left = 264 + Top = 122 + Width = 121 + Height = 21 + TabOrder = 3 + end + object SpinEdit1: TSpinEdit + Left = 16 + Top = 195 + Width = 121 + Height = 22 + MaxValue = 0 + MinValue = 0 + TabOrder = 4 + Value = 0 + Visible = False + end + object AdvInputTaskDialog1: TAdvInputTaskDialog + CommonButtons = [] + DefaultButton = 0 + Icon = tiInformation + InputType = itEdit + InputItems.Strings = ( + 'BMW' + 'Audi' + 'Mercedes' + 'Porsche' + 'VW' + 'Ferrari') + Title = 'Windows Vista Input dialog' + Content = 'Enter value here' + OnDialogInputSetText = AdvInputTaskDialog1DialogInputSetText + OnDialogInputGetText = AdvInputTaskDialog1DialogInputGetText + Left = 352 + Top = 152 + end +end diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.pas new file mode 100644 index 0000000..ee4bdd9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/UAdvInputTaskDialogDemo.pas @@ -0,0 +1,69 @@ +unit UAdvInputTaskDialogDemo; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, ExtCtrls, TaskDialog, Spin; + +type + TForm1 = class(TForm) + AdvInputTaskDialog1: TAdvInputTaskDialog; + RadioGroup1: TRadioGroup; + Button1: TButton; + Edit1: TEdit; + Label1: TLabel; + Label2: TLabel; + Edit2: TEdit; + SpinEdit1: TSpinEdit; + procedure Button1Click(Sender: TObject); + procedure AdvInputTaskDialog1DialogInputGetText(Sender: TObject; + var Text: string); + procedure AdvInputTaskDialog1DialogInputSetText(Sender: TObject; + Text: string); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.dfm} + +procedure TForm1.AdvInputTaskDialog1DialogInputGetText(Sender: TObject; + var Text: string); +begin + Text := SpinEdit1.Text; +end; + +procedure TForm1.AdvInputTaskDialog1DialogInputSetText(Sender: TObject; + Text: string); +begin + SpinEdit1.Text := Text; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + case radiogroup1.ItemIndex of + 0: AdvInputTaskDialog1.InputType := itEdit; + 1: AdvInputTaskDialog1.InputType := itComboEdit; + 2: AdvInputTaskDialog1.InputType := itComboList; + 3: AdvInputTaskDialog1.InputType := itMemo; + 4: AdvInputTaskDialog1.InputType := itDate; + 5: + begin + AdvInputTaskDialog1.InputType := itCustom; + AdvInputTaskDialog1.InputControl := SpinEdit1; + + end; + end; + AdvInputTaskDialog1.InputText := Edit1.Text; + AdvInputTaskDialog1.Execute; + Edit2.Text := AdvInputTaskDialog1.InputText; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.dfm b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.dfm new file mode 100644 index 0000000..3f3e4c6 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.dfm @@ -0,0 +1,130 @@ +object Form1: TForm1 + Left = 0 + Top = 0 + Caption = 'AdvMessageBox Test' + ClientHeight = 303 + ClientWidth = 380 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 14 + Top = 16 + Width = 47 + Height = 13 + Caption = 'Caption: ' + end + object Label2: TLabel + Left = 30 + Top = 48 + Width = 25 + Height = 13 + Caption = 'Icon:' + end + object Label3: TLabel + Left = 29 + Top = 76 + Width = 26 + Height = 13 + Caption = 'Text:' + end + object Label4: TLabel + Left = 14 + Top = 184 + Width = 41 + Height = 13 + Caption = 'Buttons:' + end + object Label5: TLabel + Left = 24 + Top = 232 + Width = 34 + Height = 13 + Caption = 'Result:' + end + object lbresults: TLabel + Left = 64 + Top = 232 + Width = 3 + Height = 13 + end + object BtnTMS: TButton + Left = 65 + Top = 264 + Width = 145 + Height = 25 + Caption = 'TMS TAdvMessageBox' + TabOrder = 0 + OnClick = BtnTMSClick + end + object BtnWindows: TButton + Left = 216 + Top = 264 + Width = 145 + Height = 25 + Caption = 'Windows Messagebox' + TabOrder = 1 + OnClick = BtnWindowsClick + end + object edCaption: TEdit + Left = 61 + Top = 13 + Width = 300 + Height = 21 + TabOrder = 2 + Text = 'Test of MessageBox' + end + object cbIcon: TComboBox + Left = 61 + Top = 45 + Width = 300 + Height = 21 + ItemHeight = 13 + ItemIndex = 0 + TabOrder = 3 + Text = 'Select Icon' + Items.Strings = ( + 'Select Icon' + 'MB_ICONEXCLAMATION' + 'MB_ICONWARNING' + 'MB_ICONASTERISK' + 'MB_ICONINFORMATION' + 'MB_ICONQUESTION' + 'MB_ICONSTOP' + 'MB_ICONERROR' + 'MB_ICONHAND') + end + object MemoInfo: TMemo + Left = 61 + Top = 76 + Width = 300 + Height = 89 + Lines.Strings = ( + 'Sample short message.') + TabOrder = 4 + end + object cbButtons: TComboBox + Left = 64 + Top = 184 + Width = 297 + Height = 21 + ItemHeight = 13 + TabOrder = 5 + Text = 'Pick Buttons' + Items.Strings = ( + 'Pick the buttons to show' + 'ABORT, RETRY, IGNORE' + 'CANCEL, TRY AGAIN, CONTINUE' + 'OK' + 'OK, CANCEL' + 'RETRY, CANCEL' + 'YES, NO' + 'YES, NO, CANCEL') + end +end diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.pas new file mode 100644 index 0000000..9ab33f9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/Unit1.pas @@ -0,0 +1,125 @@ +unit Unit1; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls; + +type + TForm1 = class(TForm) + BtnTMS: TButton; + BtnWindows: TButton; + Label1: TLabel; + edCaption: TEdit; + Label2: TLabel; + cbIcon: TComboBox; + Label3: TLabel; + MemoInfo: TMemo; + Label4: TLabel; + cbButtons: TComboBox; + Label5: TLabel; + lbresults: TLabel; + procedure BtnWindowsClick(Sender: TObject); + procedure BtnTMSClick(Sender: TObject); + private + Fmbtitle: string; + FBoxInformation: string; + FBoxflags: integer; + { Private declarations } + procedure MakeDialog(id: string); + procedure Setmbtitle(const Value: string); + procedure SetBoxInformation(const Value: string); + procedure SetBoxflags(const Value: integer); + public + { Public declarations } + + property BoxTitle: string read Fmbtitle write Setmbtitle; + property BoxInformation: string read FBoxInformation write SetBoxInformation; + property Boxflags: integer read FBoxflags write SetBoxflags; + end; + +var + Form1: TForm1; + +implementation + +uses + TaskDialog; + +{$R *.dfm} + +const + MB_CANCELTRYCONTINUE = $00000006; + iconlist: array[1..8] of integer = + (MB_ICONEXCLAMATION, + MB_ICONWARNING, + MB_ICONINFORMATION, + MB_ICONASTERISK, + MB_ICONQUESTION, + MB_ICONSTOP, + MB_ICONERROR, + MB_ICONHAND); + btnlist: array[1..7] of integer = + ( MB_ABORTRETRYIGNORE, + MB_CANCELTRYCONTINUE, + MB_OK, + MB_OKCANCEL, + MB_RETRYCANCEL, + MB_YESNO, + MB_YESNOCANCEL); + + + +// Create dialog fields for the messagebox +procedure TForm1.MakeDialog(id: string); +var + i: Integer; +begin + // make box fields from ui + BoxTitle := edCaption.text + ' ('+id+')'; // title + BoxInformation := memoInfo.Lines[0]; // info + for i := 1 to memoInfo.Lines.count - 1 do + BoxInformation := BoxInformation + #10+MemoInfo.Lines[i]; + BoxFlags := 0; + if cbIcon.ItemIndex > 0 then + BoxFlags := BoxFlags or IconList[cbIcon.ItemIndex]; + if cbButtons.ItemIndex > 0 then + BoxFlags := boxFlags or btnlist[cbButtons.itemindex]; +end; + +procedure TForm1.BtnTMSClick(Sender: TObject); +var + res: integer; +begin + MakeDialog('TMS'); + res := AdvMessagebox(0,pchar(BoxInformation), pchar(BoxTitle), BoxFlags); + lbResults.caption := IntToStr(res); +end; + +procedure TForm1.BtnWindowsClick(Sender: TObject); +var + res: integer; +begin + MakeDialog('WINDOWS'); + res := Messagebox(0,pchar(BoxInformation),pchar(BoxTitle),BoxFlags); + lbResults.caption := InttoStr(res); +end; + + +procedure TForm1.SetBoxflags(const Value: integer); +begin + FBoxflags := Value; +end; + +procedure TForm1.SetBoxInformation(const Value: string); +begin + FBoxInformation := Value; +end; + +procedure TForm1.Setmbtitle(const Value: string); +begin + Fmbtitle := Value; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.dfm b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.dfm new file mode 100644 index 0000000..a1d4604 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.dfm @@ -0,0 +1,310 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Hint = 'Thiis the Windows title for the dialog b ox' + Caption = 'TMS TAdvTaskDialog Explorer' + ClientHeight = 426 + ClientWidth = 530 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poDesktopCenter + ShowHint = True + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 136 + Top = 278 + Width = 321 + Height = 13 + Caption = 'Separate button names with spaces (Use quotes to embed spaces)' + end + object Label3: TLabel + Left = 8 + Top = 4 + Width = 81 + Height = 13 + Caption = 'Include elements' + end + object Label2: TLabel + Left = 36 + Top = 238 + Width = 81 + Height = 13 + Caption = 'Common Buttons' + end + object Label4: TLabel + Left = 58 + Top = 164 + Width = 61 + Height = 13 + Caption = 'Expand label' + end + object Label5: TLabel + Left = 306 + Top = 163 + Width = 72 + Height = 13 + Caption = 'Collapse Label:' + end + object Label6: TLabel + Left = 19 + Top = 367 + Width = 74 + Height = 13 + Caption = 'Default button:' + end + object Button1: TButton + Left = 242 + Top = 393 + Width = 264 + Height = 25 + Caption = 'Test TAdvTaskDialog' + TabOrder = 0 + OnClick = Button1Click + end + object cbFooter: TCheckBox + Left = 18 + Top = 325 + Width = 97 + Height = 17 + Caption = 'Include Footer' + Checked = True + State = cbChecked + TabOrder = 1 + OnClick = cbFooterClick + end + object cbExpanded: TCheckBox + Left = 18 + Top = 126 + Width = 84 + Height = 17 + Caption = 'More Details' + Checked = True + State = cbChecked + TabOrder = 2 + OnClick = cbExpandedClick + end + object cbVerify: TCheckBox + Left = 19 + Top = 303 + Width = 81 + Height = 12 + Caption = 'Verify text' + Checked = True + State = cbChecked + TabOrder = 3 + OnClick = cbVerifyClick + end + object cbRadioButtons: TCheckBox + Left = 19 + Top = 187 + Width = 89 + Height = 17 + Caption = 'Radio buttons' + Checked = True + State = cbChecked + TabOrder = 4 + OnClick = cbRadioButtonsClick + end + object edCustomButtons: TEdit + Left = 128 + Top = 261 + Width = 378 + Height = 21 + TabOrder = 5 + Text = '"Custom 1" "Custom 2"' + end + object memoRadiobuttons: TMemo + Left = 128 + Top = 185 + Width = 377 + Height = 45 + Lines.Strings = ( + 'Radio Button 1' + 'Radio Button 2' + 'Radio Button 3') + TabOrder = 6 + end + object cbCustom: TCheckBox + Left = 19 + Top = 263 + Width = 89 + Height = 17 + Caption = 'Custom Buttons' + Checked = True + State = cbChecked + TabOrder = 7 + OnClick = cbCustomClick + end + object edVerifyText: TEdit + Left = 127 + Top = 299 + Width = 377 + Height = 21 + TabOrder = 8 + Text = 'Check box if you can read :)' + end + object cbCaption: TCheckBox + Left = 19 + Top = 23 + Width = 89 + Height = 17 + Caption = 'Caption' + Checked = True + State = cbChecked + TabOrder = 9 + OnClick = cbCaptionClick + end + object edCaption: TEdit + Left = 129 + Top = 21 + Width = 378 + Height = 21 + Hint = 'Text for the Windows dialog box caption.' + TabOrder = 10 + Text = 'Test of AdvTaskDialog' + end + object MemoFooter: TMemo + Left = 127 + Top = 323 + Width = 378 + Height = 35 + Lines.Strings = ( + 'Sample Footer message' + 'For example: If you do this you will loose all unsaved changes!') + TabOrder = 11 + end + object cbInstruction: TCheckBox + Left = 19 + Top = 46 + Width = 83 + Height = 17 + Caption = 'Instruction' + Checked = True + State = cbChecked + TabOrder = 12 + OnClick = cbInstructionClick + end + object MemoInstruction: TMemo + Left = 128 + Top = 48 + Width = 377 + Height = 33 + Lines.Strings = ( + 'This is the bold blue main instruction and' + 'can be mulitple lines.') + TabOrder = 13 + end + object cbContent: TCheckBox + Left = 19 + Top = 86 + Width = 64 + Height = 17 + Caption = 'Content' + Checked = True + State = cbChecked + TabOrder = 14 + OnClick = cbContentClick + end + object MemoContent: TMemo + Left = 128 + Top = 87 + Width = 377 + Height = 32 + Lines.Strings = ( + 'This is the normal "content" of the dialog.' + ' Notice it'#39's in relatively small print.') + TabOrder = 15 + end + object cbBtnOK: TCheckBox + Left = 129 + Top = 240 + Width = 50 + Height = 10 + Caption = 'cbOK' + Checked = True + State = cbChecked + TabOrder = 16 + end + object cbBtnNo: TCheckBox + Left = 246 + Top = 240 + Width = 50 + Height = 10 + Caption = 'cbNo' + TabOrder = 17 + end + object cbBtnCancel: TCheckBox + Left = 366 + Top = 240 + Width = 66 + Height = 10 + Caption = 'cbCancel' + TabOrder = 18 + end + object cbBtnClose: TCheckBox + Left = 442 + Top = 240 + Width = 62 + Height = 10 + Caption = 'cbClose' + TabOrder = 19 + end + object cbBtnRetry: TCheckBox + Left = 304 + Top = 240 + Width = 60 + Height = 10 + Caption = 'cbRetry' + TabOrder = 20 + end + object cbBtnYes: TCheckBox + Left = 182 + Top = 240 + Width = 55 + Height = 10 + Caption = 'cbYes' + TabOrder = 21 + end + object MemoExpand: TMemo + Left = 128 + Top = 125 + Width = 376 + Height = 33 + Lines.Strings = ( + 'This is for extended details that are initiall hidden' + 'unless user clicks the "view more" button.') + TabOrder = 22 + end + object edExpand: TEdit + Left = 127 + Top = 161 + Width = 121 + Height = 21 + TabOrder = 23 + Text = 'More Detail' + end + object edCollapse: TEdit + Left = 384 + Top = 161 + Width = 121 + Height = 21 + TabOrder = 24 + Text = 'Less Detail' + end + object spnDefButton: TSpinEdit + Left = 127 + Top = 364 + Width = 46 + Height = 22 + MaxValue = 0 + MinValue = 0 + TabOrder = 25 + Value = 0 + end +end diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.pas new file mode 100644 index 0000000..440d6e9 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Demo/fmMain.pas @@ -0,0 +1,293 @@ +unit fmMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, TaskDialog, StdCtrls, Spin; + +type + TMainForm = class(TForm) + Button1: TButton; + cbFooter: TCheckBox; + cbExpanded: TCheckBox; + cbVerify: TCheckBox; + cbRadioButtons: TCheckBox; + cbBtnOK: TCheckBox; + cbBtnYes: TCheckBox; + cbBtnNo: TCheckBox; + cbBtnCancel: TCheckBox; + cbBtnRetry: TCheckBox; + cbBtnClose: TCheckBox; + edCustomButtons: TEdit; + Label1: TLabel; + Label3: TLabel; + memoRadiobuttons: TMemo; + cbCustom: TCheckBox; + edVerifyText: TEdit; + cbCaption: TCheckBox; + edCaption: TEdit; + MemoFooter: TMemo; + cbInstruction: TCheckBox; + MemoInstruction: TMemo; + cbContent: TCheckBox; + MemoContent: TMemo; + Label2: TLabel; + MemoExpand: TMemo; + edExpand: TEdit; + edCollapse: TEdit; + Label4: TLabel; + Label5: TLabel; + Label6: TLabel; + spnDefButton: TSpinEdit; + procedure Button1Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure specialButtonClick(sender: tObject; buttonid: integer); + procedure cbCaptionClick(Sender: TObject); + procedure cbRadioButtonsClick(Sender: TObject); + procedure cbCustomClick(Sender: TObject); + procedure cbVerifyClick(Sender: TObject); + procedure cbFooterClick(Sender: TObject); + procedure cbInstructionClick(Sender: TObject); + procedure cbContentClick(Sender: TObject); + procedure cbExpandedClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.dfm} + +procedure tmsShowmessage(const Title,Instruction,content: string; icon: tTaskDialogIcon); +var + td: tAdvTaskDialog; +begin + td := tAdvTaskDialog.Create(application); + td.Title := title; + td.Instruction := Instruction; + td.Content := Content; + td.icon := icon; + td.Execute; + td.Free; +end {ShowmessageEx}; + +procedure TMainForm.Button1Click(Sender: TObject); +var + td : tAdvTaskDialog; + msg: string; + ButtonChecked: integer; // custom button number checked + lab: string; + txt: string; + i: Integer; + inQuote: boolean; + resname: string; +begin + // + td := tAdvTaskDialog.Create(self); + td.Clear; + td.DialogPosition := dpOwnerFormCenter; + + // Dialog box Caption or Title + if cbCaption.checked then + td.Title := edCaption.text; + + // Main Instruction field + if cbInstruction.checked then + begin + // Note this field will not transform \n to #13#10 + td.Instruction := memoInstruction.lines.text; + end; + + // Content -- relatively small black text + if cbContent.checked then + td.Content := MemoContent.lines.text; + + // Radio buttons optional + if cbradioButtons.checked then + begin + td.RadioButtons.Add('Button 1'); + td.RadioButtons.Add('Button 2'); +// for i := 0 to MemoRadioButtons.Lines.count - 1 do +// td.RadioButtons.Add(MemoRadioButtons.Lines[i]); + td.DefaultRadioButton := -1; + end; + // verification checkbox: probably most used for 'Do Not Show again' + if cbVerify.checked then + td.VerificationText := edVerifytext.Text; + + // Expansiion text + if cbExpanded.checked then + td.ExpandedText := memoExpand.lines.text; + // these don't show if expandedtext is blank + td.ExpandControlText := edCollapse.text; + td.CollapsControlText := edExpand.Text; + + // Programmer defined Custom Buttons + if cbCustom.Checked and (length(edCustombuttons.text) > 0) then + begin + td.CommonButtons := []; + txt := edCustomButtons.text; + if length(txt) > 0 then + begin + lab := ''; + inquote := false; + for i := 1 to length(txt) do + begin + if txt[i] = '"' then + inQuote := not Inquote; + if ((txt[i] = ' ') and (not inQuote)) or (i = length(txt)) then + begin // have end of a button + if (i = length(txt)) and (txt[i] <> ' ') then + lab := lab + txt[i]; + if length(lab) > 0 then + td.CustomButtons.add(lab); + lab := ''; + end else if txt[i] <> '"' then + lab := lab + txt[i]; + end; + end; + end; + // Common buttons To be shown + if cbBtnOK.checked then + td.CommonButtons := td.CommonButtons + [cbOK]; + if cbBtnYes.checked then + td.CommonButtons := td.CommonButtons + [cbYes]; + if cbBtnNo.checked then + td.CommonButtons := td.CommonButtons + [cbNo]; + if cbBtnCancel.checked then + td.CommonButtons := td.CommonButtons + [cbCancel]; + if cbBtnRetry.checked then + td.CommonButtons := td.CommonButtons + [cbRetry]; + if cbBtnClose.checked then + td.CommonButtons := td.CommonButtons + [cbClose]; + + if spnDefButton.Value <> 0 then + td.DefaultButton := spnDefButton.Value; + + // Footer message + if cbFooter.checked then + begin + msg := ''; + for i := 0 to MemoFooter.Lines.count - 1 do + msg := msg +memoFooter.lines[i]+ '\n'; + setlength(msg,length(msg)-2); + td.Footer := msg; + end; + + td.Icon := tiWarning; + td.FooterIcon := tfiError; + + ButtonChecked := td.Execute; + + msg := ''; + if cbRadioButtons.checked then + msg := 'Radio Button #'+IntToStr(td.RadioButtonResult-199)+' was selected.'+#13#10; + if buttonChecked < 100 then + begin // it's a standard button + case ButtonChecked of + id_OK: resname := 'cbOK'; + id_YES: resname := 'cbYES'; + id_NO: resname := 'cbNO'; + id_CANCEL: resname := 'cbCANCEL'; + id_RETRY: resname := 'cbRETRY'; + id_ABORT: resname := 'cbCLOSE'; + else + resname := 'UNKNOWN'; + end; + end else begin + resName := td.CustomButtons[ButtonChecked-100]; + end; + msg := msg +'<'+resname+'> Button (#'+IntToStr(ButtonChecked)+') was clicked.'; + if cbVerify.Checked then + begin + msg := msg + #13#10+'Verify box was '; + if not td.VerifyResult then + msg := msg +'NOT '; + msg := msg + 'checked.'; + end; + td.Free; + tmsShowmessage('TaskDialog Espoerer',msg,'',tiInformation); + +end; + +procedure TMainForm.Button3Click(Sender: TObject); +begin + tmsShowmessage('This is the Title','This is the Instruction','This is the content',tiWarning); +end; + +procedure TMainForm.cbCaptionClick(Sender: TObject); +begin + edCaption.Enabled := (sender as tCheckbox).checked; + if edCaption.Enabled and (edCaption.Text = '') then + edCaption.text := 'Test of AdvTaskDialog'; +end; + +procedure TMainForm.cbContentClick(Sender: TObject); +begin + MemoContent.Enabled := (sender as tCheckbox).checked; + if MemoContent.Enabled and (MemoContent.lines.count = 0) then + memoContent.lines.text := 'This is the normal "content" of the dialog.'#13#10+ + 'Notice it''s in relatively small print.'; +end; + +procedure TMainForm.cbCustomClick(Sender: TObject); +begin + edCustomButtons.Enabled := (sender as tCheckbox).checked; + if edCustomButtons.enabled and (edCustomButtons.Text = '') then + edCustomButtons.text := '"Custom 1" "Custom 2"'; +end; + +procedure TMainForm.cbExpandedClick(Sender: TObject); +begin + MemoExpand.enabled := (sender as tCheckbox).checked; +end; + +procedure TMainForm.cbFooterClick(Sender: TObject); +begin + MemoFooter.Enabled := (sender as tcheckbox).checked; + if MemoFooter.Enabled and (MemoFooter.Lines.count = 0) then + memoFooter.Lines.Text := 'Sample footer Message'#13#10+ + 'For Example: If you do this you will loose all unsaved changes.'; +end; + +procedure TMainForm.cbInstructionClick(Sender: TObject); +begin + MemoInstruction.Enabled := (sender as tCheckbox).Checked; + if MemoInstruction.Enabled and (memoInstruction.lines.count = 0) then + MemoInstruction.Lines.text := 'This is the bold blue main instruction and'#1310+ + 'can be mulitple lines.'; +end; + +procedure TMainForm.cbRadioButtonsClick(Sender: TObject); +begin + memoRadioButtons.Enabled := (sender as tCheckbox).checked; + if memoradioButtons.Enabled and (memoRadioButtons.lines.count = 0) then + begin + memoRadioButtons.Lines.Add('Test Radio Button #1'); + memoRadioButtons.Lines.Add('Test Radio button #2'); + MemoRadioButtons.Lines.Add('Test Radio Button #3'); + end; +end; + +procedure TMainForm.cbVerifyClick(Sender: TObject); +begin + edVerifyText.enabled := (sender as tCheckbox).Checked; + if edverifyText.Enabled and (edVerifyText.Text = '') then + edVerifyText.text := 'Check Box if you can read :)'; +end; + +procedure TMainForm.specialButtonClick(sender: tObject; buttonid: integer); +var + td: tAdvTaskDialog; +begin + td := sender as tAdvTaskDialog; + td.tag := buttonid; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/PictureContainer.dcu b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/PictureContainer.dcu new file mode 100644 index 0000000000000000000000000000000000000000..73238e685403befd20d839aa91fdb8e95765b4ce GIT binary patch literal 32143 zcmdUX3w%`7wf8w^US}pJPa!4!1f=)Us;#}y)?VqA7DQWU#Rf&^{@31TpE+kH=)L#% z-QVx~qMLp8UTgpN+H0@9_S$>S%=MBq>Vb`tbk)%7b8foo!{19vR$Ztm5)B8+J3Au& zP)8vA(TUGJCOPMJd6rgJ*Vff|>&ohTCx2^>vr9#VPZaH4X$`gY6_vhvZ}oz5VohQN! zzkKrZEg3qXw{lI?-`4%^t(h$?SBSd#fk>6VyR{s+7l@E02o0UQpZBOXU)0w7gMo5? zTU+J&ra)ID)YDAC9l4g>_{L!uZWmIWh$Fs9CsVVKDFhHx~n_UM;~ zTO2+pA<#{aYFT%8sHG#&j7gAMJf+ZPupAQ+zUIE?Zf#LZtGmnF{N3Fbp1*SvN@cwC zi^0Awlp3L)vhJ2&&->?+goew*0e>X$26d>FvbMZt))ei%mYmWQ(Hymr2`!p=Oed*r zPHBoFTklZ+(2~wEnSMJreAd7G{h*^^eq(h-G=Kl5psTJk1ak=Q_-o#yL08q{%KFBd zhFjj=-y5{g+Ykxtz4Bysi>s4H*vhyQ%~#QQ;a-O^BVKolW9DXpQiZYfnAI(9JL zVyo-y_Ij{e@a`5~QP$kNI1oHh{jGo3AYc3tCb+F4z*XUxhgrLmb?9b1HDX?s zst~JIYC28ia(`q2Av86+u!O5Sn1)*1Rl*#XUiZQ0L0cN?XzpCsjfO!-#nOd~D`+ud zz7}I`N8<;^W1(|}vwF3vuB@iAp`ns3*|hm>ovZw9Wo>PpP51xonw>4_^J^<>Z?9dr zq_S*YP33nt{u$%pJT;w7cRu}{hu5@dyxiD#CPk*3>Wi{w9Jq%FCapva>eYRuNiz-3!N-v}mvq zOhI>NG~5(;K7H49E$+n)w=XWQC~GL&^w7TzwK%Inb>%yvt}WUo*Yw)TI;_v zP}AAb@|EAe-M~x4w^|Kd+0?Ao2D-cbEdf#)O3-a%B-F+f=r(Nb=$FziwRpTn`I$S< z)V5?9MK51(|M+3SBQ5U6t}b{2e|I3Z`S2|*PRxFtzxzx>^~2(MY+vos78R?WIlI$) zmfeMUW6PEaff;IOg>5w7?H!mDOmC@qj;dZRlNZ|VmcKoCz(;$%V?cDGJ zRpyJz6uo;L6u157WR8>#^gZIpN!8NdNJryM20&KfrFDx>!rB5m>4_ngi>+4l$5?vx3c-A#w!j4vtDvDg z+8ya^w}@ZwUmIXf9j>~g`KL#MFohJZ@`|Ugh2s?)86RrP#rwZQ#%!&<`BvG`*LdL^N+av_ii@_H0?7=&`&r+7Y>*D3QB-Dj|>qB=19-~^fSM)e@YTafN zB%i7Ki3bzNv`(89k8s!Be)yNz-}UMWXmTsnz-BljtvnnHiSTt0FsF3%4tMh4&yZWM zyd(F`$C;Hd79*&*bzJF1W}dtn&{&a>`!=d4gEs2RqLEG-(d|STlc2COBOUlDwgtV3 z=oD7)mdOUvV(k#4Eo0%^TB@flmp4Owd0Pl3voIXOhO(Zhv|5v>%i{GGL*#eptZT;z{bYZ=cxxZLLMKT|!q zXx;}8InGjLqGQ;l>Hg%e4BuF$ddu>+4!jj~Hn8dW;DNe3OzQ_aV%6zr7*rd|I+|KL z!`+|#{joul{KUiwX@sA!?&@y6zCMDRpXT?+0wk+}Ru_6k@J)m3&d=HK1Czi2GZAa3 zUv~rP_47DZo?m$8Z{)b6;qK1xpB`@?~id* zMR-c8VO2l4v!e=O4uZvSgjPMPod5eNOL4xe?Tq3Qh>oxKkNqbfxL8GP=UQI5;jtqd zjHUw579P9_YeL^Qg=z8)VDP$&Q?0gz8=y#Q5slem-c^B6OKT*T>WzI-K; zeI6v=LoG%pcV0(kb}#swnjOB*a67+3a8+O%>}=r$C*ojStg^cW7p>8?fn{_zqgLy; zz1gQ8{6f%G&7;6ql)tpLjOJtFH48hc_yx<2w)cPElCiK2_Za?Wz3p2|9>{H)m2z*~ zD@nIMcmFSyrdf&0UVGCl)3woEC?zh6HZ{#MUxGY^qUjdoY49d4C!PmUp8^`-K6GN< zHQlzRS%xaosndiqvQbQ^V>A&H3dy%OO?1_k-F*9!%Ek9d(m&(+C@4t^>Z%v$b#$eK zI%%S7ab-;ToT^J-2?xT!`4g{HC%OQSV5S*$XLy}wV%n-MJ=S3LZ}WO> zN>+nDk>W%$AW8n8th=&xN>*Jp0e3K$MHe}sJa*)^Ppw9qRLa?JUw3cYlq(u4I@jSE z&fm;#D%kQuv(L#71v;kW8bmsn(N(9QSA6eUSJ#wL2|C?+w+ZS6t?KV#Q)}!_En!@k z33_qqp$8(9aB!i%$u#*H112afIhnIonv$7Bfkfl(u^m`HDc##p)lgfbYXA+#-Tp-O zUD6cITn+9yu^;`kXHt%ZyWHQ@8bFhC@BR9jP12NXa}!2GyYx^0V@2;IoJ6S?wsoSx zoSidH-6Ku$Br3tV^jPD=TSy*V7CJ6mVbEH3{1Mh;7%NX(B{dV zU1RQ(rr=^le3m0lM`-!Nv4>vTN+U6d`UgE|xaya?_ufw6x!Two2>)9nL3e(l5?eZDBOOn){coGPAL;x8gkbGsD&5WWJ%3c6G?gYRE0WiuUh3-;; za6cienC7?~fb8HBtiD>SuCBOUct?ylOS-c-&w^_5fIz;Rko{LYZbo(%xLUc}gu|F{ zuE5!~w!$CrqmXmDz~0pzX~$#paDmbq#t2491@8HwAa}SRl)OA843bnVOr2MA9iKkHWdK5e_K`Gh#n2Ig->BSDY4sw5y z=h{1(V6e0fbe5yyt2vk)I| z@Xt>%#tCYn3vGnx??Mx|jptI@;#9;8AC?(U-jf~5JnAW*FH1r%YMeV+^>J9VFH6@`5YpwD_g zp?tzzr3;u;A4xXdxVQ#ddz64SJ1m287TTiWHq3!KTwrf(T~1Ni4)kh)USyF{ zI2IhVx>j}K5#AW)b74CLU$7^-AyocHzB3FcF~=67U;$&3@5Lz5ryr0L0YS~yNePdPh zjn%Gitj+=()-dMIL($1*(Ytk}RCmv>_US%*BlUbIZ57HPlFQfynUDqYYD|>JqsI$b`ml2JVU5y*f@49ecEnxnMU?!yWT_{?n7>;qkL*p1V{)DJ$^2kWoL(E892}!jmQfx+0 zBy+K|1Q1sTJL%{j5s@hGto{s6>Dji&wixmM7AGQi7~kU`6*~P3*Wpbw81HrD$I2Mi zmUwXvb1NJx5yWpLusaaMo3PBMfJLIYSrl@Dfo6zuAGIEM+}xOs4lDIWtBY;0N`(7T zhTS6-%H;YeUq!iMTFV}(>CWOTlYs0R1|1Ai2isiM9txE8orItkC>z*=2Yp6`pnMwn zIK|0}e@p|sKElfxFbj;GpgVw%ut{Tf+Ti*}LZWcOanc%gfKvOhAv35DZDvz5{$#csqo-`oR^2o^v`r zd7y~`e}r*kuS~$tAowB+I<__TN(*-}iIZ^;P0RHk1DsgeP{4Eo)&|T9z>+qA5e$m+ zM-K}(1?~vbUDgpoh)K3`J%P4vS4^{nqZi^T{p{{Esd%|S#G4iT=8An{&)-o2))%j= za7#}PJT_oh&Opi~Qix#;&?S-?!?;A+LKp*B5+)GC{0cpZdo<{B4h=IZ0P!}LNvMQD z_Y)#rDvg8)fPMjRr3JvE`aZ(I8Os8})r}pNyJi8CD_|0`da*E|pFh9ztvjT=?E_m4 z{cJU_hyk*O9Smk`ym-t=FvhgKMNoHbS4>csownTqGJga}L-BtiMDj&uNW&L7%Zw0! zywE-YIg*rE4f^Hie-LKTR?C1*7Hf{Z+2D@~*sDg66tGMNDDo8Hs@tcVL^VQf*u`{G z5}4g0$UNo%}%BiV1qqFrNn#E5kHFgy?XSmwqr_Y#O~lOe~G336hq^NRU7oEl|d# z%4PMb-zKDd+twZ{5}nR2?@|i|yh)itNL`oY_;(RD!dnxxDU{htq0B6Sgm(eOow`7R z-7KM3T{}B~^-aQBWZSNq!9JbvcdDmAS=&KVPd>j)z>fbo*acw#KSjVZw|mUECO?XB zbi2Grz>Od!#+#7xTLgyNB{Nte5@a`vD+Lz4?~IS{?_zJ_K@fWTTe`LI!N;VguPVhO zee5UEUsj41ms%z5LtCY!ZnH~mQmvHrs2zbUK4Xwd z@G&0$U#g#%}3AD`Zs*d>a!T%mVqfa zN9?xSKaw=bIvjX-S>7%`%Eq%k?se&*)_%LBTy)8gZ)0Rd;NcpA{65iNh{`|TFFNB0a5Mpm342xD;h)?4Z8uV?p3M4SfVD}tEeTiC&x@fYbp_m+YFnxK1l<7GH1 zfu{LEJCQ_NuG2!Gy)I~ar_1Pqj~cE4@njNlxgc%;@suEHyhr}Z8=5McK|Ld=8JtS* zGR<_G- z!IWjfVTU=ubQFRkUFYzo(Wxn6$EUL$wA!)-nZ7E*CtDxP>CH}gJN7NX;5M%R0DXEF zBjyXDCR&p|h`!e;Z{04B6Lb}Hw(PLZv(`8WxKPmCpz%vL5OX#%;zU8DhV0@Dw7elk zn=EKGX}PVVPja5)8%!f@hYKW}s5=WEec`zCZ%UWQI~LI1CiS zoWN7fcxnX?%|ybJ5r&Jjy~v zkf%9tmn2}F{Nw_X{fwOe{eq&2OL@9E27Ss7rn`WkX9zk;6-RyouQ?iWlvLxRW7wiW~Ffct=nYn$M5uoVw5U9Mf&?2Y~&6v2hm<2~MA6{${73r*S%4;6y&p$h!oY7C-BY zXfiYK-Gau2AfHaebQW_wYbDZ^G!Y9KagQL{>BgJtN3$ihSFfL@ipzb_^zolJk7}P_ zbeo5ybDlJFzF=@N>DkVzNE+AF3A0%ouyV3}*5G{I%y~#~y7Xm_OJ0Rr&1BasY(v6= zjtWKxSDgp9z|6Rgxn&dEF~OE@jSf7L*Us2qbH8S?rdI@eW@0zwUeY6VI9Y>qPdZ+z z5n{Y18ssDz7+%vOb*Ze4+v7I1IU(9)nc8qK>XE`8*23X&m|DCpT9|qTP)V+54`qReb@$XT`uwsbHU7{Rm_5dSH2`O}1JkUwDc&?2UUpFk2J#dX+ZG zGdk7kUsdK`-_dE)9CRA)E>)zja$~q&twzKxbavk8AaQL-hMKOD@4q0ZX{LiFkteeL zFA8$H<(iNf@>SZQJ`@Zt{jQ5h%NewsMsZAUoU3FDBJ#=E>LC`9S4d^91NNJ@HcXOA zG@toMgEPQRCjuPSc1ye@%ctu^+___5t$V=X791l-Ne94^E?6!XC7lFQwqP1DN|IfO zas-DN#;^wjZG~XU*O|N-m}KjKPH$sQW}LyHk4XOt3I=q#pK%llj+}&{n1+3N2jiM3 zxRL@3z#L)>lLdnj5*SMaJo^~WHG(HOumHzy#xYHB7$~M8pMH(;%o02f_NfnopQFGbqlLjB=w+F~t(OW&8wJrjsnTzR1OFy;7%5vz&iDQqOq4e$%#@yim1Z z&P=u)kJMVgT}0XrQ-fO3z`@>vhZB@0FgDB${tzJv23R?JHJ(_C5-hNzM!}M1das?> zCMDR|6M`nes?z(}^ujyw6({)6<4VEfAs+rFJaJ7)aGgdVCAb(8y&g|IB?%rN1q6?s z-gGB=R)Wr+w#y;Glfl12AzpGPZf}AcM}~I6shWAFCU|tjHGW7@(FWW%Xp-(SG^veU9nZJrfvM%?%7Sc~+ubW@8xqJ^m!!|7q) zU(DL%r{$a4?A6=wO>SVN;=5i^kFlM9wlwvqJ?nj^6W4iS7sHTx@^HJuS`EZY?7jv} zCvFD{aJwTa9X@(H54CDBE_d|WF-VPD!dQ&{nuV6-z~J$Mn5spml20h4-82re6q6Hy}%17Apc!Nl~s z&ct=NwO#S8R$pT(oFmPC#Xjm?2`Y5@*ryWE%5_t5CB&L+#T_A{CJKL0fBGm3Sxy-w z?4p8nfer4AAkobMgWIgwrH@XqaOEAHC{#&-%s#Hl^P-&%Ar#f`;IWgacJj|Th;oXD zO*$nJnmx%wv!m(-lMX)=0OsInHxHgP3ZAy=!PA2q6yFJ1eVr-gI;r)9eas(J#7<5h z3;i(ot#=@3Vr?Fbd+CTH2&ZScDa>>W8ikqq4LIqn%uP{XxZYdu=03(f6Uq+Exa8DYLovKZlLH`~+430QOJ*{eu-g>DLc3w5%tLm1CiZafZc zmgx*JQLwp$+%QFcb|`bNG%-%r8JjBTKKdbMteNq6{0mQ3;5r3&^B=@*=WV4JmQ;qB zlpdFq4{bGgAH7HU`q(O}mOQKR!WqtF9=Z!>H9e~f9qdyqOYHz^+2_T2Egibif%>7X zE%X)iCD~HGY$6jJJMJM*d{@Tw{TR!4VyxeTF~0jEzVBlGj!Vi%6C{8-()Uv&Mb%%t z5Whbq(OaAP?@y6{?2om-%vV?>IR%2+uqGpZt0lEhS%1$({2&(ZRDdM<6`q-W`9-p& z^sB!%V*C!4lz3A#QD=bTfo^_3?(Yr|>3aTu`j`CW8&ZlZxiTR{%Dh=6d8Nx$AeeI4kO%ydOcy4L{T0C*^w`D{{3U<1xxa8WXI;!@jmDH40PZ;LE zw^8`DK4x?M|Buh6ufQ=?naV;(Q<REF0=ma;hO`N|tjn_?{VoD@#f_AcON3m=Xb- z%t^|Y^pi2_{W_g^@YhSrI7c!L#wd|763K+ndxc~<7lRrD7bO!HtS@mS2FqO_QxYui zV!IwKnNP&j4gT(s@TmiPqE&`3gK->oAVv{&Y~>LNf4!7ciJyn@d>_cj40#FZN-6m$ zjLJcsk(lw;Ug6ACQ zl*~K@lI4^OE)_ykGIJFQBswLK4SX@Vo>%B{NTv zfy7R<;KKCBDVez@CL|Y9fn$FX*Q62M{d3@=WX8MN?3RrKEc*Tq7%7>Vi$`|%FM*Ac znRT)mcO-Ye9(~wpkfuMFy~JIJsq+8ABj4S1@z{o9`PMFp;j+{$(>t}Lx;P#qXqY_W zF%KCa;)DtcwyiiNGlwkkqbbN)AW<@t6^YKIqHltyKeLj0QO4FT6(Id@{b3^6&_?)@ zGE>wD^$C&x2fOB03}p8I)?kuwQ@=mWhLl<@MugA*#oahA`si19!Ze0#PD8FiU-4ld zhUn9W=$m;5Xh(drDLd@*Ayvvpe0<v`!oMrnzs>C5pfSH&_GfPS2?i~udw=Hr|BRx! zv%$)9M=IZBim5ycY(-+3}@X@5a9tX7;~9e7yPMx*?zX#0?Ea_GtPI_M#QbGW&i8>RA;}L(k!9 zsPQirgrUZFEalkU#kyhk?RWIODxq&~r$dczTNryc{^epc)VuK=d$g%{gxV~IL8<7Y?5x{I;83_4#EhD8ijUSfPA zuUj2AX#aS*e}6P@-%BGI*x9jt8!wUhWx-#WErO%zE~Ks%Q@{<58E>re5;w&D{gJ$V z4I?!L@ZD1h_?eNYGxo1ozPx!bt92fPG6X$%hPpZXSA%*xsA5Dq@f^HF?9|GGh$HL@ zHk5e$(`ZvJbxKjZSlTQVNF8{NAoru(hUX?cMWg^~+VO8YYQoY6l!EN3KnkJGFSUS{ zz#MlO%qFxA7_`R||PVD8U)<(pcROVQ;x%Nvxtstz-YNmEhApY1s=POn~JselA(>)W^#ZDjB|6RSamMxAQ9 zH^mbZggVyc$*O~Uttcu$?>>m`6z(J;MBj^9D{05d{6T5S!TLq9 z%~gx7ycEMO#5P#5uFht&g$5?Hk(p2!$?}y4>to0JUyV$FTVs`%->NYL#(KpFthXEl zhAIR*s0$yvNO8$(kC>w+tOxjy>ZPdsh1vD!<7`Td69YIHQ{#(n6(eX}4WbyV$unRK z)ZdcWxkalzJHaFEk?;LE>qx_)sRQd-0~>NQhSL9WBQU|hEG^^ z39M_Au;^0IiWR9P3t$RtI9t|xccm1W*n786iq0A;pDV;TT<()&|6-nov$-a+sS{%k z3LwN#gV=}?@i8y=9a_9_|!VA*y7Q+wLOLL@a@gMyO8j0(J&#D1kQ0rm4caiP> z9FFGYSb0ypemyKM*!SE$)HIUCs{6L!IsR}j{=J1;S;|~20*x<~VBe4E3@AmiNvFSx z_0i!V{_p_)HO51sdGc<XVYq=`#AD?( zeZ%pHD|YV8d%!gOUFMcQv;N3AV&SmOe7HZJdH+6Cj}SJ+e$Ar>uolM~wcfc!h?@Ed zF(qnpv#6>2&a?Iv%Qgmv8j55~Q&cFHirAgSu|wS2M7+d{;IvsddwYuHi_sipianZ! z%vKV$$1wum!pwdOu;C`{gXJ}`NRizfl*SG(U%?zC6ohS~ehG!c=Mc|hjXaDo@Ohc> zI|SIIh`#rwsH<<-zP9$PvZ)PdjR3LI z^WOmjD`Y-$(A?OV+%JP+NDr!n!-ySBjwPs{`LITxesJWo`u5X(iEFn12nDYOuO!apn&zin7S2 zGk*Z#i{!a-<|F$D%I{#s1E+1lzBgRK!SYq}7i9LoC1PHEiy`CbdvO#ql%!oT^M~cZ zVE_KLj?5qKKRfQfxuv3U^9YSEv%z9B8?3L==RmhaY3&$TVy-^hII1qzkE#vv`np>V z#_FnWsH@p%kC#>*JW|TelsLS?ynolXsYc#Z-n*$pir(0_sWpzn^%5M6xvBcvZ2O1o zy*Kz;d&Y@6on$b{zSi%_abFvm=fS@9Rq`f#ys8R4)(qBFQM_@@!GXGK^o`YgTpnnQ zbF{TNu(=Gdf%Fa|gkllk~<`4St z@qyGg?99A(Cm!NO{pA?j?MS$tm!3iT1JczXtwGw0#5Gno<0v$r5avu%g2Xu}V4fPQ zulmf(GxqbrzdYlpxy7`RS`@|VYZ5J9vi3n2MSAy%J}fQj67@-a^PZP8NzVM>6MR&aS`Ux-e!q8eg?)w%<&>?Ojc)X zOP7l|uxV1?KWFVn#TwPc=;h^D-@h`5m+7p{t}8t}KU0n! z8R@3$2r168Fm+FK`9--TcHHV#Ftgl;==WwzaY1;y+W)&vc|4x^&CPni&+N?i`RF^b zBeW1y>YGId!*sGid}_qXq{JxHrUwZ7aYYter}n?M>DnKWHe$aLkg-xDh>m6^s=2&;Tg_SHuJ z96QLjFn;}Ny#^hQEgdyfK8mk-^X+PEe%4@lmX&!aLJ5u8E@|k$d>x8=%aNuy8Cn!!txl8F(cy6%vU9#zOX2-A>qcz#| z5MA=|BOvbkgn2R(KRY}2!NS^qtuLc5-DZLl;}W9|vsUrwFr(7A{~kN6x7A7S>ZEfZ@Mb#UTK;mhdq6ZS4yRb`K=;fv?;4*P8=Y51zSywiRc5uB=quawKX z>`zfChyK@gqhhzc6e&yowJMKNRvrhzJotZ#hVQFG)FLMG3(9l?ne0;KS+1FKMwTqQrpo*4pwR~CaRn5(1ZrEM z;UFmQgSPeo=1r@%CZ&!JO8&hn|3Q`CP~|_CX!w$n{DR$!#;SaHx^@7?1JKnWqyxYk zw3z_UsWJfn!qndn!UU%OMG!C>r9z~?srUskRW8G0CDL-FKdJI*RenpA-$p%XqfwWS zG!AJZ(qyD-kftHcLb@L5Mx<(_TBJotjYunz{73<$5K=qR8l))F2BeKho2l#?ui;BZ z`Uo%yw&_r57JkxeE^IOjzs6M|57|(*O_d)-{sh|Wu$9O=@x046SKe*&$1;kg-)obYX6?FRwx||3LHLteRK1YLt z_nD6;8Oedl$R!kY*v_HG7L~Ilx)yF46FgH1NH^SLK(cqxUTQYROdiAN5c*|+fj@kot~l$j763q{~wR?9gk9z zg~E7c>v(06a+9*lIbPZ99M8dKqUt`R<4U7K-jkvXr@AWI4+HS&A3`=P48I zxn|5U<^mWrIo&ZynQYH7*ISsVkfS`LDGSEqiJB-2K6Gf+j>n;ZJCqNVsYsggNG{Kc zl`oelUtWeniMGb!(Kb5jlrLv!LpP&E@vLbF z(4AlLXvZ8y%8CqSdx6{zRjyHT@yo+=kT6;Zlc$|@g%%j{kR+(9(tePbEWGKfRW6X7nm6>C(L3orit}!&VDCIlH zC_(hORh#TA(Pla4Xg4~?65@@{TamJqRuD&N)lRRr+?k=ZBW-rh#pE?(f_|>g)pAvA5Ps*pFZmeE66VC;BE=5|aY)~dC4qL9)@5<4(xn^oRTwZOr zYmT-L=@8mr0uH%uMG_P6nrne}2Expqplno%lsU!PMHehV#Yl3Md^JzmtS>%Qs3BMB zS8}v`)vH{udX%}7w25jF;Z9WNp(a;p%R^RzBJZL=qsl=gL#tNt6Fo4}Jjx~8rjF5esG9PGqG`L) z)edEfaul5t{63Ut(*}^E>{QUaSUZZET@dC30;W@V-i_xA5bRk9=5VtP_b55=tsZ5c z$~qkF79H;89TvK0(sllC#l zv4pZT#g3Aet~@Ah%TT6BN~29F@k+2e`-&b(nU>-FO`#$^{Ln)eUHHPpBF7oZmOHW? z$WA!$vjK|qx&uEnphzbj_-Oz|I^|eHwDXRQlwEKPQFhUBfwB)BGO@_cy;O2I)2ZZk zR#Pe6c_WpwowFz#?VLne57^%;8#2ncIagz$()9u71jHbm7~r z5Z85xvP#!J%Bo$vDXVq8M%f})l(Lnsm6Z8iWt6qM7E!jwg)e$3(quJC*)+AEvRP_~ zvg_5Ol=Tb&VReW0q15?W=+o|F!If}GPT}0V# T)j`<-bu?v%)I!RRs{a23Q>@`) literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/SpanishConsts.dcu b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/SpanishConsts.dcu new file mode 100644 index 0000000000000000000000000000000000000000..8c95998ab6b8c919f477a9f6021ede7ef0ffa3e9 GIT binary patch literal 1095 zcma)4O=}ZD7=Cw+F}9mD#R$=QNWq32VyMJul%V-&YeTSsh7c+i-R?&+u$c|Bix4js zJQYzYf;XjSe}M-Nh2XhoL2q7)-n@un(|5)e-E0f);n~@DpRd`S>j1Ia0f4DzpKsip z`uz#yaHFSE;&duDbzEofW^Ec7Nl(@alw#!&%!u+ev1qYD6L&~X`|?fTo*9doQj zbfY1jzihq!X@;AWX!hZVQ`(W@qDpnkSRhojtp4tU-Um%Tg?3d+T=Z+7UaVpRm1;)o z>aUuX^A=kNxc~0?j;!VWRtRXhe+(j8HrhC-eaC6fS?ziaRfL$u0L(}k%m@TxGT!P? zL(EQk*(-+QqsLDmF$oPITrgt4WFN<00-N(=-hc|N8$- zY0YNt(c&bOU=1S~xW|Z>4VU$O;`}(~Bw-m-38uSv=Xj8R)|=l_8O7i2GfA98lM*~c z3+K)-n=R`ZPry?VpE@36t7}gQ;54*S;PGAI6j!oBIuG0@(~Dc>w`)7b zM3ZQGoj-rxdilc$H7HT7gAt>2!i8mpYNozKsA8If-Fy8Hs&)eHDwMeB*EzXdp^mFi zRc~JTSyi*%V(S2R-#y(C)$HF2lA8U;AgpF0_5IqnoX&#TsZ~)$h*6MWR!C!pBt=EM z)u4))nf9_uV7h&i+fmE#r$tLL8Gza zc(4s(_k1RK8OdcdU^WDMcx|qV=}SuhK}gE{$dU&KUD(luJ2RUTpuQ55zGI560Fjv> zd%d@S1`wRW$@KK z!(BG|@_lXi_##^g!(I;L7zmM|e4b;R;{}dMjwz0F94~Xsam;fpg@sZ~D4Z2avM5Jn SQ4$JrNZf>HqL_l`0LpI+x&vnb literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.dcu b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.dcu new file mode 100644 index 0000000000000000000000000000000000000000..e4b8c224c790cba08dca2b622d5f021cf4abf3f2 GIT binary patch literal 135630 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�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 CETT&Q literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.res b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialog.res new file mode 100644 index 0000000000000000000000000000000000000000..5028366a69a8e4676e68cd089bf369f31f1b0824 GIT binary patch literal 20004 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 Sxvo8XVbzem(eHWXasLhF1RGrd literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogDE.dcu b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogDE.dcu new file mode 100644 index 0000000000000000000000000000000000000000..7e74d6732d0036a5372c80173b8146acd7b3e3ec GIT binary patch literal 2250 zcmbVNU2GIp6ux)d?q15Y9cr!o6lepILh6Koi%JN#-Ji1ll%~7oM?e^6?o3CwGvmyZ zc1eRxo0!r?1NA4BEX4R?LNxefh)={-{CU9`gVtcw_#$e2@E0+3J$GlfyXztk?!)ap z=R4=S=brD(?Slw4eM}Hq@!VHix39Q)6>)q*a-It7Qqt7Ik@>lYUPk_H*5brt@o*#> z7h}Dl@%687bA=7}wVcFG9gMPAk^{oQCscPCZOcw%G7PzvS zv6qg-fKD=Gs>|uK3qtn+l(m4P{b~)N--RC>B`cChJsBS=oscVO< z_hlsjLd6W-1*O0UB_+q9PTn9rwqyAgF7bMK-{~NzDtaEe#Z#p87T3qIR6%_3dGQu$kx?oSyL1<| z56?jwQwkbr0j!eH9dfW-X%S4gtXzM*jQa>Y|E|9MJPtuS%Y`DOjV$6JoD`##kv2h64W(sV4{$0?I zO6=K!T=qVo{cR_kkbIVF|M!d`_7mC&L+5)C{Ob_bbJ0WO7((GG9`%h0^Jpy+1BF{& zXrN@j2-gEIwmaarpD^iANY3_k0Da+sag*Z}8`H{^1;XI|}O zwIol~>|uXz^BV=M<2LyJg{sHP2ULM-cd5XNcET*~+MWI-eLa08{lWLFipig`)0Q6L z8{R(qEtr>{Wh+i!N(;IEJ?S2PYL+<;KCv$wPtQ&MfE_-aeP=DW^4a^c2)*Uw5Hu$T zJwtuSMid=EI;Gt_HSf^To&a?p2NpgRE28Ys~fI z^#j?-d)W?Whx!pehVWP?9usha;6{R*2yP~LDZxC!^#m^`xP@SW;8g^-65LDhqXbV7 zJWcQn!F>ex6Z~)oe+=PcA|4}n#|D04DYt7sKi!O{Yq@nh_!*v`t;e%V@%VB)%X94l o&-w5;U&oz9r~I6VxPd#kjbrEqzkeEWXpwIQ);iw=tV?{-KiZ?5WdHyG literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.bpl b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.bpl new file mode 100644 index 0000000000000000000000000000000000000000..4d9290fb1b84b1b4e3ae71ced2535ad6ba2f5d33 GIT binary patch literal 170496 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 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.dcp b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogPkg.dcp new file mode 100644 index 0000000000000000000000000000000000000000..6f2e9b05137935f690168f2ce16d1d121d677c83 GIT binary patch literal 112914 zcmeFa3w%_?*+0I!*?X>pi=be$ND!z*f`Fi+*(4jXnj6W6i~R%Vrf=EEXsJUuU&g>XBM3H5L#4j>7+;aC%j}5{@P0 zwpDUfS2AYlmePtGSGpz3nn=u&%ET;>gYSf^UpeFK6Fz(Sy2&+`qOjjGE9tk4+2DtS z+<$FKB-59Y>JsrxScyw1i{+zBbO|p9Yb;|Rp#~Dh4kXH(dDqt0|DrNrgd`&K*?E$)mfkwmxD zp@Uq(ct(vNo$_I^&{EQ03%3g`swzksU=F?)WT$M4XhchLq()! zUirucvb!dju8W1!>BB!+H5E^O{`A|emnZSm3G?{V^7FOdKSj52T}ldPq}M3Jq8i4_ zA#-OGeJGdLsY!^iC(B^Lza5mwlun)a}gmUulL zyfC>}E~())&_Iq88(=VdpkK)_`q3)ZA0N=_o{<#R)FzG{7mPj`o-L#thX#4L!d@MWbrI?hFSf+)Hfdei%aNSpA z4)Aw(w@cBNg5UnLD$<`yg$L?lsZV!(V}e>Wc)H-e@0=aAQ&!5o=TxJ5DRuhO8jW+zh60F_GWF6LC4$DBOqT>7-6VUPS{Jnimj#+SmOXR{iPxT&|Ad~M&3&ug*v1A?)k7T>TGJI z(o@GIyPLzSq^3k%{`$-Bg!mKDUF24di*&o2rF1$hOJp)U!M2?lCB_Ws(R}XduN8hO zd#kkP@2)!7ESG7IRlL3Z>&F#0%AU?-5<&D*>|)d#Yqm@Y)KI7gzR~@asx4Ea#i3@YH<22E7%ANQbmM8g(V|dGBBMkH z0&Aprrs?uiy1>EFKOFnki_yYRo0Li`=;h;?rxtzvR8)Qwo}Rtz8+S&%p}ItG5-lg5 zx$=t5KZ};)ITnL!pwkRuSV(m|I28hPU?em9&*&GqLRIyNkd*30OU+0Rwe0%2T&f|c z?@bImO27#MnA7k4oY3wn75`;hv|pYQqOl|u4M(JIUG1vHeNt*b!yLU~_g?wr{FFJF z93$c}1{+lI?lzQoPk!J@*~^SkwJ4QXd*sfC&OkRv#;M{K{e&Qe9Kw2J%UwDkkV+*| zHUc=S7|9Qptp5O|)ht@one2vT5MMxIYT%`B-x@NZmxN;qCy0l8r9TpStbu!JO37f9 zg@jkKInCyHmCzFnoH^b0U$ZH42G9?QqCD41{~#NkXm9}XiYjWi7(`>?ffi`KGyTh- z%agKcI;4#5HoJ&qd>)cuyj$wOjj%bHK!72WZxGEyqkW^MM_{2V=q?4+SWgN8Xc%%6M|G~NF{oCclH5MlvJ5WzB_T$V-RQPD^v>~B6k?A zc7#>X24lQJWq4`sCrKRvR~CpD2~jRMsARQ$(WsPqo#4lta;*}IH7GIZFsW4$s_RQ< z61^t%JHl%u)~Tbbj(0!yWE8HDLseIQ->K+$#X!c3Dj&J#0di(D^xS@m@hAmOc<=cjwtLj@OR99sR`kt+KcnS>Sxp$7xTVOHQ`a}{yZFnR&&ho2(x`; zcx>y-d`yqyP|w0SSx>=b-%gF!*mf9B&E*b48V4R~q2DBbHnmUWSeNLFXRaZPseST1 z?jX3Sseyy?`FaimLL_t<_vbLE4SFXbj17Zl@MgA$tNOnMI0A)5sc^DKiLgMy9a5hb zUywQ#qj6n0z9yVL=bQ&m$IM1WRUssd%To8cbyqxzVL?E%Tj_d2kJr(u@Y+x+9LEeM zg+cpL!j@`SKDF9Fz|k6zJUonGHX~h5h~tb1gQ!hrE^08GYpaLN^!k?NBb3ZYHRwO5`|aR@+8{NM2Ld z5DhAjS)B$e9^tNC`O9Z8zN_GRSaKUd;4_?%S{|l_gt!w3)G4iOq!K*%)AUw>7moYO zEzC<8i565`FsbGUb59P2XtYS^{bhoaLu+tRCBK`ixWE+#ZJ zG>tV74|m1j$%N302)>3`0>egJUQZaGkwswYF-z!BG7<}SFCj7--?(Jsz;gwmsMT|n zHtbw!W@(pJ_aXH3$1tD1icq>b@E>9E?Kv3Kx!jD!hwBNWmkm5>*=`_2nU+5gG`QVJ zP+coP;q|cbO$67gRD;(l^$KNkGvQ6D3C!2b`7DihBfyF5BB-ghNa0{FO;f%>IOXT`Lixat3<^V-0og?PdO~E^^DwPE)OzqA z)N%Kv(uvetw{%WYaa4QBbqD`ps6A>Qs{3ptt#k(trW;{Yu9AgNd0e8SC$W~OzCd`B zO9;$~gwfl7Ff9;VZ~>w9Dn_Z6C}{=l@gzbRO{Bs(n>`!b8b|+t#>fn412)PX0WH2Q zk?c#d+2z*~-<=vQVOFX~;LTw6lULWNu+}wFiopUOJp40ERS}+&X&C57tKy9aa}X@1 zGSuoBaM8;%mSTR{oan>P z5mPQ^(fyRwt5a(j=}EbyY(XxEFqlgiQgb0Y@?6L#X$c|`ryTlc&*E#&HKvthmhaq= zh(m)@#kHh#l~4QkSarswBVj}lD3(kUTeAPOxjB~9OD*DGR-h5tht{!Ffh2zj`&5lY z*C}1y8G~VJN5&K3Jjv?$>e5pU`g?WG#)`6dC^@3gHL9Vg97=Nbf)?{L5jYupH z*_l+vHG4!{@RZiI@N?qhj$J)cKGILmu5LtZQ@VyV;>hy%$CX};;kw#0N0dM2O*%`< z;4D-&swjicCHwQ$Rb!~RNhM-dpFWJtEYCZ8SaQu?3k*&te2Haw&M-3gvI!MCS*;7v zmjed%F+igB_s1L3h{^zmG?ale=Ig?8%8=zq`FQFRYvVNb@kNZ9K))2}Gd7v?@)RzM zM{lnqasGxp0!eWehU4`UR|ny`oWdIf?vZoUkxqTL)~EFGitHSbEVja&SI`hcM857m zS54~L=>=C_>C8z-D2LvO#_~!@@wZj^hF4u5z4?e$IFi+W+G(oa=%I=jUH$=XX&dAk}!o0gJC9Tn|F_`VtimK_z zNJ*V~L>aVT)-!Sz7=Woo9R0k3pE`)qg-$4ZbGV<+N;D@JfyKbY=PbH*Bj94%g_K^_ z+_{3onIV{76l|bnI6b4``~YQQ8L?$rovmpYQ}9J{Og@uc32YdliBp&vKh>8`^(h$F zXNkAcD_63Xm9J|z`Uo`_TJp{#voGDJU0R@^M!lHYGE%l>%*Ba$w^kv)j~c#wPjU% z$}rlXscDU7WR6UO0Gs7guAF85Fqw!Vi+3r(dgAR>d-(^0)Q6XnfDJjYLLZLH`8^< zHz_mLS5`PMJh?h4<0Z^D|1wG+(fn(A&6NJ+l+)&@y5|OU+FB7a!<0Nutg>o^HH>lw z7d+zSm^@2hBCgb5TyoJ*~YtIKBEOw-9+-08U{AZxNY1f!djN0>&z zH5=TThKga6NG36#HM0r1;K7S*pl34k71=<;#huJ6XLfFp#gNG7ZcO6jJmof%aiLXQ zXr6^7qK;7mQD!1(CVh@_8|3sxP3A!lS-~K9-RB zBKib-q|(*wKX>JlK>L*z%lEP6Flw>b01LLLFxrL)n5ELy9%#ye)i%{gXgj?-0QeOSwpA8&C2JEIYywf~U*iaSWwAgAmNz)YS?TUd)}e-_ z6y&_cf$mBd#3S2>JGR=3NoH+c9HwNVE;zYnkYCtk+BNI~+5{X#}RGz-a1! zc&aP8%Q0h&PQ$`Z=KGA|a8ctwQ#*`OOwE?jOsm;@ZRRG&RBVGW_XM|75iLvhm#-=P zroDX3cE^m;EDFXy>9T@7{Z~7t7FUG~eG_Azv~tI&i%VxY%ExSV%qTLV8Rr>S{q(VQ zn;lcjO`NPtW$f>N`22S-DSZU&8yz!78QB>PlTm!qzs}#V-Z2$>pD1_M!!zbH?l|qu z%SxM^2*vU zT_sTZh{pJDzax44m8HvEp6eep2c9ocE^b-FAT_qtSxWx$x146sN}`cvSE*SHW@iRnx|sL>odl68{y5pAsH@i&4C@!qvlH@}aAm{C0KOVeK!8A7s)0q6biXvK4{HsuW)(U%81-bk@xJCZ8 z-pOpQS-Hhh;YNviS$s~?@!ZqPV{dwNS2*HrO8+v_xrqN>PVlk{S2E6+IL4if>rCUJ z;Xa|^Sd)bj*s~~|w7e8rp5@(XGkB4u!ijkuzVv`pn+0MH3o+xe#qjJ%&IZV7{PIq( zL5|ZPC%Z@_*6LE7Gebww#as%<6#yFn<<2ui!0`vBxV!D z^v@q!%mN|CTtMUOmqc9;QJao8iL#(~FliJJqI`LaCnon~5fXU=L|*rrNu<+%@5W+>myiTvB>WWL*^H(r`&EtZaeQW<>of$X7f3aTd*EEd+phI zNg^+^&uVKOl*MJp;vSnR3yaTzP3L_Q$)rjf5Ms=gCKg#p%H@#q(9lvg3n^x0wB;TW zvl(I@AEv^#3pu$xCOJ12ph(h9ko2344pX_DzJk6~3>D%2sKVaa$$!3&0`3wb%`Ps& z2_E*7)UA;E;wdJfmdVZti&|hU8(HgqA#9SVf;D04D-{yA1>*j4hN)MlK4G_zaC}|~ zEYc$OE5QE#BPMN7L@AYGMTDR|LQsBHL@Y(Ju7s>lt4y-cRJzyF<|vfxM4Qjky*89! zn=9$r4)Obh_$ekmMK_bRu1dMwj9f<9O0u$X`T1%t_hh@z?N@h~PPJI3 zlp)JkM3$3HS>|0FrVPJ^45w#jIN6lpWJ89Nb22<6GBnqPX%U+;T8E7MHpM=8=Z}Hb zG~im)0oSGuxOR2GbygIhMWYJ66udax>iA%8HQKs6<-HzxFSi}CnFcVoVc@YrW*0W8 zTP(M}1DVr>Ompuk%0zDfNbDsLyV~}!W1DF_^H~+rO&cGXq7~MQP+?xL8cUR^MJrc} zHbyPlxQc=lFWUGDTQmdKq6+Ac)9gw=)7BxA$Q|($YxU#Nwvk+shUM7RyE|Hu&A?G>U zw482YyWlm4Ui2P|*uDw2gSLBya0=LGhmesce|mjJg6@JKYr*84{O=aLIc}s)L5ck; zuumu$Cc3&mzbp(fCRy7ctGd8#GN~A?U{coq?iQlBS=fw9{rG{Y^X^4o3>NIRjVic# zlQwDCAWM4lf7+ zMs=u*l)6csE5Scdu;msbJ54$Et85odD}bj~lv!=Av37fj-D~k#sdJ>Xi&C4RoqH{j zRny80in6VSl+9LTv%O%u%bZVztv^9B+!eL~_QQ*uj|hc%wek{+865u@fh1lIiT4(i zZ!s#45hE?(Q!Scs*l8^Ec&PV+^^CG8{Lps{k*v!gYfr%(lPtI1Qr3~Eu|gCd%eYz) zrD`S?sz}@>h5v%wq}FVbpCOVhw~ue-)xV_Mt>W+Cm|X_g`jdS|G3)qI`Bl0)_(9G+5Wt6cz-9 z(0nQygMuxPyTIOJl1l-!L9QW0up2^zsR$8hyk0J{;_E=<_omN@$Po2+j$gjmz6lMo zUu%&4UNQal6@?An0xPd$b9yGX|JbzSvX*r4u`S!-LxSrdSh3q~G0LSuVZC5BbzE#s z2A{vB>627qpHo-#&yDtFXxbYzy*3z|_GTt$!?9@-jll?)qwi@VQS%^bhrMR!I)fzR z%#f97yAWrZ8E|o??NuakJ|sS9|MD$H-7x&}2m@u@C4`wmKQ7F$^@~KE4pC3rC)loKnUpQGN@bLyuTpJ- z6u)B&nu$S-=8itEzK#c*o%0ATefL-+GcDeTgW$jOwhJt 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 d`MTlzWiV0%@)0~|Kz_lL-Me~_U`WO&dv-o zH|-{f6e%JSrG8LEB&ZZAA|fJEL`3{TL_|bHB^C9_`X_`My?2_JX6;?ye9AlwmvesS z``mlZJ%%xq>o<%&PhT84xaZFm!|Wd}+fg&mZP%|CoAtFH?>(C^4ure5P=~8w?JxQD zbkai>EiGLfF@sKg&>WN|43;P@M1r*p!>Fexxo5k4(H7kIE*%R#b68Sxr#&uW_Gr;| zns%Md_;&T&%Hdb*{Tq}y&)uNWsKQG}Pwy2EIPCgOH)mNrKOq%4EVW70*iCOD)@25Y z+!6C3%lV$LxyQm-Q(q~tJsveAH4;%wq9b<5ZBIlnH8DNNy{dmw%O@H0oZzk=AT4wS zB+CoIv{&=B9^_m*ikRMjOyMMVy8vV^c_hLGodr4++ChUmdK0Au&$+*HTnk9fwaX3G zVp` zmRt3;8WP>v$)klCb?LPZlzsW&j1{MKfIb-luX__!E`06PZ|n$#D`$}!M~xjPoPW-} z)mWNW**Z7dw>jtJ$dpvm$!<>M9w&R%0467UjcGdIWVepfK_}ZeJ$F0Vf#Aycbgmko zmXrP0{Jg>07yI^WUuJ0Z5EJVoUrjUFA1*s(7-};x(gUX9WYQZ8fLaMQSi56Z$8NBN zxol=Swi?Nfztr;Ds5)?3-$m4oklKnN?5hfLr7TIOSq+tTM4%jGKAX+Hxh0p+(8(&a3|p|!rg>@ zg#CmO3kL`XGZ-a|6Y_*f!W7{?3p0engd$;LQfPw%3 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogRegDE.dcu b/TAdvTaskDialog/internal/1.5.1.6/1/Lib/D12/TaskDialogRegDE.dcu new file mode 100644 index 0000000000000000000000000000000000000000..f42152228afd4323e6deaa615d458002c1ca6640 GIT binary patch literal 715 zcmcCyU=TUY#K0ikd)LZN`tKbECjOAb;%t}9#GL%}pwx61*MB$dr!lbE6mW<52D`Yr z1?zeGIX7r7w_+*~MpLO*kXQ_oVMt*Mt}HG|&1GOG;=C8zKp zRJpiVWj z$)>2D=Sen2_mmJ&4T>`*l1(w3B9m;+q-W^Hz`(|!!2$CH&^4f-XHXL0U`W>B0mnvW zRbokIejZFJMsWgAZXS~c7M}n^gn>aokpraQp9=#A&~SdBNCW@>|NrY3IDlkx`np9y z^g|?^GNn@>LkFbjB}nM?kJ!V_x*!(g z;amv@9s?FeF)l^{E+#219wRcCKg6L9$uyi3=`RybQqXInVIw~ K7$!3?Bmw~1WYdWN literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/SpanishConsts.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/SpanishConsts.pas new file mode 100644 index 0000000..6cbab14 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/SpanishConsts.pas @@ -0,0 +1,22 @@ +unit SpanishConsts; + +interface + +resourcestring + SSpanishMsgDlgOK = 'OK'; + SSpanishMsgDlgYes = '&Si'; + SSpanishMsgDlgNo = '&No'; + SSpanishMsgDlgCancel = 'Cancelar'; + SSpanishMsgDlgAbort = '&Abortar'; + SSpanishMsgDlgRetry = '&Reintentar'; + + SSpanishMsgDlgWarning = 'Aviso'; + SSpanishMsgDlgError = 'Error'; + SSpanishMsgDlgInformation = 'Información'; + SSpanishMsgDlgConfirm = 'Confirmación'; + + +implementation + +end. + diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.pas new file mode 100644 index 0000000..d976bd0 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.pas @@ -0,0 +1,4814 @@ +{***************************************************************************} +{ TTaskDialog component } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2009 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialog; + +{$R TASKDIALOG.RES} + +{$I TMSDEFS.INC} + +interface + +uses + Classes, Windows, Messages, Forms, Dialogs, SysUtils, StdCtrls, Graphics, Consts, Math, + ExtCtrls, Controls, ComCtrls, PictureContainer, ComObj, ShellAPI, CommCtrl, ClipBrd, ImgList; + +const +{$IFNDEF DELPHI6_LVL} + sLineBreak = #13#10; +{$ENDIF} + + MAJ_VER = 1; // Major version nr. + MIN_VER = 5; // Minor version nr. + REL_VER = 1; // Release nr. + BLD_VER = 6; // Build nr. + + // version history + // 1.0.0.0 : First release + // 1.0.1.0 : Added support for Information icon + // : Fixed issue with radiobutton initialization + // 1.0.2.0 : Various cosmetic fixes for emulated dialog + // : Design time preview + // 1.0.3.0 : Improved wordwrapped content display + // 1.0.4.0 : Added support to display shield icon on non Vista operating systems + // 1.0.5.0 : Fixed issue with tiError icon for non Vista operating systems + // 1.0.5.1 : Fixed issue with tiBlank icon for non Vista operating systems + // 1.0.5.2 : Removed Close button from dialog caption for non Vista operating systems + // 1.0.5.3 : Fixed issue with blank FooterIcon + // : Fixed issue with content height + // 1.0.5.4 : Improved : content sizing for non Vista operating systems dialogs + // 1.0.5.5 : Fixed issue with progress bar for non Vista operating systems dialogs + // 1.0.5.6 : Fixed issue with Expanded Text size calculation for non Vista operating systems dialogs + // 1.0.5.7 : Fixed issue with default button for non Vista operating systems dialogs + // 1.0.5.8 : Fixed issue with Expanded Text size calculation for non Vista operating systems dialogs + // : Fixed issue with FooterIcon drawing + // 1.0.6.0 : New : property DialogPosition added , only applicable for non Vista OS + // : Fixed : issue with ESC key handling + // 1.1.0.0 : Improved : Reflect properties change at run time + // : Fixed issues with Footer and its FooterIcon size + // : Added ShortCut support in CommandLinks + // 1.2.0.0 : New : support added for Hyperlinks in expanded text + // : New : option to show no default radiobutton added + // : New : capability to update instruction, content, expanded text, footer while dialog is displayed + // : New : option to allow cancelling the dialog with ESC added + // : Improved : text wrapping for verify text + // : New : TAdvTaskDialogEx component created using TAdvGlowButton on non Vista emulation + // : New : property ApplicationIsParent added + // : New : support for custom icons + // 1.2.1.0 : New : support for Information & Shield footer icon + // : Improved : border drawing on Vista in XP compatibility mode + // : New : added support for \n linebreaks in Vista emulation mode + // 1.2.1.1 : Fixed : issue with DefaultRadioButton initialization + // 1.2.1.2 : Fixed : issue with \n linebreaks with doHyperlinks style + // 1.2.2.0 : Improved : keyboard handling for CommandLinks dialog on non Vista emulation + // : Improved : DefaultButton handling for CommandLinks dialog on non Vista emulation + // 1.2.2.1 : Fixed : issue with noCommandLinksIcon on non Vista emulation + // 1.2.2.2 : Fixed : hot painting issue on taskdialog button on non Vista emulation + // 1.2.3.0 : Improved : allow using \n line separators in footer text on non Vista emulation + // : Fixed : issue with doAllowDialogCancel on non Vista emulation + // : Fixed : issue with doAllowMinimize on non Vista emulation + // 1.2.4.0 : Improved : removed limitation on text length of Content, Title, ... in Vista native mode + // : Improved : handling of linefeed character on non Vista emulation + // : Improved : handling of anchors in Vista native mode + // : Improved : handling of ESC with common buttons + // 1.2.4.1 : Improved : prevent that Alt-F4 can close the dialog + // 1.2.5.0 : New : support for hotkeys on expand/contract text on non-Vista emulation + // 1.2.5.1 : Fixed : issue with identical accelerator key for expand/collaps + // 1.2.6.0 : Improved : taskdialog does not size beyond screen width + // : Improved : DefaultButton can be set to -1 to have no default button + // 1.2.7.0 : New: NonNativeDialog property added + // : New: NonNativeMinFormWidth public property added + // 1.2.8.0 : Improved : display of disabled task button + // 1.2.8.1 : Fixed : display of long text in non native taskdialog + // 1.2.8.2 : Fixed : issue with DefaultButton = IdYes, IdNo + // 1.5.0.0 : New : replacement functions for ShowMessage , MessageDlg + // : New : TAdvInputTaskDialog + // : New : ElevateButton method added + // : Improved : message label set transparent + // : Improved : Ctrl-C puts taskdialog text on clipboard + // 1.5.0.1 : Fixed : Delphi 5 issue with TAdvInputTaskDialog + // 1.5.0.2 : Fixed : issue with use of TAdvTaskDialog on topmost forms + // 1.5.0.3 : Improved : automatic height adaption of custom input control + // 1.5.0.4 : Fixed : issue with removing InputControl at designtime + // 1.5.0.5 : Improved : width control of custom editor in TAdvInputTaskDialog + // 1.5.0.6 : Improved : AdvShowMessageBox() handling of ESC key for cancel button + // 1.5.0.7 : Improved : handling of \n linefeed sequence + // 1.5.0.8 : Improved : use of dialog constants in AdvMessageDlg procs + // 1.5.0.9 : Improved : use of question icon in mtConfirmation dialog type + // 1.5.1.0 : Improved : support for F1 help handling + // : Improved : support for HelpContext in message dialog replacements + // : New : various new AdvMessageDlg() function overloads to set Title & Caption separately + // 1.5.1.1 : Fixed : issue with use of dialog on modal StayOnTop forms + // 1.5.1.2 : Improved : handling of button disabling for non native dialog + // 1.5.1.3 : Improved : Clear method clears InputText field too + // 1.5.1.4 : Fixed : issue with handling OnDialogClose and custom input controls in TAdvInputTaskDialog + // 1.5.1.5 : Fixed : close button shown on emulated dialog when doAllowDialogCancel is set + // 1.5.1.6 : Improved : when custom input control is wider than taskdialog, adapt width of taskdialog + +type + {$IFNDEF DELPHI6_LVL} + PBoolean = ^Boolean; + {$ENDIF} + + TTaskDialogResult = (trNone, trOk, trCancel); + + TNonNativeDialog = (nndAuto, nndAlways); + + TTaskDialogOption = (doHyperlinks, doCommandLinks, doCommandLinksNoIcon, doExpandedDefault, + doExpandedFooter, doAllowMinimize, doVerifyChecked, doProgressBar, doProgressBarMarquee, + doTimer, doNoDefaultRadioButton, doAllowDialogCancel); + + TTaskDialogOptions = set of TTaskDialogOption; + + TTaskDialogIcon = (tiBlank, tiWarning, tiQuestion, tiError, tiInformation,tiNotUsed,tiShield); + //(mtWarning, mtError, mtInformation, mtConfirmation, mtCustom); + TTaskDialogFooterIcon = (tfiBlank, tfiWarning, tfiQuestion, tfiError, tfiInformation, + tfiShield); + + TTaskDialogProgressState = (psNormal, psError, psPaused); + + TTaskDialogPosition = (dpScreenCenter, dpOwnerFormCenter); + + TCommonButton = (cbOK, cbYes, cbNo, cbCancel, cbRetry, cbClose); + + TTaskDialogButtonClickEvent = procedure(Sender: TObject; ButtonID: integer) of object; + TTaskDialogHyperlinkClickEvent = procedure(Sender: TObject; HRef: string) of object; + TTaskDialogVerifyClickEvent = procedure(Sender: TObject; Checked: boolean) of object; + TTaskDialogCloseEvent = procedure(Sender: TObject; var CanClose: boolean) of object; + + TTaskDialogProgressEvent = procedure(Sender: TObject; var Pos: integer; var State: TTaskDialogProgressState) of object; + + TCommonButtons = set of TCommonButton; + + TAdvMessageForm = class; + + TInputType = (itEdit, itMemo, itComboEdit, itComboList, itDate, itCustom, itNone); + + TInputGetTextEvent = procedure(Sender: TObject; var Text: string) of object; + TInputSetTextEvent = procedure(Sender: TObject; Text: string) of object; + + TCustomAdvTaskDialog = class(TComponent) + private + FTitle: string; + FContent: string; + FFooter: string; + FInstruction: string; + FCommonButtons: TCommonButtons; + FExpandedText: string; + FCollapsControlText: string; + FExpandControlText: string; + FButtonResult: integer; + FVerifyResult: boolean; + FVerifyText: string; + FCustomButtons: TStringList; + FCustomIcon: TIcon; + FOptions: TTaskDialogOptions; + FRadioButtons: TStringList; + FhWnd: THandle; + FOnCreated: TNotifyEvent; + FOnTimer: TNotifyEvent; + FHelpContext: longint; + FProgressBarMin: integer; + FProgressBarMax: integer; + FOnDialogHyperlinkClick: TTaskDialogHyperlinkClickEvent; + FOnDialogClick: TTaskDialogButtonClickEvent; + FOnDialogRadioClick: TTaskDialogButtonClickEvent; + FOnDialogVerifyClick: TTaskDialogVerifyClickEvent; + FOnDialogProgress: TTaskDialogProgressEvent; + FOnDialogClose: TTaskDialogCloseEvent; + FOnDialogInputGetText: TInputGetTextEvent; + FOnDialogInputSetText: TInputSetTextEvent; + FIcon: TTaskDialogIcon; + FFooterIcon: TTaskDialogFooterIcon; + FDefaultButton: integer; + FDefaultRadioButton: integer; + FDialogForm: TAdvMessageForm; + FDlgPosition: TTaskDialogPosition; + FApplicationIsParent: Boolean; + FModalParent: THandle; + FMinFormWidth: Integer; + FNonNativeDialog: TNonNativeDialog; + FInputType: TInputType; + FInputText: string; + FInputItems: TStrings; + FInputControl: TWinControl; + function GetVersion: string; + procedure SetVersion(const Value: string); + function GetVersionNr: Integer; + procedure SetCustomButtons(const Value: TStringList); + procedure SetRadioButtons(const Value: TStringList); + procedure SetContent(const Value: string); + procedure SetInstruction(const Value: string); + procedure SetFooter(const Value: string); + procedure SetExpandedText(const Value: string); + procedure SetCustomIcon(const Value: TIcon); + procedure SetInputItems(const Value: TStrings); + protected + function CreateButton(AOwner: TComponent): TWinControl; virtual; + function CreateRadioButton(AOwner: TComponent): TWinControl; virtual; + procedure InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); virtual; + procedure SetRadioButtonState(Btn: TWinControl; Checked: boolean); virtual; + procedure SetRadioButtonCaption(Btn: TWinControl; Value: string); virtual; + procedure SetButtonCaption(aButton: TWinControl; Value: TCaption); virtual; + procedure SetButtonCancel(aButton: TWinControl; Value: Boolean); virtual; + procedure SetButtonDefault(aButton: TWinControl; Value: Boolean); virtual; + procedure SetButtonModalResult(aButton: TWinControl; Value: Integer); virtual; + function GetButtonModalResult(aButton: TWinControl): Integer; virtual; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure TaskDialogFormCreated(Sender: TObject); + property CustomButtons: TStringList read FCustomButtons write SetCustomButtons; + property CustomIcon: TIcon read FCustomIcon write SetCustomIcon; + property RadioButtons: TStringList read FRadioButtons write SetRadioButtons; + property CommonButtons: TCommonButtons read FCommonButtons write FCommonButtons; + property DefaultButton: integer read FDefaultButton write FDefaultButton; + property DefaultRadioButton: integer read FDefaultRadioButton write FDefaultRadioButton; + property DialogPosition: TTaskDialogPosition read FDlgPosition write FDlgPosition default dpScreenCenter; + property ExpandedText: string read FExpandedText write SetExpandedText; + property Footer: string read FFooter write SetFooter; + property FooterIcon: TTaskDialogFooterIcon read FFooterIcon write FFooterIcon default tfiBlank; + property HelpContext: longint read FHelpContext write FHelpContext default 0; + property Icon: TTaskDialogIcon read FIcon write FIcon default tiBlank; + property InputText: string read FInputText write FInputText; + property InputType: TInputType read FInputType write FInputType; + property InputItems: TStrings read FInputItems write SetInputItems; + property InputControl: TWinControl read FInputControl write FInputControl; + property Title: string read FTitle write FTitle; + property Instruction: string read FInstruction write SetInstruction; + property Content: string read FContent write SetContent; + property ExpandControlText: string read FExpandControlText write FExpandControlText; + property CollapsControlText: string read FCollapsControlText write FCollapsControlText; + property Options: TTaskDialogOptions read FOptions write FOptions; + property ApplicationIsParent: boolean read FApplicationIsParent write FApplicationIsParent default true; + property VerificationText: string read FVerifyText write FVerifyText; + property NonNativeDialog: TNonNativeDialog read FNonNativeDialog write FNonNativeDialog default nndAuto; + property NonNativeMinFormWidth: integer read FMinFormWidth write FMinFormWidth default 350; + + property ProgressBarMin: integer read FProgressBarMin write FProgressBarMin default 0; + property ProgressBarMax: integer read FProgressBarMax write FProgressBarMax default 100; + property Version: string read GetVersion write SetVersion; + + property OnDialogCreated: TNotifyEvent read FOnCreated write FOnCreated; + property OnDialogClose: TTaskDialogCloseEvent read FOnDialogClose write FOnDialogClose; + property OnDialogButtonClick: TTaskDialogButtonClickEvent read FOnDialogClick write FOnDialogClick; + property OnDialogInputSetText: TInputSetTextEvent read FOnDialogInputSetText write FOnDialogInputSetText; + property OnDialogInputGetText: TInputGetTextEvent read FOnDialogInputGetText write FOnDialogInputGetText; + property OnDialogRadioClick: TTaskDialogButtonClickEvent read FOnDialogRadioClick write FOnDialogRadioClick; + property OnDialogHyperlinkClick: TTaskDialogHyperlinkClickEvent read FOnDialogHyperlinkClick write FOnDialogHyperLinkClick; + property OnDialogTimer: TNotifyEvent read FOnTimer write FOnTimer; + property OnDialogVerifyClick: TTaskDialogVerifyClickEvent read FOnDialogVerifyClick write FOnDialogVerifyClick; + property OnDialogProgress: TTaskDialogProgressEvent read FOnDialogProgress write FOnDialogProgress; + public + property hWnd: THandle read FhWnd write FhWnd; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function Execute: integer; virtual; + procedure Clear; + procedure EnableButton(ButtonID: integer; Enabled: boolean); + procedure ElevateButton(ButtonID: integer; Enabled: boolean); + procedure ClickButton(ButtonID: integer); + property RadioButtonResult: integer read FButtonResult write FButtonResult; + property VerifyResult: boolean read FVerifyResult write FVerifyResult; + property ModalParent: THandle read FModalParent write FModalParent; + end; + + TAdvTaskDialog = class(TCustomAdvTaskDialog) + published + property CustomButtons; + property CustomIcon; + property RadioButtons; + property CommonButtons; + property DefaultButton; + property DefaultRadioButton; + property DialogPosition; + property ExpandedText; + property Footer; + property FooterIcon; + property HelpContext; + property Icon; + property Title; + property Instruction; + property Content; + property ExpandControlText; + property CollapsControlText; + property Options; + property ApplicationIsParent; + property VerificationText; + property NonNativeDialog; + property NonNativeMinFormWidth; + + property ProgressBarMin; + property ProgressBarMax; + property Version; + + property OnDialogCreated; + property OnDialogClose; + property OnDialogButtonClick; + property OnDialogRadioClick; + property OnDialogHyperlinkClick; + property OnDialogTimer; + property OnDialogVerifyClick; + property OnDialogProgress; + end; + + TAdvInputTaskDialog = class(TCustomAdvTaskDialog) + public + constructor Create(AOwner: TComponent); override; + function Execute: integer; override; + published + property ApplicationIsParent; + property CustomButtons; + property CustomIcon; + property CommonButtons; + property DefaultButton; + property DialogPosition; + property ExpandedText; + property Footer; + property FooterIcon; + property Icon; + property InputControl; + property InputType; + property InputText; + property InputItems; + property Instruction; + property Title; + property Content; + property ExpandControlText; + property CollapsControlText; + property VerificationText; + property OnDialogCreated; + property OnDialogClose; + property OnDialogButtonClick; + property OnDialogVerifyClick; + property OnDialogInputSetText; + property OnDialogInputGetText; + end; + + TTaskDialogButton = class(TCustomControl) + private + FOnMouseLeave: TNotifyEvent; + FOnMouseEnter: TNotifyEvent; + FGlyph: TBitmap; + FGlyphDisabled: TBitmap; + FGlyphDown: TBitmap; + FGlyphHot: TBitmap; + FMouseInControl: Boolean; + FMouseDown: Boolean; + FBorderColorDown: TColor; + FBorderColorHot: TColor; + FBorderColor: TColor; + FModalResult: TModalResult; + FHeadingFont: TFont; + FAutoFocus: boolean; + procedure OnPictureChanged(Sender: TObject); + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure SetGlyph(const Value: TBitmap); + procedure SetGlyphDisabled(const Value: TBitmap); + procedure SetGlyphDown(const Value: TBitmap); + procedure SetGlyphHot(const Value: TBitmap); + procedure SetHeadingFont(const Value: TFont); + protected + procedure Paint; override; + procedure KeyPress(var Key: char); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure Click; override; + procedure DoEnter; override; + procedure DoExit; override; + property AutoFocus: boolean read FAutoFocus write FAutoFocus; + published + property Anchors; + property BorderColor: TColor read FBorderColor write FBorderColor; + property BorderColorHot: TColor read FBorderColorHot write FBorderColorHot; + property BorderColorDown: TColor read FBorderColorDown write FBorderColorDown; + property Constraints; + property Enabled; + property HeadingFont: TFont read FHeadingFont write SetHeadingFont; + property ModalResult: TModalResult read FModalResult write FModalResult default 0; + property Picture: TBitmap read FGlyph write SetGlyph; + property PictureHot: TBitmap read FGlyphHot write SetGlyphHot; + property PictureDown: TBitmap read FGlyphDown write SetGlyphDown; + property PictureDisabled: TBitmap read FGlyphDisabled write SetGlyphDisabled; + property Visible; + property OnClick; + property OnDblClick; + property OnMouseDown; + property OnMouseMove; + property OnMouseUp; + property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; + property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; + end; + + TAdvMessageForm = class(TForm) + private + Message: TLabel; + FHorzMargin: Integer; + FVertMargin: Integer; + FHorzSpacing: Integer; + FVertSpacing: Integer; + FExpandButton: TTaskDialogButton; + FExpanded: Boolean; + //FExpandLabel: TLabel; + FExpandControlText: String; + FCollapsControlText: String; + FcmBtnList: TList; + FcsBtnList: TList; + FTaskDialog: TCustomAdvTaskDialog; + FFooterIcon: TImage; + FFooterIconID: PChar; + FRadioList: TList; + FVerificationCheck: TCheckBox; + FProgressBar: TProgressBar; + FIcon: TImage; + FFooterXSize: Integer; + FFooterYSize: Integer; + FContentXSize: Integer; + FContentYSize: Integer; + FExpTextXSize: Integer; + FExpTextYSize: Integer; + FExpTextTop: Integer; + FAnchor: String; + FTimer: TTimer; + FWhiteWindowHeight: Integer; + FHorzParaMargin: Integer; + FMinFormWidth: Integer; + FInputEdit: TEdit; + FInputCombo: TComboBox; + FInputDate: TDateTimePicker; + FInputMemo: TMemo; + FOldParent: TWinControl; + procedure WMActivate(var M: TWMActivate); message WM_ACTIVATE; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure OnTimer(Sender: TObject); + procedure OnExpandButtonClick(Sender: TObject); + procedure OnVerifyClick(Sender: TObject); + procedure OnRadioClick(Sender: TObject); + procedure OnButtonClick(Sender: TObject); + procedure SetExpandButton(const Value: TTaskDialogButton); + procedure GetTextSize(Canvas: TCanvas; Text: string;var W, H: Integer); + //procedure GetMultiLineTextSize(Canvas: TCanvas; Text: string; HeadingFont, ParaFont: TFont; var W, H: Integer); + //procedure HelpButtonClick(Sender: TObject); + protected + procedure SetExpanded(Value: Boolean); + procedure CustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure WriteToClipBoard(Text: String); + function GetFormText: String; + procedure Paint; override; + procedure KeyDown(var Key:Word;Shift:TShiftSTate); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure DoClose(var Action: TCloseAction); override; + + function GetButton(ButtonID: Integer; var TaskButton: TTaskDialogButton): TButton; + procedure EnableButton(ButtonID: integer; Enabled: boolean); + procedure ClickButton(ButtonID: integer); + function IsAnchor(x, y: integer): string; + function GetFooterRect: TRect; + function GetContentRect: TRect; + function GetExpTextRect: TRect; + procedure DrawExpandedText; + procedure DrawContent; + procedure DrawFooter; + property Expanded: Boolean read FExpanded default true; + property ExpandButton: TTaskDialogButton read FExpandButton write SetExpandButton; + procedure DoShow; override; + public + constructor CreateNew(AOwner: TComponent; Dummy: Integer); {$IFNDEF BCB} reintroduce; {$ENDIF} + destructor Destroy; override; + procedure BuildTaskDialog(TaskDialog: TCustomAdvTaskDialog); + procedure SetPositions; + procedure UpdateDialog; + property MinFormWidth: Integer Read FMinFormWidth Write FMinFormWidth; + end; + + function AdvMessageDlgPos(TaskDialog: TCustomAdvTaskDialog; X, Y: Integer): Integer; + + +function AdvShowMessage(const Instruction: string): boolean; overload; +function AdvShowMessage(const Title, Instruction: string): boolean; overload; +function AdvShowmessage(const Title, Instruction: string; tiIcon: tTaskDialogIcon): boolean; overload; +function AdvShowMessage(const Title, Instruction, content, verify: string; + tiIcon: tTaskDialogIcon): boolean; overload; + +function AdvMessageBox(hWnd: HWND; lpInstruction, lpTitle: PChar; flags: UINT): Integer; + + +function AdvShowMessageFmt(const Instruction: string; Parameters: array of const): boolean; + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; + +function AdvTaskMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +function AdvTaskMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; + +function AdvTaskMessageDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; overload; + +function AdvTaskMessageDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + DefaultButton: TMsgDlgBtn): Integer; overload; + +function AdvTaskMessageDlgPosHelp(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: string): Integer; overload; + +function AdvTaskMessageDlgPosHelp(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer; overload; + + + +function AdvInputQueryDlg(ACaption, APrompt: string; var Value: string): boolean; + +var + DRAWBORDER: Boolean = True; + ButtonNames: array[TCommonButton] of string = ('OK', 'Yes', 'No', 'Cancel', 'Retry', 'Abort'); + ButtonCaptions: array[TCommonButton] of Pointer; + +procedure Register; + +implementation + +{$I HTMLENGO.PAS} + +const + TDE_CONTENT = 0; + TDE_EXPANDED_INFORMATION = 1; + TDE_FOOTER = 2; + TDE_MAIN_INSTRUCTION = 3; + + TDF_ENABLE_HYPERLINKS = $0001; + TDF_USE_HICON_MAIN = $0002; + TDF_USE_HICON_FOOTER = $0004; + TDF_ALLOW_DIALOG_CANCELLATION = $0008; + TDF_USE_COMMAND_LINKS = $0010; + TDF_USE_COMMAND_LINKS_NO_ICON = $0020; + TDF_EXPAND_FOOTER_AREA = $0040; + TDF_EXPANDED_BY_DEFAULT = $0080; + TDF_VERIFICATION_FLAG_CHECKED = $0100; + TDF_SHOW_PROGRESS_BAR = $0200; + TDF_SHOW_MARQUEE_PROGRESS_BAR = $0400; + TDF_CALLBACK_TIMER = $0800; + TDF_POSITION_RELATIVE_TO_WINDOW = $1000; + TDF_RTL_LAYOUT = $2000; + TDF_NO_DEFAULT_RADIO_BUTTON = $4000; + TDF_CAN_BE_MINIMIZED = $8000; + + TDM_NAVIGATE_PAGE = WM_USER+101; + TDM_CLICK_BUTTON = WM_USER+102; // wParam = Button ID + TDM_SET_MARQUEE_PROGRESS_BAR = WM_USER+103; // wParam = 0 (nonMarque) wParam != 0 (Marquee) + TDM_SET_PROGRESS_BAR_STATE = WM_USER+104; // wParam = new progress state + TDM_SET_PROGRESS_BAR_RANGE = WM_USER+105; // lParam = MAKELPARAM(nMinRange, nMaxRange) + TDM_SET_PROGRESS_BAR_POS = WM_USER+106; // wParam = new position + TDM_SET_PROGRESS_BAR_MARQUEE = WM_USER+107; // wParam = 0 (stop marquee), wParam != 0 (start marquee), lparam = speed (milliseconds between repaints) + TDM_SET_ELEMENT_TEXT = WM_USER+108; // wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR) + TDM_CLICK_RADIO_BUTTON = WM_USER+110; // wParam = Radio Button ID + TDM_ENABLE_BUTTON = WM_USER+111; // lParam = 0 (disable), lParam != 0 (enable), wParam = Button ID + TDM_ENABLE_RADIO_BUTTON = WM_USER+112; // lParam = 0 (disable), lParam != 0 (enable), wParam = Radio Button ID + TDM_CLICK_VERIFICATION = WM_USER+113; // wParam = 0 (unchecked), 1 (checked), lParam = 1 (set key focus) + TDM_UPDATE_ELEMENT_TEXT = WM_USER+114; // wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR) + TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE = WM_USER+115; // wParam = Button ID, lParam = 0 (elevation not required), lParam != 0 (elevation required) + TDM_UPDATE_ICON = WM_USER+116; // wParam = icon element (TASKDIALOG_ICON_ELEMENTS), lParam = new icon (hIcon if TDF_USE_HICON_* was set, PCWSTR otherwise) + + TDN_CREATED = 0; + TDN_NAVIGATED = 1; + TDN_BUTTON_CLICKED = 2; // wParam = Button ID + TDN_HYPERLINK_CLICKED = 3; // lParam = (LPCWSTR)pszHREF + TDN_TIMER = 4; // wParam = Milliseconds since dialog created or timer reset + TDN_DESTROYED = 5; + TDN_RADIO_BUTTON_CLICKED = 6; // wParam = Radio Button ID + TDN_DIALOG_CONSTRUCTED = 7; + TDN_VERIFICATION_CLICKED = 8; // wParam = 1 if checkbox checked, 0 if not, lParam is unused and always 0 + TDN_HELP = 9; + TDN_EXPANDO_BUTTON_CLICKED = 10; // wParam = 0 (dialog is now collapsed), wParam != 0 (dialog is now expanded) + + TDCBF_OK_BUTTON = $0001; // selected control return value IDOK + TDCBF_YES_BUTTON = $0002; // selected control return value IDYES + TDCBF_NO_BUTTON = $0004; // selected control return value IDNO + TDCBF_CANCEL_BUTTON = $0008; // selected control return value IDCANCEL + TDCBF_RETRY_BUTTON = $0010; // selected control return value IDRETRY + TDCBF_CLOSE_BUTTON = $0020; // selected control return value IDCLOSE + + PBST_NORMAL = $0001; + PBST_ERROR = $0002; + PBST_PAUSED = $0003; +{ + TD_ICON_BLANK = 100; + TD_ICON_WARNING = 101; + TD_ICON_QUESTION = 102; + TD_ICON_ERROR = 103; + TD_ICON_INFORMATION = 104; + TD_ICON_BLANK_AGAIN = 105; + TD_ICON_SHIELD = 106; +} + // Well, Microsoft did it again, incorrect TD_ICON_xxx values in the SDK + // and changing values just between last beta2 & RTM... Gotta love them. + // These values were obtained emperically by the lack of proper documentation + + TD_ICON_BLANK = 17; + TD_ICON_WARNING = 84; + TD_ICON_QUESTION = 99; + TD_ICON_ERROR = 98; + TD_ICON_INFORMATION = 81; + TD_ICON_BLANK_AGAIN = 0; + TD_ICON_SHIELD = 78; + + +type + TProControl = class(TControl); + + PTASKDIALOG_BUTTON = ^TTASKDIALOG_BUTTON; + TTASKDIALOG_BUTTON = record + nButtonID: integer; + pszButtonText: pwidechar; + end; + + TTaskDialogWideString = array[0..1023] of widechar; + + TTaskDialogButtonArray = array of TTASKDIALOG_BUTTON; + TTaskDialogWideStringArray = array of TTaskDialogWideString; + + PTASKDIALOGCONFIG = ^TTASKDIALOGCONFIG; + TTASKDIALOGCONFIG = record + cbSize: integer; + hwndParent: THandle; + hInstance: THandle; + dwFlags: integer; // TASKDIALOG_FLAGS dwFlags; + dwCommonButtons: integer; // TASKDIALOG_COMMON_BUTTON_FLAGS + pszWindowTitle: pwidechar; + hMainIcon: integer; + pszMainInstruction: pwidechar; + pszContent: pwidechar; + cButtons: integer; + pbuttons: pinteger; // const TASKDIALOG_BUTTON* pButtons; + nDefaultButton: integer; + cRadioButtons: integer; + pRadioButtons: pinteger; //const TASKDIALOG_BUTTON* pRadioButtons; + nDefaultRadioButton: integer; + pszVerificationText: pwidechar; + pszExpandedInformation: pwidechar; + pszExpandedControlText: pwidechar; + pszCollapsedControlText: pwidechar; + case Integer of + 0: (hFooterIcon: HICON); + 1: (pszFooterIcon: pwidechar; + pszFooter: pwidechar; + pfCallback: pinteger; + pData: pointer; + cxWidth: integer // width of the Task Dialog's client area in DLU's. + // If 0, Task Dialog will calculate the ideal width. + ); +{ + hFooterIcon: integer; + pszFooter: pwidechar; + pfCallBack: pinteger; // PFTASKDIALOGCALLBACK pfCallback; + pData: pointer; + cxWidth: integer; +} + end; + +//------------------------------------------------------------------------------ + +procedure RunElevated(HWND: THandle; pszPath, pszParameters, pszDirectory: string); +var + shex : SHELLEXECUTEINFO; +begin + fillchar(shex, sizeof(shex),0); + shex.cbSize := sizeof( SHELLEXECUTEINFO ); + shex.fMask := 0; + shex.wnd := hwnd; + shex.lpVerb := 'runas'; + shex.lpFile := pchar(pszPath); + shex.lpParameters := pchar(pszParameters); + shex.lpDirectory := nil; + shex.nShow := SW_NORMAL; + ShellExecuteEx(@shex); +end; + +//------------------------------------------------------------------------------ + +function IsVista: boolean; +var + hKernel32: HMODULE; +begin + hKernel32 := GetModuleHandle('kernel32'); + if (hKernel32 > 0) then + begin + Result := GetProcAddress(hKernel32, 'GetLocaleInfoEx') <> nil; + end + else + Result := false; +end; + +//------------------------------------------------------------------------------ + +procedure VistaShellOpen(HWND: THandle; Command, Param: string); +begin + if IsVista then + RunElevated(HWND, Command, Param, '') + else + ShellExecute(HWND, 'open', pchar(Param), nil, nil, SW_NORMAL); +end; + +//------------------------------------------------------------------------------ + +function GetFileVersion(const AFileName: string): Cardinal; +var + FileName: string; + InfoSize, Wnd: DWORD; + VerBuf: Pointer; + FI: PVSFixedFileInfo; + VerSize: DWORD; +begin + Result := Cardinal(-1); + // GetFileVersionInfo modifies the filename parameter data while parsing. + // Copy the string const into a local variable to create a writeable copy. + FileName := AFileName; + UniqueString(FileName); + InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); + if InfoSize <> 0 then + begin + GetMem(VerBuf, InfoSize); + try + if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then + if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then + Result:= FI.dwFileVersionMS; + finally + FreeMem(VerBuf); + end; + end; +end; + + +function TaskDialogCallbackProc(hWnd: THandle; msg, wParam, lparam: integer; refData: pointer): integer; stdcall; +var + td: TAdvTaskDialog; + SPos: integer; + State: TTaskDialogProgressState; + Res: integer; + CanClose: boolean; + Anchor: string; + + procedure ShowHelpException(E: Exception); + var + Msg: string; + Flags: Integer; + begin + Flags := MB_OK or MB_ICONSTOP; + if Application.UseRightToLeftReading then + Flags := Flags or MB_RTLREADING; + Msg := E.Message; + if (Msg <> '') and (AnsiLastChar(Msg) > '.') then + Msg := Msg + '.'; + MessageBox(0, PChar(Msg), PChar(Application.Title), Flags); + end; + +begin + td := nil; + if Assigned(refdata) then + td := TAdvTaskDialog(refdata); + + Res := 0; + + if Assigned(td) then + td.hWnd := hWnd; + + case msg of + TDN_CREATED: + begin + if Assigned(td) and Assigned(td.OnDialogCreated) then + begin + td.OnDialogCreated(td); + + if (doProgressBar in td.Options) then + begin + SendMessage(hWnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MakeLParam(td.ProgressBarMin,td.ProgressBarMax)); + end; + end; + end; + TDN_BUTTON_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogButtonClick) then + begin + td.OnDialogButtonClick(td, wParam); + end; + + if Assigned(td) and Assigned(td.OnDialogClose) then + begin + CanClose := true; + td.OnDialogClose(td, CanClose); + if not CanClose then + Res := 1; + end; + end; + TDN_RADIO_BUTTON_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogRadioClick) then + begin + td.OnDialogRadioClick(td, wParam); + end; + end; + TDN_HYPERLINK_CLICKED: + begin + if Assigned(td) then + begin + Anchor := WideCharToString(PWideChar(lparam)); + + if not Assigned(td.OnDialogHyperlinkClick) then + begin + if (Pos('://', Anchor) > 0) then + VistaShellOpen(0, 'iexplore.exe', Anchor); + end; + + if Assigned(td.OnDialogHyperlinkClick) then + begin + td.OnDialogHyperlinkClick(td, Anchor); + end; + end; + end; + TDN_VERIFICATION_CLICKED: + begin + if Assigned(td) and Assigned(td.OnDialogVerifyClick) then + begin + td.OnDialogVerifyClick(td, bool(wparam)); + end; + end; + TDN_HELP: + begin + if Assigned(td) then + if td.HelpContext <> 0 then + try + Application.HelpContext(td.HelpContext); + except + on E: Exception do + ShowHelpException(E); + end; + end; + TDN_TIMER: + begin + if Assigned(td) and Assigned(td.OnDialogTimer) then + begin + td.OnDialogTimer(td); + end; + + if Assigned(td) and Assigned(td.OnDialogProgress) then + begin + td.OnDialogProgress(td, SPos, State); + SendMessage(hWnd,TDM_SET_PROGRESS_BAR_POS,SPos,0); + case State of + psNormal: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_NORMAL, 0); + psError: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_ERROR, 0); + psPaused: SendMessage(hWnd,TDM_SET_PROGRESS_BAR_STATE, PBST_PAUSED, 0); + end; + end; + end; + end; + + Result := Res; +end; + +//------------------------------------------------------------------------------ + +function RemoveSpaces(S: String): String; +var + i: Integer; +begin + Result := S; + for i := 1 to Length(s) do + begin + if (s[i] = ' ') then + Result := copy(S, 2, Length(S)-1) + else + Break; + end; + + for i := Length(s) downto 1 do + begin + if (s[i] = ' ') then + Result := copy(S, 1, Length(S)-1) + else + Break; + end; +end; + +//------------------------------------------------------------------------------ + +function HasLf(s:string): boolean; +var + i,j: integer; +begin + Result := false; + i := pos('\n', s); + if i > 0 then + begin + j := pos(':\n',s); + + if (j = -1) or (j <> i - 1) then + Result := true; + end; +end; + +//------------------------------------------------------------------------------ + +procedure SplitInToLines(Text: string; sl: TStrings); +var + i, j: Integer; + s, rs: string; +begin + if (Text <> '') and Assigned(sl) then + begin + rs := #13; + if HasLf(Text) or (pos(rs, Text) > 0) then + begin + Text := RemoveSpaces(Text); + + while (Length(Text) > 0) do + begin + i := Pos('\n', Text); + j := 2; + if (i <= 0) then + begin + i := pos(rs, Text); + j := 2; + end; + + if (i <= 0) then + begin + i := Length(Text)+1; + j := 0; + end; + s := copy(Text, 1, i-1); + Delete(Text, 1, i-1+j); + s := RemoveSpaces(s); + sl.Add(s); + Text := RemoveSpaces(Text); + end; + end + else + sl.Add(Text); + end; +end; + +//------------------------------------------------------------------------------ + +procedure GetMultiLineTextSize(Canvas: TCanvas; Text: string; HeadingFont, ParaFont: TFont; DrawTextBiDiModeFlagsReadingOnly: Longint; var W, H: Integer; WithSpace: Boolean = True); +var + R: TRect; + i, tw, th: Integer; + s: string; + OldFont: TFont; + SL: TStringList; +begin + if Assigned(Canvas) then + begin + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + if HasLf(Text) or (pos(#13, Text) > 0) then + begin + tw := 0; + th := 0; + + SL := TStringList.Create; + SplitInToLines(Text, SL); + s := RemoveSpaces(SL[0]); + + if (s <> '') then + begin + Canvas.Font.Assign(HeadingFont); + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(s), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + tw := R.Right; + th := R.Bottom; + if WithSpace then + begin + tw := tw + 8; + th := th + 10; + end; + end; + + Canvas.Font.Assign(ParaFont); + for i:= 1 to SL.Count-1 do + begin + s := SL[i]; + if (s <> '') then + begin + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(s), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + if WithSpace then + begin + tw := Max(tw, R.Right + 8); + th := th + R.Bottom + 2; + end + else + begin + tw := Max(tw, R.Right); + th := th + R.Bottom; + end; + end; + end; + + W := tw; + H := th; + SL.Free; + end + else + begin + Canvas.Font.Assign(HeadingFont); + SetRect(R, 0, 0, 0, 0); + Windows.DrawText( Canvas.handle, PChar(Text), -1, R, + DT_CALCRECT or DT_LEFT or DT_SINGLELINE or DrawTextBiDiModeFlagsReadingOnly); + W := R.Right; + H := R.Bottom; + end; + + Canvas.Font.Assign(OldFont); + OldFont.Free; + end; +end; + +//------------------------------------------------------------------------------ + +{ TAdvTaskDialog } + +procedure TCustomAdvTaskDialog.Clear; +begin + CommonButtons := []; + RadioButtons.Clear; + CustomButtons.Clear; + Icon := tiBlank; + FooterIcon := tfiBlank; + Instruction := ''; + Title := ''; + Content := ''; + Footer := ''; + VerificationText := ''; + ExpandControlText := ''; + CollapsControlText := ''; + ExpandedText := ''; + DefaultRadioButton := 200; + DefaultButton := 0; + Options := []; + VerifyResult := false; + InputText := ''; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.ClickButton(ButtonID: integer); +begin + SendMessage(hWnd, TDM_CLICK_BUTTON, ButtonID, 0); + if Assigned(FDialogForm) then + FDialogForm.ClickButton(ButtonID); +end; + +//------------------------------------------------------------------------------ + +constructor TCustomAdvTaskDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FCustomButtons := TStringList.Create; + FRadioButtons := TStringList.Create; + FProgressBarMin := 0; + FProgressBarMax := 100; + FDialogForm := nil; + FApplicationIsParent := true; + FModalParent := 0; + FCustomIcon := TIcon.Create; + FDefaultRadioButton := 200; + FMinFormWidth := 350; + FNonNativeDialog := nndAuto; + FInputType := itNone; + FInputItems := TStringList.Create; +end; + +//------------------------------------------------------------------------------ + +destructor TCustomAdvTaskDialog.Destroy; +begin + FRadioButtons.Free; + FCustomButtons.Free; + FCustomIcon.Free; + FInputItems.Free; + inherited; +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TButton.Create(AOwner); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.CreateRadioButton(AOwner: TComponent): TWinControl; +begin + Result := TRadioButton.Create(AOwner); +end; + +procedure TCustomAdvTaskDialog.SetRadioButtonState(Btn: TWinControl; Checked: boolean); +begin + TRadioButton(Btn).Checked := Checked; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.TaskDialogFormCreated(Sender: TObject); +begin + if Assigned(OnDialogCreated) then + OnDialogCreated(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited; + if not (csDestroying in ComponentState) then + begin + if (AOperation = opRemove) then + begin + if (AComponent = FInputControl) then + FInputControl := nil; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.ElevateButton(ButtonID: integer; + Enabled: boolean); +begin + SendMessage(hWnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, ButtonID, integer(Enabled)); +end; + +procedure TCustomAdvTaskDialog.EnableButton(ButtonID: integer; Enabled: boolean); +begin + SendMessage(hWnd, TDM_ENABLE_BUTTON, ButtonID, integer(Enabled)); + if Assigned(FDialogForm) then + FDialogForm.EnableButton(ButtonID, Enabled); +end; + +//------------------------------------------------------------------------------ + +function ConvertNL(s: string): string; +begin + if Pos('\\n', s) > 0 then + Result := StringReplace(s, '\\n', '\n', [rfReplaceAll]) + else + begin + if pos('\n',s) > 0 then + Result := StringReplace(s,'\n',#10,[rfReplaceAll]) + else + Result := s; + end; +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.Execute: integer; +var + verinfo: TOSVersionInfo; + DLLHandle: THandle; + res,radiores: integer; + verify: boolean; + TaskDialogConfig : TTASKDIALOGCONFIG; + TaskDialogIndirectProc : function(AConfig: PTASKDIALOGCONFIG; Res: pinteger; ResRadio: pinteger; VerifyFLag: pboolean): integer cdecl stdcall; +{ + wTitle: TTaskDialogWideString; + wDesc: TTaskDialogWideString; + wContent: TTaskDialogWideString; + wExpanded: TTaskDialogWideString; + wExpandedControl: TTaskDialogWideString; + wCollapsedControl: TTaskDialogWideString; + wFooter: TTaskDialogWideString; + wVerifyText: TTaskDialogWideString; +} + TBA: TTaskDialogButtonArray; + TBWS: TTaskDialogWideStringArray; + i: integer; + + TRA: TTaskDialogButtonArray; + TRWS: TTaskDialogWideStringArray; + ComCtlVersion: integer; + + +begin + Result := -1; + + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + GetVersionEx(verinfo); + + ComCtlVersion := GetFileVersion('COMCTL32.DLL'); + ComCtlVersion := (ComCtlVersion shr 16) and $FF; + + if (verinfo.dwMajorVersion >= 6) and (ComCtlVersion > 5) and (FNonNativeDialog = nndAuto) then + begin + // check COMCTL version ... + + DLLHandle := LoadLibrary('comctl32.dll'); + if DLLHandle >= 32 then + begin + @TaskDialogIndirectProc := GetProcAddress(DLLHandle,'TaskDialogIndirect'); + + if Assigned(TaskDialogIndirectProc) then + begin + FillChar(TaskDialogConfig, sizeof(TTASKDIALOGCONFIG),0); + TaskDialogConfig.cbSize := sizeof(TTASKDIALOGCONFIG); + + if ModalParent <> 0 then + begin + TaskDialogConfig.hwndParent := ModalParent + end + else + begin + if Assigned(Self.Owner) and not ApplicationIsParent then + TaskDialogConfig.hwndParent := (Self.Owner as TWinControl).Handle + else + TaskDialogConfig.hwndParent := Application.Handle; + end; + + if FCustomButtons.Count > 0 then + begin + SetLength(TBA, FCustomButtons.Count); + SetLength(TBWS, FCustomButtons.Count); + + for i := 0 to FCustomButtons.Count - 1 do + begin + StringToWideChar(ConvertNL(FCustomButtons.Strings[i]), TBWS[i], sizeof(TBWS[i])); + TBA[i].pszButtonText := TBWS[i]; + TBA[i].nButtonID := i + 100; + end; + + TaskDialogConfig.cButtons := FCustomButtons.Count; + TaskDialogConfig.pbuttons := @TBA[0]; + end; + + if FRadioButtons.Count > 0 then + begin + SetLength(TRA, FRadioButtons.Count); + SetLength(TRWS, FRadioButtons.Count); + + for i := 0 to FRadioButtons.Count - 1 do + begin + StringToWideChar(ConvertNL(FRadioButtons.Strings[i]), TRWS[i], sizeof(TRWS[i])); + TRA[i].pszButtonText := TRWS[i]; + TRA[i].nButtonID := i + 200; + end; + + TaskDialogConfig.cRadioButtons := FRadioButtons.Count; + TaskDialogConfig.pRadioButtons := @TRA[0]; + end; + + if FTitle <> '' then + begin + TaskDialogConfig.pszWindowTitle := PWideChar(WideString(ConvertNL(FTitle))); + end; + + if FInstruction <> '' then + begin + TaskDialogConfig.pszMainInstruction := PWideChar(WideString(ConvertNL(FInstruction))); + end; + + if FContent <> '' then + begin + TaskDialogConfig.pszContent := PWideChar(WideString(ConvertNL(FContent))); + end; + + if FFooter <> '' then + begin + TaskDialogConfig.pszFooter := PWideChar(WideString(ConvertNL(FFooter))); + end; + + if FExpandControlText <> '' then + begin + TaskDialogConfig.pszExpandedControlText := PWideChar(WideString(FExpandControlText)); + end; + + if FCollapsControlText <> '' then + begin + TaskDialogConfig.pszCollapsedControlText := PWideChar(WideString(FCollapsControlText)); + end; + + if FExpandedText <> '' then + begin + TaskDialogConfig.pszExpandedInformation := PWideChar(WideString(FExpandedText)) + end; + + if FVerifyText <> '' then + begin + TaskDialogConfig.pszVerificationText := PWideChar(WideString(FVerifyText)); + end; + + if cbOk in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_OK_BUTTON; + + if cbYes in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_YES_BUTTON; + + if cbNo in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_NO_BUTTON; + + if cbCancel in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_CANCEL_BUTTON; + + if cbClose in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_CLOSE_BUTTON; + + if cbRetry in FCommonButtons then + TaskDialogConfig.dwCommonButtons := TaskDialogConfig.dwCommonButtons or TDCBF_RETRY_BUTTON; + + if doCommandLinks in FOptions then + TaskDialogConfig.dwFlags := TDF_USE_COMMAND_LINKS; + + if doCommandLinksNoIcon in FOptions then + TaskDialogConfig.dwFlags := TDF_USE_COMMAND_LINKS_NO_ICON; + + if doHyperlinks in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_ENABLE_HYPERLINKS; + + if doExpandedDefault in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_EXPANDED_BY_DEFAULT; + + if doExpandedFooter in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_EXPAND_FOOTER_AREA; + + if doAllowMinimize in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_CAN_BE_MINIMIZED; + + if doVerifyChecked in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_VERIFICATION_FLAG_CHECKED; + + if doProgressBar in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_SHOW_PROGRESS_BAR; + + if doProgressBarMarquee in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_SHOW_MARQUEE_PROGRESS_BAR; + + if (doProgressBarMarquee in FOptions) or + (doProgressBar in FOptions) or + (doTimer in FOptions) then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_CALLBACK_TIMER; + + if (DialogPosition = dpOwnerFormCenter) then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_POSITION_RELATIVE_TO_WINDOW; + + if doNoDefaultRadioButton in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_NO_DEFAULT_RADIO_BUTTON; + + if doAllowDialogCancel in FOptions then + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_ALLOW_DIALOG_CANCELLATION; + + TaskDialogConfig.hInstance := 0; + + if not CustomIcon.Empty then + begin + TaskDialogConfig.hMainIcon := CustomIcon.Handle; + TaskDialogConfig.dwFlags := TaskDialogConfig.dwFlags or TDF_USE_HICON_MAIN; + end + else + begin + case Icon of + tiWarning: TaskDialogConfig.hMainIcon := TD_ICON_WARNING; + tiQuestion: TaskDialogConfig.hMainIcon := TD_ICON_QUESTION; + tiError: TaskDialogConfig.hMainIcon := TD_ICON_ERROR; + tiShield: TaskDialogConfig.hMainIcon := TD_ICON_SHIELD; + tiBlank: TaskDialogConfig.hMainIcon := TD_ICON_BLANK; + tiInformation: TaskDialogConfig.hMainIcon := TD_ICON_INFORMATION; + end; + end; + + case FooterIcon of + tfiWarning: TaskDialogConfig.hFooterIcon := TD_ICON_WARNING; + tfiQuestion: TaskDialogConfig.hFooterIcon := TD_ICON_QUESTION; + tfiError: TaskDialogConfig.hFooterIcon := TD_ICON_ERROR; + tfiInformation: TaskDialogConfig.hFooterIcon := THandle(MAKEINTRESOURCEW(Word(-3))); + tfiShield: TaskDialogConfig.hFooterIcon := THandle(MAKEINTRESOURCEW(Word(-4))); + end; + + TaskDialogConfig.pfCallBack := @TaskDialogCallbackProc; + TaskDialogConfig.pData := Self; + + TaskDialogConfig.nDefaultButton := DefaultButton; + TaskDialogConfig.nDefaultRadioButton := DefaultRadioButton; + + + TaskDialogIndirectProc(@TaskDialogConfig, @res, @radiores, @verify); + + RadioButtonResult := radiores; + VerifyResult := verify; + Result := res; + + end; + end; + end + else + Result := AdvMessageDlgPos(Self, -1, -1); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetVersion: string; +var + vn: Integer; +begin + vn := GetVersionNr; + Result := IntToStr(Hi(Hiword(vn))) + '.' + IntToStr(Lo(Hiword(vn))) + '.' + + IntToStr(Hi(Loword(vn))) + '.' + IntToStr(Lo(Loword(vn))); +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetVersionNr: Integer; +begin + Result := MakeLong(MakeWord(BLD_VER, REL_VER), MakeWord(MIN_VER, MAJ_VER)); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetContent(const Value: string); +begin + if (FContent <> Value) then + begin + FContent := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_CONTENT, Integer(PWideChar(WideString(FContent)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetCustomButtons(const Value: TStringList); +begin + FCustomButtons.Assign(Value); +end; + +procedure TCustomAdvTaskDialog.SetCustomIcon(const Value: TIcon); +begin + FCustomIcon.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetExpandedText(const Value: string); +begin + if (FExpandedText <> Value) then + begin + FExpandedText := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_EXPANDED_INFORMATION, Integer(PWideChar(WideString(FExpandedText)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetFooter(const Value: string); +begin + if (FFooter <> Value) then + begin + FFooter := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_FOOTER, Integer(PWideChar(WideString(FFooter)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetInputItems(const Value: TStrings); +begin + FInputItems.Assign(Value); +end; + +procedure TCustomAdvTaskDialog.SetInstruction(const Value: string); +begin + if (FInstruction <> Value) then + begin + FInstruction := Value; + SendMessage(hWnd, TDM_UPDATE_ELEMENT_TEXT, TDE_MAIN_INSTRUCTION, Integer(PWideChar(WideString(FInstruction)))); + if Assigned(FDialogForm) then + FDialogForm.UpdateDialog; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TRadioButton(Btn).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetRadioButtons(const Value: TStringList); +begin + FRadioButtons.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetVersion(const Value: string); +begin + +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonCancel(aButton: TWinControl; Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Cancel := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonDefault(aButton: TWinControl; Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Default := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonModalResult(aButton: TWinControl; Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).ModalResult := Value; +end; + +//------------------------------------------------------------------------------ + +function TCustomAdvTaskDialog.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + Result := TButton(aButton).ModalResult; +end; + +//------------------------------------------------------------------------------ + +procedure TCustomAdvTaskDialog.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TButton) then + Exit; + + TButton(aButton).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +{ TTaskDialogButton } + +constructor TTaskDialogButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FGlyph := TBitmap.Create; + FGlyph.OnChange := OnPictureChanged; + + FGlyphHot := TBitmap.Create; + + FGlyphDown := TBitmap.Create; + + FGlyphDisabled := TBitmap.Create; + FGlyphDisabled.OnChange := OnPictureChanged; + + FHeadingFont := TFont.Create; + + SetBounds(0, 0, 23, 22); + ShowHint := False; + FBorderColorDown := clNone; + FBorderColorHot := clNone; + FBorderColor := clNone; +end; + +//------------------------------------------------------------------------------ + +destructor TTaskDialogButton.Destroy; +begin + FGlyph.Free; + FGlyphHot.Free; + FGlyphDown.Free; + FGlyphDisabled.Free; + FHeadingFont.Free; + inherited; +end; + +procedure TTaskDialogButton.DoEnter; +begin + inherited; + Invalidate; +end; + +procedure TTaskDialogButton.DoExit; +begin + inherited; + Invalidate; +end; + +procedure TTaskDialogButton.KeyPress(var Key: char); +begin + inherited; + if (Key = #32) or (Key = #13) then + begin + Click; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.Paint; +var + Pic: TBitmap; + x, y, bw, bh, i: Integer; + R, TR: TRect; + BrClr: TColor; + SL: TStringList; +begin + inherited; + + R := ClientRect; + + BrClr := clNone; + + if FMouseDown then + BrClr := BorderColorDown + else if FMouseInControl then + BrClr := BorderColorHot; + + if not Enabled then + BrClr := clNone; + + if GetFocus = Handle then + BrClr := BorderColorDown; + + Pic := Picture; + if FMouseDown and not FGlyphDown.Empty then + Pic := FGlyphDown + else if FMouseInControl and not FGlyphHot.Empty then + Pic := FGlyphHot; + + if not Enabled and not PictureDisabled.Empty then + Pic := PictureDisabled; + + if Assigned(Pic) and not Pic.Empty then + begin + Pic.Transparent := True; + if (Caption = '') then + begin + x := (Width - Pic.Width) div 2; + y := (Height - Pic.Height) div 2; + end + else + begin + x := 4; + y := (Height - Pic.Height) div 2; + end; + + Canvas.Draw(x, y, Pic); + R.Left := x + Pic.Width + 3; + end + else + R.Left := R.Left + 2; + + if (Caption <> '') then + begin + if HasLf(Caption) or (pos(#13, Caption) > 0) then + begin + TR := R; + SL := TStringList.Create; + SplitInToLines(Caption, SL); + GetMultiLineTextSize(Canvas, Caption, HeadingFont, Self.Font, DrawTextBiDiModeFlagsReadingOnly, bw, bh); + TR.Top := 2 + (Height - bh) div 2; + + Canvas.Brush.Style := bsClear; + if (SL[0] <> '') then + begin + Canvas.Font.Assign(HeadingFont); + + if not Enabled then + Canvas.Font.Color := clSilver; + + DrawText(Canvas.Handle, PChar(SL[0]),Length(SL[0]), TR, DT_LEFT or DT_TOP or DT_SINGLELINE); + TR.Top := TR.Top + Canvas.TextHeight('gh') + 4; + end; + + Canvas.Font.Assign(Self.Font); + + if not Enabled then + Canvas.Font.Color := clSilver; + + for i:= 1 to SL.Count - 1 do + begin + DrawText(Canvas.Handle, PChar(SL[i]),Length(SL[i]), TR, DT_LEFT or DT_TOP or DT_SINGLELINE); + TR.Top := TR.Top + Canvas.TextHeight('gh') + 2; + end; + SL.Free; + end + else + begin + Canvas.Brush.Style := bsClear; + Canvas.Font.Assign(HeadingFont); + if not Enabled then + Canvas.Font.Color := clSilver; + DrawText(Canvas.Handle,PChar(Caption),Length(Caption), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE); + end; + end; + + if (BrClr <> clNone) then + begin + R := ClientRect; + Canvas.Pen.Color := BrClr; + Canvas.Brush.Style := bsClear; + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, 2, 2); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + + if (ssLeft in Shift) then + begin + FMouseDown := True; + Invalidate; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + inherited; + + FMouseDown := False; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyph(const Value: TBitmap); +begin + FGlyph.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphDown(const Value: TBitmap); +begin + FGlyphDown.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphHot(const Value: TBitmap); +begin + FGlyphHot.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetGlyphDisabled(const Value: TBitmap); +begin + FGlyphDisabled.Assign(Value); + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.OnPictureChanged(Sender: TObject); +begin + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.CMMouseEnter(var Message: TMessage); +begin + inherited; + FMouseInControl := True; + + if AutoFocus then + SetFocus; + + Invalidate; + if Assigned(FOnMouseEnter) then + FOnMouseEnter(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.CMMouseLeave(var Message: TMessage); +begin + inherited; + FMouseInControl := False; + Invalidate; + + if Assigned(FOnMouseLeave) then + FOnMouseLeave(Self); +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.SetHeadingFont(const Value: TFont); +begin + FHeadingFont.Assign(Value); +end; + +//------------------------------------------------------------------------------ + +function GetAveCharSize(Canvas: TCanvas): TPoint; +var + I: Integer; + Buffer: array[0..51] of Char; +begin + for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A')); + for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a')); + GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result)); + Result.X := Result.X div 52; +end; + +//------------------------------------------------------------------------------ + +var + ButtonWidths : array[TCommonButton] of integer; // initialized to zero + //tiBlank, tiWarning, tiQuestion, tiError, tiInformation,tiNotUsed,tiShield + IconIDs: array[TTaskDialogIcon] of PChar = (IDI_ASTERISK, IDI_EXCLAMATION, IDI_QUESTION, IDI_ERROR, IDI_INFORMATION, nil, IDI_HAND); + FooterIconIDs: array[TTaskDialogFooterIcon] of PChar = (nil, IDI_EXCLAMATION, IDI_QUESTION, IDI_HAND, IDI_INFORMATION, IDI_WINLOGO); + Captions: array[TTaskDialogIcon] of Pointer; + // = (nil, @SMsgDlgWarning, @SMsgDlgConfirm, @SMsgDlgError, @SMsgDlgInformation); + ModalResults: array[TCommonButton] of Integer = (mrOk, mrYes, mrNo, mrCancel, mrRetry, mrAbort); + //(tiBlank, tiWarning, tiQuestion, tiError, tiShield); + //(mtWarning, mtError, mtInformation, mtConfirmation, mtCustom); + +function CreateAdvMessageDlg(TaskDialog: TCustomAdvTaskDialog): TForm; +begin + Result := nil; + if not Assigned(TaskDialog) then + Exit; + + if TaskDialog.ApplicationIsParent then + Result := TAdvMessageForm.CreateNew(Application,0) + else + Result := TAdvMessageForm.CreateNew((TaskDialog.Owner) as TCustomForm,0); + + with Result do + begin + BiDiMode := Application.BiDiMode; + BorderIcons := []; + + if doAllowMinimize in TaskDialog.Options then + begin + BorderStyle := bsSingle; + BorderIcons := [biSystemMenu,biMinimize] + end + else + begin + BorderStyle := bsDialog; + end; + + if cbCancel in TaskDialog.CommonButtons then + TaskDialog.Options := TaskDialog.Options + [doAllowDialogCancel]; + + if doAllowDialogCancel in TaskDialog.Options then + begin + BorderIcons := BorderIcons + [biSystemMenu]; + end; + + if not TaskDialog.ApplicationIsParent then + begin + if ((TaskDialog.Owner) is TForm) then + if ((TaskDialog.Owner) as TForm).FormStyle = fsStayOnTop then + FormStyle := fsStayOnTop; + end; + + Canvas.Font := Font; + KeyPreview := True; + OnKeyDown := TAdvMessageForm(Result).CustomKeyDown; + end; + //TaskDialog.Options := TaskDialog.Options + [doAllowDialogCancel]; + TAdvMessageForm(Result).MinFormWidth := TaskDialog.NonNativeMinFormWidth; + TAdvMessageForm(Result).BuildTaskDialog(TaskDialog); +end; + +//------------------------------------------------------------------------------ + +function AdvMessageDlgPos(TaskDialog: TCustomAdvTaskDialog; X, Y: Integer): Integer; +var + DlgForm: TAdvMessageForm; +begin + Result := -1; + if not Assigned(TaskDialog) then + Exit; + + DlgForm := TAdvMessageForm(CreateAdvMessageDlg(TaskDialog)); + + DlgForm.OnShow := TaskDialog.TaskDialogFormCreated; + + TaskDialog.FDialogForm := DlgForm; + + with DlgForm do + try + Color := clWhite; + //HelpContext := HelpCtx; + //HelpFile := HelpFileName; + if X >= 0 then Left := X; + if Y >= 0 then Top := Y; + {$IFDEF DELPHI5_LVL} + if TaskDialog.DialogPosition = dpOwnerFormCenter then + begin + if (Y < 0) and (X < 0) then + Position := poOwnerFormCenter; + end + else + begin + DefaultMonitor := dmMainForm; + if (Y < 0) and (X < 0) then + Position := poScreenCenter; + end; + {$ELSE} + {$ENDIF} + Result := ShowModal; + {$IFNDEF DELPHI6_LVL} + Close; + {$ENDIF} + finally + TaskDialog.FDialogForm := nil; + Free; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.GetTextSize(Canvas: TCanvas; Text: string;var W, H: Integer); +var + R: TRect; +begin + if (Text = '') then + begin + W := 0; + H := 0; + Exit; + end; + + if Assigned(Canvas) then + begin + if W = 0 then + SetRect(R, 0, 0, 1000, 100) + else + SetRect(R, 0, 0, W, 100); + + DrawText(Canvas.Handle, PChar(Text), Length(Text)+1, R, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or DT_NOPREFIX or + DrawTextBiDiModeFlagsReadingOnly); + + W := R.Right; + H := R.Bottom; + end; +end; + +//------------------------------------------------------------------------------ + +const + mcHorzMargin = 8; + mcVertMargin = 8; + mcHorzSpacing = 10; + mcVertSpacing = 10; + mcButtonWidth = 50; + mcButtonHeight = 14; + mcButtonSpacing = 4; + +function GetExeName: string; +var + s: string; + fe: string; +begin + s := ExtractFileName(Application.EXEName); + fe := ExtractFileExt(s); + if (Length(fe) > 0) then + delete(s, length(s) - Length(fe) + 1, length(fe)); + Result := s; +end; + +procedure TAdvMessageForm.BuildTaskDialog(TaskDialog: TCustomAdvTaskDialog); +var + DialogUnits: TPoint; + ButtonWidth, ButtonHeight, ButtonSpacing, ButtonCount, ButtonGroupWidth, + IconTextWidth, IconTextHeight, X, Y, ALeft: Integer; + B, DefaultButton, CancelButton: TCommonButton; + IconID: PChar; + TextRect, FR: TRect; + Msg: string; + DlgType: TTaskDialogIcon; + Buttons: TCommonButtons; + i, bw, bh, h, w, j, FooterIconTextWidth, FooterIconTextHeight: Integer; + CmBtnGroupWidth, CsBtnGroupWidth: Integer; + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink, k, l, n: Integer; + Focusanchor: string; + OldFont, hf, pf: TFont; + verifTextWidth: Integer; + v: Boolean; + szContent,szExpandedText,szFooterText: string; + defIdx: integer; + +begin + if not Assigned(TaskDialog) then + Exit; + + FTaskDialog := TaskDialog; + Msg := TaskDialog.Instruction; + DlgType := TaskDialog.Icon; + Buttons := TaskDialog.CommonButtons; + + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + + DialogUnits := GetAveCharSize(Canvas); + FHorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); + FVertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); + FHorzSpacing := MulDiv(mcHorzSpacing, DialogUnits.X, 4); + FVertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); + + w := 0; + + if TaskDialog.Title <> '' then + Caption := TaskDialog.Title + else + Caption := GetExeName; + + if (Caption <> '') then + begin + w := 1000; + GetTextSize(Canvas, Caption, w, l); + w := w + 50; + end; + + ButtonWidth := MulDiv(mcButtonWidth, DialogUnits.X, 4); + ButtonHeight := MulDiv(mcButtonHeight, DialogUnits.Y, 8); + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + ButtonCount := 0; + FHorzParaMargin := FHorzMargin; + Y := FVertMargin; + FcmBtnList.Clear; + + DefaultButton := cbOk; + if TaskDialog.DefaultButton <> -1 then + begin + + if TaskDialog.DefaultButton = 0 then + begin + if (cbOk in Buttons) then DefaultButton := cbOk else + if cbYes in Buttons then DefaultButton := cbYes else + DefaultButton := cbRetry; + if cbCancel in Buttons then CancelButton := cbCancel else + if cbNo in Buttons then CancelButton := cbNo else + CancelButton := cbOk; + end + else + begin + case TaskDialog.DefaultButton of + 1: if (cbOk in Buttons) then DefaultButton := cbOK + else + DefaultButton := cbYes; + 2: if (cbCancel in Buttons) then DefaultButton := cbCancel + else + DefaultButton := cbNo; + 6: if (cbYes in Buttons) then DefaultButton := cbYes; + 7: if (cbNo in Buttons) then DefaultButton := cbNo; + end; + end; + end; + + + for B := Low(TCommonButton) to High(TCommonButton) do + begin + if B in Buttons then + begin + if ButtonWidths[B] = 0 then + begin + TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.Handle, + PChar(LoadResString(ButtonCaptions[B])), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do + ButtonWidths[B] := Right - Left + 16; + end; + + if ButtonWidths[B] > ButtonWidth then + ButtonWidth := ButtonWidths[B]; + + i := FcmBtnList.Add(TaskDialog.CreateButton(Self)); + + with TWinControl(FcmBtnList.Items[i]) do + begin + Name := ButtonNames[B]; + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcmBtnList.Items[i]), LoadResString(ButtonCaptions[B])); + TaskDialog.SetButtonModalResult(TWinControl(FcmBtnList.Items[i]), ModalResults[B]); + //ModalResult := ModalResults[B]; + + if (TaskDialog.GetButtonModalResult(TWinControl(FcmBtnList.Items[i])) = mrCancel) and + (doAllowDialogCancel in TaskDialog.Options) then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + //Cancel := true; + + if (TaskDialog.DefaultButton <> -1) then + begin + if (B = DefaultButton) then + begin + //Default := True; + TaskDialog.SetButtonDefault(TWinControl(FcmBtnList.Items[i]), True); + TabOrder := 0; + end; + end; + + if (B = CancelButton) and (doAllowDialogCancel in TaskDialog.Options) then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + + Width := Max(60, ButtonWidths[B]); + Height := ButtonHeight; + cmBtnGroupWidth := cmBtnGroupWidth + Width + ButtonSpacing; + //if B = mbHelp then + //OnClick := TMessageForm(Result).HelpButtonClick; + if TaskDialog.DefaultButton = -1 then + TabStop := false; + end; + //Inc(ButtonCount); + end; + end; + + FcsBtnList.Clear; + if not (docommandLinks in TaskDialog.Options) then + begin + for i := 0 to TaskDialog.CustomButtons.Count - 1 do + begin + TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.Handle, + PChar(TaskDialog.CustomButtons[i]), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + + with TextRect do + bw := Right - Left + 16; + + if bw > ButtonWidth then + ButtonWidth := bw; + + j := FcsBtnList.Add(TaskDialog.CreateButton(Self)); + with TWinControl(FcsBtnList.Items[j]) do + begin + Name := 'Button'+inttostr(i); + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcsBtnList.Items[j]), TaskDialog.CustomButtons[i]); + //ModalResult := i + 100; //mrAbort; + TaskDialog.SetButtonModalResult(TWinControl(FcsBtnList.Items[j]), i + 100); + v := (TaskDialog.GetButtonModalResult(TWinControl(FcsBtnList.Items[j])) = TaskDialog.DefaultButton); + TaskDialog.SetButtonDefault(TWinControl(FcsBtnList.Items[j]), V); + //Default := (ModalResult = TaskDialog.DefaultButton); + //if V then + // TabOrder := 0; + //if B = DefaultButton then Default := True; + //if B = CancelButton then Cancel := True; + Width := Max(60, bw); + Height := ButtonHeight; + TProControl(FcsBtnList.Items[j]).OnClick := OnButtonClick; + CsBtnGroupWidth := CsBtnGroupWidth + Width + ButtonSpacing; + if TaskDialog.DefaultButton = -1 then + TabStop := false; + end; + end; + end + else + begin + n := 0; + hf := TFont.Create; + pf := TFont.Create; + hf.Assign(Canvas.Font); + hf.Size := 11; + hf.Style := [fsBold]; + pf.Assign(Canvas.Font); + + + for i := 0 to TaskDialog.CustomButtons.Count-1 do + begin + Canvas.Font.Size := 10; + Canvas.Font.Style := []; + bw := 0; + bh := 0; + GetMultiLineTextSize(Canvas, TaskDialog.CustomButtons[i], Hf, Pf, DrawTextBiDiModeFlagsReadingOnly, bw, bh); + + {TextRect := Rect(0,0,0,0); + Windows.DrawText( Canvas.handle, + PChar(TaskDialog.CustomButtons[i]), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do bw := (Right - Left) + 8 + 18;} + bw := bw + 26; + if bw > ButtonWidth then + ButtonWidth := bw; + + if bw > n then + n := bw; + + if not (doCommandLinksNoIcon in TaskDialog.Options) then + w := Max(w, n + FHorzMargin*2 + FHorzSpacing + 32) + else + w := Max(w, n + FHorzMargin); + + j := FcsBtnList.Add(TTaskDialogButton.Create(Self)); + with TTaskDialogButton(FcsBtnList.Items[j]) do + begin + Name := 'Button'+inttostr(i); + Parent := Self; + Caption := TaskDialog.CustomButtons[i]; + Font.Assign(pf); + Font.Color := RGB(0, 83, 196); + HeadingFont.Assign(hf); + HeadingFont.Color := RGB(0, 83, 196);//RGB(21, 28, 85); + ModalResult := i + 100; //mrAbort; + //Default := (ModalResult = TaskDialog.DefaultButton); + BorderColorHot := RGB(108, 225, 255); + BorderColorDown := RGB(108, 225, 255); + Width := Max(60, n); + if TaskDialog.DefaultButton <> -1 then + AutoFocus := true; + + Height := Max(bh, Max(ButtonHeight, Canvas.TextHeight('gh') + 20)); + + if not (doCommandLinksNoIcon in TaskDialog.Options) then + begin + Picture.LoadFromResourceName(HInstance, 'TD_ARW'); + Picture.TransparentColor := clFuchsia; + + PictureHot.LoadFromResourceName(HInstance, 'TD_ARWHOT'); + PictureHot.TransparentColor := clFuchsia; + + PictureDown.LoadFromResourceName(HInstance, 'TD_ARWDOWN'); + PictureDown.TransparentColor := clFuchsia; + + PictureDisabled.LoadFromResourceName(HInstance, 'TD_ARWDIS'); + PictureDisabled.TransparentColor := clFuchsia; + end; + + if TaskDialog.DefaultButton = -1 then + TabStop := false + else + TabStop := true; + + OnClick := OnButtonClick; + //CsBtnGroupWidth := CsBtnGroupWidth + Width + ButtonSpacing; + end; + + end; + Canvas.Font.Assign(OldFont); + hf.Free; + pf.Free; + end; + + // if no button then OK button is added + if (FcmBtnList.Count = 0) and (FcsBtnList.Count = 0) then + begin + b := cbOK; + TextRect := Rect(0,0,0,0); + Windows.DrawText( canvas.handle, + PChar(LoadResString(ButtonCaptions[B])), -1, + TextRect, DT_CALCRECT or DT_LEFT or DT_SINGLELINE or + DrawTextBiDiModeFlagsReadingOnly); + with TextRect do ButtonWidths[B] := Right - Left + 8; + + //if ButtonWidths[B] > ButtonWidth then + //ButtonWidth := ButtonWidths[B]; + + i := FcmBtnList.Add(TaskDialog.CreateButton(Self)); + with TWinControl(FcmBtnList.Items[i]) do + begin + Name := ButtonNames[B]; + Parent := Self; + TaskDialog.SetButtonCaption(TWinControl(FcmBtnList.Items[i]), LoadResString(ButtonCaptions[B])); + TaskDialog.SetButtonModalResult(TWinControl(FcmBtnList.Items[i]), ModalResults[B]); + //ModalResult := ModalResults[B]; + //Default := True; + TaskDialog.SetButtonDefault(TWinControl(FcmBtnList.Items[i]), True); + //Cancel := True; // handle ESC + + if doAllowDialogCancel in TaskDialog.Options then + TaskDialog.SetButtonCancel(TWinControl(FcmBtnList.Items[i]), True); + + Width := Max(60, ButtonWidths[B]); + Height := ButtonHeight; + cmBtnGroupWidth := cmBtnGroupWidth + Width + ButtonSpacing; + //if B = mbHelp then + //OnClick := TMessageForm(Result).HelpButtonClick; + end; + end; + + // Instruction + Canvas.Font.Size := 11; + Canvas.Font.Style := [fsBold]; + + SetRect(TextRect, 0, 0, Screen.Width div 2, 0); + DrawText(Canvas.Handle, PChar(Msg), Length(Msg) + 1, TextRect, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or + DrawTextBiDiModeFlagsReadingOnly); + + Canvas.Font.Assign(OldFont); + + IconID := IconIDs[DlgType]; + + IconTextWidth := TextRect.Right; + IconTextHeight := TextRect.Bottom; + if IconID <> nil then + begin + Inc(IconTextWidth, 32 + FHorzSpacing); + if IconTextHeight < 32 then IconTextHeight := 32; + end; + + {if DlgType <> tiBlank then + Caption := LoadResString(Captions[DlgType]) else + Caption := Application.Title;} + + if ((IconID <> nil) or not (TaskDialog.CustomIcon.Empty)) {and not (doCommandLinksNoIcon in TaskDialog.Options)} then + begin + FIcon := TImage.Create(Self); + with FIcon do + begin + Name := 'Image'; + Parent := Self; + + if not TaskDialog.CustomIcon.Empty then + begin + Picture.Icon.Assign(TaskDialog.CustomIcon); + end + else + begin + + case TaskDialog.Icon of + tiShield: Picture.Bitmap.Handle := LoadBitmap(hInstance, 'TD_SHIELD'); + tiBlank: + begin + Picture.Bitmap.Height := 32; + Picture.Bitmap.Width := 32; + Picture.Bitmap.Canvas.Brush.Color := clWhite; + Picture.Bitmap.Canvas.Pen.Style := psClear; + Picture.Bitmap.Canvas.Rectangle(0,0,31,31); + end; + else + Picture.Icon.Handle := LoadIcon(0, IconID); + end; + end; + + SetBounds(FHorzMargin, Y, 32, 32); + end; + end; + + Message := TLabel.Create(Self); + with Message do + begin + Name := 'Instr'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := True; + {$ENDIF} + Caption := Msg; + Font.Size := 11; + Font.Color := RGB(0, 83, 196); + Font.Style := [fsBold]; + BoundsRect := TextRect; + BiDiMode := Self.BiDiMode; + ShowAccelChar := false; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + SetBounds(ALeft, Y, + TextRect.Right, TextRect.Bottom); + y := Y + Height + FVertSpacing; + FHorzParaMargin := ALeft; + end; + + if (doTimer in TaskDialog.Options) then + begin + FTimer := TTimer.Create(Self); + FTimer.Interval := 100; + FTimer.OnTimer := OnTimer; + FTimer.Enabled := True; + end; + + if (doProgressBar in TaskDialog.Options) then + begin + FProgressBar := TProgressBar.Create(Self); + with FProgressBar do + begin + Name := 'ProgressBar'; + Parent := Self; + BoundsRect := Rect(FHorzMargin, Y, Width - FHorzMargin, Y + 12); + Min := TaskDialog.ProgressBarMin; + Max := TaskDialog.ProgressBarMax; + Position := 0; + end; + + if not Assigned(FTimer) then + begin + FTimer := TTimer.Create(Self); + FTimer.Interval := 100; + FTimer.OnTimer := OnTimer; + FTimer.Enabled := True; + end; + end; + + if (TaskDialog.RadioButtons.Count > 0) then + begin + if (doNodefaultRadioButton in FTaskDialog.Options) then + FTaskDialog.RadioButtonResult := 0 + else + FTaskDialog.RadioButtonResult := FTaskDialog.DefaultRadioButton; + + for i := 0 to TaskDialog.RadioButtons.Count-1 do + begin + j := FRadioList.Add(FTaskDialog.CreateRadioButton(Self)); + + TaskDialog.InitRadioButton(self, TWinControl(FRadioList.Items[j]), i, OnRadioClick); + + with TWinControl(FRadioList.Items[j]) do + begin + (* + Name := 'Radio' + inttostr(i); + Parent := Self; + Font.Name := Canvas.Font.Name; + Font.Size := 8; + {$IFDEF DELPHI7_LVL} + //WordWrap := False; + {$ENDIF} + OnClick := OnRadioClick; + BiDiMode := Self.BiDiMode; + *) + + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + end; + + TaskDialog.SetRadioButtonCaption(FRadioList.Items[j],TaskDialog.RadioButtons[i]); + + if doNoDefaultRadioButton in TaskDialog.Options then + TaskDialog.SetRadioButtonState(FRadioList.Items[j], False) + else + begin + if (TaskDialog.DefaultRadioButton > 0) then + TaskDialog.SetRadioButtonState(FRadioList.Items[j], (j + 200 = TaskDialog.DefaultRadioButton)) + else + begin + TaskDialog.SetRadioButtonState(FRadioList.Items[j], (i = 0)); + end; + end; + + (* + with TRadioButton(FRadioList.Items[j]) do + begin + if doNoDefaultRadioButton in TaskDialog.Options then + Checked := False + else + begin + if (TaskDialog.DefaultRadioButton > 0) then + Checked := (j + 200 = TaskDialog.DefaultRadioButton) + else + begin + Checked := (i = 0); + end; + end; + end; + *) + end; + end; + + if (TaskDialog.ExpandedText <> '') then + begin + (*FExpandLabel := TLabel.Create(Self); + with FExpandLabel do + begin + Name := 'Expand'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := True; + {$ENDIF} + ShowAccelChar := false; + BiDiMode := Self.BiDiMode; + FExpandLabel.Caption := TaskDialog.ExpandedText; + Left := ALeft; + Top := Y; + end; *) + + FExpTextXSize := 0; + FExpTextYSize := 0; + r := Rect(FHorzMargin, Y, 300, Y + 26); + + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FExpTextXSize, FExpTextYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + FExpTextXSize := r.Right - r.Left; + //szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]); + //GetTextSize(Canvas, szContent, FExpTextXSize, FExpTextYSize); + + GetTextSize(Canvas, szExpandedText, FExpTextXSize, FExpTextYSize); + end; + + FExpandButton := TTaskDialogButton.Create(Self); + with FExpandButton do + begin + Name := 'ExpandButton'; + Parent := Self; + Caption := ''; + ModalResult := mrNone; + Width := 19; + Height := 19; + OnClick := OnExpandButtonClick; + Picture.LoadFromResourceName(HInstance, 'TD_COLP'); + Picture.TransparentColor := clFuchsia; + + PictureHot.LoadFromResourceName(HInstance, 'TD_COLPHOT'); + PictureHot.TransparentColor := clFuchsia; + + PictureDown.LoadFromResourceName(HInstance, 'TD_COLPDOWN'); + PictureDown.TransparentColor := clFuchsia; + end; + end; + + verifTextWidth := 0; + if (TaskDialog.VerificationText <> '') then + begin + k := 0; + FVerificationCheck := TCheckBox.Create(Self); + with FVerificationCheck do + begin + Name := 'Verification'; + Parent := Self; + {$IFDEF DELPHI7_LVL} + WordWrap := False; + {$ENDIF} + BoundsRect := TextRect; + BiDiMode := Self.BiDiMode; + Caption := TaskDialog.VerificationText; + Left := FHorzMargin; + Top := Y; + Color := RGB(240, 240, 240); + OnClick := OnVerifyClick; + Checked := (doVerifyChecked in TaskDialog.Options); + GetTextSize(Canvas, Caption, k, l); + verifTextWidth := k + FVertSpacing *2; + w := Max(w, Left + k); + end; + end; + + FFooterXSize := 0; + FFooterYSize := 0; + if (TaskDialog.Footer <> '') then + begin + r := Rect(FHorzMargin, Y, 300, Y + 26); + + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + IconID := FooterIconIDs[TaskDialog.FooterIcon]; + FooterIconTextWidth := TextRect.Right; + FooterIconTextHeight := TextRect.Bottom; + if IconID <> nil then + begin + Inc(FooterIconTextWidth, 24 + FHorzSpacing); + if FooterIconTextHeight < 24 then FooterIconTextHeight := 24; + end; + + if IconID <> nil then + begin + FFooterIcon := TImage.Create(Self); + FFooterIconID := IconID; + + with FFooterIcon do + begin + Name := 'FooterImage'; + Parent := Self; + Visible := False; + SetBounds(FHorzMargin, Y, 16, 16); + end; + end; + end; + + ButtonGroupWidth := CmBtnGroupWidth + CsBtnGroupWidth + verifTextWidth; + if (TaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + FHorzSpacing + k + FHorzSpacing; + end; + + if TaskDialog.Content = '' then + Y := Y - 20; + + case TaskDialog.InputType of + itEdit: + begin + FInputEdit := TEdit.Create(self); + FInputEdit.Parent := Self; + FInputEdit.TabStop := true; + FInputEdit.Text := TaskDialog.InputText; + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputEdit.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + itComboEdit, itComboList: + begin + FInputCombo := TComboBox.Create(self); + FInputCombo.Parent := Self; + FInputCombo.TabStop := true; + FInputCombo.Text := TaskDialog.InputText; + FInputCombo.Items.Assign(TaskDialog.InputItems); + + if TaskDialog.InputType = itComboList then + begin + FInputCombo.Style := csDropDownList; + FInputCombo.ItemIndex := FInputCombo.Items.IndexOf(TaskDialog.InputText); + end; + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputCombo.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + itDate: + begin + FInputDate := TDateTimePicker.Create(self); + FInputDate.Parent := Self; + FInputDate.TabStop := true; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + FInputDate.Top := Y + 20; + FInputDate.Left := ALeft; + end; + itMemo: + begin + FInputMemo := TMemo.Create(self); + FInputMemo.Parent := Self; + FInputMemo.TabStop := true; + FInputMemo.WantReturns := false; + FInputMemo.Lines.Text := TaskDialog.InputText; + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + FInputMemo.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 60); + end; + itCustom: + begin + if Assigned(TaskDialog.InputControl) then + begin + FOldParent := TaskDialog.InputControl.Parent; + TaskDialog.InputControl.Parent := self; + TaskDialog.InputControl.Visible := true; + if Assigned(TaskDialog.OnDialogInputSetText) then + TaskDialog.OnDialogInputSetText(TaskDialog, TaskDialog.InputText) + else + SetWindowText(TaskDialog.InputControl.Handle, Pchar(TaskDialog.InputText)); + + ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + if UseRightToLeftAlignment then + ALeft := Self.ClientWidth - ALeft - Width; + + TaskDialog.InputControl.Left := ALeft; + TaskDialog.InputControl.Top := Y + 20; + + if TaskDialog.InputControl.Width + ALeft > self.Width then + w := TaskDialog.InputControl.Width + ALeft + ALeft; + + //TaskDialog.InputControl.SetBounds(ALeft, Y + 20, ClientWidth - ALeft, 20); + end; + end; + end; + + //-- setting Form Width + k := Max(FFooterXSize, Max(IconTextWidth, ButtonGroupWidth)) + FHorzMargin * 2; + k := Max(FExpTextXSize + FHorzMargin * 2, k); + w := Max(w, k); + w := Max(w, FMinFormWidth); + + if w > (Screen.Width - 2 * GetSystemMetrics(SM_CYEDGE)) then + w := Screen.Width - 2 * GetSystemMetrics(SM_CYEDGE); +// if w > 800 then +// w := 800; + + ClientWidth := w; + + if (TaskDialog.InputType = itCustom) and Assigned(TaskDialog.InputControl) then + begin + if TaskDialog.InputControl.Width > ClientWidth - ALeft then + TaskDialog.InputControl.Width := ClientWidth - ALeft; + end; + + if (doProgressBar in TaskDialog.Options) then + begin + FProgressBar.Width := ClientWidth - FHorzMargin*2; + end; + + SetPositions; + + if (TaskDialog.ExpandedText <> '') then + begin + SetExpanded((doExpandedDefault in TaskDialog.Options)); + end; + + Left := (Screen.Width div 2) - (Width div 2); + Top := (Screen.Height div 2) - (Height div 2); + OldFont.Free; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.UpdateDialog; +var + DialogUnits: TPoint; + ButtonSpacing, ButtonGroupWidth, IconTextWidth, X, Y: Integer; + IconID: PChar; + TextRect: TRect; + Msg: string; + DlgType: TTaskDialogIcon; + Buttons: TCommonButtons; + i, w: Integer; + CmBtnGroupWidth, CsBtnGroupWidth: Integer; + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink, k, l, n: Integer; + Focusanchor,szFooterText: string; + OldFont: TFont; +begin + if not Assigned(FTaskDialog) then + Exit; + + Msg := FTaskDialog.Instruction; + DlgType := FTaskDialog.Icon; + Buttons := FTaskDialog.CommonButtons; + + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + + DialogUnits := GetAveCharSize(Canvas); + w := 0; + + if FTaskDialog.Title <> '' then + Caption := FTaskDialog.Title + else + Caption := GetExeName; + + + if (Caption <> '') then + begin + w := 1000; + GetTextSize(Canvas, Caption, w, l); + w := w + 50; + end; + + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + Y := FVertMargin; + //ALeft := 0; + + for i := 0 to FcmBtnList.Count-1 do + begin + CmBtnGroupWidth := CmBtnGroupWidth + TButton(FcmBtnList.Items[i]).Width + ButtonSpacing; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i := 0 to FcsBtnList.Count-1 do + begin + CsBtnGroupWidth := CsBtnGroupWidth + TButton(FcsBtnList.Items[i]).Width + ButtonSpacing; + end; + end + else + begin + + end; + + // Instruction + Canvas.Font.Size := 11; + Canvas.Font.Style := [fsBold]; + + SetRect(TextRect, 0, 0, Screen.Width div 2, 0); + DrawText(Canvas.Handle, PChar(Msg), Length(Msg) + 1, TextRect, + DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or + DrawTextBiDiModeFlagsReadingOnly); + + Canvas.Font.Assign(OldFont); + + + IconID := IconIDs[DlgType]; + IconTextWidth := TextRect.Right; + if (IconId <> nil) then + begin + Inc(IconTextWidth, 32 + FHorzSpacing); + end; + + if Assigned(Message) then + begin + Message.Caption := Msg; + //ALeft := IconTextWidth - TextRect.Right + FHorzMargin; + //if UseRightToLeftAlignment then + //ALeft := Self.ClientWidth - ALeft - Width; + y := Y + Height + FVertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + FTaskDialog.RadioButtonResult := FTaskDialog.DefaultRadioButton; + + for i := 0 to FRadioList.Count - 1 do + begin + with TRadioButton(FRadioList.Items[i]) do + begin + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + end; + end; + end; + + {if (FTaskDialog.ExpandedText <> '') and Assigned(FExpandLabel) then + begin + with FExpandLabel do + begin + Left := ALeft; + Top := Y; + FExpandLabel.Caption := FTaskDialog.ExpandedText; + end; + end; } + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + k := 0; + with FVerificationCheck do + begin + BoundsRect := TextRect; + Caption := FTaskDialog.VerificationText; + Left := FHorzMargin; + Top := Y; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k); + end; + end; + + FFooterXSize := 0; + FFooterYSize := 0; + if (FTaskDialog.Footer <> '') then + begin + r := Rect(FHorzMargin, Y, 300, Y + 26); + x := 0; + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + if Assigned(FFooterIcon) then + begin + FFooterIcon.SetBounds(FHorzMargin, Y, 16, 16); + end; + end; + + ButtonGroupWidth := CmBtnGroupWidth + CsBtnGroupWidth; + if (FTaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + FHorzSpacing + k + FHorzSpacing; + end; + + + //-- setting Form Width + k := Max(FFooterXSize, Max(IconTextWidth, ButtonGroupWidth)) + FHorzMargin * 2; + w := Max(w, k); + w := Max(w, FMinFormWidth); + + + ClientWidth := w; + + if (doProgressBar in FTaskDialog.Options) and Assigned(FProgressBar) then + begin + FProgressBar.Width := ClientWidth - FHorzMargin*2; + end; + + SetPositions; + + OldFont.Free; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetPositions; +var + DialogUnits: TPoint; + HorzMargin, VertMargin, VertSpacing, ButtonSpacing, ButtonGroupWidth, X, Y: Integer; + i, h: Integer; + CmBtnGroupWidth, CsBtnGroupWidth, BtnH: Integer; + X1, y1: Integer; + r, re, rc: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + ExpTextTop, verifTextWidth, k, l: Integer; + szContent: string; + szExpandedText,szFooterText: string; + //lbl:TLabel; + //ExH: integer; +begin + if not Assigned(FTaskDialog) then + Exit; + + DialogUnits := GetAveCharSize(Canvas); + HorzMargin := MulDiv(mcHorzMargin, DialogUnits.X, 4); + VertMargin := MulDiv(mcVertMargin, DialogUnits.Y, 8); + VertSpacing := MulDiv(mcVertSpacing, DialogUnits.Y, 8); + ButtonSpacing := MulDiv(mcButtonSpacing, DialogUnits.X, 4); + CmBtnGroupWidth := 0; + CsBtnGroupWidth := 0; + Y := VertMargin; + + {$IFDEF DELPHI7_LVL} + Message.Transparent := true; + {$ENDIF} + + // Instruction Label + if (Message.Caption <> '') then + y := Y + Message.Height + VertSpacing + else + Message.Visible := False; + + if (FTaskDialog.Content <> '') then + begin + //FContent.Width := ClientWidth - FContent.Left - HorzMargin; + //FContent.Top := Y; + //Y := Y + FContent.Height + VertSpacing; + X1 := 0; + Y1 := 0; + r := GetContentRect; + r := Rect(r.Left, Y, R.Right, Y + 26); + + if (doHyperlinks in FTaskDialog.Options) then + begin + szContent := StringReplace(FTaskDialog.Content,'\n','
',[rfReplaceAll]); + szContent := StringReplace(szContent,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szContent, r, nil, x1, y1, -1, -1, 1, true, true, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FContentXSize, FContentYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + if HasLf(FTaskDialog.Content) then + szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]) + else + szContent := FTaskDialog.Content; + + { + if (Message.Caption <> '') then + FContentXSize := Message.Width + else + FContentXSize := 360; + + if FContentXSize < 360 then + FContentXSize := 360; + } + FContentXSize := r.Right - r.Left; + GetTextSize(Canvas, szContent, FContentXSize, FContentYSize); + end; + + rc := GetContentRect; + if (fContentXSize > rc.Right - rc.Left) then + ClientWidth := ClientWidth + (fContentXSize - (rc.Right - rc.Left)); + + y1 := FContentYSize; + if (Message.Caption = '') and Assigned(FIcon) then + begin + y1 := Max(FIcon.Height, Y1); + end; + + Y := Y + Y1 + VertSpacing; + + case FTaskDialog.InputType of + itEdit: FInputEdit.Top := Y - 10; + itComboEdit,itComboList: FInputCombo.Top := Y - 10; + itDate: FInputDate.Top := Y - 10; + itMemo: FInputMemo.Top := Y - 10; + itCustom: if Assigned(FTaskDialog.InputControl) then + FTaskDialog.InputControl.Top := Y - 10; + end; + + end + else + begin + if (FTaskDialog.RadioButtons.Count = 0) and not (doCommandLinks in FTaskDialog.Options) then + Y := Y + VertSpacing; + + if (Message.Caption = '') and Assigned(FIcon) then + Y := Y + VertSpacing + VertMargin; + end; + + if (FTaskDialog.InputType in [itEdit, itComboEdit, itComboList, itDate]) then + begin + Y := Y + 30; + end; + + if (FTaskDialog.InputType in [itMemo]) then + begin + Y := Y + 70; + end; + + if (FTaskDialog.InputType in [itCustom]) then + begin + if Assigned(FTaskDialog.InputControl) then + Y := Y + FTaskDialog.InputControl.Height + 10 + else + Y := Y + 30; + end; + + if (doProgressBar in FTaskDialog.Options) then + begin + if Assigned(FIcon) then + begin + Y := Max(Y, FIcon.Top + FIcon.Height+3); + end; + FProgressBar.Top := Y; + Y := Y + FProgressBar.Height + VertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + for i:= 0 to FRadioList.Count-1 do + begin + TRadioButton(FRadioList.Items[i]).Top := Y; + TRadioButton(FRadioList.Items[i]).Width := ClientWidth - TRadioButton(FRadioList.Items[i]).Left - HorzMargin; + Y := Y + TRadioButton(FRadioList.Items[i]).Height + 4; + end; + Y := Y + VertSpacing - 4; + end; + + FExpTextXSize := 0; + FExpTextYSize := 0; + ExpTextTop := 0; + if (FTaskDialog.ExpandedText <> '') then + begin + if FExpanded then + begin + (*lbl := TLabel.Create(self); + {$IFDEF DELPHI7_LVL} + lbl.WordWrap := true; + {$ENDIF} + lbl.Width := ClientWidth - FExpandLabel.Left - HorzMargin; + lbl.Caption := FTaskDialog.FExpandedText; + ExH := lbl.Height; + lbl.Free; + + FExpandLabel.Top := Y; + FExpandLabel.Width := ClientWidth - FExpandLabel.Left - HorzMargin; + FExpandLabel.Height := ExH; + + Y := Y + FExpandLabel.Height + VertSpacing; + FExpandLabel.Visible := True; + *) + + + X1 := 0; + Y1 := 0; + r := GetExpTextRect; + r := Rect(r.Left, Y, R.Right, Y + 26); + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, r, nil, x1, y1, -1, -1, 1, true, true, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FExpTextXSize, FExpTextYSize, hyperlinks, + mouselink, re, nil, nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + FExpTextXSize := r.Right - r.Left; + GetTextSize(Canvas, szExpandedText, FExpTextXSize, FExpTextYSize); + end; + + ExpTextTop := Y; + FExpTextTop := ExpTextTop; + Y := Y + FExpTextYSize + VertSpacing; + end + else + begin + //FExpandLabel.Visible := False; + end; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + CsBtnGroupWidth := CsBtnGroupWidth + TButton(FcsBtnList.Items[i]).Width{ + ButtonSpacing}; + end; + + if (FcsBtnList.Count > 0) then + CsBtnGroupWidth := CsBtnGroupWidth + (FcsBtnList.Count-1) * ButtonSpacing; + end + else + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + if Assigned(FIcon) then + TTaskDialogButton(FcsBtnList.Items[i]).Left := FHorzParaMargin; // FIcon.Left + FIcon.Width + FHorzSpacing; + TTaskDialogButton(FcsBtnList.Items[i]).Top := Y; + TTaskDialogButton(FcsBtnList.Items[i]).Width := ClientWidth - TTaskDialogButton(FcsBtnList.Items[i]).Left - HorzMargin; + Y := Y + TTaskDialogButton(FcsBtnList.Items[i]).Height + 2; + end; + FWhiteWindowHeight := Y; + Y := Y + VertSpacing; + end; + + for i := 0 to FcmBtnList.Count-1 do + begin + CmBtnGroupWidth := CmBtnGroupWidth + TButton(FcmBtnList.Items[i]).Width{ + ButtonSpacing}; + end; + CmBtnGroupWidth := CmBtnGroupWidth + (FcmBtnList.Count-1) * ButtonSpacing; + + verifTextWidth := 0; + if (FTaskDialog.VerificationText <> '') then + begin + GetTextSize(Canvas, FTaskDialog.VerificationText, k, l); + verifTextWidth := k + FVertSpacing * 2; + end; + + ButtonGroupWidth := CsBtnGroupWidth + CmBtnGroupWidth; + + X := (ClientWidth - ButtonGroupWidth - FHorzSpacing - 4); //(ClientWidth - ButtonGroupWidth) div 2; + h := Y; + BtnH := 0; + + if (FTaskDialog.ExpandedText <> '') then + begin + X := (ClientWidth - ButtonGroupWidth - FHorzSpacing - 4); + { + k := 0; + l := 0; + GetTextSize(Canvas, FTaskDialog.CollapsControlText, k, l); + GetTextSize(Canvas, FTaskDialog.ExpandControlText, n, l); + k := Max(k, n); + ButtonGroupWidth := ButtonGroupWidth + FExpandButton.Width + ButtonSpacing + k + FHorzSpacing; + } + end; + + if (FTaskDialog.ExpandedText <> '') then + begin + with FExpandButton do + begin + Top := Y; + Left := FVertMargin; //X; + //Inc(X, FExpandButton.Width + ButtonSpacing); + if (FExpandButton.Height > BtnH) then + BtnH := FExpandButton.Height; + end; + end; + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + FVerificationCheck.Width := verifTextWidth - FVertSpacing; //ClientWidth - FVerificationCheck.Left - HorzMargin; + FVerificationCheck.Top := Y + BtnH; + FVerificationCheck.Left := FVertMargin + 3; + //X := FVerificationCheck.Left + FVerificationCheck.Width + FVertMargin; + end; + + if not (docommandLinks in FTaskDialog.Options) then + begin + for i:= 0 to FcsBtnList.Count-1 do + begin + with TButton(FcsBtnList.Items[i]) do + begin + Top := Y; + Left := X; + Inc(X, TButton(FcsBtnList.Items[i]).Width + ButtonSpacing); + //if (i = 0) then + //h := h + TButton(FcsBtnList.Items[i]).Height; + if (TButton(FcsBtnList.Items[i]).Height > BtnH) then + BtnH := TButton(FcsBtnList.Items[i]).Height; + end; + end; + if (FcsBtnList.Count > 0) then + FWhiteWindowHeight := TButton(FcsBtnList.items[0]).Top{ - (FVertSpacing div 2)}; + end; + + for i := 0 to FcmBtnList.Count-1 do + begin + with TButton(FcmBtnList.Items[i]) do + begin + Top := Y; + Left := X; + Inc(X, TButton(FcmBtnList.Items[i]).Width + ButtonSpacing); + //if (i = 0) then + //h := h + TButton(FcmBtnList.Items[i]).Height; + if (TButton(FcmBtnList.Items[i]).Height > BtnH) then + BtnH := TButton(FcmBtnList.Items[i]).Height; + end; + + if (FcmBtnList.Count > 0) then + FWhiteWindowHeight := TButton(FcmBtnList.items[0]).Top{ - (FVertSpacing div 2)}; + end; + + if (FTaskDialog.VerificationText <> '') and Assigned(FVerificationCheck) then + begin + h := h + Max(BtnH, FVerificationCheck.Height + VertSpacing); + y := y + Max(BtnH + FVertSpacing, FVerificationCheck.Height + VertSpacing); + end + else + begin + h := h + BtnH; + if (BtnH > 0) then + y := y + BtnH + FVertSpacing; + end; + + if (FTaskDialog.Footer <> '') then + begin + X1 := 0; + Y1 := 0; + if Assigned(FFooterIcon) then + r := Rect(HorzMargin + 20, Y, Width - HorzMargin, Y + 100) + else + r := Rect(HorzMargin, Y, Width - HorzMargin, Y + 100); + + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, r, nil, x1, y1, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, FFooterXSize, FFooterYSize, hyperlinks, + mouselink, re, nil, nil, 0); + + y1 := FFooterYSize; + if Assigned(FFooterIcon) then + begin + FFooterIcon.Top := Y; + y1 := Max(Y1, 20); + end; + h := h + Y1 + VertSpacing; + end; + + h := h + VertMargin; + ClientHeight := h; + if (FcmBtnList.Count = 0) and ((docommandLinks in FTaskDialog.Options) or (not (docommandLinks in FTaskDialog.Options) and (FcsBtnList.Count = 0))) then + FWhiteWindowHeight := Height; + + if (ExpTextTop > 0) and (doExpandedFooter in FTaskDialog.Options) then + FWhiteWindowHeight := ExpTextTop; +end; + +//------------------------------------------------------------------------------ + +constructor TAdvMessageForm.CreateNew(AOwner: TComponent; Dummy: Integer); +var + NonClientMetrics: TNonClientMetrics; +begin + inherited CreateNew(AOwner); + NonClientMetrics.cbSize := sizeof(NonClientMetrics); + if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then + Font.Handle := CreateFontIndirect(NonClientMetrics.lfMessageFont); + + FExpandButton := nil; + FExpanded := true; + //FExpandLabel := nil; + FExpandControlText := ''; + FCollapsControlText := ''; + FcmBtnList := TList.Create; + FcsBtnList := TList.Create; + FRadioList := TList.Create; + FFooterXSize := 0; + FFooterYSize := 0; + FWhiteWindowHeight := Height; + FHorzParaMargin := 0; + FMinFormWidth := 350; +end; + +//------------------------------------------------------------------------------ + +{procedure TAdvMessageForm.HelpButtonClick(Sender: TObject); +begin + Application.HelpContext(HelpContext); +end;} + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.CustomKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +begin + if ((ssAlt in Shift) and (Key = VK_F4)) then + Key := 0; + + if (Shift = [ssCtrl]) and (Key = Word('C')) then + begin + Beep; + WriteToClipBoard(GetFormText); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.WMActivate(var M: TWMActivate); +begin + // only do this when parent form is topmost + SetWindowPos( Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE ); +end; + +procedure TAdvMessageForm.WriteToClipBoard(Text: String); +var + Data: THandle; + DataPtr: Pointer; +begin + if OpenClipBoard(0) then + begin + try + Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Length(Text) + 1); + try + DataPtr := GlobalLock(Data); + try + Move(PChar(Text)^, DataPtr^, Length(Text) + 1); + EmptyClipBoard; + SetClipboardData(CF_TEXT, Data); + finally + GlobalUnlock(Data); + end; + except + GlobalFree(Data); + raise; + end; + finally + CloseClipBoard; + end; + end + else + raise Exception.CreateRes(@SCannotOpenClipboard); +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetFormText: String; +var + DividerLine, ButtonCaptions: string; + I: integer; +begin + DividerLine := StringOfChar('-', 27) + sLineBreak; + for I := 0 to ComponentCount - 1 do + if Components[I] is TButton then + ButtonCaptions := ButtonCaptions + TButton(Components[I]).Caption + + StringOfChar(' ', 3); + ButtonCaptions := StringReplace(ButtonCaptions,'&','', [rfReplaceAll]); + Result := Format('%s%s%s%s%s%s%s%s%s%s', [DividerLine, Caption, sLineBreak, + DividerLine, Message.Caption, sLineBreak, DividerLine, ButtonCaptions, + sLineBreak, DividerLine]); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetExpandButton(const Value: TTaskDialogButton); +begin + if Assigned(FExpandButton) then + FExpandButton.OnClick := nil; + + FExpandButton := Value; + + if Assigned(FExpandButton) then + FExpandButton.OnClick := OnExpandButtonClick; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnExpandButtonClick(Sender: TObject); +begin + if Assigned(FExpandButton) then + begin + SetExpanded(not Expanded); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.SetExpanded(Value: Boolean); +begin + if FExpanded then + begin + if not Value then + begin + FExpandButton.Picture.LoadFromResourceName(HInstance, 'TD_EXP'); + FExpandButton.Picture.TransparentColor := clFuchsia; + FExpandButton.PictureHot.LoadFromResourceName(HInstance, 'TD_EXPHOT'); + FExpandButton.PictureHot.TransparentColor := clFuchsia; + FExpandButton.PictureDown.LoadFromResourceName(HInstance, 'TD_EXPDOWN'); + FExpandButton.PictureDown.TransparentColor := clFuchsia; + end; + end + else + begin + if Value then + begin + FExpandButton.Picture.LoadFromResourceName(HInstance, 'TD_COLP'); + FExpandButton.Picture.TransparentColor := clFuchsia; + FExpandButton.PictureHot.LoadFromResourceName(HInstance, 'TD_COLPHOT'); + FExpandButton.PictureHot.TransparentColor := clFuchsia; + FExpandButton.PictureDown.LoadFromResourceName(HInstance, 'TD_COLPDOWN'); + FExpandButton.PictureDown.TransparentColor := clFuchsia; + end; + end; + FExpanded := Value; + SetPositions; + Invalidate; +end; + +//------------------------------------------------------------------------------ + +destructor TAdvMessageForm.Destroy; +begin + FcmBtnList.Free; + FcsBtnList.Free; + FRadioList.Free; + if Assigned(FTimer) then + FTimer.Free; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawExpandedText; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize: Integer; + szExpandedText: string; +begin + if not Assigned(FTaskDialog) or (not FExpanded) then + Exit; + + R := GetExpTextRect; + if (FTaskDialog.ExpandedText <> '') then + begin + + if (doHyperlinks in FTaskDialog.Options) then + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n','
',[rfReplaceAll]); + szExpandedText := StringReplace(szExpandedText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szExpandedText, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end + else + begin + szExpandedText := StringReplace(FTaskDialog.ExpandedText,'\n',#13,[rfReplaceAll]); + + DrawText(Canvas.Handle,PChar(szExpandedText),Length(szExpandedText), R, DT_EXPANDTABS or DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_NOPREFIX); + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawContent; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize: Integer; + szContent: string; +begin + if not Assigned(FTaskDialog) then + Exit; + + R := GetContentRect; + if (FTaskDialog.Content <> '') then + begin + + if (doHyperlinks in FTaskDialog.Options) then + begin + szContent := StringReplace(FTaskDialog.Content,'\n','
',[rfReplaceAll]); + szContent := StringReplace(szContent,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szContent, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end + else + begin + if HasLf(FTaskDialog.Content) then + szContent := StringReplace(FTaskDialog.Content,'\n',#13,[rfReplaceAll]) + else + szContent := FTaskDialog.Content; + DrawText(Canvas.Handle,PChar(szContent),Length(szContent), R, DT_EXPANDTABS or DT_LEFT or DT_VCENTER or DT_WORDBREAK or DT_NOPREFIX); + end; + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetContentRect: TRect; +var + X, Y: Integer; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and (FTaskDialog.Content <> '') then + begin + X := FHorzMargin; + if Assigned(FIcon) then + X := FIcon.Left + FIcon.Width + FHorzSpacing; + if (Message.Caption <> '') then + Y := Message.Top + Message.Height + FVertSpacing + else + Y := FVertMargin; + Result := Rect(X, Y, ClientWidth - FHorzMargin, Y + FContentYSize); + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetExpTextRect: TRect; +var + X, Y: Integer; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and FExpanded then + begin + X := FHorzMargin; + if Assigned(FIcon) then + X := FIcon.Left + FIcon.Width + FHorzSpacing; + {if (Message.Caption <> '') then + Y := Message.Top + Message.Height + FVertSpacing + else + Y := FVertMargin; + + if (FTaskDialog.Content <> '') then + y := Y + FContentYSize + FVertSpacing; + + if (doProgressBar in FTaskDialog.Options) then + begin + if Assigned(FIcon) then + begin + Y := Max(Y, FIcon.Top + FIcon.Height+3); + end; + + if Assigned(FProgressBar) then + Y := Y + FProgressBar.Height + FVertSpacing; + end; + + if (FTaskDialog.RadioButtons.Count > 0) then + begin + if (FRadioList.Count > 0) then + Y := Y + TRadioButton(FRadioList.Items[FRadioList.Count-1]).Height + FVertSpacing; + end;} + Y := FExpTextTop; + + Result := Rect(X, Y, ClientWidth - FHorzMargin, Y + FExpTextYSize); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DrawFooter; +var + r, re: trect; + anchor, stripped: string; + HyperLinks,MouseLink: Integer; + Focusanchor: string; + xsize, ysize, i: Integer; + bmp: TBitmap; + shieldbmp: TBitmap; + IconH: THandle; + szFooterText: string; + +begin + if not Assigned(FTaskDialog) then + Exit; + + if (FTaskDialog.Footer <> '') then + begin + R := GetFooterRect; + + i := R.Top - FVertSpacing; + Canvas.Pen.Color := RGB(223, 223, 223); + Canvas.MoveTo(2, i); + Canvas.LineTo(ClientWidth -3, i); + Canvas.Pen.Color := clWhite; + Canvas.MoveTo(2, i+1); + Canvas.LineTo(ClientWidth -3, i+1); + + if Assigned(FFooterIcon) then + begin + + IconH := LoadImage(0,FFooterIconID,IMAGE_ICON,16,16, LR_SHARED); + + bmp := TBitmap.Create; + bmp.Width := 16; + bmp.Height := 16; + bmp.Transparent := True; + bmp.Canvas.Brush.Color := RGB(240, 240, 240); + bmp.Canvas.Rectangle(0,0,16,16); + //DrawIcon(bmp.Canvas.Handle,0, 0, IconH); + //Canvas.StretchDraw(Rect(R.Left, R.Top-2, R.Left+16, R.Top+14), bmp); + + if FTaskDialog.FooterIcon = tfiShield then + begin + shieldbmp := TBitmap.Create; + shieldbmp.Handle := LoadBitmap(hInstance, 'TD_SHIELD'); + bmp.Canvas.StretchDraw(Rect(0,0,16,16),shieldbmp); + shieldbmp.Free; + end + else + begin + DrawIconEx(bmp.Canvas.Handle, 0, 0, IconH, 16, 16, 0, bmp.Canvas.Brush.Handle, DI_NORMAL); //Replaced DrawIcon + end; + Canvas.Draw(R.Left, R.Top, bmp); + bmp.Free; + + R.Left := R.Left + 20; + end; + szFooterText := StringReplace(FTaskDialog.Footer,'\n','
',[rfReplaceAll]); + szFooterText := StringReplace(szFooterText,#10,'
',[rfReplaceAll]); + + HTMLDrawEx(Canvas, szFooterText, R, nil, 0, 0, -1, -1, 1, false, false, false, false, False, false, + true, 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, + hyperlinks, mouselink, re, nil , nil, 0); + end; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetFooterRect: TRect; +begin + Result := Rect(-1, -1, -1, -1); + if Assigned(FTaskDialog) and (FTaskDialog.Footer <> '') then + begin + Result := Rect(FHorzMargin, ClientHeight - FFooterYSize-10, ClientWidth - FHorzMargin, ClientHeight); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.Paint; +var + i: Integer; + R: TRect; + s: string; + VerInfo: TOSVersionInfo; + +begin + inherited; + i := FWhiteWindowHeight; + + {if (FcmBtnList.Count > 0) then + i := TButton(FcmBtnList.Items[0]).Top + else if (FcsBtnList.Count > 0) then + i := TButton(FcsBtnList.Items[0]).Top;} + + VerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); + GetVersionEx(verinfo); + + if (i > 0) then + begin + R := ClientRect; + R.Top := i - (FVertSpacing div 2) ; + Canvas.Brush.Color := RGB(240, 240, 240); + Canvas.FillRect(R); + Canvas.Pen.Color := RGB(223, 223, 223); + Canvas.MoveTo(R.Left, R.Top); + Canvas.LineTo(R.Right, R.Top); + R := ClientRect; + Canvas.Brush.Style := bsClear; + + if (verinfo.dwMajorVersion >= 6) then + Canvas.Pen.Style := psClear + else + Canvas.Pen.Style := psSolid; + + if DRAWBORDER and not IsVista then // only draw on non Vista + begin + Canvas.Pen.Color := clGray; + Canvas.Rectangle(R.Left+1, R.Top+1, R.Right-1, R.Bottom-1); + end; + Canvas.Pen.Style := psSolid; + end; + + DrawContent; + DrawExpandedText; + if Assigned(FTaskDialog) and (FTaskDialog.ExpandedText <> '') and Assigned(FExpandButton) then + begin + if not FExpanded then + s := FTaskDialog.CollapsControlText + else + s := FTaskDialog.ExpandControlText; + + Canvas.Brush.Style := bsClear; + R := Rect(FExpandButton.Left + FExpandButton.Width + FHorzSpacing - 5, FExpandButton.Top, ClientRect.Right, FExpandButton.Top + FExpandButton.Height); + DrawText(Canvas.Handle,PChar(s),Length(s), R, DT_SINGLELINE or DT_LEFT or DT_VCENTER); + end; + DrawFooter; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.IsAnchor(x, y: integer): string; +var + r: trect; + xsize, ysize: integer; + anchor, stripped: string; + + HyperLinks,MouseLink: Integer; + Focusanchor: string; + re: TRect; + AText: String; +begin + Result := ''; + if not Assigned(FTaskDialog) then + Exit; + + AText := ''; + R := GetFooterRect; + if PtInRect(R, Point(X, Y)) then + begin + if Assigned(FFooterIcon) then + begin + R.Left := R.Left + 20; + end; + AText := FTaskDialog.Footer; + end + else + begin + R := GetContentRect; + if PtInRect(R, Point(X, y)) then + AText := FTaskDialog.Content + else + begin + R := GetExpTextRect; + if PtInRect(R, Point(X, y)) then + AText := FTaskDialog.ExpandedText; + end; + end; + + AText := StringReplace(AText,'\n','
',[rfReplaceAll,rfIgnoreCase]); + AText := StringReplace(AText,#10,'
',[rfReplaceAll,rfIgnoreCase]); + + Anchor := ''; + if (AText <> '') then + begin + if HTMLDrawEx(Canvas, AText, r, nil, x, y, -1, -1, 1, true, false, false, true, true, false, true, + 1.0, clBlue, clNone, clNone, clGray, anchor, stripped, focusanchor, xsize, ysize, hyperlinks, + mouselink, re, nil, nil, 0) then + Result := anchor; + end; +end; + +procedure TAdvMessageForm.KeyDown(var Key: Word; Shift: TShiftSTate); +var + s: string; +begin + inherited; + if (Key = VK_F1) then + begin + if FTaskDialog.HelpContext <> 0 then + Application.HelpContext(FTaskDialog.HelpContext); + end; + if (Key = ord('C')) and (ssCtrl in Shift) then + begin + // got ctrl-c + s := FTaskDialog.FTitle + #13#10; + s := s + FTaskDialog.FInstruction + #13#10; + s := s + FTaskDialog.FContent; + clipboard.Open; + clipboard.AsText := s; + clipboard.Close; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + Anchor: string; +begin + inherited; + Anchor := IsAnchor(X, Y); + if Anchor <> '' then + begin + if not Assigned(FTaskDialog.OnDialogHyperlinkClick) then + begin + if (Pos('://', anchor) > 0) then + VistaShellOpen(0, 'iexplore.exe', Anchor); + end; + + if Assigned(FTaskDialog.OnDialogHyperlinkClick) then + FTaskDialog.OnDialogHyperlinkClick(FTaskDialog, Anchor); + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseMove(Shift: TShiftState; X, Y: Integer); +var + anchor: string; +begin + anchor := IsAnchor(x, y); + if (Anchor <> '') then + begin + if (self.Cursor = crDefault) or (fAnchor <> Anchor) then + begin + fAnchor := Anchor; + self.Cursor := crHandPoint; + //if fAnchorHint then + //Application.CancelHint; + //if Assigned(fAnchorEnter) then fAnchorEnter(self, anchor); + end; + end + else + begin + if (self.Cursor = crHandPoint) then + begin + self.Cursor := crDefault; + //if assigned(fAnchorExit) then fAnchorExit(self, anchor); + end; + end; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnTimer(Sender: TObject); +var + State: TTaskDialogProgressState; + Pos: Integer; +begin + if Assigned(FTaskDialog) then + begin + if Assigned(FTaskDialog.OnDialogTimer) then + FTaskDialog.OnDialogTimer(FTaskDialog); + + if Assigned(FTaskDialog.OnDialogProgress) then + begin + Pos := FProgressBar.Position; + FTaskDialog.OnDialogProgress(FTaskDialog, Pos, State); + FProgressBar.Position := Pos; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.ClickButton(ButtonID: integer); +var + Btn: TButton; + TaskBtn: TTaskDialogButton; +begin + TaskBtn := nil; + Btn := GetButton(ButtonID, TaskBtn); + if Assigned(Btn) then + Btn.Click + else if Assigned(TaskBtn) then + TaskBtn.Click; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.EnableButton(ButtonID: integer; + Enabled: boolean); +var + Btn: TButton; + TaskBtn: TTaskDialogButton; +begin + TaskBtn := nil; + Btn := GetButton(ButtonID, TaskBtn); + if Assigned(Btn) then + Btn.Enabled := Enabled + else if Assigned(TaskBtn) then + TaskBtn.Enabled := Enabled; +end; + +//------------------------------------------------------------------------------ + +function TAdvMessageForm.GetButton(ButtonID: Integer; var TaskButton: TTaskDialogButton): TButton; +var + i, j: Integer; +begin + j := 0; + Result := nil; + for i := 0 to FcmBtnList.Count-1 do + begin + Inc(j); + if (j >= ButtonID) then + begin + TButton(FcmBtnList.Items[i]).Enabled := Enabled; + Result := TButton(FcmBtnList.Items[i]); + break; + end; + end; + + if not Assigned(Result) then + begin + j := 99; + for i := 0 to FcsBtnList.Count-1 do + begin + Inc(j); + if (j >= ButtonID) then + begin + if (doCommandLinks in FTaskDialog.Options) then + begin + TTaskDialogButton(FcsBtnList.Items[i]).Enabled := Enabled; + TaskButton := TTaskDialogButton(FcsBtnList.Items[i]); + end + else + begin + TButton(FcsBtnList.Items[i]).Enabled := Enabled; + Result := TButton(FcsBtnList.Items[i]); + end; + break; + end; + end; + end; +end; + +//------------------------------------------------------------------------------ + +procedure TTaskDialogButton.Click; +var + Form: TCustomForm; +begin + Form := GetParentForm(Self); + if Form <> nil then + Form.ModalResult := ModalResult; + inherited; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnVerifyClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FVerificationCheck) then + Exit; + + FTaskDialog.VerifyResult := FVerificationCheck.Checked; + + if Assigned(FVerificationCheck) and Assigned(FTaskDialog.OnDialogVerifyClick) then + FTAskDialog.OnDialogVerifyClick(FTaskDialog, FVerificationCheck.Checked); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnRadioClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FRadioList) then + Exit; + + FTaskDialog.RadioButtonResult := FRadioList.IndexOf(Sender) + 200; + if Assigned(FTaskDialog) and Assigned(FTaskDialog.OnDialogRadioClick) then + FTAskDialog.OnDialogRadioClick(FTaskDialog, FTaskDialog.RadioButtonResult); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.DoClose(var Action: TCloseAction); +var + CanClose: Boolean; + s: string; + a: array[0..255] of char; + +begin + CanClose := True; + + if Assigned(FTaskDialog) and Assigned(FTaskDialog.OnDialogClose) then + begin + FTaskDialog.OnDialogClose(FTaskDialog, CanClose); + end; + + case FTaskDialog.InputType of + itEdit: FTaskDialog.InputText := FInputEdit.Text; + itComboEdit, itComboList: FTaskDialog.InputText := FInputCombo.Text; + itDate: FTaskDialog.InputText := DateToStr(FInputDate.Date); + itMemo: FTaskDialog.InputText := FInputMemo.Lines.Text; + itCustom: + begin + if Assigned(FTaskDialog.InputControl) then + begin + GetWindowText(FTaskDialog.InputControl.Handle, a, sizeof(a)); + s := strpas(a); + if Assigned(FTaskDialog.OnDialogInputGetText) then + begin + s := ''; + FTaskDialog.OnDialogInputGetText(Self, s); + end; + FTaskDialog.InputText := s; + if CanClose then + begin + FTaskDialog.InputControl.Visible := false; + FTaskDialog.InputControl.Parent := FOldParent; + end; + end; + end; + end; + + if not CanClose then + Action := caNone; + inherited; +end; + +procedure TAdvMessageForm.DoShow; +var + defBtn: integer; +begin + inherited; + + defBtn := -1; + + if FTaskDialog.DefaultButton <> -1 then + begin + if (FTaskDialog.DefaultButton - 100 >= 0) and (FTaskDialog.DefaultButton - 100 < FTaskDialog.CustomButtons.Count) then + defBtn := FTaskDialog.DefaultButton - 100; + end; + + if defBtn <> -1 then + begin + if (docommandLinks in FTaskDialog.Options) then + TTaskDialogButton(FcsBtnList[defBtn]).SetFocus + else + TCustomControl(FcsBtnList[defBtn]).SetFocus; + end + else + begin + if (FTaskDialog.DefaultButton >= 0) and (FTaskDialog.DefaultButton < FCmBtnList.Count) then + begin + if TCustomControl(FcmBtnList[FTaskDialog.DefaultButton]).Enabled then + TCustomControl(FcmBtnList[FTaskDialog.DefaultButton]).SetFocus; + end; + end; + + + case FTaskDialog.InputType of + itEdit: FInputEdit.SetFocus; + itComboEdit, itComboList: FInputCombo.SetFocus; + itDate: FInputDate.SetFocus; + itMemo: FInputMemo.SetFocus; + itCustom: FTaskDialog.InputControl.SetFocus; + end; + +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.OnButtonClick(Sender: TObject); +begin + if not Assigned(FTaskDialog) or not Assigned(FcsBtnList) then + Exit; + + if Assigned(FTaskDialog) and Assigned(FTaskDialog.onDialogButtonClick) then + FTaskDialog.OnDialogButtonClick(FTaskDialog, FcsBtnList.IndexOf(Sender) + 100); +end; + +//------------------------------------------------------------------------------ + +procedure TAdvMessageForm.CMDialogChar(var Message: TCMDialogChar); +var + I: Integer; +begin + if Assigned(FTaskDialog) and (docommandLinks in FTaskDialog.Options) then + begin + for I := 0 to FcsBtnList.Count-1 do + begin + if (TControl(FcsBtnList[I]) is TTaskDialogButton) and IsAccel(Message.CharCode, TTaskDialogButton(FcsBtnList[I]).Caption) and CanFocus then + begin + TTaskDialogButton(FcsBtnList[I]).Click; + Message.Result := 1; + Exit; + end; + end; + end; + + if (FTaskDialog.ExpandControlText <> '') and Expanded then + begin + if IsAccel(Message.CharCode, FTaskDialog.FExpandControlText) then + begin + OnExpandButtonClick(Self); + end; + end + else + if (FTaskDialog.CollapsControlText <> '') and not Expanded then + if IsAccel(Message.CharCode, FTaskDialog.FCollapsControlText) then + begin + OnExpandButtonClick(Self); + end; + + inherited; + + + if Assigned(FTaskDialog) and (doAllowDialogCancel in FTaskDialog.Options) and (Message.CharCode = VK_ESCAPE) then + begin + Self.Close; + end; +end; + + +function CoreShowmessage( + const Title, // dialog window title + Instruction, // the part of the message shown in blue + content, // additional message if desired + verify: string; // ex Do Not Show this Again + tiIcon: tTaskDialogIcon): boolean; +var + td: TCustomAdvTaskDialog; +begin + td := TCustomAdvTaskDialog.Create(application); + td.Title := Title; + td.Instruction := instruction; + td.Content := Content; + td.VerificationText := verify; + td.icon := tiIcon; + td.Execute; + result := (verify <> '') and td.VerifyResult; + td.free; +end {CoreShowmessage}; + +//===================================================================== +// This returns false unless verify is not blank AND the verify checkbox +// was not checked. +//--------------------------------------------------------------------- +function AdvShowMessage( + const Title, // dialog window title + Instruction, // the part of the message shown in blue + content, // additional message if desired + verify: string; // ex Do Not Show this Again + tiIcon: tTaskDialogIcon): boolean; overload; +begin + result := coreShowmessage(title, instruction,content,verify,tiIcon); +end { tmsShowMessage }; + +function AdvShowmessage(const Instruction: string):boolean; overload; +begin // Only instruction . tiInformation + result := CoreShowMessage('',Instruction,'','',tiInformation); +end; + +function AdvShowmessage(const Title, Instruction: string):boolean; overload; +begin // title, instruction tiInformation + result := CoreShowMessage(Title,Instruction,'','',tiInformation); +end; + +function AdvShowmessage(const Title, Instruction: string;tiIcon: TTaskDialogIcon): boolean; overload; +begin + result := CoreShowMessage(Title,Instruction,'','',tiIcon); +end; + +function AdvShowMessageFmt(const Instruction: string; Parameters: array of const): boolean; +begin + Result := AdvShowmessage(Format(Instruction,Parameters)); +end; + +function AdvMessageBox(hWnd: HWND; lpInstruction, lpTitle: PChar; flags: UINT): Integer; +const + MB_CANCELTRYCONTINUE = $00000006; // missing from windows unit so probably never be used +var + td: TCustomAdvTaskDialog; + res: integer; + def: integer; + num: integer; + task: tCommonButton; + txt: string; +begin + td := TCustomAdvTaskDialog.Create(application); + td.Title := lptitle; + td.instruction := lpInstruction; + + // extract the icon from flags + case MB_ICONMASK and flags of + MB_ICONEXCLAMATION: td.Icon := tiWarning; // Exclamation mark= MB_ICONWARNING + MB_ICONINFORMATION: td.Icon := tiInformation; // Circled I = MB_ICONASTERISK + MB_ICONQUESTION: td.Icon := tiQuestion; // Question (api says don't use any more + MB_ICONSTOP: td.Icon := tiError; //Stop sign = MB_ICONERROR & MB_ICONHAND + end; + + // extract the buttons from flags + // MessageBox() Flags from Windows help file + // MB_ABORTRETRYIGNORE + // The message box contains three push buttons: Abort, Retry, and Ignore. + // MB_CANCELTRYCONTINUE + // Microsoft Windows 2000/XP: The message box contains three push buttons: Cancel, Try Again, Continue. Use this message box type instead of MB_ABORTRETRYIGNORE. + // MB_HELP + // Windows 95/98/Me, Windows NT 4.0 and later: Adds a Help button to the message box. When the user clicks the Help button or presses F1, the system sends a WM_HELP message to the owner. + // MB_OK + // The message box contains one push button: OK. This is the default. + // MB_OKCANCEL + // The message box contains two push buttons: OK and Cancel. + // MB_RETRYCANCEL + // The message box contains two push buttons: Retry and Cancel. + // MB_YESNO + // The message box contains two push buttons: Yes and No. + // MB_YESNOCANCEL + // The message box contains three push buttons: Yes, No, and Cancel. + td.Commonbuttons := []; + txt := ''; + case MB_TYPEMASK and flags of + MB_ABORTRETRYIGNORE: txt := SAbortButton + #10 + SRetryButton + #10 + SIgnoreButton; + MB_CANCELTRYCONTINUE: txt := SCancelButton + #10 + SRetryButton + #10 + SContinue; + MB_OK: td.Commonbuttons := [cbOK]; + MB_RETRYCANCEL: txt := SRetryButton + #10 + SCancelButton; + MB_OKCANCEL: td.CommonButtons := [cbOK,cbCancel]; + MB_YESNOCANCEL: td.Commonbuttons := [cbYes, cbNO, cbCancel]; + MB_YESNO: td.CommonButtons := [cbYes, cbNO]; + end; + + + + if MB_HELP and flags <> 0 then + begin + if length(txt) > 0 then + txt := txt + #10; + txt := txt + SHelpButton; + end; + if txt <> '' then + td.CustomButtons.text := txt; + + // deal with mbDefbutton1, 2, 3 & 4 + def := 0; + if mb_DefButton1 and flags <> 0 then + def := 1; + if mb_DefButton2 and flags <> 0 then + def := 2; + if mb_DefButton3 and flags <> 0 then + def := 3; + if mb_DefButton4 and flags <> 0 then + def := 4; + if def > 0 then + begin // have to set default button + num := td.CustomButtons.count; + if num <= def then + td.DefaultButton := 99 + def + else + begin + // I think this compiles on supported delphi compilers + for task := cbOK to cbClose do + begin + if task in td.CommonButtons then + begin + inc(num); + if num = def then + begin + case task of + cbOK: td.Defaultbutton := idOK; + cbYes: td.Defaultbutton := idYES; + cbNo: td.Defaultbutton := idNO; + cbCancel: td.Defaultbutton := idCANCEL; + cbRetry: td.Defaultbutton := idRETRY; + cbClose: td.Defaultbutton := idCLOSE; + end; + break; + end; + end; + end; + end; + end; + + if (cbCancel in td.CommonButtons) then + td.Options := td.Options + [doAllowDialogCancel]; + + // Deal with mbAppModal, mbSystemModal and mbtaskModal + // not sure what to do with these (I personally haven't used them. + result := 0; + res := td.Execute; + case res of + 1: result := IDOK; + 2: result := IDCANCEL; + 3: result := IDABORT; + 4: result := IDRETRY; + 5: result := IDIGNORE; + 6: result := IDYES; + 7: result := IDNO; + else + begin + case MB_TYPEMASK and flags of + MB_ABORTRETRYIGNORE: + case res of + 100: result := IDABORT; + 101: result := IDRETRY; + 102: result := IDIGNORE; + end; + MB_CANCELTRYCONTINUE: + case res of + 100: result := IDCANCEL; + {$IFDEF DELPHI9_LVL} + 101: result := IDTRYAGAIN; + 102: result := IDCONTINUE; + {$ENDIF} + end; + MB_RETRYCANCEL: + case res of + 100: result := IDRETRY; + 101: result := IDCANCEL; + end; + end; + end; + end; + td.Free; +end; + +//================================================================================================== + +function AdvTaskMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; +begin + Result := AdvTaskMessageDlgPosHelp(Title, Msg, DlgType, Buttons, HelpCtx, -1, -1, ''); +end; + +//-------------------------------------------------------------------------------------------------- + +function AdvTaskMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +begin + Result := AdvTaskMessageDlgPosHelp(Title, Msg, DlgType, Buttons, HelpCtx, + -1, -1, '', DefaultButton); +end; + +//-------------------------------------------------------------------------------------------------- + +function AdvTaskMessageDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; +begin + Result := AdvTaskMessageDlgPosHelp(Title, Msg, DlgType, Buttons, HelpCtx, X, Y, ''); +end; + +//-------------------------------------------------------------------------------------------------- + +function AdvTaskMessageDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + DefaultButton: TMsgDlgBtn): Integer; overload; +begin + Result := AdvTaskMessageDlgPosHelp(Title, Msg, DlgType, Buttons, HelpCtx, + X, Y, '', DefaultButton); +end; + +//-------------------------------------------------------------------------------------------------- + +function AdvTaskMessageDlgPosHelp(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: string): Integer; +begin + Result := AdvTaskMessageDlgPosHelp(Title, Msg, DlgType, Buttons, HelpCtx, X, Y, + HelpFileName, mbYes); +end; + + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +begin + // passes mbHelp as the default button since we can't deal with help anyway + Result := AdvMessageDlg(Instruction,Dlgtype,Buttons,HelpCtx,mbHelp); +end; + +function AdvMessageDlg(const Instruction: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +var + td: TCustomAdvTaskDialog; + ray: array[0..3] of integer; + res: integer; +begin + td := TCustomAdvTaskDialog.Create(Application); + td.Instruction := instruction; + + case DlgType of + mtWarning: + begin + td.Icon := tiWarning; + td.Title := SMsgDlgWarning; + end; + mtError: + begin + td.Icon := tiError; + td.Title := SMsgDlgError; + end; + mtInformation: + begin + td.Icon := tiInformation; + td.Title := SMsgDlgInformation; + end; + mtConfirmation: + begin + td.Icon := tiQuestion; + td.Title := SMsgDlgConfirm; + end; + end; + + fillchar(ray,sizeof(ray),0); + td.CommonButtons := []; + +// TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, +// mbAll, mbNoToAll, mbYesToAll, mbHelp); + + if (mbYes in Buttons) then + td.CommonButtons := td.CommonButtons + [cbYes]; + + if (mbNo in Buttons) then + td.CommonButtons := td.CommonButtons + [cbNo]; + + if (mbOK in Buttons) then + td.CommonButtons := td.CommonButtons + [cbOK]; + + if (mbCancel in Buttons) then + td.CommonButtons := td.CommonButtons + [cbCancel]; + + if (mbAbort in Buttons) then + td.CommonButtons := td.CommonButtons + [cbClose]; + + if (mbRetry in Buttons) then + td.CommonButtons := td.CommonButtons + [cbRetry]; + + if (mbIgnore in Buttons) then + begin + td.CustomButtons.Add(SMsgDlgIgnore); + ray[0] := mrIgnore; + end; + + if (mbAll in Buttons) then + begin + ray[td.custombuttons.Count] := mrALL; + td.CustomButtons.Add(SMsgDlgAll); + end; + + if (mbNoToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrNoToAll; + td.CustomButtons.Add(SMsgDlgNoToAll); + end; + + if (mbYesToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrYesToAll; + td.Custombuttons.Add(SMsgDlgYesToAll); + end; + + if (mbHelp in buttons) then + begin + ray[td.Custombuttons.Count] := mrNone; + td.Custombuttons.Add(SMsgDlgHelp); + end; + + case DefaultButton of + mbYes: td.DefaultButton := integer(mrYes); + mbNo: td.DefaultButton := integer(mrNo); + mbCancel: td.DefaultButton := integer(mrCancel); + mbOK: td.DefaultButton := integer(mrOK); + mbAbort: td.DefaultButton := integer(mrAbort); + mbRetry: td.DefaultButton := integer(mrRetry); + mbIgnore: td.DefaultButton := integer(mrIgnore); + end; + + td.HelpContext := HelpCtx; + td.Options := td.Options + [doAllowDialogCancel]; + + + result := 0; + res := td.Execute; + + case res of + 1: Result := mrOk; + 2: Result := mrCancel; + 3: Result := mrAbort; + 4: Result := mrRetry; + 6: Result := mrYes; + 7: Result := mrNo; + else + if (res > 99) and (res < 100 + high(ray)) then + begin + result := ray[res - 100]; + + if (Result = mrNone) and (td.HelpContext > 0) then + begin + Application.HelpContext(td.HelpContext); + end; + end; + end; +end; + + +//-------------------------------------------------------------------------------------------------- + +function AdvTaskMessageDlgPosHelp(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; + const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer; +var + td: TAdvTaskDialog; + ray: array[0..3] of integer; + res: integer; +begin + td := TAdvTaskDialog.Create(Application); + try + td.Instruction := Title; + td.Content := msg; + + case DlgType of + mtWarning: + begin + td.Icon := tiWarning; + td.Title := SMsgDlgWarning; + end; + mtError: + begin + td.Icon := tiError; + td.Title := SMsgDlgError; + end; + mtInformation: + begin + td.Icon := tiInformation; + td.Title := SMsgDlgInformation; + end; + mtConfirmation: + begin + td.Icon := tiShield; + td.Title := SMsgDlgConfirm; + end; + end; + + fillchar(ray,sizeof(ray),0); + td.CommonButtons := []; + + // TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAdvrt, mbRetry, mbIgnore, + // mbAll, mbNoToAll, mbYesToAll, mbHelp); + + if (mbYes in Buttons) then + td.CommonButtons := td.CommonButtons + [cbYes]; + + if (mbNo in Buttons) then + td.CommonButtons := td.CommonButtons + [cbNo]; + + if (mbOK in Buttons) then + td.CommonButtons := td.CommonButtons + [cbOK]; + + if (mbCancel in Buttons) then + td.CommonButtons := td.CommonButtons + [cbCancel]; + + if (mbAbort in Buttons) then + td.CommonButtons := td.CommonButtons + [cbClose]; + + if (mbRetry in Buttons) then + td.CommonButtons := td.CommonButtons + [cbRetry]; + + + if (mbIgnore in Buttons) then + begin + td.CustomButtons.Add(SMsgDlgIgnore); + ray[0] := mrIgnore; + end; + + if (mbAll in Buttons) then + begin + ray[td.custombuttons.Count] := mrALL; + td.CustomButtons.Add(SMsgDlgAll); + end; + + if (mbNoToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrNoToAll; + td.CustomButtons.add(SMsgDlgNoToAll); + end; + + if (mbYesToAll in buttons) then + begin + ray[td.custombuttons.Count] := mrYesToAll; + td.Custombuttons.Add(SMsgDlgYesToAll); + end; + + if (mbHelp in buttons) then + begin + ray[td.Custombuttons.Count] := mrNone; + td.Custombuttons.Add(SMsgDlgHelp); + end; + + case DefaultButton of + mbYes: td.DefaultButton := integer(mrYes); + mbNo: td.DefaultButton := integer(mrNo); + mbCancel: td.DefaultButton := integer(mrCancel); + mbOK: td.DefaultButton := integer(mrOK); + mbAbort: td.DefaultButton := integer(mrAbort); + mbRetry: td.DefaultButton := integer(mrRetry); + mbIgnore: td.DefaultButton := integer(mrIgnore); + end; + + td.HelpContext := HelpCtx; + td.Options := td.Options + [doAllowDialogCancel]; + + Result := 0; + res := td.Execute; + case res of + 1: Result := mrOk; + 2: Result := mrCancel; + 3: Result := mrAbort; + 4: Result := mrRetry; + 6: Result := mrYes; + 7: Result := mrNo; + else + if (res > 99) and (res < 100+high(ray)) then + begin + result := ray[res-100]; + + if (Result = mrNone) and (td.HelpContext > 0) then + begin + Application.HelpContext(td.HelpContext); + end; + end; + end; + finally + td.Free; + end; +end; + + +function AdvInputQueryDlg(ACaption, APrompt: string; var Value: string):boolean; +var + AID: TAdvInputTaskDialog; +begin + AID := TAdvInputTaskDialog.Create(Application); + AID.Instruction := APrompt; + AID.Title := ACaption; + AID.InputText := Value; + AID.InputType := itEdit; + AID.CommonButtons := [cbOK, cbCancel]; + Result := AID.Execute = mrOK; + Value := AID.InputText; +end; + +//------------------------------------------------------------------------------ + +procedure Register; +begin + RegisterComponents('TMS',[TAdvTaskDialog, TAdvInputTaskDialog]); +end; + +//------------------------------------------------------------------------------ + + +{ TAdvInputTaskDialog } + +constructor TAdvInputTaskDialog.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FInputType := itEdit; + Options := Options + [doAllowDialogCancel]; +end; + +function TAdvInputTaskDialog.Execute: integer; +begin + Result := AdvMessageDlgPos(Self, -1, -1); +end; + + +initialization + //cbOK, cbYes, cbNo, cbCancel, cbRetry, cbClose); + ButtonCaptions[cbOK] := @SMsgDlgOK; + ButtonCaptions[cbYes] := @SMsgDlgYes; + ButtonCaptions[cbNo] := @SMsgDlgNo; + ButtonCaptions[cbCancel] := @SMsgDlgCancel; + ButtonCaptions[cbRetry] := @SMsgDlgRetry; + ButtonCaptions[cbClose] := @SMsgDlgAbort; + + Captions[tiBlank] := nil; + Captions[tiWarning] := @SMsgDlgWarning; + Captions[tiQuestion] := @SMsgDlgConfirm; + Captions[tiError] := @SMsgDlgError; + Captions[tiShield] := @SMsgDlgInformation; + + +{$IFDEF FREEWARE} + if (FindWindow('TApplication', nil) = 0) OR + (FindWindow('TAppBuilder', nil) = 0) then + begin + MessageBox(0,'Application uses trial version of TMS components','Info',MB_OK); + end +{$ENDIF} + + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.res b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialog.res new file mode 100644 index 0000000000000000000000000000000000000000..5028366a69a8e4676e68cd089bf369f31f1b0824 GIT binary patch literal 20004 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 Sxvo8XVbzem(eHWXasLhF1RGrd literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogDE.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogDE.pas new file mode 100644 index 0000000..0434010 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogDE.pas @@ -0,0 +1,84 @@ +{***************************************************************************} +{ TTaskDialog component } +{ for Delphi & C++Builder } +{ version 1.2 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogDE; + +interface + +{$I TMSDEFS.INC} + +uses + Classes, Graphics, Comctrls, Windows, Forms, TypInfo, Dialogs, ExtCtrls, + Controls, ExtDlgs, TaskDialog +{$IFDEF DELPHI6_LVL} + {$IFNDEF TMSDOTNET} + , DesignIntf, DesignEditors, ContNrs + {$ENDIF} + {$IFDEF TMSDOTNET} + , Borland.Vcl.design.DesignIntf, Borland.Vcl.design.DesignEditors, ContNrs + {$ENDIF} +{$ELSE} + , DsgnIntf +{$ENDIF} + ; + +type + + TTaskDialogEditor = class(TDefaultEditor) + public + function GetVerb(Index: Integer):string; override; + function GetVerbCount: Integer; override; + procedure ExecuteVerb(Index: Integer); override; + end; + +implementation + +{ TTaskDialogEditor } + +procedure TTaskDialogEditor.ExecuteVerb(Index: Integer); +var + AppIsParent: boolean; +begin + inherited; + case Index of + 0: + begin + AppIsParent := TAdvTaskDialog(Component).ApplicationIsParent; + TAdvTaskDialog(Component).ApplicationIsParent := true; + TAdvTaskDialog(Component).Execute; + TAdvTaskDialog(Component).ApplicationIsParent := AppIsParent; + end; + end; +end; + +function TTaskDialogEditor.GetVerb(Index: Integer): string; +begin + case Index of + 0: Result := 'Preview'; + end; +end; + +function TTaskDialogEditor.GetVerbCount: Integer; +begin + Result := 1; +end; + + + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogEx.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogEx.pas new file mode 100644 index 0000000..c1a40fe --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogEx.pas @@ -0,0 +1,300 @@ +{***************************************************************************} +{ TTaskDialogEx component } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 2007 - 2008 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogEx; + +{$I TMSDEFS.INC} + +interface + +uses + Classes, Windows, Messages, Forms, Dialogs, SysUtils, StdCtrls, Graphics, Consts, Math, + ExtCtrls, Controls, TaskDialog, AdvGlowButton, AdvOfficeButtons; + +type + TButtonCreatedEvent = procedure(Sender: TObject; Button: TAdvGlowButton) of object; + + TAdvTaskDialogEx = class(TAdvTaskDialog) + private + FOnButtonCreated: TButtonCreatedEvent; + FAppearance: TGlowButtonAppearance; + protected + function CreateRadioButton(AOwner: TComponent): TWinControl; override; + procedure SetRadioButtonState(Btn: TWinControl; Checked: boolean); override; + procedure SetRadioButtonCaption(Btn: TWinControl; Value: string); override; + function CreateButton(AOwner: TComponent): TWinControl; override; + procedure InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); override; + procedure SetButtonCaption(aButton: TWinControl; Value: TCaption); override; + procedure SetButtonCancel(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonDefault(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonModalResult(aButton: TWinControl; Value: Integer); override; + function GetButtonModalResult(aButton: TWinControl): Integer; override; + public + property Appearance: TGlowButtonAppearance read FAppearance write FAppearance; + property OnButtonCreated:TButtonCreatedEvent read FOnButtonCreated write FOnButtonCreated; + end; + + TAdvInputTaskDialogEx = class(TAdvInputTaskDialog) + private + FOnButtonCreated: TButtonCreatedEvent; + FAppearance: TGlowButtonAppearance; + protected + function CreateRadioButton(AOwner: TComponent): TWinControl; override; + procedure SetRadioButtonState(Btn: TWinControl; Checked: boolean); override; + procedure SetRadioButtonCaption(Btn: TWinControl; Value: string); override; + function CreateButton(AOwner: TComponent): TWinControl; override; + procedure InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); override; + procedure SetButtonCaption(aButton: TWinControl; Value: TCaption); override; + procedure SetButtonCancel(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonDefault(aButton: TWinControl; Value: Boolean); override; + procedure SetButtonModalResult(aButton: TWinControl; Value: Integer); override; + function GetButtonModalResult(aButton: TWinControl): Integer; override; + public + property Appearance: TGlowButtonAppearance read FAppearance write FAppearance; + property OnButtonCreated:TButtonCreatedEvent read FOnButtonCreated write FOnButtonCreated; + end; + + +procedure Register; + +implementation + +//------------------------------------------------------------------------------ + +procedure Register; +begin + RegisterComponents('TMS',[TAdvTaskDialogEx]); +end; + +//------------------------------------------------------------------------------ + +{ TAdvTaskDialogEx } + +function TAdvTaskDialogEx.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvGlowButton.Create(AOwner); + if Assigned(FAppearance) then + (Result as TAdvGlowButton).Appearance := FAppearance; + (Result as TAdvGlowButton).TabStop := true; + if Assigned(FOnButtonCreated) then + FOnButtonCreated(Self,(Result as TAdvGlowButton)); +end; + +//------------------------------------------------------------------------------ + +function TAdvTaskDialogEx.CreateRadioButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvOfficeRadioButton.Create(AOwner); +end; + +//------------------------------------------------------------------------------ + +function TAdvTaskDialogEx.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + Result := TAdvGlowButton(aButton).ModalResult; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonCancel(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Cancel := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonDefault(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Default := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetButtonModalResult(aButton: TWinControl; + Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).ModalResult := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TAdvOfficeRadioButton(Btn).Caption := Value; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.SetRadioButtonState(Btn: TWinControl; + Checked: boolean); +begin + TAdvOfficeRadioButton(Btn).Checked := Checked; +end; + +//------------------------------------------------------------------------------ + +procedure TAdvTaskDialogEx.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +{ TAdvInputTaskDialogEx } + +//------------------------------------------------------------------------------ + +function TAdvInputTaskDialogEx.CreateButton(AOwner: TComponent): TWinControl; +begin + Result := TAdvGlowButton.Create(AOwner); + if Assigned(FAppearance) then + (Result as TAdvGlowButton).Appearance := FAppearance; + (Result as TAdvGlowButton).TabStop := true; + if Assigned(FOnButtonCreated) then + FOnButtonCreated(Self,(Result as TAdvGlowButton)); +end; + +function TAdvInputTaskDialogEx.CreateRadioButton( + AOwner: TComponent): TWinControl; +begin + Result := TAdvOfficeRadioButton.Create(AOwner); +end; + +function TAdvInputTaskDialogEx.GetButtonModalResult( + aButton: TWinControl): Integer; +begin + Result := mrNone; + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + Result := TAdvGlowButton(aButton).ModalResult; +end; + +procedure TAdvInputTaskDialogEx.SetButtonCancel(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Cancel := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonCaption(aButton: TWinControl; + Value: TCaption); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Caption := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonDefault(aButton: TWinControl; + Value: Boolean); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).Default := Value; +end; + +procedure TAdvInputTaskDialogEx.SetButtonModalResult(aButton: TWinControl; + Value: Integer); +begin + if not Assigned(aButton) or not (aButton is TAdvGlowButton) then + Exit; + + TAdvGlowButton(aButton).ModalResult := Value; +end; + +procedure TAdvInputTaskDialogEx.SetRadioButtonCaption(Btn: TWinControl; + Value: string); +begin + TAdvOfficeRadioButton(Btn).Caption := Value; +end; + +procedure TAdvInputTaskDialogEx.SetRadioButtonState(Btn: TWinControl; + Checked: boolean); +begin + TAdvOfficeRadioButton(Btn).Checked := Checked; +end; + +procedure TAdvInputTaskDialogEx.InitRadioButton(AOwner: TForm; Btn: TWinControl; btnIndex: Integer; OnClickEvent : TNotifyEvent); +begin + with TRadioButton(Btn) do + begin + Name := 'Radio' + inttostr(btnIndex); + Parent := AOwner; + Font.Name := AOwner.Canvas.Font.Name; + Font.Size := 8; + BiDiMode := AOwner.BiDiMode; + OnClick := OnClickEvent; + { + BoundsRect := TextRect; + Left := FHorzParaMargin + FHorzMargin; //ALeft + FHorzMargin; + Top := Y; + Width := Self.Width - Left - 4; + GetTextSize(Canvas, Caption, k, l); + w := Max(w, Left + k + FHorzMargin + 20); + } + end; +end; + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dpk b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dpk new file mode 100644 index 0000000..7a9bb7f --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dpk @@ -0,0 +1,40 @@ +package TaskDialogPkg; + +{$R *.res} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DESCRIPTION 'TMS TaskDialog'} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + designide; + +contains + TaskDialogRegDE in 'TaskDialogRegDE.pas', + TaskDialog in 'TaskDialog.pas', + TaskDialogDE in 'TaskDialogDE.pas', + picturecontainer in 'picturecontainer.pas', + SpanishConsts in 'SpanishConsts.pas'; + +end. diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dproj b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dproj new file mode 100644 index 0000000..5198e02 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.dproj @@ -0,0 +1,91 @@ + + + {322e4f51-9fd5-43be-8659-42e8edcc60b1} + TaskDialogPkg.dpk + Release + AnyCPU + DCC32 + ..\Lib\D11\TaskDialogPkgD2007.bpl + 12.0 + Base + + + true + + + ..\Lib\D12\TaskDialogPkg.bpl + 00400000 + false + ..\Lib\D12 + false + TMS TaskDialog + false + true + ..\Lib\D12 + true + 0 + true + ..\Lib\D12 + + + Delphi.Personality.12 + Package + + + + False + True + False + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 2067 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + TaskDialogPkg.dpk + + + + 12 + + + + MainSource + + + + + + + + + + + Base + + + + diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.res b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogPkg.res new file mode 100644 index 0000000000000000000000000000000000000000..5fc5c89d548a21d08982c8e99b9cf4cdef8d29e0 GIT binary patch literal 3008 zcmb7`&5qne6oqS&NMr>qh1sxSgb=c4ffA7gi?$~;AyOnDsHa`qIBLR7S0^)37)#B9 zaUP-{f)#IoG|#{jc)`jW*jQqLFyE=N$K8`;L0RSBd(S!dr%E=)m_26OhRN;L_~mB* z{W>-~{@ZADi??A!T=tmvm^)^~nQ{3wJihJh;?bl@Mw4)?r*-6F=B_`-;oQB8uVRcQ z^41I(g>`Y8G;z@#byPcN-FfBebFN$d@~E+`BOw&JM}>=f9}Rep$j{ixkT)bJ)4YwWUjn{nB>)LbdRg1rhZ8(p{upC1*G@#prB6sNw9h?RJOz z%D+|caN8z@KP@eBqYv+_8q1F7`3%A&v zs~7cnHAj_gvemqZtDozITU0`rp=7`FPPuyj(yr#ET~Axsv9#h|&0FeR@Wmy(bNO+7 zoG;vrYT7FH?5Rt6N@SBBVh=){Rf~F&XH|4i%Cm~rQ zp&wp9#|04w@7AFgPX|Ih6aRXe!(T57loWg|OJOm~me^YEsk)^@dDc-b$?gnpp+rUL z*B$p%V__zaN}xRA2{Z?v09YQwAce$y_y)H_wUq8|q4DF|=CLr3LcQcl%0wKL_h(f^ zeUWEPradz3QgyfcY7Gtks)NtGP{QoI*~$D47Z3t_uVAQxkd&=F5lT2%d#aez9;q4j zNco1LjBYB>eF;j#4zivWuA#2lW5O<{-Ev?b5Vke+cv{;BWqOz%HWmc<#nv+qSH0cN z!+_v1j;Q2Yy@ex$?P~T2TJKDvc{BI63hCJFiMBjATFtfE-=ur+?eBt)*U$a;&1-wX z{{=7pVgAkhi&-%*y7`K$=Kme9`0dcVFy^{uWz0KZzX!*Ma2@#Hnv3i0`^K2t%(i{k zd}F>a56!pCFU=#a{n-4k(cjFD+1nfWzZ(4o?U=J`ru$bKz42e@?Al$RtT{A~Ie%rQ z+&%ORk3HW5?lpe9@#nw73sY~xf7O9*88?{Wjeqo~-~Ee2b7o$eg*h=t<^k7d<|)W0 z<_B|%)vw;>w)x!LF`p6bT{KA1N1*Kx>#2EeUYIA?|3uVJczSwCu)#(ab&9 z3pf|}o?P1A<_B-*lHX$c66?X{j`4H*bI`VQMu&3b_}Xa?mTh?}b{gyH_<-)0mHaCxi%3@Op;jW-V^r{Nu)dqL8Y5 literal 0 HcmV?d00001 diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogRegDE.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogRegDE.pas new file mode 100644 index 0000000..3a9109f --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/TaskDialogRegDE.pas @@ -0,0 +1,49 @@ +{***************************************************************************} +{ TTaskDialog component } +{ for Delphi & C++Builder } +{ version 1.2 } +{ } +{ written by TMS Software } +{ copyright © 2006 - 2007 } +{ Email : info@tmssoftware.com } +{ Web : http://www.tmssoftware.com } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{***************************************************************************} + +unit TaskDialogRegDE; + +interface +{$I TMSDEFS.INC} + +uses + Classes, TaskDialog, TaskDialogDE, + {$IFDEF DELPHI6_LVL} + {$IFDEF TMSDOTNET} + Borland.Vcl.Design.DesignIntf, Borland.Vcl.Design.DesignEditors + {$ENDIF} + {$IFNDEF TMSDOTNET} + DesignIntf, DesignEditors + {$ENDIF} + {$ELSE} + DsgnIntf + {$ENDIF} + ; + +procedure Register; + +implementation + +procedure Register; +begin + RegisterComponentEditor(TAdvTaskDialog,TTaskDialogEditor); +end; + +end. + diff --git a/TAdvTaskDialog/internal/1.5.1.6/1/Source/htmlengo.pas b/TAdvTaskDialog/internal/1.5.1.6/1/Source/htmlengo.pas new file mode 100644 index 0000000..8c876c1 --- /dev/null +++ b/TAdvTaskDialog/internal/1.5.1.6/1/Source/htmlengo.pas @@ -0,0 +1,2353 @@ +{**************************************************************************} +{ Mini HTML rendering engine } +{ for Delphi & C++Builder } +{ } +{ written by TMS Software } +{ copyright © 1999-2008 } +{ Email : info@tmssoftware.com } +{ Website : http://www.tmssoftware.com/ } +{ } +{ The source code is given as is. The author is not responsible } +{ for any possible damage done due to the use of this code. } +{ The component can be freely used in any application. The complete } +{ source code remains property of the author and may not be distributed, } +{ published, given or sold in any form as such. No parts of the source } +{ code can be included in any other component or application without } +{ written authorization of the author. } +{**************************************************************************} + +{$I TMSDEFS.INC} + +{$IFNDEF TMSDOTNET} +procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap); +var + BitmapHeader: pBitmapInfo; + BitmapImage : POINTER; + HeaderSize : DWORD; + ImageSize : DWORD; +begin + GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize); + GetMem(BitmapHeader, HeaderSize); + GetMem(BitmapImage, ImageSize); + try + GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^); + StretchDIBits(Canvas.Handle, + DestRect.Left, DestRect.Top, // Destination Origin + DestRect.Right - DestRect.Left, // Destination Width + DestRect.Bottom - DestRect.Top, // Destination Height + 0, 0, // Source Origin + Bitmap.Width, Bitmap.Height, // Source Width & Height + BitmapImage, + TBitmapInfo(BitmapHeader^), + DIB_RGB_COLORS, + SRCCOPY) + finally + FreeMem(BitmapHeader); + FreeMem(BitmapImage) + end; +end; +{$ENDIF} + +{$IFDEF TMSDOTNET} +procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap); +var + BitmapHeader: TBitmapInfo; + HeaderSize : DWORD; + ImageSize : DWORD; + Bits: HBITMAP; + Image: TBytes; + Info: IntPtr; + +begin + Bits := Bitmap.Handle; + + GetDIBSizes(Bits, HeaderSize, ImageSize); + + + Info := System.Runtime.InteropServices.Marshal.AllocHGlobal(HeaderSize); + + try + SetLength(Image, ImageSize); + GetDIB(Bits, 0, Info, Image); + + BitmapHeader := TBitmapInfo(System.Runtime.InteropServices.Marshal.PtrToStructure(Info, TypeOf(TBitmapInfo))); + + StretchDIBits(Canvas.Handle, + DestRect.Left, DestRect.Top, // Destination Origin + DestRect.Right - DestRect.Left, // Destination Width + DestRect.Bottom - DestRect.Top, // Destination Height + 0, 0, // Source Origin + Bitmap.Width, Bitmap.Height, // Source Width & Height + Image, + Info, + DIB_RGB_COLORS, + SRCCOPY) + finally + System.Runtime.InteropServices.Marshal.FreeHGlobal(Info); + end; +end; +{$ENDIF} + +function DirExists(const Name: string): Boolean; +var + Code: Integer; +begin + {$IFNDEF TMSDOTNET} + Code := GetFileAttributes(PChar(Name)); + {$ENDIF} + {$IFDEF TMSDOTNET} + Code := GetFileAttributes(Name); + {$ENDIF} + Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); +end; + +function SysImage(Canvas: TCanvas;x,y:Integer;APath:string;large,draw,print:boolean;resfactor:double):TPoint; +var + SFI: TSHFileInfo; + i,Err: Integer; + imglsthandle: THandle; + rx,ry: Integer; + bmp: TBitmap; + r: TRect; +begin + Val(APath,i,Err); + + {$IFNDEF TMSDOTNET} + FillChar(SFI,Sizeof(SFI),0); + {$ENDIF} + + {$IFNDEF TMSDOTNET} + if (APath <> '') and (Err <> 0) then + begin + if FileExists(APath) or DirExists(APath) then + // If the file or directory exists, just let Windows figure out it's attrs. + SHGetFileInfo(PChar(APath), 0, SFI, SizeOf(TSHFileInfo), + SHGFI_SYSICONINDEX {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}) + else + // File doesn't exist, so Windows doesn't know what to do with it. We have + // to tell it by passing the attributes we want, and specifying the + // SHGFI_USEFILEATTRIBUTES flag so that the function knows to use them. + SHGetFileInfo(PChar(APath), 0, SFI, SizeOf(TSHFileInfo), + SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}); + i := SFI.iIcon; + end; + + if Large then + imglsthandle := SHGetFileInfo('', 0, SFI, SizeOf(SFI), + SHGFI_SYSICONINDEX or SHGFI_LARGEICON) + else + imglsthandle := SHGetFileInfo('', 0, SFI, SizeOf(SFI), + SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + {$ENDIF} + {$IFDEF TMSDOTNET} + if (APath <> '') and (Err <> 0) then + begin + if FileExists(APath) or DirExists(APath) then + // If the file or directory exists, just let Windows figure out it's attrs. + SHGetFileInfo(APath, 0, SFI, System.Runtime.interopservices.marshal.SizeOf(TypeOf(TSHFileInfo)), + SHGFI_SYSICONINDEX {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}) + else + // File doesn't exist, so Windows doesn't know what to do with it. We have + // to tell it by passing the attributes we want, and specifying the + // SHGFI_USEFILEATTRIBUTES flag so that the function knows to use them. + SHGetFileInfo(APath, 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(TSHFileInfo)), + SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES {or OPEN_FLAG[Open] or SELECTED_FLAG[Selected]}); + i := SFI.iIcon; + end; + + if Large then + imglsthandle := SHGetFileInfo('', 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(SFI)), + SHGFI_SYSICONINDEX or SHGFI_LARGEICON) + else + imglsthandle := SHGetFileInfo('', 0, SFI, System.Runtime.interopservices.Marshal.SizeOf(TypeOf(SFI)), + SHGFI_SYSICONINDEX or SHGFI_SMALLICON); + {$ENDIF} + + + ImageList_GetIconSize(imglsthandle,rx,ry); + + {$IFNDEF TMSDOTNET} + Result := Point(rx,ry); + {$ENDIF} + {$IFDEF TMSDOTNET} + Result := Borland.Vcl.Types.Point(rx,ry); + {$ENDIF} + + if Draw and not Print then + ImageList_Draw(imglsthandle,i,Canvas.Handle,x,y, ILD_TRANSPARENT); + + if Draw and Print then + begin + bmp := TBitmap.Create; + bmp.Width := rx; + bmp.Height := ry; + ImageList_Draw(imglsthandle,i,bmp.Canvas.handle,0,0,ILD_NORMAL); + r.left := x; + r.top := y; + r.right := x + Round(rx * ResFactor); + r.bottom := y + Round(ry * ResFactor); + PrintBitmap(Canvas,r,bmp); + bmp.Free; + end; +end; + +procedure DrawHTMLGradient(Canvas: TCanvas; FromColor,ToColor,BorderColor: TColor; Steps: Integer;R:TRect; Direction: Boolean); +var + diffr,startr,endr: Integer; + diffg,startg,endg: Integer; + diffb,startb,endb: Integer; + iend: Integer; + rstepr,rstepg,rstepb,rstepw: Real; + i,stepw: Word; +begin + if Steps = 0 then + Steps := 1; + + FromColor := ColorToRGB(FromColor); + ToColor := ColorToRGB(ToColor); + + startr := (FromColor and $0000FF); + startg := (FromColor and $00FF00) shr 8; + startb := (FromColor and $FF0000) shr 16; + endr := (ToColor and $0000FF); + endg := (ToColor and $00FF00) shr 8; + endb := (ToColor and $FF0000) shr 16; + + diffr := endr - startr; + diffg := endg - startg; + diffb := endb - startb; + + rstepr := diffr / steps; + rstepg := diffg / steps; + rstepb := diffb / steps; + + if Direction then + rstepw := (R.Right - R.Left) / Steps + else + rstepw := (R.Bottom - R.Top) / Steps; + + with Canvas do + begin + for i := 0 to Steps - 1 do + begin + endr := startr + Round(rstepr*i); + endg := startg + Round(rstepg*i); + endb := startb + Round(rstepb*i); + stepw := Round(i*rstepw); + Pen.Color := endr + (endg shl 8) + (endb shl 16); + Brush.Color := Pen.Color; + if Direction then + begin + iend := R.Left + stepw + Trunc(rstepw) + 1; + if iend > R.Right then + iend := R.Right; + Rectangle(R.Left + stepw,R.Top,iend,R.Bottom) + end + else + begin + iend := R.Top + stepw + Trunc(rstepw)+1; + if iend > r.Bottom then + iend := r.Bottom; + Rectangle(R.Left,R.Top + stepw,R.Right,iend); + end; + end; + + if BorderColor <> clNone then + begin + Brush.Style := bsClear; + Pen.Color := BorderColor; + Rectangle(R.Left,R.Top,R.Right,R.Bottom); + end; + end; +end; + +{ +procedure DrawHTMLGradient(Canvas: TCanvas; FromColor,ToColor: TColor; Steps: Integer;R:TRect; Direction: Boolean); +var + diffr,startr,endr: Integer; + diffg,startg,endg: Integer; + diffb,startb,endb: Integer; + iend: Integer; + rstepr,rstepg,rstepb,rstepw: Real; + i,stepw: Word; + +begin + if Steps = 0 then + Steps := 1; + + FromColor := ColorToRGB(FromColor); + ToColor := ColorToRGB(ToColor); + + startr := (FromColor and $0000FF); + startg := (FromColor and $00FF00) shr 8; + startb := (FromColor and $FF0000) shr 16; + endr := (ToColor and $0000FF); + endg := (ToColor and $00FF00) shr 8; + endb := (ToColor and $FF0000) shr 16; + + diffr := endr - startr; + diffg := endg - startg; + diffb := endb - startb; + + rstepr := diffr / steps; + rstepg := diffg / steps; + rstepb := diffb / steps; + + if Direction then + rstepw := (R.Right - R.Left) / Steps + else + rstepw := (R.Bottom - R.Top) / Steps; + + with Canvas do + begin + for i := 0 to Steps - 1 do + begin + endr := startr + Round(rstepr*i); + endg := startg + Round(rstepg*i); + endb := startb + Round(rstepb*i); + stepw := Round(i*rstepw); + Pen.Color := endr + (endg shl 8) + (endb shl 16); + Brush.Color := Pen.Color; + if Direction then + begin + iend := R.Left + stepw + Trunc(rstepw) + 1; + if iend > R.Right then + iend := R.Right; + Rectangle(R.Left + stepw,R.Top,iend,R.Bottom) + end + else + begin + iend := R.Top + stepw + Trunc(rstepw)+1; + if iend > r.Bottom then + iend := r.Bottom; + Rectangle(R.Left,R.Top + stepw,R.Right,iend); + end; + end; + end; +end; +} + +function Text2Color(s:string):tcolor; +begin + Result := clBlack; + + if (s='clred') then result:=clred else + if (s='clblack') then result:=clblack else + if (s='clblue') then result:=clblue else + if (s='clgreen') then result:=clgreen else + if (s='claqua') then result:=claqua else + if (s='clyellow') then result:=clyellow else + if (s='clfuchsia') then result:=clfuchsia else + if (s='clwhite') then result:=clwhite else + if (s='cllime') then result:=cllime else + if (s='clsilver') then result:=clsilver else + if (s='clgray') then result:=clgray else + if (s='clolive') then result:=clolive else + if (s='clnavy') then result:=clnavy else + if (s='clpurple') then result:=clpurple else + if (s='clteal') then result:=clteal else + if (s='clmaroon') then result:=clmaroon; + + if Result <> clBlack then Exit; + + if (s='clbackground') then result:=clbackground else + if (s='clactivecaption') then result:=clactivecaption else + if (s='clinactivecaption') then result:=clinactivecaption else + if (s='clmenu') then result:=clmenu else + if (s='clwindow') then result:=clwindow else + if (s='clwindowframe') then result:=clwindowframe else + if (s='clmenutext') then result:=clmenutext else + if (s='clwindowtext') then result:=clwindowtext else + if (s='clcaptiontext') then result:=clcaptiontext else + if (s='clactiveborder') then result:=clactiveborder else + if (s='clinactiveborder') then result:=clinactiveborder else + if (s='clappworkspace') then result:=clappworkspace else + if (s='clhighlight') then result:=clhighlight else + if (s='clhighlighttext') then result:=clhighlighttext else + if (s='clbtnface') then result:=clbtnface else + if (s='clbtnshadow') then result:=clbtnshadow else + if (s='clgraytext') then result:=clgraytext else + if (s='clbtntext') then result:=clbtntext else + if (s='clinactivecaptiontext') then result:=clinactivecaptiontext else + if (s='clbtnhighlight') then result:=clbtnhighlight else + if (s='cl3ddkshadow') then result:=clgraytext else + if (s='cl3dlight') then result:=cl3dlight else + if (s='clinfotext') then result:=clinfotext else + if (s='clinfobk') then result:=clinfobk; +end; + +function HexVal(s:string): Integer; +var + i,j: Integer; +begin + if Length(s) < 2 then + begin + Result := 0; + Exit; + end; + + if s[1] >= 'A' then + i := ord(s[1]) - ord('A') + 10 + else + i := ord(s[1]) - ord('0'); + + if s[2] >= 'A' then + j := ord(s[2]) - ord('A') + 10 + else + j := ord(s[2]) - ord('0'); + + Result := i shl 4 + j; +end; + +function Hex2Color(s:string): TColor; +var + r,g,b: Integer; +begin + r := Hexval(Copy(s,2,2)); + g := Hexval(Copy(s,4,2)) shl 8; + b := Hexval(Copy(s,6,2)) shl 16; + Result := TColor(b + g + r); +end; + +function IPos(su,s:string):Integer; +begin + Result := Pos(UpperCase(su),UpperCase(s)); +end; + +function IStrToInt(s:string):Integer; +var + Err,Res: Integer; +begin + Val(s,Res,Err); + Result := Res; +end; + +function DBTagStrip(s:string):string; +var + i,j: Integer; +begin + i := Pos('<#',s); + if i > 0 then + begin + Result := Copy(s,1,i - 1); + Delete(s,1,i); + j := Pos('>',s); + if j > 0 then + Delete(s,j,1); + Result := Result + s; + end + else + Result := s; +end; + +function CRLFStrip(s:string;break:boolean):string; +var + i: Integer; +begin + Result := ''; + for i := 1 to Length(s) do + begin + if not ( (s[i] =#13) or (s[i] =#10)) then + Result := Result + s[i] + else + if (s[i] = #13) and break then + Result := Result + '
'; + end; +end; + +function VarPos(su,s:string;var Res:Integer):Integer; +begin + Res := Pos(su,s); + Result := Res; +end; + +function TagReplaceString(const Srch,Repl:string;var Dest:string):Boolean; +var + i: Integer; +begin + i := IPos(srch,dest); + if i > 0 then + begin + Result := True; + Delete(Dest,i,Length(Srch)); + Dest := Copy(Dest,1,i-1) + Repl + Copy(Dest,i,Length(Dest)); + end + else + Result := False; +end; + +{$WARNINGS OFF} +function HTMLDrawEx(Canvas:TCanvas; s:string; fr:TRect; + FImages: TCustomImageList; + XPos,YPos,FocusLink,HoverLink,ShadowOffset: Integer; + CheckHotSpot,CheckHeight,Print,Selected,Blink,HoverStyle,WordWrap: Boolean; + ResFactor:Double; + URLColor,HoverColor,HoverFontColor,ShadowColor:TColor; + var AnchorVal,StripVal,FocusAnchor: string; + var XSize,YSize,HyperLinks,MouseLink: Integer; + var HoverRect:TRect;ic: THTMLPictureCache; pc: TPictureContainer;LineSpacing: Integer): Boolean; +var + su: string; + r,dr,hr,rr,er: TRect; + htmlwidth,htmlheight,txtheight: Integer; + Align: TAlignment; + PIndent: Integer; + OldFont: TFont; + CalcFont: TFont; + DrawFont: TFont; + OldCalcFont: TFont; + OldDrawFont: TFont; + Hotspot, ImageHotspot: Boolean; + Anchor,OldAnchor,MouseInAnchor,Error: Boolean; + bgcolor,paracolor,hvrcolor,hvrfntcolor,pencolor,blnkcolor,hifcol,hibcol: TColor; + LastAnchor,OldAnchorVal: string; + IMGSize: TPoint; + isSup,isSub,isPara,isShad: Boolean; + subh,suph,imgali,srchpos,hlcount,licount: Integer; + hrgn,holdfont: THandle; + ListIndex: Integer; + dtp: TDrawTextParams; + Invisible: Boolean; + FoundTag: Boolean; + {new for editing} + nnFit: Integer; + nnSize: TSize; + inspoint: Integer; + {$IFNDEF TMSDOTNET} + nndx: Pointer; + {$ENDIF} + AltImg,ImgIdx,OldImgIdx: Integer; + DrawStyle: DWord; + Col1,Col2: TColor; + ofsx,newofsx: integer; + + procedure StartRotated(Canvas:TCanvas;Angle: Integer); + var + LFont:TLogFont; + begin + {$IFNDEF TMSDOTNET} + GetObject(Canvas.Font.Handle,SizeOf(LFont),Addr(LFont)); + {$ENDIF} + + {$IFDEF TMSDOTNET} + GetObject(Canvas.Font.Handle,System.Runtime.InteropServices.Marshal.SizeOf(TypeOf(LFont)),LFont); + {$ENDIF} + + LFont.lfEscapement := Angle * 10; + LFont.lfOrientation := Angle * 10; + hOldFont:=SelectObject(Canvas.Handle,CreateFontIndirect(LFont)); + end; + + procedure EndRotated(Canvas:TCanvas); + begin + DeleteObject(SelectObject(Canvas.Handle,hOldFont)); + end; + + function HTMLDrawLine(Canvas: TCanvas;var s:string;r: TRect;Calc:Boolean; + var w,h,subh,suph,imgali:Integer;var Align:TAlignment; var PIndent: Integer; + XPos,YPos:Integer;var Hotspot,ImageHotSpot:Boolean;OffsetX: integer; var NewOffsetX: integer):string; + var + su,Res,TagProp,Prop,AltProp,Tagp,LineText:string; + cr: TRect; + linebreak,imgbreak,linkbreak: Boolean; + th,sw,indent,err,bmpx,bmpy,oldh: Integer; + TagPos,SpacePos,o,l: Integer; + bmp: THTMLPicture; + ABitmap: TBitmap; + NewColor,NewColorTo: TColor; + TagWidth,TagHeight,WordLen,WordLenEx,WordWidth: Integer; + TagChar: Char; + LengthFits, SpaceBreak: Boolean; + + begin + Result := ''; + LineText := ''; + r.Bottom := r.Bottom - Subh; + + w := 0; + sw := 0; + + LineBreak := False; + ImgBreak := False; + LinkBreak := False; + HotSpot := False; + ImageHotSpot := False; + +// r.Left := r.Left + offsetX; + + cr := r; + res := ''; + + if not Calc then + cr.Left := cr.Left + OffsetX; + + if isPara and not Calc then + begin + Pencolor := Canvas.Pen.Color; + Canvas.Pen.color := Canvas.Brush.Color; + Canvas.Rectangle(fr.Left,r.Top,fr.Right,r.Top + h); + end; + + while (Length(s) > 0) and not LineBreak and not ImgBreak do + begin + // get next word or till next HTML tag + TagPos := Pos('<',s); + + if WordWrap then + SpacePos := Pos(' ',s) + else + SpacePos := 0; + + if (Tagpos > 0) and ((SpacePos > TagPos) or (SpacePos = 0)) then + begin + su := Copy(s,1,TagPos - 1); + end + else + begin + if SpacePos > 0 then + su := Copy(s,1,SpacePos) + else + su := s; + end; + + {$IFDEF TMSDEBUG} + DbgMsg(su+ '.'); + {$ENDIF} + + WordLen := Length(su); + + while Pos(' ',su) > 0 do + begin + TagReplacestring(' ',' ',su); + end; + + while Pos('<',su) > 0 do + begin + TagReplacestring('<','<',su); + end; + + while Pos('>',su) > 0 do + begin + TagReplacestring('>','>',su); + end; + + WordLenEx := Length(su); + + if WordLen > 0 then + begin + th := Canvas.TextHeight(su); + + if isSub and (subh < (th shr 2)) then subh := th shr 2; + if isSup and (suph < (th shr 2)) then suph := th shr 2; + + if th > h then + h := th; + + StripVal := StripVal + su; + + if Invisible then + Delete(s,1,WordLen); + + if not Invisible then + begin + // draw mode + if not Calc then + begin + if isSup then + cr.Bottom := cr.Bottom - suph; + if isSub then + cr.Bottom := cr.Bottom + subh; + + cr.Bottom := cr.Bottom - imgali; + + if isShad then + begin + OffsetRect(cr,ShadowOffset,ShadowOffset); + NewColor := Canvas.Font.Color; + Canvas.Font.Color := ShadowColor; + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + {$ENDIF} + Offsetrect(cr,-ShadowOffset,-ShadowOffset); + Canvas.Font.Color := NewColor; + end; + + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle and not DT_EXTERNALLEADING,nil); + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + if Anchor and (Hyperlinks - 1 = FocusLink) then + FocusAnchor := LastAnchor; + + {$IFDEF TMSDEBUG} + if Anchor then + OutputDebugString(pchar('drawrect for '+anchorval+' = ['+inttostr(cr.Left)+':'+inttostr(cr.Top)+'] ['+inttostr(cr.right)+':'+inttostr(cr.bottom)+'] @ ['+inttostr(xpos)+':'+inttostr(ypos))); + {$ENDIF} + + if Error then + begin + Canvas.Pen.Color := clRed; + Canvas.Pen.Width := 1; + + l := (cr.Left div 2) * 2; + if (l mod 4)=0 then o := 2 else o := 0; + + Canvas.MoveTo(l,r.Bottom + o - 1); + while l < cr.Right do + begin + if o = 2 then o := 0 else o := 2; + Canvas.LineTo(l + 2,r.bottom + o - 1); + Inc(l,2); + end; + // if o = 2 then o := 0 else o := 2; + // Canvas.LineTo(l + 2,r.Bottom + o - 1); + end; + + cr.Left := cr.Right; + cr.Right := r.Right; + cr.Bottom := r.Bottom; + cr.Top := r.Top; + end + else + begin + cr := r; //reinitialized each time ! + {$IFNDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,PChar(su),WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + {$IFDEF TMSDOTNET} + DrawTextEx(Canvas.Handle,su,WordLenEx,cr,DrawStyle or DT_CALCRECT,nil); + {$ENDIF} + + // preparations for editing purposes + if (ypos > cr.Top) and (ypos < cr.bottom) and (xpos > w) then {scan charpos here} + begin + {$IFNDEF TMSDOTNET} + er := rect(w,cr.top,xpos,cr.bottom); + Fillchar(dtp,sizeof(dtp),0); + {$ENDIF} + + {$IFDEF TMSDOTNET} + er := Borland.Vcl.Types.rect(w,cr.top,xpos,cr.bottom); + {$ENDIF} + dtp.cbSize:=sizeof(dtp); + + {$IFDEF DELPHI4_LVL} + {$IFNDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,pChar(su),WordLenEx,xpos-w,@nnfit,nil,nnSize); + {$ENDIF} + {$IFDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,su,WordLenEx,xpos-w,nnfit,nil,nnSize); + {$ENDIF} + {$ELSE} + {$IFNDEF TMSDOTNET} + nndx := nil; {fix for declaration error in Delphi 3 WINDOWS.PAS} + GetTextExtentExPoint(Canvas.Handle,pChar(su),WordLenEx,xpos - w,nnfit,integer(nndx^),nnSize); + {$ENDIF} + {$IFDEF TMSDOTNET} + GetTextExtentExPoint(Canvas.Handle,su,WordLenEx,xpos - w,nnfit,nil,nnSize); + {$ENDIF} + {$ENDIF} + + {this will get the character pos of the insertion point} + if nnfit = WordLen then + InsPoint := InsPoint + WordLen + else + InsPoint := InsPoint + nnfit; + end; + {end of preparations for editing purposes} + + { Calculated text width } + WordWidth := cr.Right - cr.Left; + w := w + WordWidth; + + if (XPos - cr.Left >= w - WordWidth) and (XPos - cr.Left <= w) and Anchor then + begin + HotSpot := True; + if (YPos > cr.Top){ and (YPos < cr.Bottom)} then + begin + Anchorval := LastAnchor; + MouseInAnchor := True; + end; + end; + end; + + LengthFits := (w < r.Right - r.Left - OfsX) or (r.Right - r.Left - OfsX <= WordWidth); + + if not LengthFits and + ((Length(LineText) > 0) and (LineText[Length(LineText)] <> ' ')) then + LengthFits := True; + + LineText := LineText + su; + + if LengthFits or not WordWrap then + begin + Res := Res + Copy(s,1,WordLen); + + //if not LengthFits and Calc and (LineText <> su) then + // s := ''; + + Delete(s,1,WordLen); + + if Length(su) >= WordLen then + begin + {$IFNDEF TMSDOTNET} + if System.Copy(su, WordLen, 1) = ' ' then + {$ENDIF} + {$IFDEF TMSDOTNET} + if Copy(su, WordLen, 1) = ' ' then + {$ENDIF} + sw := Canvas.TextWidth(' ') + else + sw := 0; + end + else + sw := 0; + end + else + begin + LineBreak := True; + w := w - WordWidth; + end; + end; + end; + + TagPos := Pos('<',s); + + if (TagPos = 1) and (Length(s) <= 2) then + s := ''; + + if not LineBreak and (TagPos = 1) and (Length(s) > 2) then + begin + if (s[2] = '/') and (Length(s) > 3) then + begin + case UpCase(s[3]) of + 'A':begin + if (not HoverStyle or (Hoverlink = Hyperlinks)) and not Calc then + begin + Canvas.Font.Style := Canvas.Font.Style - [fsUnderline]; + if Hovercolor <> clNone then + begin + Canvas.Brush.Color := HvrColor; + if HvrColor = clNone then + Canvas.Brush.Style := bsClear; + end; + if HoverFontColor <> clNone then + Canvas.Font.Color := HoverFontColor; + end; + + if not Selected then + Canvas.Font.Color := Oldfont.Color; + + Anchor := False; + + if MouseInAnchor then + begin + hr.Bottom := r.Bottom; + hr.Right := r.Left + w; + if r.Top <> hr.Top then + begin + hr.Left := r.Left; + hr.Top := r.Top; + end; + + HoverRect := hr; + MouseLink := HyperLinks; + {$IFDEF TMSDEBUG} + DbgRect('hotspot anchor '+lastanchor,hr); + {$ENDIF} + MouseInAnchor := False; + end; + + if Focuslink = Hyperlinks - 1 then + begin + rr.Right := cr.Left; + rr.Bottom := cr.Bottom - ImgAli; + rr.Top := rr.Bottom - Canvas.TextHeight('gh'); + InflateRect(rr,1,0); + if not Calc then Canvas.DrawFocusRect(rr); + end; + end; + 'E':begin + if not Calc then + Error := False; + end; + 'B':begin + if s[4] <> '>' then + Canvas.Font.Color := OldFont.Color + else + Canvas.Font.Style := Canvas.Font.Style - [fsBold]; + end; + 'S':begin + TagChar := UpCase(s[4]); + + if (TagChar = 'U') then + begin + isSup := False; + isSub := False; + end + else + if (TagChar = 'H') then + isShad := False + else + Canvas.Font.Style := Canvas.Font.Style - [fsStrikeOut]; + end; + 'F':begin + Canvas.Font.Name := OldFont.Name; + Canvas.Font.Size := OldFont.Size; + if not Calc and not Selected then + begin + Canvas.Font.Color := OldFont.Color; + Canvas.Brush.Color := BGColor; + if BGColor = clNone then + begin + Canvas.Brush.Style := bsClear; + end; + end; + end; + 'H':begin + if not Calc then + begin + Canvas.Font.Color := hifCol; + Canvas.Brush.Color := hibCol; + if hibCol = clNone then + Canvas.Brush.Style := bsClear; + end; + end; + 'I':begin + Canvas.Font.Style := Canvas.Font.Style - [fsItalic]; + end; + 'L':begin + LineBreak := True; + end; + 'O':begin + NewOffsetX := 0; + end; + 'P':begin + LineBreak := True; + if not Calc then + begin + Canvas.Brush.Color := ParaColor; + if ParaColor = clNone then Canvas.Brush.Style := bsClear; + isPara := false; + end; + end; + 'U':begin + if (s[4] <> '>') and (ListIndex > 0) then + Dec(Listindex) + else + Canvas.Font.Style := Canvas.Font.Style - [fsUnderline]; + end; + 'R':begin + EndRotated(Canvas); + end; + 'Z':Invisible := False; + end; + end + else + begin + case Upcase(s[2]) of + 'A':begin + { only do this when at hover position in xpos,ypos } + if (FocusLink = HyperLinks) and not Calc then + begin + rr.Left := cr.Left; + rr.Top := cr.Top; + end; + + Inc(HyperLinks); + if (not HoverStyle or (Hoverlink = HyperLinks)) and not Calc then + begin + Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; + if (Hovercolor <> clNone) and not Calc then + begin + HvrColor := Canvas.Brush.Color; + + if Canvas.Brush.Style = bsClear then + HvrColor := clNone; + Canvas.Brush.Color := HoverColor; + end; + + if HoverFontColor <> clNone then + begin + hvrfntcolor := Canvas.Font.Color; + Canvas.Font.Color := HoverFontColor; + end; + end; + + if not Selected and ((HoverFontColor = clNone) or (HoverLink <> HyperLinks) or not HoverStyle) then + Canvas.Font.Color := URLColor; + + TagProp := Copy(s,3,Pos('>',s) - 1); //
+ Prop := Copy(TagProp,Pos('"',TagProp) + 1,Length(TagProp)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + LastAnchor := Prop; + Anchor := True; + + hr.Left := w; + hr.Top := r.Top; + end; + 'B':begin + TagChar := Upcase(s[3]); + case TagChar of + '>': Canvas.Font.Style := Canvas.Font.Style + [fsBold]; // tag + 'R': //
tag + begin + LineBreak := true; + StripVal := StripVal + #13; + end; + 'L': if not Blink then + Canvas.Font.Color := BlnkColor; // tag + 'O': + begin + Res := Res + Copy(s,1,pos('>',s)); + if not Calc and not Selected then + begin + TagProp := Uppercase(Copy(s,6,pos('>',s)-1)); + + if (Pos('BACKGROUND',TagProp) > 0) then + begin + Prop := Copy(TagProp,Pos('BACKGROUND',TagProp)+10,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop)+1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop)-1); + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':',Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://',Prop) > 0) and Assigned(ic) then + begin + if ic.FindPicture(Prop) = nil then + with ic.AddPicture do + begin + Asynch := False; + LoadFromURL(Prop); + end; + bmp := ic.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the tiling here + bmpy := 0; + hrgn := CreateRectRgn(fr.left, fr.top, fr.right,fr.bottom); + SelectClipRgn(Canvas.Handle, hrgn); + while (bmpy < fr.bottom-fr.top) do + begin + bmpx := 0; + while (bmpx < fr.right - fr.left) do + begin + Canvas.Draw(fr.left+bmpx,fr.top+bmpy,bmp); + bmpx := bmpx + bmp.width; + end; + bmpy := bmpy + bmp.height; + end; + SelectClipRgn(Canvas.handle, 0); + DeleteObject(hrgn); + end; + end; //end of bmp <> nil + end; //end of background + + if (Pos('BGTOPLEFT', TagProp) > 0) then + begin + Prop := Copy(TagProp, Pos('BGTOPLEFT', TagProp) + 10, Length(TagProp)); + Prop := Copy(Prop, Pos('"', Prop) + 1, Length(Prop)); + Prop := Copy(Prop, 1, Pos('"', Prop) - 1); + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Left, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Left, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':', Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://', Prop) > 0) and Assigned(iC) then + begin + if iC.FindPicture(Prop) = nil then + with iC.AddPicture do + begin + ASYNCH := False; + LoadFromURL(Prop); + end; + bmp := iC.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the tiling here + bmpy := 0; + HRgn := CreateRectRgn(fr.Left, fr.Top, fr.Right, fr.Bottom); + SelectClipRgn(Canvas.Handle, HRgn); + if (bmpy < fr.Bottom - fr.Top) then + begin + bmpx := 0; + if (bmpx < fr.Right - fr.Left) then + begin + Canvas.Draw(fr.Left + bmpx, fr.Top + bmpy, bmp); + bmpx := bmpx + bmp.Width; + end; + bmpy := bmpy + bmp.Height; + end; + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(HRgn); + end; + end; //end of bmp <> nil + end; //end of bgtopleft + + if (Pos('BGTOPRIGHT', TagProp) > 0) then + begin + Prop := Copy(TagProp, Pos('BGTOPRIGHT', TagProp) + 10, Length(TagProp)); + Prop := Copy(Prop, Pos('"', Prop) + 1, Length(Prop)); + Prop := Copy(Prop, 1, Pos('"', Prop) - 1); + + if Pos('IDX:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.X := MulDiv(FImages.Width, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(FImages.Height, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + + if not Calc and not Print then +{$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas, CR.Right - FImages.Width, CR.Top, IStrToInt(Prop), True); +{$ELSE} + FImages.Draw(Canvas, CR.Right - FImages.Width, CR.Top, IStrToInt(Prop)); +{$ENDIF} + + if not Calc and Print then + begin + CR.Right := CR.Left + Round(resfactor * FImages.Width); + CR.Bottom := CR.Top + Round(resfactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop), ABitmap); + PrintBitmap(Canvas, CR, ABitmap); + ABitmap.Free; + CR := r; + end; + end; + end; + + if Pos('SSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Right - FImages.Width, CR.Top, Prop, False, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + if Pos('LSYS:', UpperCase(Prop)) > 0 then + begin + Delete(Prop, 1, 5); + IMGSize := SysImage(Canvas, CR.Right - FImages.Width, CR.Top, Prop, True, not Calc, Print, resfactor); + + IMGSize.X := MulDiv(IMGSize.X, GetDeviceCaps(Canvas.Handle, LOGPIXELSX), 96); + IMGSize.Y := MulDiv(IMGSize.Y, GetDeviceCaps(Canvas.Handle, LOGPIXELSY), 96); + end; + + bmp := nil; + + if (Pos(':', Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://', Prop) > 0) and Assigned(iC) then + begin + if iC.FindPicture(Prop) = nil then + with iC.AddPicture do + begin + ASYNCH := False; + LoadFromURL(Prop); + end; + bmp := iC.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty and (bmp.Width > 0) and (bmp.Height > 0) then + begin + // do the printing here + bmpy := 0; + HRgn := CreateRectRgn(fr.Left, fr.Top, fr.Right, fr.Bottom); + SelectClipRgn(Canvas.Handle, HRgn); + if (bmpy < fr.Bottom - fr.Top) then + begin + bmpx := 0; + if (bmpx < fr.Right - fr.Left) then + begin + Canvas.Draw(fr.Right - bmp.Width, fr.Top + bmpy, bmp); + bmpx := bmpx + bmp.Width; + end; + bmpy := bmpy + bmp.Height; + end; + SelectClipRgn(Canvas.Handle, 0); + DeleteObject(HRgn); + end; + end; //end of bmp <> nil + end; //end of bgtopright + + if VarPos('BGCOLOR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + NewColor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColor := Hex2Color(Prop) + else + NewColor := Text2Color(AnsiLowerCase(prop)); + end; + + if VarPos('BGCOLORTO',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + NewColorTo := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColorTo := Hex2Color(Prop) + else + NewColorTo := Text2Color(AnsiLowerCase(prop)); + end; + + Prop := 'H'; + if VarPos('DIR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 3,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + end; + + Canvas.Pen.Color := Newcolor; + {$IFNDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,fr.top,fr.right,fr.bottom),Prop = 'H'); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Borland.Vcl.Types.Rect(fr.left,fr.top,fr.right,fr.bottom),Prop = 'H'); + {$ENDIF} + Canvas.Brush.Style := bsClear + end + else + begin + BGColor := Canvas.Brush.Color; + Canvas.Brush.color := NewColor; + PenColor:=Canvas.Pen.Color; + Canvas.Pen.Color := Newcolor; + Canvas.Rectangle(fr.left - 2,fr.top,fr.right,fr.bottom); + Canvas.Pen.Color := PenColor; + end; + end; + end; + end; + end; + end; + 'E':begin + if not Calc then + Error := True; + end; + 'H':begin + case Upcase(s[3]) of + 'R': + begin + LineBreak := True; + if not Calc then + begin + Pencolor := Canvas.Pen.color; + Canvas.Pen.color:=clblack; + Canvas.MoveTo(r.left,cr.bottom+1); + Canvas.Lineto(r.right,cr.bottom+1); + Canvas.pen.color:=pencolor; + end; + end; + 'I': + begin + if not Calc then + begin + hifCol := Canvas.Font.Color; + hibCol := Canvas.Brush.Color; + if Canvas.Brush.Style = bsClear then + hibCol := clNone; + + Canvas.Brush.Color := clHighLight; + Canvas.Font.Color := clHighLightText; + end; + end; + end; + end; + 'I':begin + TagChar := Upcase(s[3]); + + if TagChar = '>' then // tag + Canvas.Font.Style := Canvas.Font.Style + [fsItalic] + else + if TagChar = 'N' then // tag + begin + TagProp := Copy(s,3,pos('>',s) - 1); + + Prop := Copy(TagProp,ipos('x',TagProp) + 2,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + val(Prop,indent,err); + if err = 0 then + begin + if indent > w then + begin + w := Indent; + cr.left := fr.left + Indent; + end; + end; + end + else + if TagChar = 'M' then + begin + inc(ImgIdx); + + TagProp := Copy(s,3,Pos('>',s) - 1); + Prop := Copy(TagProp,Pos('SRC',Uppercase(TagProp)) + 4,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + TagProp := Uppercase(TagProp); + + if (Pos('ALT',TagProp) > 0) and (AltImg = ImgIdx) then + begin + Prop := Copy(TagProp,Pos('ALT',TagProp) + 4,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + end; + + TagWidth := 0; + TagHeight := 0; + + if Pos('WIDTH',TagProp) > 0 then + begin + Tagp := Copy(TagProp,Pos('WIDTH',TagProp) + 6,Length(TagProp)); + Tagp := Copy(Tagp,Pos('"',tagp) + 1,Length(Tagp)); + Tagp := Copy(Tagp,1,Pos('"',tagp) - 1); + Val(Tagp,TagWidth,Err); + end; + + if Pos('HEIGHT',TagProp) > 0 then + begin + Tagp := Copy(TagProp,ipos('HEIGHT',TagProp) + 7,Length(TagProp)); + Tagp := Copy(Tagp,pos('"',Tagp) + 1,Length(Tagp)); + Tagp := Copy(Tagp,1,pos('"',Tagp) - 1); + Val(Tagp,TagHeight,Err); + end; + + IMGSize.x := 0; + IMGSize.y := 0; + + if Pos('IDX:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,4); + if Assigned(FImages) and (IStrToInt(Prop) < FImages.Count) then + begin + IMGSize.x := MulDiv(FImages.Width,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(FImages.Height,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + + if not Calc and not Print then + {$IFDEF DELPHI4_LVL} + FImages.Draw(Canvas,cr.Left,cr.Top,IStrToInt(Prop),True); + {$ELSE} + FImages.Draw(Canvas,cr.Left,cr.Top,IStrToInt(Prop)); + {$ENDIF} + + if not Calc and Print then + begin + cr.Right := cr.Left + Round(ResFactor * FImages.Width); + cr.Bottom := cr.Top + Round(ResFactor * FImages.Height); + + ABitmap := TBitmap.Create; + FImages.GetBitmap(IStrToInt(Prop),ABitmap); + PrintBitmap(Canvas,cr,ABitmap); + ABitmap.Free; + cr := r; + end; + end; + end; + + if Pos('SSYS:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,5); + IMGSize := SysImage(Canvas,cr.Left,cr.Top,Prop,False,not Calc,Print,ResFactor); + + IMGSize.x := MulDiv(IMGSize.X,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(IMGSize.Y,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + + if Pos('LSYS:',Uppercase(Prop)) > 0 then + begin + Delete(Prop,1,5); + IMGsize := SysImage(Canvas,cr.Left,cr.Top,Prop,True,not Calc,Print,ResFactor); + + IMGSize.x := MulDiv(IMGSize.X,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(IMGSize.Y,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + + bmp := nil; + + if (Pos(':',Prop) = 0) and Assigned(pc) then + begin + bmp := pc.FindPicture(Prop); + end; + + if (Pos('://',Prop) > 0) and Assigned(ic) then + begin + if ic.FindPicture(Prop) = nil then + with ic.AddPicture do + begin + Asynch := False; + LoadFromURL(Prop); + end; + + bmp := ic.FindPicture(Prop); + end; + + if bmp <> nil then + begin + if not bmp.Empty then + begin + if not Calc {and not Print} then + begin + if (TagWidth > 0) and (TagHeight > 0) then + begin + bmp.Stretch := True; + {$IFNDEF TMSDOTNET} + Canvas.StretchDraw(Rect(cr.Left,cr.Top,cr.Left + TagWidth,cr.Top + TagHeight),bmp) + {$ENDIF} + {$IFDEF TMSDOTNET} + Canvas.StretchDraw(Borland.Vcl.Types.Rect(cr.Left,cr.Top,cr.Left + TagWidth,cr.Top + TagHeight),bmp) + {$ENDIF} + end + else + begin + + // need for animation - redraw background + if bmp.FrameCount > 1 then + begin + //Canvas.Pen.Color := BlnkColor; + //Canvas.Brush.Color := BlnkColor; + //Canvas.Rectangle(cr.Left,cr.Top,cr.Left + bmp.MaxWidth,cr.Top+bmp.MaxHeight); + end; + + Canvas.Draw(cr.Left + bmp.FrameXPos,cr.Top + bmp.FrameYPos,bmp); + end; + end; + + if (TagWidth > 0) and (TagHeight > 0) then + begin + IMGSize.x := MulDiv(TagWidth,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(TagHeight,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end + else + begin + IMGSize.x := MulDiv(bmp.MaxWidth,GetDeviceCaps(Canvas.Handle,LOGPIXELSX),96); + IMGSize.y := MulDiv(bmp.MaxHeight,GetDeviceCaps(Canvas.Handle,LOGPIXELSY),96); + end; + end; + end; + + if (XPos - r.Left > w) and (XPos - r.Left < w + IMGSize.x) and + (YPos > cr.Top) and (YPos < cr.Top + IMGSize.Y) and Anchor then + begin + ImageHotSpot := True; + AnchorVal := LastAnchor; + AltImg := ImgIdx; + end; + + if Print then + begin + //IMGSize.x := Round(IMGSize.x * ResFactor); + //IMGSize.y := Round(IMGSize.y * ResFactor); + {$IFDEF TMSDEBUG} + DbgPoint('bmp : ',point(IMGSize.x,IMGSize.y)); + {$ENDIF} + end; + + oldh := h; + + if (w + IMGSize.x > r.Right-r.Left) and + (IMGSize.x < r.Right - r.Left) then + begin + ImgBreak := True; + end + else + begin + w := w + IMGSize.x; + cr.left := cr.left + IMGSize.x; + if IMGSize.y > h then + h := IMGSize.y; + end; + + if Pos('ALIGN',TagProp) > 0 then + begin + if Pos('"TOP',TagProp) > 0 then + begin + ImgAli := h - Canvas.TextHeight('gh'); + end + else + begin + if Pos('"MIDDLE',TagProp) > 0 then + ImgAli := (h - Canvas.TextHeight('gh')) shr 1; + end; + end; + + if (Pos('WRAP',TagProp) > 0) then + begin + h := Canvas.TextHeight('gh'); + ImgAli := 0; + end; + end; + end; + 'L':begin + w := w + 12 * ListIndex; + if Linkbreak then + Imgbreak := True else Linkbreak := True; + + cr.left := cr.left + 12 * (ListIndex - 1); + if not calc and not Invisible then + begin + Prop := Canvas.Font.Name; + Canvas.Font.Name := 'Symbol'; + + if Odd(ListIndex) then + DrawText(Canvas.Handle,'·',1,cr,0) + else + DrawText(Canvas.Handle,'o',1,cr,0); + + Canvas.Font.Name := prop; + end; + cr.Left := cr.Left + 12; + end; + 'U':begin + if s[3] <> '>' then + begin + Inc(ListIndex); + LineBreak := true; + end + else + Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; + end; + 'O':begin + TagChar := Upcase(s[3]); + if TagChar = 'F' then // tag + begin + TagProp := Copy(s,3,pos('>',s) - 1); + Prop := Copy(TagProp,ipos('x',TagProp) + 2,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + val(Prop,NewOffsetX,err); + cr.Left := NewOffsetX; + w := NewOffsetX; + end + end; + 'P':begin + if (VarPos('>',s,TagPos)>0) then + begin + TagProp := Uppercase(Copy(s,3,TagPos-1)); + + if VarPos('ALIGN',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos+5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + + if Pos('RIGHT',Prop) > 0 then Align := taRightJustify; + if Pos('LEFT',Prop) > 0 then Align := taLeftJustify; + if Pos('CENTER',Prop) > 0 then Align := taCenter; + end; + + if VarPos('INDENT',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos+6,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + PIndent := IStrToInt(Prop); + end; + + if VarPos('BGCOLOR',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + + NewColor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColor := Hex2Color(Prop) + else + NewColor := Text2Color(AnsiLowerCase(prop)); + end; + + if VarPos('BGCOLORTO',TagProp,TagPos) > 0 then + begin + Prop := Copy(TagProp,TagPos + 5,Length(TagProp)); + Prop := Copy(Prop,Pos('"',Prop) + 1,Length(Prop)); + Prop := Copy(Prop,1,Pos('"',Prop) - 1); + NewColorTo := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + NewColorTo := Hex2Color(Prop) + else + NewColorTo := Text2Color(AnsiLowerCase(prop)); + end; + if not Calc then + begin + isPara := True; + Canvas.Pen.Color := Newcolor; + {$IFNDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Rect(fr.left,r.top,fr.right,r.bottom+2),true); + {$ENDIF} + {$IFDEF TMSDOTNET} + DrawHTMLGradient(Canvas,NewColor,NewColorTo,clNone,64,Borland.Vcl.Types.Rect(fr.left,r.top,fr.right,r.bottom+2),true); + {$ENDIF} + Canvas.Brush.Style := bsClear + end; + end + else + begin + if not Calc then + begin + isPara := True; + paracolor := Canvas.Brush.Color; + if Canvas.Brush.Style = bsClear then ParaColor := clNone; + Canvas.Brush.color := NewColor; + PenColor := Canvas.Pen.Color; + Canvas.Pen.Color := Newcolor; + Canvas.Rectangle(fr.left,r.top,fr.right,r.bottom); + end; + end; + end; + end; + end; + 'F':begin + if (VarPos('>',s,TagPos)>0) then + begin + TagProp := UpperCase(Copy(s,6,TagPos-6)); + + if (VarPos('FACE',TagProp,TagPos) > 0) then + begin + Prop := Copy(TagProp,TagPos+4,Length(TagProp)); + Prop := Copy(prop,pos('"',prop)+1,Length(prop)); + Prop := Copy(prop,1,pos('"',prop)-1); + Canvas.Font.Name := Prop; + end; + + if (VarPos(' COLOR',TagProp,TagPos) > 0) and not Selected then + begin + Prop := Copy(TagProp,TagPos+6,Length(TagProp)); + Prop := Copy(Prop,Pos('"',prop)+1,Length(prop)); + Prop := Copy(Prop,1,Pos('"',prop)-1); + //oldfont.color:=Canvas.font.color; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + Canvas.font.color := Hex2Color(Prop) + else + Canvas.Font.Color := Text2Color(AnsiLowerCase(prop)); + end; + + end; + + if (VarPos('BGCOLOR',TagProp,TagPos)>0) and not Calc and not Selected then + begin + Prop := Copy(TagProp,TagPos+7,Length(TagProp)); + Prop := Copy(prop,pos('"',prop)+1,Length(prop)); + Prop := Copy(prop,1,pos('"',prop)-1); + BGColor := Canvas.Brush.Color; + + if Canvas.Brush.Style = bsClear then + bgcolor := clNone; + + if Length(Prop) > 0 then + begin + if Prop[1] = '#' then + Canvas.Brush.Color := Hex2Color(Prop) + else + Canvas.Brush.Color := Text2Color(AnsiLowerCase(prop)); + end; + + end; + + if (VarPos('SIZE',TagProp,TagPos)>0) then + begin + Prop := Copy(TagProp,TagPos+4,Length(TagProp)); + Prop := Copy(Prop,Pos('=',Prop)+1,Length(Prop)); + Prop := Copy(Prop,Pos('"',Prop)+1,Length(Prop)); + + case IStrToInt(Prop) of + 1:Canvas.Font.Size := 8; + 2:Canvas.Font.Size := 10; + 3:Canvas.Font.Size := 12; + 4:Canvas.Font.Size := 14; + 5:Canvas.Font.Size := 16; + else + Canvas.Font.Size := IStrToInt(Prop); + end; + + end; + end; + end; + 'S':begin + TagChar := Upcase(s[3]); + + if TagChar = '>' then + Canvas.Font.Style := Canvas.font.Style + [fsStrikeOut] + else + begin + if TagChar = 'H' then + isShad := True + else + begin + if ipos('',s)=1 then + isSub := True + else + if ipos('',s)=1 then + isSup := True; + end; + end; + end; + 'R':begin + TagProp := Copy(s,3,pos('>',s)-1); + prop := Copy(TagProp,ipos('a',TagProp)+2,Length(TagProp)); + prop := Copy(prop,pos('"',prop)+1,Length(prop)); + prop := Copy(prop,1,pos('"',prop)-1); + Val(prop,Indent,err); + StartRotated(Canvas,indent); + end; + 'Z':Invisible := True; + end; + end; + + if (VarPos('>',s,TagPos)>0) and not ImgBreak then + begin + Res := Res + Copy(s,1,TagPos); + Delete(s,1,TagPos); + end + else + if not Imgbreak then + Delete(s,1,Length(s)); + end; + end; + + w := w - sw; + + if w > xsize then + xsize := w + 2; + + if (FocusLink = Hyperlinks - 1) and Anchor and not Calc then + begin + rr.Right := cr.Left; + rr.Bottom := cr.Bottom; + InflateRect(rr,1,0); + if not Calc then + Canvas.DrawFocusRect(rr); + rr.Left := r.Left + 1; + rr.Top := rr.Bottom; + end; + + Result := Res; + end; + + +begin + Anchor := False; + Error := False; + OldFont := TFont.Create; + OldFont.Assign(Canvas.Font); + DrawFont := TFont.Create; + DrawFont.Assign(Canvas.Font); + CalcFont := TFont.Create; + CalcFont.Assign(Canvas.Font); + OldDrawfont := TFont.Create; + OldDrawFont.Assign(Canvas.Font); + OldCalcFont := TFont.Create; + OldCalcFont.Assign(Canvas.Font); + BlnkColor := Canvas.Brush.color; + Canvas.Brush.Color := clNone; + BGColor := clNone; + ParaColor := clNone; + isPara := False; + isShad := False; + Invisible := False; + + OfsX := 0; + NewOfsX := 0; + + Result := False; + + r := fr; + r.Left := r.Left + 1; {required to add offset for DrawText problem with first capital W letter} + + Align := taLeftJustify; + PIndent := 0; + + XSize := 0; + YSize := 0; + HyperLinks := 0; + HlCount := 0; + ListIndex := 0; + LiCount := 0; + StripVal := ''; + FocusAnchor := ''; + MouseLink := -1; + MouseInAnchor := False; + + ImgIdx := 0; + AltImg := -1; + + SetBKMode(Canvas.Handle,TRANSPARENT); + + DrawStyle := DT_LEFT or DT_SINGLELINE or DT_EXTERNALLEADING or DT_BOTTOM or DT_EXPANDTABS; // or DT_NOPREFIX; + + if Pos(' & ',s) > 0 then + DrawStyle := DrawStyle or DT_NOPREFIX; + + + if not WordWrap then + DrawStyle := DrawStyle or DT_END_ELLIPSIS; + + if Pos('&',s) > 0 then + begin + repeat + Foundtag := False; + //if TagReplacestring('<','<',s) then Foundtag := True; + //if TagReplacestring('>','>',s) then Foundtag := True; + + if TagReplacestring('&','&&',s) then Foundtag := True; + if TagReplacestring('"','"',s) then Foundtag := True; + + if TagReplacestring('§','§',s) then Foundtag := True; + if TagReplacestring('‰','®‰',s) then Foundtag := True; + if TagReplacestring('®','®',s) then Foundtag := True; + + if TagReplacestring('©','©',s) then Foundtag := True; + if TagReplacestring('¶','¶',s) then Foundtag := True; + + if TagReplacestring('™','™',s) then Foundtag := True; + if TagReplacestring('€','€',s) then Foundtag := True; + + until not Foundtag; + end; + + s := DBTagStrip(s); + s := CRLFStrip(s,True); + + InsPoint := 0; + + while Length(s) > 0 do + begin + {calculate part of the HTML text fitting on the next line} + Oldfont.Assign(OldCalcFont); + Canvas.Font.Assign(CalcFont); + Oldanchor := Anchor; + OldAnchorVal := LastAnchor; + suph := 0; + subh := 0; + imgali := 0; + isSup := False; + isSub := False; + + HtmlHeight := Canvas.TextHeight('gh'); + txtHeight := HtmlHeight; + + OldImgIdx := ImgIdx; + + su := HTMLDrawLine(Canvas,s,r,True,HtmlWidth,HtmlHeight,subh,suph,imgali,Align,PIndent,XPos,YPos,HotSpot,ImageHotSpot,ofsx,newofsx); + + Anchor := OldAnchor; + LastAnchor := OldAnchorVal; + + CalcFont.Assign(Canvas.Font); + OldCalcFont.Assign(OldFont); + + HTMLHeight := HTMLHeight + LineSpacing; + + dr := r; + + case Align of + taCenter:if (r.right - r.left - htmlwidth > 0) then + dr.left := r.left+((r.right - r.left - htmlwidth) shr 1); + taRightJustify:if r.right - htmlwidth > r.left then + dr.left := r.right - htmlwidth; + end; + + dr.Left := dr.Left + PIndent; + + dr.Bottom := dr.Top + HtmlHeight + Subh + Suph; + + if not CheckHeight then + begin + OldFont.Assign(OldDrawFont); + Canvas.Font.Assign(DrawFont); + + HyperLinks := HlCount; + ListIndex := LiCount; + ImgIdx := OldImgIdx; + + HTMLDrawLine(Canvas,su,dr,CheckHotSpot,HtmlWidth,HtmlHeight,subh,suph,ImgAli,Align,PIndent,XPos,YPos,HotSpot,ImageHotspot,ofsx,newofsx); + + HlCount := HyperLinks; + LiCount := ListIndex; + + if (HotSpot and + (YPos > dr.Bottom - ImgAli - Canvas.TextHeight('gh')) and + (YPos < dr.Bottom - ImgAli)) or ImageHotSpot then + begin + Result := True; + end; + + ofsx := newofsx; + + DrawFont.Assign(Canvas.Font); + OldDrawFont.Assign(OldFont); + end; + + r.top := r.top + HtmlHeight + subh + suph; + ysize := ysize + HtmlHeight + subh + suph; + + {do not draw below bottom} + if (r.top + TxtHeight > r.bottom) and not CheckHeight then + s := ''; + end; + + if (ysize = 0) then + ysize := Canvas.TextHeight('gh'); + + //ysize := ysize + 2; + + InsPoint := InsPoint shr 1; + + Canvas.Brush.Color := BlnkColor; + Canvas.Font.Assign(OldFont); + OldFont.Free; + DrawFont.Free; + CalcFont.Free; + OldDrawfont.Free; + OldCalcfont.Free; +end; +{$WARNINGS ON} + +{$IFNDEF REMOVEDRAW} +function HTMLDraw(Canvas:TCanvas;s:string;fr:trect; + FImages:TImageList; + xpos,ypos:integer; + checkhotspot,checkheight,print,selected,blink:boolean; + resfactor:double; + URLColor:tcolor; + var Anchorval,StripVal:string; + var XSize,YSize:integer):boolean; +var + HyperLinks,MouseLink: Integer; + Focusanchor: string; + r: TRect; +begin + Result := HTMLDrawEx(Canvas,s,fr,FImages,xpos,ypos,-1,-1,1,checkhotspot,checkheight,print,selected,blink,false, + False,resfactor,URLColor,clNone,clNone,clGray,anchorval,stripval,focusanchor,xsize,ysize,HyperLinks,MouseLink,r,nil,nil,0); +end; + +{$IFNDEF REMOVEIPOSFROM} +function IPosFrom(su,s:string;frm:integer):Integer; +var + i:Integer; +begin + i := Pos(UpperCase(su),UpperCase(s)); + if i > frm then + Result := i + else + Result := 0; +end; +{$ENDIF} + +{$ENDIF} + + +{$IFNDEF DELPHI4_LVL} +function StringReplace(const S, OldPattern, NewPattern: string): string; +var + SearchStr, Patt, NewStr: string; + Offset: Integer; +begin + SearchStr := S; + Patt := OldPattern; + + NewStr := S; + Result := ''; + while SearchStr <> '' do + begin + {$IFDEF DELPHI3_LVL} + Offset := AnsiPos(Patt, SearchStr); + {$ELSE} + Offset := Pos(Patt, SearchStr); + {$ENDIF} + + if Offset = 0 then + begin + Result := Result + NewStr; + Break; + end; + Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern; + NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt); + Result := Result + NewStr; + Break; + end; +end; +{$ENDIF} + +{$IFNDEF REMOVESTRIP} + +function HTMLStrip(s:string):string; +var + TagPos: integer; +begin + Result := ''; + // replace line breaks by linefeeds + {$IFNDEF DELPHI4_LVL} + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('


',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10)); + {$ELSE} + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10),[rfIgnoreCase]); + while (pos('
',uppercase(s))>0) do s := StringReplace(s,'
',chr(13)+chr(10),[rfIgnoreCase]); + {$ENDIF} + + while (VarPos('',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); // copy till Z tag + if (VarPos('',s,TagPos) > 0) then + Delete(s,1,TagPos + 3) + else + Break; + end; + + while (VarPos('',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); // copy till Z tag + if (VarPos('',s,TagPos) > 0) then + Delete(s,1,TagPos + 3) + else + Break; + end; + + + // remove all other tags + while (VarPos('<',s,TagPos) > 0) do + begin + Result := Result + Copy(s,1,TagPos - 1); + if (VarPos('>',s,TagPos)>0) then + Delete(s,1,TagPos) + else + Break; + end; + Result := Result + s; +end; +{$ENDIF} + +{$IFDEF HILIGHT} + +function HTMLStripAll(s:string):string; +var + TagPos: integer; +begin + Result := ''; + + // remove all tags + while (VarPos('<',s,TagPos)>0) do + begin + Result := Result + Copy(s,1,TagPos-1); + if (VarPos('>',s,TagPos)>0) then + Delete(s,1,TagPos); + end; + Result := Result + s; +end; + +function StripPos2HTMLPos(s:string; i: Integer): Integer; +var + j,k: Integer; + Skip: Boolean; +begin + Result := 0; + k := 1; + Skip := False; + + for j := 1 to Length(s) do + begin + if s[j] = '<' then + Skip := True; + + if k = i then + begin + Result := j; + Exit; + end; + + if not Skip then + Inc(k); + + if s[j] = '>' then + Skip := False; + + end; + + if k = i then + begin + Result := Length(s) + 1; + end; +end; + + +function PosFrom(su,s:string; h: Integer;DoCase: boolean; var Res: Integer): Integer; +var + r: Integer; +begin + Result := 0; + Res := 0; + + if h > 0 then + Delete(s,1,h); + + if DoCase then + r := Pos(su,s) + else + r := Pos(UpperCase(su),UpperCase(s)); + + if r > 0 then + begin + Res := h + r; + Result := Res; + end; +end; + +function HiLight(s,h,tag:string;DoCase:boolean):string; +var + hs: string; + l,k: Integer; +begin + hs := HTMLStripAll(s); + + l := 0; + + while PosFrom(h,hs,l,DoCase,k) > 0 do + begin + l := k + Length(h); + Insert('<'+tag+'>',s,StripPos2HTMLPos(s,k)); + Insert('',s,StripPos2HTMLPos(s,l)); + end; + + Result := s; +end; + +function UnHiLight(s,tag:string):string; +begin + Result := ''; + // replace line breaks by linefeeds + {$IFNDEF DELPHI4_LVL} + while Pos('<'+tag+'>',s) > 0 do s := StringReplace(s,'<'+tag+'>',''); + while Pos('',s) > 0 do s := StringReplace(s,'',''); + tag := Uppercase(tag); + while Pos('<'+tag+'>',s) > 0 do s := StringReplace(s,'<'+tag+'>',''); + while Pos('',s) > 0 do s := StringReplace(s,'',''); + {$ELSE} + tag := Uppercase(tag); + while Pos('<'+tag+'>',Uppercase(s)) > 0 do s := StringReplace(s,'<'+tag+'>','',[rfIgnoreCase]); + while Pos('',Uppercase(s)) > 0 do s := StringReplace(s,'','',[rfIgnoreCase]); + {$ENDIF} + Result := s; +end; + +{$ENDIF} + +{$IFDEF PARAMS} + +function IPosv(su,s:string;var vp:integer):integer; +begin + vp := pos(UpperCase(su),UpperCase(s)); + Result := vp; +end; + + +function GetHREFValue(html,href:string;var value:string):boolean; +var + lp: Integer; +begin + Result := False; + while IPosv('href="',html,lp) > 0 do + begin + Delete(html,1,lp+5); {delete all before} + if IPosv('"',html,lp) > 0 then + begin + if CompareText(href,copy(html,1,lp-1))=0 then + begin + {href match - get the value now} + Delete(html,1,lp); + if (iposv('>',html,lp)>0) then + begin + Delete(html,1,lp); + if (iposv('<',html,lp)>0) then + begin + Value := Copy(html,1,lp-1); + Result := True; + Break; + end; + end; + end; + end; + end; +end; + + +function SetHREFValue(var html:string;href,value:string):boolean; +var + h:string; + p:string; +begin + {get current value and do a stringreplace} + + Result := False; + if GetHREFValue(html,href,h) then + begin + p := Copy(html,pos('href="' + href,html),Length(html)); + + {$IFNDEF DELPHI4_LVL} + p := StringReplace(p,'>' + h + '' + value + '' + h + '' + value + ' 0) then + begin + //manipulate the stream here for animated GIF ? + Gifstream := TMemoryStream.Create; + + ImgIdx := 1; + SkipImg := False; + + FDataStream.Position := 6; + FDataStream.Read(FAnimMaxX,2); + FDataStream.Read(FAnimMaxY,2); + + for i := 1 to FDataStream.Size do + begin + FDataStream.Position := i - 1; + FDataStream.Read(b,1); + + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Position := FDataStream.Position + 5; + + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then + begin + if imgidx = FFrame then + begin + FDataStream.Read(FFrameXPos,2); + FDataStream.Read(FFrameYPos,2); + FDataStream.Read(FFrameXSize,2); + FDataStream.Read(FFrameYSize,2); + end; + + Inc(ImgIdx); + if ImgIdx <= FFrame then + SkipImg := True + else + SkipImg := False; + end; + end; + if not SkipImg then GifStream.Write(b,1); + end; + GifStream.Position := 0; + GifStream.ReadBuffer(pvData^,GifStream.Size); + GifStream.Free; + end + else + begin + FDataStream.ReadBuffer(pvData^,fDataStream.Size); + end; + + GlobalUnlock(hGlobal); + + pstm := nil; + + // Create IStream* from global memory + hr := CreateStreamOnHGlobal(hGlobal, TRUE, pstm); + + if (not hr=S_OK) then + raise Exception.Create('Could not create image stream') + else + if (pstm = nil) then + raise Exception.Create('Empty image stream created'); + + // Create IPicture from image file + hr := OleLoadPicture(pstm, FDataStream.Size,FALSE,IID_IPicture,gpPicture); + + if not (hr = S_OK) then + raise Exception.Create('Could not load image. Invalid format') + else + if gpPicture = nil then + raise Exception.Create('Could not load image'); + + finally + GlobalFree(hGlobal); + end; + {$ENDIF} +end; + +procedure THTMLPicture.Draw(ACanvas: TCanvas; const Rect: TRect); +var + hmWidth:integer; + hmHeight:integer; + nPixX,nPixY:integer; + pnWidth,pnHeight:integer; + +begin + if Empty then Exit; + + if gpPicture = nil then Exit; + + hmWidth := 0; + hmHeight := 0; + gpPicture.get_Width(hmWidth); + gpPicture.get_Height(hmHeight); + + if Stretch then + begin + gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Bottom,Rect.Right - Rect.Left,-(Rect.Bottom - Rect.Top),0,0, + hmWidth,hmHeight, Rect); + end + else + begin + nPixX := GetDeviceCaps(ACanvas.Handle,LOGPIXELSX); + nPixY := GetDeviceCaps(ACanvas.Handle,LOGPIXELSY); + //Convert to device units + pnWidth := MulDiv(hmWidth, nPixX, HIMETRIC_INCH); + pnHeight := MulDiv(hmHeight, nPixY, HIMETRIC_INCH); + + //gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Top + pnHeight,pnWidth,-pnHeight,0,0, + // hmWidth,hmHeight, Rect); + gpPicture.Render(ACanvas.Handle,Rect.Left,Rect.Top, + pnWidth,pnHeight,0,hmHeight, hmWidth,-hmHeight, Rect); + end; + +end; + +function THTMLPicture.GetEmpty: Boolean; +begin + Result := FIsEmpty; +end; + +function THTMLPicture.GetHeight: integer; +var + hmHeight:integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + gpPicture.get_Height(hmHeight); + Result := MulDiv(hmHeight, FLogPixY, HIMETRIC_INCH); + end; +end; + +function THTMLPicture.GetWidth: Integer; +var + hmWidth: Integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + gpPicture.get_Width(hmWidth); + Result := MulDiv(hmWidth, FLogPixX, HIMETRIC_INCH); + end; +end; + +procedure THTMLPicture.LoadFromFile(const FileName: string); +begin + try + FDataStream.LoadFromFile(Filename); + FIsEmpty:=false; + LoadPicture; + if Assigned(OnChange) then + OnChange(self); + except + FIsEmpty:=true; + end; +end; + +procedure THTMLPicture.LoadFromStream(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.LoadFromStream(Stream); + FIsEmpty := False; + LoadPicture; + if Assigned(OnChange) then + OnChange(self); + end; +end; + +procedure THTMLPicture.ReadData(Stream: TStream); +begin + + if assigned(Stream) then + begin + fDataStream.LoadFromStream(stream); + fIsEmpty:=false; + LoadPicture; + end; +end; + +procedure THTMLPicture.SaveToStream(Stream: TStream); +begin + if Assigned(Stream) then fDataStream.SaveToStream(Stream); +end; + +procedure THTMLPicture.LoadFromResourceName(Instance: THandle; const ResName: string); +var + Stream: TCustomMemoryStream; +begin + {$IFNDEF TMSDOTNET} + if FindResource(Instance,pchar(ResName),RT_RCDATA)<>0 then + {$ENDIF} + {$IFDEF TMSDOTNET} + if FindResource(Instance,ResName,RT_RCDATA)<>0 then + {$ENDIF} + begin + Stream := TResourceStream.Create(Instance, ResName, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; + end; +end; + +procedure THTMLPicture.LoadFromResourceID(Instance: THandle; ResID: Integer); +var + Stream: TCustomMemoryStream; +begin + Stream := TResourceStream.CreateFromID(Instance, ResID, RT_RCDATA); + try + LoadFromStream(Stream); + finally + Stream.Free; + end; +end; + + +procedure THTMLPicture.SetHeight(Value: integer); +begin + +end; + +procedure THTMLPicture.SetWidth(Value: integer); +begin + +end; + +procedure THTMLPicture.WriteData(Stream: TStream); +begin + if Assigned(Stream) then + begin + FDataStream.savetostream(stream); + end; +end; + +procedure THTMLPicture.LoadFromURL(url: string); +var + UUrl: string; +begin + UUrl := UpperCase(url); + + if Pos('RES://',UUrl) = 1 then + begin + ID := url; + Delete(url,1,6); + if url <> '' then + LoadFromResourceName(hinstance,url); + Exit; + end; + + if Pos('FILE://',Uurl) = 1 then + begin + ID := url; + Delete(url,1,7); + if url <> '' then + LoadFromFile(url); + Exit; + end; + + if FAsynch then + begin + if FThreadBusy then + Exit; + FURL := url; + FThreadBusy := True; + TDownLoadThread.Create(self); + end + else + begin + FURL := url; + ID := url; + {$IFDEF USEWININET} + DownLoad; + {$ENDIF} + end; +end; + +{$IFDEF USEWININET} +procedure THTMLPicture.DownLoad; +var + RBSIZE:dword; + httpstatus,httpsize,err:integer; + dwIdx:dword; + dwBufSize:dword; + ms:TMemoryStream; + len:dword; + cbuf:array[0..255] of char; + rb:array[0..4095] of byte; + + FISession:hinternet; + FIHttp:hinternet; + Cancel:boolean; + +begin + fISession:=InternetOpen('HTMLImage',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0); + if (fISession=nil) then + begin + DownLoadError('Cannot open internet session'); + fThreadBusy:=false; + Exit; + end; + + fIHttp:=InternetOpenURL(fISession,pchar(furl),nil,0, + INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_RELOAD,0); + + if (fIHttp=nil) then + begin + InternetCloseHandle(fISession); + DownLoadError('Cannot open http connection'); + fThreadBusy:=false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_STATUS_CODE,@cbuf,dwBufSize,dwIdx); + + val(cbuf,httpstatus,err); + if (httpstatus <> 200) or (err <> 0) then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Cannot open URL '+furl); + FThreadBusy:=false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_CONTENT_TYPE,@cbuf,dwBufSize,dwIdx); + + if Pos('IMAGE',UpperCase(StrPas(cbuf))) = 0 then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Resource is not of image type : ' + FUrl); + fThreadBusy := false; + Exit; + end; + + dwBufSize := SizeOf(cbuf); + dwidx := 0; + HttpQueryInfo(fIHttp,HTTP_QUERY_CONTENT_LENGTH,@cbuf,dwBufSize,dwIdx); + + val(cbuf,httpsize,err); + if (httpsize = 0) or (err <> 0) then + begin + InternetCloseHandle(fISession); + InternetCloseHandle(fIHttp); + DownLoadError('Image size is 0'); + fThreadBusy:=false; + Exit; + end; + + DownLoadProgress(0,httpsize); + + len := 4096; + RBSIZE := 4096; + + ms := TMemoryStream.Create; + + cancel:=false; + + while (len=RBSIZE) and not Cancel do + begin + InternetReadFile(fIHttp,@rb,RBSIZE,len); + if len>0 then ms.WriteBuffer(rb,len); + DownLoadProgress(ms.Size,httpsize); + DownLoadCancel(cancel); + end; + + if not cancel then + begin + ms.Position := 0; + LoadFromStream(ms); + end; + + ms.Free; + + InternetCloseHandle(fIHttp); + InternetCloseHandle(fISession); + FThreadBusy:=false; +end; +{$ENDIF} + +procedure THTMLPicture.DownLoadCancel(var cancel: boolean); +begin + if assigned(FOnDownLoadCancel) then + FOnDownLoadCancel(self,cancel); +end; + +procedure THTMLPicture.DownLoadComplete; +begin + if Assigned(FOnDownLoadComplete) then + FOnDownLoadComplete(self); +end; + +procedure THTMLPicture.DownLoadError(err: string); +begin + if Assigned(fOnDownloadError) then + FOnDownLoadError(self,err); +end; + +procedure THTMLPicture.DownLoadProgress(dwSize, dwTotSize: dword); +begin + if Assigned(FOnDownLoadProgress) then + FOnDownLoadProgress(self,dwSize,dwTotSize); +end; + + +procedure THTMLPicture.LoadFromClipboardFormat(AFormat: Word; + AData: THandle; APalette: HPALETTE); +begin +end; + +procedure THTMLPicture.SaveToClipboardFormat(var AFormat: Word; + var AData: THandle; var APalette: HPALETTE); +begin +end; + +function THTMLPicture.GetFrameCount: Integer; +var + i: Integer; + b,c,d,e: Byte; + Res: Integer; +begin + Result := -1; + + if FFrameCount <> -1 then + Result := FFrameCount + else + if IsGIFFile then + begin + Res := 0; + for i := 1 to FDataStream.Size do + begin + FDataStream.Position := i - 1; + FDataStream.Read(b,1); + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Position := FDataStream.Position+5; + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then Inc(res); + end; + end; + FFrameCount := Res; + Result := Res; + FDataStream.Position := 0; + end; +end; + +function THTMLPicture.IsGIFFile: Boolean; +var + buf: array[0..4] of char; +begin + Result := False; + if FDataStream.Size>4 then + begin + FDataStream.Position := 0; + {$IFNDEF TMSDOTNET} + FDataStream.Read(buf,4); + buf[4] := #0; + Result := Strpas(buf) = 'GIF8'; + {$ENDIF} + FDataStream.Position := 0; + + end; +end; + +function THTMLPicture.GetFrameTime(i: Integer): Integer; +var + j: Integer; + b,c,d,e: Byte; + res: Integer; + ft: Word; + +begin + Result := -1; + + if IsGIFFile then + begin + Res := 0; + for j := 1 to FDataStream.Size do + begin + FDataStream.Position := j-1; + FDataStream.Read(b,1); + if (b = $21) and (i + 8 < FDataStream.Size) then + begin + FDataStream.Read(c,1); + FDataStream.Read(d,1); + FDataStream.Read(b,1); + {transp. flag here} + + FDataStream.Read(ft,2); + FDataStream.Position := FDataStream.Position + 2; + + FDataStream.Read(e,1); + if (c = $F9) and (d = $4) and (e = $2C) then + begin + Inc(res); + if res = i then + begin + Result := ft; + FFrameTransp := b and $01=$01; + FFrameDisposal := (b shr 3) and $7; + end; + end; + end; + end; + end; + FDataStream.Position := 0; +end; + +function THTMLPicture.GetMaxHeight: Integer; +var + hmHeight: Integer; +begin + {$IFNDEF TMSDOTNET} + if gpPicture = nil then + Result := 0 + else + begin + if FAnimMaxY>0 then Result:=FAnimMaxY + else + begin + gpPicture.get_Height(hmHeight); + Result := MulDiv(hmHeight, fLogPixY, HIMETRIC_INCH); + end; + end; + {$ENDIF} +end; + +function THTMLPicture.GetMaxWidth: Integer; +var + hmWidth: Integer; +begin + if gpPicture = nil then + Result := 0 + else + begin + if FAnimMaxX > 0 then + Result := FAnimMaxX + else + begin + gpPicture.get_Width(hmWidth); + Result := MulDiv(hmWidth, fLogPixX, HIMETRIC_INCH); + end; + end; +end; + + +procedure THTMLPicture.SetFrame(const Value: Integer); +begin + FFrame := Value; + if FDataStream.Size > 0 then + begin + LoadPicture; + if Assigned(OnFrameChange) then + OnFrameChange(self); + end; +end; + +procedure THTMLPicture.FrameNext; +begin + if FFrame < FFrameCount then + Inc(FFrame) + else + FFrame := 1; +end; + +function THTMLPicture.Step: Boolean; +begin + Result := False; + if (FFrameCount <= 1) or FIsEmpty then + Exit; + + if FNextCount = -1 then + FrameTime[FFrame]; + + if FTimerCount*10 >= FNextCount then + begin + FrameNext; + LoadPicture; + FNextCount := FNextCount + FrameTime[FFrame]; + Result := True; + end; + + Inc(FTimerCount); +end; + +procedure THTMLPicture.FramePrev; +begin + if FFrame > 1 then + Dec(FFrame) + else + FFrame := FFrameCount; +end; + +function THTMLPicture.GetStretched: boolean; +begin + Result := FStretched; +end; + +procedure THTMLPicture.SetStretched(const Value: boolean); +begin + FStretched := Value; +end; + +{ THTMLImage } + +constructor THTMLImage.Create(aOwner: TComponent); +begin + inherited; + fHTMLPicture:=THTMLPicture.Create; + fHTMLPicture.OnChange:=PictureChanged; + Width:=100; + Height:=100; + fHTMLPicture.OnDownLoadError:=DownLoadError; + fHTMLPicture.OnDownLoadCancel:=DownLoadCancel; + fHTMLPicture.OnDownLoadProgress:=DownLoadProgress; + fHTMLPicture.OnDownLoadComplete:=DownLoadComplete; +end; + +destructor THTMLImage.Destroy; +begin + fHTMLPicture.Free; + inherited; +end; + +procedure THTMLImage.Loaded; +begin + inherited; + fHTMLPicture.fLogPixX := GetDeviceCaps(canvas.handle,LOGPIXELSX); + fHTMLPicture.fLogPixY := GetDeviceCaps(canvas.handle,LOGPIXELSY); +end; + +procedure THTMLImage.Paint; +var + xo,yo:integer; + + function Max(a,b:integer):integer; + begin + if (a>b) then result:=a else result:=b; + end; + +begin + inherited; + if assigned(fHTMLPicture) then + begin + if not fHTMLPicture.Empty then + case fPicturePosition of + bpTopLeft:Canvas.Draw(0,0,fHTMLPicture); + bpTopRight:Canvas.Draw(Max(0,width-fHTMLPicture.Width),0,fHTMLPicture); + bpBottomLeft:Canvas.Draw(0,Max(0,height-fHTMLPicture.Height),fHTMLPicture); + bpBottomRight:Canvas.Draw(Max(0,width-fHTMLPicture.Width),Max(0,height-fHTMLPicture.Height),fHTMLPicture); + bpCenter:Canvas.Draw(Max(0,width-fHTMLPicture.Width) shr 1,Max(0,height-fHTMLPicture.Height) shr 1,fHTMLPicture); + bpTiled:begin + yo:=0; + while (yo Value) then + begin + fPicturePosition := Value; + Invalidate; + end; +end; + +procedure THTMLImage.DownLoadCancel(Sender: TObject; var cancel: boolean); +begin + if assigned(fOnDownLoadCancel) then fOnDownLoadCancel(self,cancel); +end; + +procedure THTMLImage.DownLoadComplete(Sender: TObject); +begin + if assigned(fOnDownLoadComplete) then fOnDownLoadComplete(self); +end; + +procedure THTMLImage.DownLoadError(Sender: TObject; err: string); +begin + if Assigned(FOnDownloadError) then + FOnDownLoadError(self,err); +end; + +procedure THTMLImage.DownLoadProgress(Sender: TObject; dwSize, + dwTotSize: dword); +begin + if Assigned(FOnDownLoadProgress) then + FOnDownLoadProgress(self,dwSize,dwTotSize); +end; + +{ TDownLoadThread } + +constructor TDownLoadThread.Create(aHTMLPicture: THTMLPicture); +begin + inherited Create(false); + HTMLPicture := aHTMLPicture; + FreeOnTerminate := True; +end; + +procedure TDownLoadThread.Execute; +begin + {$IFDEF USEWININET} + HTMLPicture.DownLoad; + {$ENDIF} +end; + +{ THTMLPictureCache } + +destructor THTMLPictureCache.Destroy; +begin + ClearPictures; + inherited; +end; + +function THTMLPictureCache.AddPicture: THTMLPicture; +begin + Result := THTMLPicture.Create; + {$IFNDEF TMSDOTNET} + Add(pointer(result)); + {$ENDIF} + {$IFDEF TMSDOTNET} + Add(TObject(Result)); + {$ENDIF} +end; + +procedure THTMLPictureCache.ClearPictures; +var + i: Integer; +begin + for i := 1 to Count do + Items[i - 1].Free; + + Clear; + //inherited; +end; + +function THTMLPictureCache.FindPicture(ID: string): THTMLPicture; +var + i: Integer; +begin + Result := nil; + for i := 1 to Count do + begin + if (Items[i - 1].ID = ID) then + begin + Result := Items[i - 1]; + Break; + end; + end; +end; + +function THTMLPictureCache.GetPicture(Index: Integer): THTMLPicture; +begin + Result := THTMLPicture(inherited Items[Index]); +end; + +procedure THTMLPictureCache.SetPicture(Index: Integer; Value: THTMLPicture); +begin + {$IFNDEF TMSDOTNET} + inherited Items[index] := Pointer(Value); + {$ENDIF} + {$IFDEF TMSDOTNET} + inherited Items[index] := Value; + {$ENDIF} +end; + +function THTMLPictureCache.Animate: Boolean; +var + i: Integer; +begin + Result := False; + for i := 1 to Count do + begin + if Items[i - 1].Step then + Result := True; + end; +end;