Pārlūkot izejas kodu

1. 在线签署,按钮美化
2. 标段划分,周洪波定制功能
3. Excel导出主从表数据

MaiXinRong 8 gadi atpakaļ
vecāks
revīzija
a7ac7f756a

+ 3 - 2
DataModules/BillsCompileDm.pas

@@ -101,7 +101,8 @@ type
 implementation
 
 uses
-  ProjectData, Math, ZhAPI, UtilMethods, ConstUnit, mDataRecord, Variants;
+  ProjectData, Math, ZhAPI, UtilMethods, ConstUnit, mDataRecord, Variants,
+  ConditionalDefines;
 
 {$R *.dfm}
 
@@ -1137,7 +1138,7 @@ end;
 
 procedure TBillsCompileData.CalculateDesignPrice(ANode: TBillsIDTreeNode);
 begin
-  if ANode.Rec.DgnQuantity1.AsFloat <> 0 then
+  if QuantityRoundTo(ANode.Rec.DgnQuantity1.AsFloat) <> 0 then
     ANode.Rec.DgnPrice.AsFloat := PriceRoundTo(
         ANode.Rec.TotalPrice.AsFloat/ANode.Rec.DgnQuantity1.AsFloat)
   else

+ 6 - 0
Forms/MainFrm.dfm

@@ -1077,6 +1077,12 @@ object MainForm: TMainForm
       Hint = #29983#25104#22312#32447#31614#32626
       Visible = ivAlways
     end
+    object dxbtnExportTpExcel: TdxBarButton
+      Caption = 'New Item'
+      Category = 0
+      Hint = 'New Item'
+      Visible = ivAlways
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent

+ 1 - 0
Forms/MainFrm.pas

@@ -161,6 +161,7 @@ type
     dxbtnCanCalc: TdxBarButton;
     dxbtnWithoutCalcCurPay: TdxBarButton;
     dxbtnSignOnline: TdxBarButton;
+    dxbtnExportTpExcel: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;

+ 342 - 13
Forms/SelectOnlineSignPhaseFrm.dfm

@@ -13,15 +13,353 @@ object SelectOnlineSignPhaseForm: TSelectOnlineSignPhaseForm
   PixelsPerInch = 96
   TextHeight = 12
   object lblHint: TLabel
-    Left = 50
-    Top = 86
+    Left = 62
+    Top = 85
     Width = 228
     Height = 12
     Caption = #21482#33021#23545#24050#23457#25209#23436#25104#30340#26631#27573#36827#34892#31614#32626#25253#34920#29983#25104
   end
+  object pbOk: TPNGButton
+    Left = 216
+    Top = 44
+    Width = 112
+    Height = 30
+    Layout = pbsImageLeft
+    Spacing = 2
+    ImageNormal.Data = {
+      89504E470D0A1A0A0000000D494844520000006E0000001E0806000000CD792B
+      3A0000001974455874536F6674776172650041646F626520496D616765526561
+      647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+      000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+      4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+      6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+      786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+      392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+      2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+      3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+      7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+      626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+      62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+      74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+      6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+      7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+      43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+      32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+      3D22786D702E6969643A38414233333630393246443731314537394539394133
+      444242433346374543342220786D704D4D3A446F63756D656E7449443D22786D
+      702E6469643A3841423333363041324644373131453739453939413344424243
+      334637454334223E203C786D704D4D3A4465726976656446726F6D2073745265
+      663A696E7374616E636549443D22786D702E6969643A38414233333630373246
+      44373131453739453939413344424243334637454334222073745265663A646F
+      63756D656E7449443D22786D702E6469643A3841423333363038324644373131
+      453739453939413344424243334637454334222F3E203C2F7264663A44657363
+      72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+      203C3F787061636B657420656E643D2272223F3EA20170A600000C0949444154
+      78DAED9B095093671AC7FF8140028433A85C1A8C8215B410A10702BDACEB1671
+      5C6D3B62555C5BD91EB3B6CBF6B0B62BDB8575AD2D95D9B253EBC46A8DBA425B
+      7555EAD65A5BE590D64A2354508246E4560E0F226720FB7CEFFB05F0982D0567
+      5A66F28C9FC977BEEFF3FC9EEBFD8C12CCDBF818808F68F3854D4682D4D3F68C
+      84C0D54D8BD5F89A9C14E8EAE985C5F24BCFCB26B713890470B4B783A2DD841F
+      F2F4F502384BF0CC58189BDB61EEB551FB358BD44E02B5D20986437960E0021F
+      8E46654BC72F3D2F9B0C4202BDE4A8FCA68083533D108D0B976DE04682A83CE5
+      B8906B05174BE06C1137224445117721CF0A2EDA066EA40803576005379DC035
+      DBC08D04512909DC312BB8FB6DE0468A3070DF5AC1DD47E09A6CE04682A8BC09
+      DC77567091C307A776B647CC5827FAD6FB93D7E657B5C1D86661AB4A6DBC2F60
+      E945D2BE6AC04E4AC7EC6E7BEC664999AE446AFE2576CE921109C98B05FC5A61
+      1B8458C7A0BFD87ED2BE9A1BC6129E2FE8929ADF88F84005BC9CA4B7E8D6D2D6
+      839CAA76BE3A86E4B6CFFF7F3A0C19DC092BB80802D7383C70F1E39C90362F80
+      4D76A29F020D2DED30B59BFBCE874FF0C4C9732D4CC1D59F1A9053D303D83B42
+      FFA76064EC374077EA322073A5630EA87F6B0AE6A77FC79455BABB22A7BAEB06
+      E3A4442BF168A81B1EC82CA155A90C96CC28489EC9011CE97E996290E0C61087
+      6EAC3D7016998B42915D580F5D39417090B371B4F13EEC7CD26E23F42B2351D7
+      DC863AD2898B047E5E32DAE4D0BC7312F141DE489B1F283A02171F4F19730AC1
+      0E1C1A9FFB9EE317915AD04C301D449D7E26B85104AEC80A2E7CF8E0D8BBB2EE
+      36A0CB04FD9BF72263770974271B191C1615BAB99024ECE0FB8E2E881AEB8DA7
+      63FD111FA9C4D193B568EDE8C5E6C2CB9819EA8D105F47246C2A42548017742B
+      A621E8AD227E1F4115449F1C44E39971C2D0440670C4F25981D8F47999788D8C
+      5DB3B9A011858DE4387676D0FF7912C2C7BBFEA40A4BD77F0B5D450FB48F8F47
+      A4DA85C099B1E75835E645AB90F19FD3D0155F12F5B147E2544F24CF99004D1A
+      45BADC9D1D43F775A0A79B3BC68260F63D697B31E9EBDC9F09844F29652607DA
+      ECEC8706EEA4155C1881BB34DC1A47E07A298A7ABAC843A7206317812BB9C2A3
+      882668D13E08C9827FF37DB907A27C5CF0748C3712627D9175B81CF1D3D558FB
+      4919562D9882E8BFE4628C8B1441FE4AAC4B9C840DFBCB919ADBC2222A31D415
+      EB9E5221E7D879EEE1E4B9CBE382B169FF8F37A4CACDB9F5286C264F97CAA17F
+      85A27AF729E88AAAFBBC5FFB5408DDDF83A4ADA2530842D7C2C90B8961A3B0E0
+      3E4FD2A70B1B0E189096388DEE2F434553373E783682E9AA904BB1EDAB0AA41E
+      AAA27B3C9195188C497E72585FF6FA78F1B2D140913A30E2346BBE27682E7CAC
+      A144DC6802576C0537E54E80EB17FDAB13095C29A5BF56064930A6E5C3088AB8
+      CF68DF931F23051327CB903CDB0F9AD70FA0E29F73504F4AFA2A5D28C57609AE
+      891367AFC195F47B306C0C7C571C867AF41814A48461E547C5D01DAFE490280A
+      2D3BE640327F2B19C4997B32F36C873E03E95F0BC2E1A22A949CA7746C2F4705
+      E9FAF8BDA310E0E980848D3FE0C58727C2C34586D4C375FC1EA1CECEA754DAD3
+      81A46DA7A0FFFB23048E22EE94893FDFDCC11C94398E0040E6C6E1745D67F708
+      C7B50B8379AADD5ACCE7652F469C90111C15FDCE321470A7ACE04209DCC5E181
+      CB5A1C8049FE4ECC1B27FAB990A75DE7354E4821E459E113DC71D2D0C8F6CB6B
+      DB91A0AB447ABC1FDC653D4C39CB278F43F24416F7584149C1F062F4643D3319
+      6FEC3C8D9890B1889BA644C287453C6D0A46169C627334DD9BCDA359E6CE2724
+      78B3D814E857064141F632B57743E12CC391E246E4955D46F2DCF1D0A414409F
+      164B29B19EC0D58BCFB4C7E7CBC72298F4A96FBA0E576747F8289D58D434B017
+      1516F6273CC80B92258790324B8D7951A358045BCFB1EB2DB7465C798D89E9CE
+      D2E5101A16D51802576A0577D7F0C1C58F778497AC8B79E2EAC521D89B7B1625
+      C6ABA267D961EBAAE9589AFA05F3B896767BE49CEF44EEEBD3B0E9C039B4983A
+      291D8562F5163DD29685E3C60E4D823DF95548FDA28AA7CA30776C7D45F393F3
+      912C39CAA381E0E9575106F884A2F4FB5AA42F08853B81D87BFC12329E0B47DA
+      B61FB1EED969F07DEE4B168DF1A17ED8F9720883FCC3998B58B1F17BEC7AF321
+      6C397006CB28256B5EFF865D9718391AC9F382A079335F8C387250733BAB8B29
+      B3C6625E8C3F03A779ED207306B5870B6226BA41A7A7BA2C75E65137C80EF816
+      7067ACE082095CC33053254D98A7904E54BC773F92DF2F408EC1C41A1141294B
+      F62C48E2B7718F66A9428694DFF862C9A33E30545DC3E9AAAB28394751F06408
+      346FE48BD6A79445358EB5D5DBCEF5A724A109101AA15EDE0858F63C01C9639B
+      B8174B7973C2539827FBAC5F1F8AF929475158DF01EDB229AC16276D3D0DCBAE
+      B9385B7315691FEBC9A0548F1DDDA0F6A488EDEDC0AAB851ACC6256D2985FEDD
+      47097C29163C3C0ED9DF545293D206FD3FA2D8315D11352C722577509A4FFAEF
+      FC30376A0C66BDF135329FBD1BD95F57B279AD5E128A23FA0624E92AB84D0478
+      4389381F0267B0820B2270F577A039A134A756D8A1787D185C17EEA5C9B9F479
+      A365FB7D90CCFD941907320F3E6941D1394ABC9C30094BD38EB0F498FCE45DE4
+      A547B962A4B076F138B15618C8405EDC4042E7460EC253137D64CF20A7A08ED5
+      41C19D82419732686A37198ADF9B42F3D9C72236EBB950949D6F42EA816AAAAB
+      0FC050D984D96F1F43FAE2085CEBB0A366A3993D57BBD08F83A371F56FC722E3
+      D332E41BAEA060FD23A8A869456B9B19B3DF3DC16B16A5E7282A0FEBA85C6882
+      688C4346246D3E4551E68CE20D3370B6BA152FFCAB0485B526B1C6B9F2523004
+      51F912B80A2B38F59D00C7E5F3152AB49ADA90F07E11AF3702281AC6B2839A93
+      399FF12810C09108900FAE0EC29113D5888F19871D078D981149CDCAAB79BC89
+      2110DA85A37993B0A5BC2F826E7199DB3CDB2A293369CD17EE82E3A50D7879D1
+      54AA391D887EE92B64BEA0819FB713D52219A2FFF85FECFADB0C6CA174FC7E6E
+      336B26B48BFCFBC6D5BF138D8CECD3C83F7B1D1F278741134C5DE44103C1A139
+      39299112A7C29299A390B9EB1CA6AAE4DCD1E85C2275CA1E2E7658B37C32BB7E
+      EDEE6A183B9D875CDFFAC019ADE0C613B8BAE1818BA2B5D7BAA501CC5B7FFFEE
+      71185B7B4443F32ECFB2938C3BBBDFB86A577B1C4C09C6B62F2A91BAE734E227
+      539AF275C59AE723C843AFF29A41B551306C4EDE05328401DAA4302C9F336ED0
+      73923C7114FAB5E164F472E8BEADE15E4E6952FF5E0CEA9A3A307BED09A42704
+      62D163C1348E33263CB51FC63647689787E2A1700F72A83A06409F1E83F2CACB
+      8898EC8DBD79B5F860DF197CFCDA3D08527961C39E4A6C3F7615C62BED0CB476
+      D944444EF6A226C881BAE44EACD49EC1C52BD790F9FC54C4C5A8F0D74D6548FD
+      F20A5B7F0E6939404B8E0BE7ADE0C60D1F5CCA6F957073EAC52BDB4BF901216D
+      39B888006841BA4889A48DC53C4D380A9D1F2D07C2E464D02A7E3D15FC287F19
+      66DEAD40EAEE33DCC8941613EFF162F55357748D9EE7C6EB5AB7A9AFBE71AFE8
+      E1359675910316B5149D89F7FB41F7DD45EEE1F67236AE9AA666BC6C12E94A29
+      CD09403B5158DDC6D2717A821AEE7233D6EE2C85F1BA03B25E9A8AB2734D3854
+      D440E9AE8B2F9CE97989911EA8A86B43610395093B19039112C733C476AA6DC6
+      D65E9E1A8571C961D40A331BDFD826E7656428CD8900AECA0A6E2C81AB1DEE9B
+      1333EFAA84F58D3059B6C01C3031617D236C8212F662BAEBE55D2833367BE3D1
+      DBD7E070E348391461136B165B3B09E73188DFC748AC207BF977D6E14AF85CC5
+      371CCC41D87E073F2766883EE790F2751DCC6D7C1E5610C273857908D7B03736
+      E23161DF2CBE4161EB4C99185DE0BA320773E0C787D29CF813B86A2B38FF3B01
+      CEC20DD067B09BD2806070611326DB3761DED0F4BF8714F7D9CB5C7BF1B8A5FF
+      1DE080F5D0CF98D84D630C38DEB76FE9F703714858BAFB756197DCACDBC0F9A2
+      FF18B383B89E93D8DF06CEC0817EBE3070B556707E04AEC6F6CF3A2341540104
+      AECE0ACEC7066EA40803D720820B247095553670234102C7C9516905171C100B
+      63653BCC66DB0F627FCD22954AA00E7482A186FF20B62E2244E3DB7A4D81AE4E
+      DB4FD07FADC27E822EB383AB9B094565FA06015C1CF87FFAF0F9A52767934149
+      2D6D7FF81F3F8DFC0DF4F11BEB0000000049454E44AE426082}
+    ImageDown.Data = {
+      89504E470D0A1A0A0000000D494844520000006E0000001E0806000000CD792B
+      3A0000001974455874536F6674776172650041646F626520496D616765526561
+      647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+      000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+      4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+      6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+      786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+      392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+      2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+      3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+      7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+      626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+      62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+      74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+      6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+      7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+      43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+      32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+      3D22786D702E6969643A39464434423242423246443731314537383342433843
+      313545333831443937322220786D704D4D3A446F63756D656E7449443D22786D
+      702E6469643A3946443442324243324644373131453738334243384331354533
+      383144393732223E203C786D704D4D3A4465726976656446726F6D2073745265
+      663A696E7374616E636549443D22786D702E6969643A39464434423242393246
+      44373131453738334243384331354533383144393732222073745265663A646F
+      63756D656E7449443D22786D702E6469643A3946443442324241324644373131
+      453738334243384331354533383144393732222F3E203C2F7264663A44657363
+      72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+      203C3F787061636B657420656E643D2272223F3E82751C13000005CD49444154
+      78DAED5B0D4C94651CFF5F77427C5CDC3A03EF06760381C4B1E5B0AF59E12A6A
+      12CB996DE99C569A8DB9CCA935A20DDDA42257E98C0D69A215E64037663AB215
+      CB69D66AA6453520A0EC94BA930B0A3A3E0439E9F93DC7F3FADECB7B1F90C4DD
+      F6FEB677F7F2BECFFB3CFFFFFFF7FF7ADEBDE828E7DDC544B48F1D16D2100970
+      B263AD8E11E7209DDE428678A21BA2D961986EC134A8E1EA083B868846FA8846
+      3D4E10374A3312880C718CB41BC788D34DB7981A7C303A46DC65465C3FD1955E
+      F212179D483CE2F48C381D234EA71117561865C48D32E23C97BD1137E41A232E
+      C6EA258E47DC8CE91653831AAE5E198B3846DCA0434E9CF15AC469083F4811E7
+      D6888B2868C4452834E222141A71118AA9222E35414FF7CE8D0D69EC972D0374
+      BED7C3CFF7165AF9EFBA4A87745FED9A125B97CEA4ED47BABC3A35E4902EEFDC
+      84E4156B0828D7C2FC00D62898174B371BF5E3E6F8CBEDA1FAA68180F307D261
+      42982AE2A05C69610A3F9F333B862E750D53DF8047BA7FFB6DF1D4F8731F3F2F
+      A9EC9014FEBE3C93761D7450F5376E69ACB3269B1E2F6AE3E7666630A57160D4
+      87EE4AA0FB5FFED5ABD37F20AEACA693CA37A6D0A1CFBA7D64901B1E323AFE1C
+      22876B58BA6F4D8C22EB2DD1347F43AB8FEE02B36646F15FD8418E2327BA2587
+      0B0BE2E450234369DC7B6647D39A7C3315E49AE9D4D91E72F77B68FFF16ECACB
+      3152566A0C2D7FBB838FA9DE9646E96B9BC7CD0F9C6DF2CEFFEC320B55D5397D
+      C660AEAF2F0E49E3E138C1F054491B9719A42D9867940CBDF401F3387D56DF6D
+      A44D2BAD9C3835444CC44D96B8E58B13A9F6131727B06C7F0715AF49A18585CD
+      949460A0746B14EDD868A33D879D9297C260B8567FAA5B9A2B14E294F204322C
+      D678F261333FDF53E7E2D184E7DB1DC354F1928D5F8F8FD5D3817A972457ED96
+      14CAB45D2B15FE22CE1FD111439C3090F0DAF67D59E464E9C8C2D28F48B18828
+      639C9E721798C8B2E2275E47BFAACCA2A2DDF6A0732BE5F9FC4C0FFDD8EE4DB9
+      206059AE899259BA4364BF90672253BCC127852953A5529F60889888937B5CB0
+      1AD76A1FE0067B6B5512253062A05C20E363EE57AA1CBCF9C95F68E2CFFAE814
+      02718810C883DF93DFF6D0E946B7E434B8AFAC3D1F6FB551C6ADB1DC998C7106
+      D508824E58173517E9540E7F1127740F1BE2E49D57C9BA143A7AB25BF270E083
+      D20C5E4300D18D7DF1461A557DE4E27F231DA169511679406E544429E60A0639
+      91F28811CE72F4740FEDDA6CA3D2BD1D3CF522A2851E35AF677092BF6B71D386
+      DD1D54F7EA1C7AEF58273DF3589294EA02D5383991E2BEE8BA2712B5FF0B7172
+      20ED6DDA69F7E906D5A2020AAE2A48A4B60B03D4F2DB20275A698C50524EB088
+      135D2A6A9E7C3E3CF7CBC5414E9E30280C0C14AF4892C609E251F744F7E92F7D
+      C231962C32D3239B5BA56E15803323D2279D3AA79A3828FE4375361997348664
+      5C28BA6575B2148DD79B38A53C48BBCDE7077904C3C1E0348F6EB77339FEE9F3
+      4891AD56E3B0FF448D6D67CFB85944E23901345B3BD627D3FCB946DE6CE139B1
+      369C63FD9B76A9590A4BE2501BD0DA875287A0D8A73B33B927A2AB3C78DC450F
+      DE69BAAEC4893DDF99A63EEE20A839E85A110DD887A116E16F910EDF69E80948
+      DCFBC5361F72C41AC81CE5B50ECA4E8B959E433A35B1F2F1DAF3363E1E7B46F1
+      E2216C88131E073C5D661F27A0D2B88234D152A3B6A4B2F61F4AC243056058B4
+      FE30048C89D63F54603DB5942636D422D256E627F275D29E68E472639D457798
+      A4D486F1682A72B28CBC76571CEBE204A6B3E6055B950F4FFCEDF326087B4034
+      41686C8A2A7EA7CEDE11EE28F9F799695BC585F0DA80C3EB6E8AD7D38B073A55
+      EF432165D4C023E50605F9D880CB15C31860B2455DB90600A7913B16D605442A
+      130D8C8810915E1BCEB97DD21DE6C6D6427E4DBC2A9393295F179854D4692F99
+      23141A71110A8DB808857FE2B48F85C21AAA1F0B699FE78537FC7E9EA77D101B
+      E650FF2096C59DC1E2254EFB043D6C217D82DE8FE8BB04E2F2C9FB4F1FB3A65B
+      360D21E10F763CF72F1B7626899AE5D73F0000000049454E44AE426082}
+    ImageOver.Data = {
+      89504E470D0A1A0A0000000D494844520000006E0000001E0806000000CD792B
+      3A0000001974455874536F6674776172650041646F626520496D616765526561
+      647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+      000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+      4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+      6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+      786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+      392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+      2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+      3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+      7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+      626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+      62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+      74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+      6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+      7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+      43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+      32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+      3D22786D702E6969643A38414233333630393246443731314537394539394133
+      444242433346374543342220786D704D4D3A446F63756D656E7449443D22786D
+      702E6469643A3841423333363041324644373131453739453939413344424243
+      334637454334223E203C786D704D4D3A4465726976656446726F6D2073745265
+      663A696E7374616E636549443D22786D702E6969643A38414233333630373246
+      44373131453739453939413344424243334637454334222073745265663A646F
+      63756D656E7449443D22786D702E6469643A3841423333363038324644373131
+      453739453939413344424243334637454334222F3E203C2F7264663A44657363
+      72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+      203C3F787061636B657420656E643D2272223F3EA20170A600000C0949444154
+      78DAED9B095093671AC7FF8140028433A85C1A8C8215B410A10702BDACEB1671
+      5C6D3B62555C5BD91EB3B6CBF6B0B62BDB8575AD2D95D9B253EBC46A8DBA425B
+      7555EAD65A5BE590D64A2354508246E4560E0F226720FB7CEFFB05F0982D0567
+      5A66F28C9FC977BEEFF3FC9EEBFD8C12CCDBF818808F68F3854D4682D4D3F68C
+      84C0D54D8BD5F89A9C14E8EAE985C5F24BCFCB26B713890470B4B783A2DD841F
+      F2F4F502384BF0CC58189BDB61EEB551FB358BD44E02B5D20986437960E0021F
+      8E46654BC72F3D2F9B0C4202BDE4A8FCA68083533D108D0B976DE04682A83CE5
+      B8906B05174BE06C1137224445117721CF0A2EDA066EA40803576005379DC035
+      DBC08D04512909DC312BB8FB6DE0468A3070DF5AC1DD47E09A6CE04682A8BC09
+      DC77567091C307A776B647CC5827FAD6FB93D7E657B5C1D86661AB4A6DBC2F60
+      E945D2BE6AC04E4AC7EC6E7BEC664999AE446AFE2576CE921109C98B05FC5A61
+      1B8458C7A0BFD87ED2BE9A1BC6129E2FE8929ADF88F84005BC9CA4B7E8D6D2D6
+      839CAA76BE3A86E4B6CFFF7F3A0C19DC092BB80802D7383C70F1E39C90362F80
+      4D76A29F020D2DED30B59BFBCE874FF0C4C9732D4CC1D59F1A9053D303D83B42
+      FFA76064EC374077EA322073A5630EA87F6B0AE6A77FC79455BABB22A7BAEB06
+      E3A4442BF168A81B1EC82CA155A90C96CC28489EC9011CE97E996290E0C61087
+      6EAC3D7016998B42915D580F5D39417090B371B4F13EEC7CD26E23F42B2351D7
+      DC863AD2898B047E5E32DAE4D0BC7312F141DE489B1F283A02171F4F19730AC1
+      0E1C1A9FFB9EE317915AD04C301D449D7E26B85104AEC80A2E7CF8E0D8BBB2EE
+      36A0CB04FD9BF72263770974271B191C1615BAB99024ECE0FB8E2E881AEB8DA7
+      63FD111FA9C4D193B568EDE8C5E6C2CB9819EA8D105F47246C2A42548017742B
+      A621E8AD227E1F4115449F1C44E39971C2D0440670C4F25981D8F47999788D8C
+      5DB3B9A011858DE4387676D0FF7912C2C7BBFEA40A4BD77F0B5D450FB48F8F47
+      A4DA85C099B1E75835E645AB90F19FD3D0155F12F5B147E2544F24CF99004D1A
+      45BADC9D1D43F775A0A79B3BC68260F63D697B31E9EBDC9F09844F29652607DA
+      ECEC8706EEA4155C1881BB34DC1A47E07A298A7ABAC843A7206317812BB9C2A3
+      882668D13E08C9827FF37DB907A27C5CF0748C3712627D9175B81CF1D3D558FB
+      4919562D9882E8BFE4628C8B1441FE4AAC4B9C840DFBCB919ADBC2222A31D415
+      EB9E5221E7D879EEE1E4B9CBE382B169FF8F37A4CACDB9F5286C264F97CAA17F
+      85A27AF729E88AAAFBBC5FFB5408DDDF83A4ADA2530842D7C2C90B8961A3B0E0
+      3E4FD2A70B1B0E189096388DEE2F434553373E783682E9AA904BB1EDAB0AA41E
+      AAA27B3C9195188C497E72585FF6FA78F1B2D140913A30E2346BBE27682E7CAC
+      A144DC6802576C0537E54E80EB17FDAB13095C29A5BF56064930A6E5C3088AB8
+      CF68DF931F23051327CB903CDB0F9AD70FA0E29F73504F4AFA2A5D28C57609AE
+      891367AFC195F47B306C0C7C571C867AF41814A48461E547C5D01DAFE490280A
+      2D3BE640327F2B19C4997B32F36C873E03E95F0BC2E1A22A949CA7746C2F4705
+      E9FAF8BDA310E0E980848D3FE0C58727C2C34586D4C375FC1EA1CECEA754DAD3
+      81A46DA7A0FFFB23048E22EE94893FDFDCC11C94398E0040E6C6E1745D67F708
+      C7B50B8379AADD5ACCE7652F469C90111C15FDCE321470A7ACE04209DCC5E181
+      CB5A1C8049FE4ECC1B27FAB990A75DE7354E4821E459E113DC71D2D0C8F6CB6B
+      DB91A0AB447ABC1FDC653D4C39CB278F43F24416F7584149C1F062F4643D3319
+      6FEC3C8D9890B1889BA644C287453C6D0A46169C627334DD9BCDA359E6CE2724
+      78B3D814E857064141F632B57743E12CC391E246E4955D46F2DCF1D0A414409F
+      164B29B19EC0D58BCFB4C7E7CBC72298F4A96FBA0E576747F8289D58D434B017
+      1516F6273CC80B92258790324B8D7951A358045BCFB1EB2DB7465C798D89E9CE
+      D2E5101A16D51802576A0577D7F0C1C58F778497AC8B79E2EAC521D89B7B1625
+      C6ABA267D961EBAAE9589AFA05F3B896767BE49CEF44EEEBD3B0E9C039B4983A
+      291D8562F5163DD29685E3C60E4D823DF95548FDA28AA7CA30776C7D45F393F3
+      912C39CAA381E0E9575106F884A2F4FB5AA42F08853B81D87BFC12329E0B47DA
+      B61FB1EED969F07DEE4B168DF1A17ED8F9720883FCC3998B58B1F17BEC7AF321
+      6C397006CB28256B5EFF865D9718391AC9F382A079335F8C387250733BAB8B29
+      B3C6625E8C3F03A779ED207306B5870B6226BA41A7A7BA2C75E65137C80EF816
+      7067ACE082095CC33053254D98A7904E54BC773F92DF2F408EC1C41A1141294B
+      F62C48E2B7718F66A9428694DFF862C9A33E30545DC3E9AAAB28394751F06408
+      346FE48BD6A79445358EB5D5DBCEF5A724A109101AA15EDE0858F63C01C9639B
+      B8174B7973C2539827FBAC5F1F8AF929475158DF01EDB229AC16276D3D0DCBAE
+      B9385B7315691FEBC9A0548F1DDDA0F6A488EDEDC0AAB851ACC6256D2985FEDD
+      47097C29163C3C0ED9DF545293D206FD3FA2D8315D11352C722577509A4FFAEF
+      FC30376A0C66BDF135329FBD1BD95F57B279AD5E128A23FA0624E92AB84D0478
+      4389381F0267B0820B2270F577A039A134A756D8A1787D185C17EEA5C9B9F479
+      A365FB7D90CCFD941907320F3E6941D1394ABC9C30094BD38EB0F498FCE45DE4
+      A547B962A4B076F138B15618C8405EDC4042E7460EC253137D64CF20A7A08ED5
+      41C19D82419732686A37198ADF9B42F3D9C72236EBB950949D6F42EA816AAAAB
+      0FC050D984D96F1F43FAE2085CEBB0A366A3993D57BBD08F83A371F56FC722E3
+      D332E41BAEA060FD23A8A869456B9B19B3DF3DC16B16A5E7282A0FEBA85C6882
+      688C4346246D3E4551E68CE20D3370B6BA152FFCAB0485B526B1C6B9F2523004
+      51F912B80A2B38F59D00C7E5F3152AB49ADA90F07E11AF3702281AC6B2839A93
+      399FF12810C09108900FAE0EC29113D5888F19871D078D981149CDCAAB79BC89
+      2110DA85A37993B0A5BC2F826E7199DB3CDB2A293369CD17EE82E3A50D7879D1
+      54AA391D887EE92B64BEA0819FB713D52219A2FFF85FECFADB0C6CA174FC7E6E
+      336B26B48BFCFBC6D5BF138D8CECD3C83F7B1D1F278741134C5DE44103C1A139
+      39299112A7C29299A390B9EB1CA6AAE4DCD1E85C2275CA1E2E7658B37C32BB7E
+      EDEE6A183B9D875CDFFAC019ADE0C613B8BAE1818BA2B5D7BAA501CC5B7FFFEE
+      71185B7B4443F32ECFB2938C3BBBDFB86A577B1C4C09C6B62F2A91BAE734E227
+      539AF275C59AE723C843AFF29A41B551306C4EDE05328401DAA4302C9F336ED0
+      73923C7114FAB5E164F472E8BEADE15E4E6952FF5E0CEA9A3A307BED09A42704
+      62D163C1348E33263CB51FC63647689787E2A1700F72A83A06409F1E83F2CACB
+      8898EC8DBD79B5F860DF197CFCDA3D08527961C39E4A6C3F7615C62BED0CB476
+      D944444EF6A226C881BAE44EACD49EC1C52BD790F9FC54C4C5A8F0D74D6548FD
+      F20A5B7F0E6939404B8E0BE7ADE0C60D1F5CCA6F957073EAC52BDB4BF901216D
+      39B888006841BA4889A48DC53C4D380A9D1F2D07C2E464D02A7E3D15FC287F19
+      66DEAD40EAEE33DCC8941613EFF162F55357748D9EE7C6EB5AB7A9AFBE71AFE8
+      E1359675910316B5149D89F7FB41F7DD45EEE1F67236AE9AA666BC6C12E94A29
+      CD09403B5158DDC6D2717A821AEE7233D6EE2C85F1BA03B25E9A8AB2734D3854
+      D440E9AE8B2F9CE97989911EA8A86B43610395093B19039112C733C476AA6DC6
+      D65E9E1A8571C961D40A331BDFD826E7656428CD8900AECA0A6E2C81AB1DEE9B
+      1333EFAA84F58D3059B6C01C3031617D236C8212F662BAEBE55D2833367BE3D1
+      DBD7E070E348391461136B165B3B09E73188DFC748AC207BF977D6E14AF85CC5
+      371CCC41D87E073F2766883EE790F2751DCC6D7C1E5610C273857908D7B03736
+      E23161DF2CBE4161EB4C99185DE0BA320773E0C787D29CF813B86A2B38FF3B01
+      CEC20DD067B09BD2806070611326DB3761DED0F4BF8714F7D9CB5C7BF1B8A5FF
+      1DE080F5D0CF98D84D630C38DEB76FE9F703714858BAFB756197DCACDBC0F9A2
+      FF18B383B89E93D8DF06CEC0817EBE3070B556707E04AEC6F6CF3A2341540104
+      AECE0ACEC7066EA40803D720820B247095553670234102C7C9516905171C100B
+      63653BCC66DB0F627FCD22954AA00E7482A186FF20B62E2244E3DB7A4D81AE4E
+      DB4FD07FADC27E822EB383AB9B094565FA06015C1CF87FFAF0F9A52767934149
+      2D6D7FF81F3F8DFC0DF4F11BEB0000000049454E44AE426082}
+    ButtonStyle = pbsNoFrame
+    OnClick = pbOkClick
+  end
   object pnlPhase: TPanel
-    Left = 48
-    Top = 48
+    Left = 60
+    Top = 47
     Width = 145
     Height = 25
     BevelOuter = bvNone
@@ -46,13 +384,4 @@ object SelectOnlineSignPhaseForm: TSelectOnlineSignPhaseForm
       ItemHeight = 14
     end
   end
-  object btnOk: TButton
-    Left = 208
-    Top = 48
-    Width = 121
-    Height = 25
-    Caption = #24320#22987#29983#25104#25253#34920
-    TabOrder = 1
-    OnClick = btnOkClick
-  end
 end

+ 4 - 4
Forms/SelectOnlineSignPhaseFrm.pas

@@ -4,15 +4,15 @@ interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
-  Dialogs, JimCombos, StdCtrls, ExtCtrls, sdDB;
+  Dialogs, JimCombos, StdCtrls, ExtCtrls, sdDB, PNGButton;
 
 type
   TSelectOnlineSignPhaseForm = class(TForm)
     pnlPhase: TPanel;
     jcbPhase: TJimComboBox;
-    btnOk: TButton;
     lblHint: TLabel;
-    procedure btnOkClick(Sender: TObject);
+    pbOk: TPNGButton;
+    procedure pbOkClick(Sender: TObject);
   private
     function GetPhaseIndex: Integer;
     { Private declarations }
@@ -64,7 +64,7 @@ begin
   jcbPhase.ItemIndex := jcbPhase.Items.Count - 1;
 end;
 
-procedure TSelectOnlineSignPhaseForm.btnOkClick(Sender: TObject);
+procedure TSelectOnlineSignPhaseForm.pbOkClick(Sender: TObject);
 begin
   if jcbPhase.ItemIndex > 0 then
     ModalResult := mrOk;

+ 536 - 14
Forms/SignOnlineReportsFrm.dfm

@@ -5,15 +5,15 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
   ClientHeight = 644
   ClientWidth = 1295
   Color = clBtnFace
-  Font.Charset = DEFAULT_CHARSET
+  Font.Charset = ANSI_CHARSET
   Font.Color = clWindowText
-  Font.Height = -11
-  Font.Name = 'MS Sans Serif'
+  Font.Height = -12
+  Font.Name = #23435#20307
   Font.Style = []
   OldCreateOrder = False
   OnShow = FormShow
   PixelsPerInch = 96
-  TextHeight = 13
+  TextHeight = 12
   object previewBox: TImage
     Left = 116
     Top = 60
@@ -25,7 +25,7 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
     Left = 0
     Top = 0
     Width = 225
-    Height = 603
+    Height = 594
     Align = alLeft
     Indent = 19
     ReadOnly = True
@@ -38,27 +38,549 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
   end
   object pnlBottom: TPanel
     Left = 0
-    Top = 603
+    Top = 594
     Width = 1295
-    Height = 41
+    Height = 50
     Align = alBottom
     BevelOuter = bvNone
     TabOrder = 1
-    object btnGenerateSignOnline: TButton
-      Left = 1167
+    object lblAlreadyUpload: TLabel
+      Left = 444
+      Top = 20
+      Width = 96
+      Height = 12
+      Caption = #35813#25253#34920#24050#19978#20256#23436#25104
+      Font.Charset = ANSI_CHARSET
+      Font.Color = clRed
+      Font.Height = -12
+      Font.Name = #23435#20307
+      Font.Style = []
+      ParentFont = False
+    end
+    object pbGenerate: TPNGButton
+      Left = 224
       Top = 4
-      Width = 123
-      Height = 35
-      Caption = #29983#25104#25253#34920
+      Width = 210
+      Height = 44
+      Layout = pbsImageLeft
+      Spacing = 4
+      ImageNormal.Data = {
+        89504E470D0A1A0A0000000D49484452000000C80000002C0806000000208DF7
+        0A0000001974455874536F6674776172650041646F626520496D616765526561
+        647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+        000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+        4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+        6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+        786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+        392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+        2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+        3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+        7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+        626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+        62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+        74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+        6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+        7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+        43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+        32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+        3D22786D702E6969643A33463831373138313246443831314537414642444244
+        324243414646413431452220786D704D4D3A446F63756D656E7449443D22786D
+        702E6469643A3346383137313832324644383131453741464244424432424341
+        464641343145223E203C786D704D4D3A4465726976656446726F6D2073745265
+        663A696E7374616E636549443D22786D702E6969643A33463831373137463246
+        44383131453741464244424432424341464641343145222073745265663A646F
+        63756D656E7449443D22786D702E6469643A3346383137313830324644383131
+        453741464244424432424341464641343145222F3E203C2F7264663A44657363
+        72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+        203C3F787061636B657420656E643D2272223F3E8A2CD968000013EE49444154
+        78DAED9D0B5C5555DAC69FC34D1050E42250E0C123289205A8A1A2686646215A
+        34CD68391F4C09D36DD24AFB4A531C506352B4B4AFACC1A9609A9469CA2E4869
+        37E5A262DAC11BA4E011242E5E0E8872BF9D79D75A7BE30139F4659A1DDACFEF
+        77D4C3DE67EDB5F77EFFEB7D9FB5F61115A2DEBC1BC03FE8E509458A14C9AAA4
+        D73C150152313A2CD8B3CECE012DED1D3018AE77BF1429BA7E52A9001B4B0B38
+        34D6E1BB6C6D2503C430FCCE30E8F48D68EB50E850A4C8CA42058D8B1D8EEFC8
+        0607C467EA4494D4345DEF7E2952F4AB91CF205B947C932B0051DF3611A50A20
+        8A14754A4D8094EE940199A200A24891B13820BB6440262B802852642C0E4896
+        3120D50A208A14C9523B1B0312A600A24891B13820D932201315401429321607
+        24570624540144D18FC980482F3B38DB5A22A7BC11BAC68EEBDDA16B2A0EC86E
+        1990090488FE370048473BB48F8F4090CF40C46C2A405A7103FD50750D0F4841
+        75A30D3E7DF216FE4EF56C1E6061816D0FF8A0A2A61949596728D07E6471D660
+        40FCB841881AED86659F9E424679D335EEB309B5B7896B37D409317F3F82B413
+        4D62D9B98F4AED4280EC910119DFC700317420E56EF168D95BFBF4D853DD0A1E
+        54AD8DD03EE18FA061AE88D9780069BA760A58CB6BD80F0AFEA60B306CB89DBF
+        553DB50B1A877E78E781A108BBC91D55E79BF0DCFBBADE416D6F45CA5D83117B
+        8786FAAC45DAC936DAD542C04EE7C220FCFF4B85E0D7BEBFB2736E6980F62F23
+        C5B57B7D3FF5835D3BAB6B77EDAEB338207B6540C61120E7FA0E201A9B561C5C
+        36160EB65698B9EE00322A0C62B46BAE83763EDD64DFC18879752FD24A54D7F8
+        26D3711B6A60786D3A7FA7FACB9780952D50AF4772B81716DE3F06754D6D085C
+        F91D74CD2682B6AD990071416CF808EAF33EEAB341F49902D6B03EEC27F748B5
+        201BB0E9DFA58FD1C3ED1136CC11BDC246A0468E718787B33D32BF2D43C5850E
+        01AAE923212EB3F247F6F9F54AED4A80E4C980DCDA8700A1EC111F628F843901
+        282E3F0FBF95DF02764EE24631409E9200D940809CBCD680901ACFC3F0FA34FE
+        4FD5E304483F479EC9D0508DE8918E701AE8880D875BA4A0ED218BB435513624
+        40EEF2EFDAE7A65A02EF76E417552238FE33FA682F59A1A315862DB1C82F3E83
+        E0978F00B6038DB6B52125C21DB1D37DAEFAA9AB16E48A01C10CC501F9560664
+        6C1F028446DCCA8420780CEA8FE5A97B919847C168CB464729833C2D01B2FE67
+        00C2CA9B05AC1E1FF8D33FDB8B544FE549FD21EF32840CB11D41DDDE82D9639D
+        1011A2C6DAAD053854D5C1F749D396C1F0C67402E434825FDA0758F737DD309D
+        B7E1AD7B24400A04A4B2A8FD09039AE137B083C3625234F02C9B7B2B7CBD5CB0
+        367D2F0E95D6A2572F4460A4E9E86F1BFBAB7A8D7E297140F6CB808C2140CEF6
+        014098F798E18AD83B875E95E6623692913FD6833F605EE669F232BEAE28FEA1
+        06758DADBDB4D281203F0FFEAFFCA22AFA532E39BA9533940182D7158880A240
+        D53E45006A9C4CB6AA8ACD84615304B54941BFAE9082DE81B719EDEF889C530D
+        D03548B34CE48392A73A62E1BD23907DA81C93DF28A663381875AF5D64B4B6C6
+        DE01A18147BB74223F9798355F23ADA08E4F389894653FD1274B9BAB722F7E69
+        A9DD0890033220C17D0310EE3D568C81839D35F28F578007239F6991029C82C5
+        D77B106DB7A1C0AE9602DBC428489F5B46063AA35C75B9A96599681165223FCA
+        44499948CBD79B0E160A2CC3FB0F8B267FFF168DACFD7ADECFDA0EB077139980
+        02363ED401DE83289B18DA3176C460040DF744E6EE22545453205B58232EFD38
+        0CA9F70840922540281B54AE0CA6ECD9735913B366278DEA56E2589D22503B3A
+        A8DC231FE2D78B0F217822433C8407C93B858ADA8E5EAF5DDC4774FD2DAD705D
+        66DCAE8238205A1990A03E0008DDC0ACC734081BE54670505DFEC276BA41D65D
+        F721A3A95D15CE832DE6450AEC837AD3269205B29DB32847BAEFC30079560224
+        399BB24CAB690FD07211DA2563E9981E98B9220B196526028B41C8465BF63705
+        3A9BFD426BBD98C59AE38FD8598188F9DB0EA41DAEED0C70C33B910290351220
+        AD0DD832FB068CF0322AA128E02BCE5E447A968EFAD926CEA9FB75613E6416F9
+        90709FAB763B548F99AFFF60E280E4CB8004122067CC181056464C1F848551C3
+        282BB4E0CEC59F614FADEDE537880248BB643405AB3B62564B816D6ACA934121
+        076CF7806E2140FE5702642D7999E25EBC4C3301F25C80D877DDB7B4AFD436F5
+        79FED88118E26283D773F45412198DDC6C7A98953B543272931EE581D8C80082
+        31570439EB570BF315D30520AB0B45D944FB32F3CFA0ECFC6A28CBA0947178E9
+        C6CC39CF60DDCE87F99081E4439C7BF121946596459307F1260FF21E7990925A
+        D3EB2096E43F8A60B6FE83493D980039280372B33903C2EA6E5BA42E18C5DF2D
+        DFB41B895934FADA0DBA3C6859603F2F8FFC14D8455768D28DDAC9DC5B868AF3
+        3D4C79B232E3C34A0165E731F344E0B0635266C87A7218C26E7643FAAE72CCD9
+        5CDE73166280DCE34280F877ED73D37918DE9E862A7D3D32F69D1610B0F28841
+        65E8BECAAD12FDA3F6E3B6F630F56A907C486B2F3EA49D3C48C2449E096392C8
+        831CA9EB3DFBDA98AFFF60E2801C96011945809C365340E886C687D923217A14
+        32738B31E3FF8E00FDDD7A1E2959602FA6601D4EC1BA8682EDF8CF00446AC794
+        AAC82B783EABE553ACDBFEAC46C4041F2C7FE72012739B78569AE0DC8EDD49E3
+        F8BEA18BBEC69EF3FD2F2F7D9878061180ACFDF75178B93B61CA2DAEF09CBF13
+        867F86FFE4AEABE619973E064C186C8D8727BAB00B895ED741980719471EC485
+        3CC89E53D2A060CA5F08DF57A66F45E2AE6AB35C7157BB13204764406E326F40
+        D0588DE448772CDA7A82E0A0A0B5B6EFF9A6B0C05E2201B2FA670222B5B3F65F
+        546E9C349EF2EC40EAD2BBC8079D45F08B057C944DB98F027C660036651CA711
+        5CF89E6D71DE88187703417D023336525AB1ED21E3F1E95E0BAC98ED4D19C8AD
+        F3A755D50DF07CE24B1836CF4271991E2BDECEC3B287C653F9E38C98959FE3D2
+        4C999093BD15D63F7D3B9F94707C3487FCCA00A97966CE6D90FA4CE035B935F9
+        C535084EFADE2C330907E4A80CC848330684D5DA6D0DA23CA000D3FE756C2FFB
+        76C0D7CB5E9AC5AA455D131B317B1EDDB6EE3D87C46F6A4C83B654026D15951B
+        878CCA0DEA87E183DF1320E40D5616F23EC587D92261DE183EF2CE78F31426B8
+        DB60F74B217CF7D0F9DBC82F394AEB18AACE7E6E7B448DC9373B535F2F4193AD
+        2DC5EA2D879171A299671B43FA2CE41FAB42F0F35F2325E626C4DE1B8805EB73
+        B1614F358C67EEE2A7BB2321368460D461C61B250488B47E43A595C6A61193BC
+        98E7693179D96ED13861E1DC90CEF7E9DB8F2233AFACF75572DA56DD6C8D8C32
+        2A1BADEC606EE28014CA80F8132055660A08138384D5D1548E18DE9D72559ADC
+        94A143DC7FCE48B57D37112095EBC7F27263D8BCCFA16B1B70C93F349337D81C
+        2E00492CE4A367B4BF01A98B4345564938826D4F8E40C4F81B90BEA31073DE2A
+        A1ECE1DC357BB435A2F29531F070B64366CE0938F6B742D8683562567C81B4C3
+        749F6CE878ED4DE238C7E838F1FB11A9B1C1A7497710846594914A2FF59BBC43
+        E52BACAFFD09E69D48FBDEF2D2A222BB6ED48E3C5BD6C38545A4AF3D362F9D04
+        87FE368889FF18AF3D7F37DF12F8C40EE8EABBEEAD71B0C03BF383F1E5814A24
+        6EAF10C761D9DC0C9FD9527B1020DFCB800C37734064B11B5D7F9A1BE31E6568
+        83765D0482FC3D11B33C0369FBCFA27B39C2C5BC80AD138DB4837A2E0F9A6B29
+        38A50710676FA77D5D2E651A0EC83411B80985A2DE6FD4C3F07E04DF1C93B497
+        60198FBA8616043EFA1974EDCED2B4AD51A6A2F3881E09E414564057DB8A9479
+        B720362A10312FEE465A21449F781FA4E3FCF53007A168ED04BECE13BA280F7B
+        CE59724B113F95FCD99F46D27EA711BC943D76E3D63560E5C1E5F28B85F9E307
+        60D5437E7C5D69F91BB948CC2C45F21FFCB0F08FB722FDAB52CC79479A58A08C
+        973CCB1D8F440EE119AF4ADF88892F68A16BB492B28C197A1006C87119103F02
+        A4B20F00C2FC089BEA3498988961334A4921081AE14EB57A16D20E369A18DD54
+        62259805E2656504195BE766EC7E65229F41F27C7C2F81E4D4B92D3A4085D4E7
+        C75039548EC9AB8BC508DA5443C13B9607AFAC056B7761435E8B2877BACF5EB1
+        751056364AB35129736F44EC3D010408F9A602C9373110D325409617F0637318
+        1E0941F6C13398BCE6248DE82A1C7C399807784C225BFDB69056D17B0F58F6B9
+        17EF77C7ECDB6FE4EF631276202DBF519C4BCB0514BD3A959FCBF2B78FA1E45C
+        1B5E9A378CB29D2D877ECBF642246D2D83AE75E0E5E09B91D49E0448910C886F
+        1F01E4C7C4BC4322798711CC3B1805DB4F1105EDFC106BAC9F1F84ECEF7EC0E4
+        978A44C9C3B7B5132040EA92106CFAA800715BCE49415587E4998E34F28EE6BB
+        65661763C6BAA3623427082387D9E2B69B1CF1C1BEF3D85325953A06C91F5109
+        9432C79500F1EFDA6706C8BF2540E20B45D66B3C4B03C078CA90EE58FE5621A2
+        2679904F1A449E814AB9374FD0F15C7B2E193BCF8DB246A82316CF51F38097A5
+        BA77AB9479AC79769BE05C8F1DEBC279D9C554D7D08A2D9F1720E9FD42E81AAC
+        05F4D68E66595AC9E28014CB80687E2380B412202B24405652B01DBD02403A28
+        181EA6D175FA50AC7D371F8B3EB9202090B625CF1C80850F0610208588DBAC17
+        06953CC5B627BD113149CD770B7D848C790D8DE456F61CAAE47B5DB070B62FD6
+        A69FC0A28FF55D330A9BE67DC0850CB87FD73E3340FE2301B2AC50B4D57A1191
+        EA166C4E9CDA19BCC5A7AA11BE389B46F4415D2702BA88325FA03D9E8EF24490
+        9FC886D9074AE1E9E600DF212E50FDEE0B31CBC63ECBB274730DA26FB6446A82
+        788C3FFD7302904DAF3330ACFA8BEC6BA68FB9CBE280E8644086122015BF1140
+        561220FE04C80A0AB62357000833D06F8CE6A677E6B35F43E3ED81F05B5D5171
+        AE198E762ACC0875A7E0B4A66DDF20A3B41F1F75B7CD2738423D3A9BD8F4D171
+        C4BDA717251C798794072943DC3B9C00C823136EE83ACAB74B8044F977ED3303
+        E44302E47B0264290162EDC0019DE0528FB4E78329B09DC5B13E3C8CB87F56F5
+        5CCA7113DE0F294FF9D1F9888C5175AE0ECFADCF415A5E15B4EBEF42D0480FA8
+        EEFBAA4B19A9B16B43E4284B9CAF398BD716DFC16164BE23E9BD126CC8AD37CB
+        758FEE52DF40809C9401F1F90D01B24A0224F14A00318891F385601E489E0F7D
+        83E8719E485DDA756A79D307871097560E8D8B0BB62706C0D7CB818FE42BDECC
+        41EAAA597C9F996462334E889937ED2A7FCA6AAE1836773B8DF44E5DFBC40079
+        500224B11B205B25405E101964FE2407AC8A1DC63D4771A91E1E6E8E3C78F38F
+        D7E0F1D74BA97C63DECC2878591947D7A4683DF32996D8989E8FC44F4AA8641C
+        C8338076F5ADFC5AA9A2BEE2804507D963F6646782DD9D325735829FD989483F
+        1BBCFC4C68279055FA26ECD25623737F2DF9967A98AD07618094C8800C316340
+        D823EEFFE381D859DED7A4F94D9F948911987FCD953DEC389C82D9196B53BFC3
+        A20FF4D00CB0C4248D8A6F638B8445150DD8530944067A23E5D99BF9C8CCCB9C
+        67BE80EEA201297123117B7F20AFDB9F78E538728ED5E0E0C671DCE07A3E9C4B
+        81E8CC47608DA305EDDFC13356D6D261081BED2900396404C8C70290C75F2DC6
+        4B71231016E4C2FB9CFE5901E6ACD98B096A47A4254CEB0CDECCDDA7B171DB59
+        6414C9DF6B37084FE14A7D2EA916A522F353AC2C648F9624057040D2779460CA
+        180FA32C538F7F7D7E128BDEAF12EB274D35489EEB87B99101F070BDF4287D76
+        BE1E93579DE8FDCB5CBF5271404EC980781320E5660A08DDA0F87007444DF1C0
+        8FFFEE06B65D7E4E4965F432210AD4ADBBAA90B89D2D045AD3086D8BF54F8FE2
+        D963E2133BA16B96CA8EB67A01088388CA23CDC07E38F8F7501ABDAD90BDFF14
+        FEF4B77DD03531D3CAA667ABB16D492022A6F876395466D649CC483E29466F43
+        1BB296F97606BCACD0477662CF390A5E15FBCA2D01F2C93482AF860010B3630C
+        B21736E460C3D77A11E86CFA96404A7934007322027836292EBB88F065C7A0AB
+        93CE9B790AB616C2AE0DEB1F7BD1A6E840CA94CB823B8FCD80CEA27349DF5E4C
+        E5D739D14F0EB38598716BA9E51E283E6A28EE183F047E3EAE98F8640E5DA301
+        A24D3393FA4602A44C06C4CB9C016915378702A6D72FFC5C89D8486DE324951C
+        963CB88B3686E0D5F70E63434E8BF83907AC5DB0C7638E7D0BB011919A36DC16
+        38008BDE3D211602AD0748C14430359D45FC2C4F3C3627888FB8F98555F85D3C
+        41D4CA1E45B7136555B41B62EF1BCEBBC1027FCDDB0790F8599DE80F6B8701F2
+        E934FED9FD474FC3917CCF924D87A06BB093D66F6CA5A70CEAF9BE9AFE2D583C
+        37001FEFAEA6D2CE4A7A1E4BCA229DBAB492AFB1BD88DC0DE35075E602B67E55
+        8C77BF29A78CA6129301DC88DB4A30A9A4A78F5BF879B3928D7FF98AF591F583
+        81AA32BFD92C0EC80F3220379831207CA1AB558072B57FFB8FFCA8B84A32CD6D
+        750246FEF8B89398ADE9492C5858A0B03EB160B2B2BB1424FC11F6060174EB05
+        F18D3EB6DDD6554C8D3210A9BC41B39ECF16F136989967C76323B6A5F410266B
+        BFE98CD8CEFB68258C3A0B603970E5E375348B63B2765960F329D8DEA77B59DF
+        347617A1ABAEBF1C8A9EBE02D0FD5EB0ED7C5FF38383890352610CC80F660AC8
+        2F29B600D921FDB73B0C1A93B335D2EA34CF2A9697EF278FB81CEA7611AC7C51
+        D208223E22378BB6581B9DE58F5169C402DF206DE7E59D95E97A9F3F06DF2E3E
+        AF3211E0C6EA2CBD20FAC72134EFA9DB9F22B59731201E0A208A7A92E98739FB
+        BA3820553220EE0A208A14198B0372DA1890320510458A64A9BD8D0119AC00A2
+        4891B138206724407C089092530A208A14C9F219628B121990E15E61D09D6C44
+        5B9BF26BA01529B2B2524133D40EC77F10BF06BA62CCC860CF8B171CD0D2DC71
+        D5971214293227B159709B7E16701C50870385DA2A0608FBAADB3FE8E5F1731B
+        57A4A80FA99C5E7FFE2F42D0E6154E85D1F40000000049454E44AE426082}
+      ImageDown.Data = {
+        89504E470D0A1A0A0000000D49484452000000C80000002C0806000000208DF7
+        0A0000001974455874536F6674776172650041646F626520496D616765526561
+        647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+        000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+        4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+        6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+        786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+        392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+        2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+        3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+        7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+        626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+        62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+        74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+        6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+        7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+        43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+        32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+        3D22786D702E6969643A33323435433731303246443831314537383633434344
+        394346443836413041312220786D704D4D3A446F63756D656E7449443D22786D
+        702E6469643A3332343543373131324644383131453738363343434439434644
+        383641304131223E203C786D704D4D3A4465726976656446726F6D2073745265
+        663A696E7374616E636549443D22786D702E6969643A33323435433730453246
+        44383131453738363343434439434644383641304131222073745265663A646F
+        63756D656E7449443D22786D702E6469643A3332343543373046324644383131
+        453738363343434439434644383641304131222F3E203C2F7264663A44657363
+        72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+        203C3F787061636B657420656E643D2272223F3E39360BF7000007FF49444154
+        78DAED9D0B6C14551486CFDAD24A614363B1B00D85865A101045212A2A608C80
+        148C21108110D1F050441105A3567944885440544401032558348009212A5605
+        4302888F04228A8008984A71172AD59222D04259E7DCF6AC776767EECC3ECAEC
+        E3FCC9A6DBDD79DC999EEF9ED7DDAE0BFABE3F0C00CAB48707582C16C9A73D26
+        B93440BCE04AF3407A5B806B32B547BAD30363B19CD395CBDAA31EE0F239007F
+        A30F01F143AB7600E96D3438AE6D06C4E5F430592C07E46F06E4A206C8BF0097
+        CE42132099B9203C489A06884B03C4C580B052507E0D10BF0648E3C5260F525F
+        DD0C48EBBC2640840769E5F430592CE774E552B307D100B9E0950171FFEF4158
+        AC5455C083D431202C56881810164B210684C552880161B114624058916A44AF
+        2CB8CE9D06DF1C3E0FBF9F6D747A382DA35407E4C7E5DDA1CF8D6DE1D139BF41
+        F9F7752D7E3E34AACFDEEE219EBB06EF133F3F9F5B00DEEA0628DD70DA96A1CD
+        1DD91E46DE9703735655C1D683E753E6DE39A2540164F5D43CF1736D450D7C77
+        A23EF0BA137F64FFF6BEE22702D2B55D1AAC2B2980017DB3E1D49906787159A5
+        E538F05A268FF2848C19AF255CDD3AFD48C4D7C18024092068843F95F786B659
+        69F0E0B38783665DA70121BDF148079835A1139C3BDF08B74C38A0F4246680D0
+        71C3913C06D2843BDD30A08FDB72DF118372A063FB0CA8D85D233CA095A6ACF2
+        B6EC8D6D09A502201892BC3AAD0B1C3B71018A261D0A7A2F5E0041A161666B31
+        FD3BDB6B95FBAB00D9FFEB395B5E41B52D1D3FD6328231EE950A80F836F41633
+        DDBC157FC0FC2D6782DE8B1520749C584A36284A88516386E440F1801C585A7E
+        127E3EDAE40D71ECB102A47FE74C28CACBB03CC69C29F97043E7D641E3502921
+        C3B064072496B3A10A220204BD1486492A114868A02AC9C66B0520C26464F4E8
+        95F455260AE776EFAB85812F1D8FF87E700E92E080C8B9879931E20C88EFDB31
+        6C55D5281C63310BB154C23031BF43D3ACDEAF975B9C4B8EFD31BE370284BCA7
+        915463B593878493832464FE814A664076BD5E28AA43AAB023D621969DE3D0B6
+        FA82815D8593836C9C950FDD0BB282F6F7FE550F9BB6D528C719EB3C2421F30F
+        54B202225785864C3F1C54DA95E52420FA6D9F199C0D9D3B66C28A4FCF445CC5
+        B29B8358C94E1E124E0E92B02158320282E1C1070BBA89E74689B9AC5803A20A
+        3728CC303B2779BC4D5F56C3D8A555A6E7520182BD94AD3B6B6C8F3B9AD08773
+        90040584CABA68ACC3E7572AB7BD5A552C345CCFB803E23976CEB10A25C38B33
+        F6B7653789E7774DFAC5D4E3A108109CB93BE566C0A07ED9E2D8B1E883E03826
+        16E7D8DA37DC3E48D5E906E56415974A46405018623DBFFEB4E576B106C428DC
+        406F26873E64E06B36FB02333841630535967B174CCD0F8291E04340B0D8B060
+        755520FCC1EBD20B7B2DCB5E2814E1A7FBA1FD41EFC9DE37D68A55F8775595AC
+        8090AC965FD8AD626DD9511371A8A6CF0DF41ECE8EF74080066AE1178E958465
+        DAC5EB7D81445F3E0F413863F1F190C6A3CAC362E5EF9E1E59A0D2CD455922BF
+        23614858B147DDDC44FD5DD7E8E8DAB18894EC8044127618499EED8D44E5D4C2
+        D1FB43126C3D20344BD36BE43D54B9071D1F8DDAAD4182B98A2A49A745914610
+        D0B122F19A78DC0D0BBB095071FFF74A0AC5EB46CB63689DD9D73F9C4DBCD02A
+        7053931C102BC52AC452F5368CAA4BB43D9E1761B15A832537FCEC56B18E96F5
+        141E52F64AE43D220977B0CAF6DAD305020ECA9FA85AA8871B5F7F62B4476C8B
+        21E0DD530F25E6927806247A40284492137112790B7DD79A8C9764140A99C92E
+        2004039D5B6E9C8673BDB8DFC2C97930E6815CF1BB7E5FBA1684A6D2570F8B66
+        14080F85D06FFCA2DAF632FEB81403123D2038B362D26BB4748300D1876834F3
+        A2F461108631F7DEE686CD3B6B0DF39170FA20747D68BCF819127C6E5546D65F
+        5BC9C4FCA06EBC51E56BDBF21E81FC2829C008DC5406246A40B05B8DB32B56B0
+        F4953302410F08E51D287D624EFB181D0F150E2072CE80C262C4D099472C0D17
+        C17E6E7C5EA05A86F07BAECF149EC26C893C55BFC20130EEC580440F0825BDB8
+        74A46B5E060CED9F2DFA02EE3669307C604EC8E7506438507A78CC00B07ADF08
+        109CDDCBE71506C239AB620302B57A7661C063C81FE2A27BA5070443B011B7BB
+        A1B6AE5124ED947794AEADB21D36C6AD1890E800A19993F20FA33E0219251AD2
+        576F7617C64AFD0ADA560688C664541143D905444EAAF17C68F4B47073DA924A
+        D36624E614B8DDCA8F7D41D5273D2078ADB4F45EAE9EBD35B3200024DE979D7B
+        6B45193821BBEDC908484B7DE007A59F81E506218643FA3EC2516F8330447966
+        96C31C1A2BC6ED4F951E17952A4CA4F17739E1C7E3122CB424C50C1034FE45D3
+        3A896D5014F2E8BD09E63E2B375787F426703B2378E85AF178D8BD97BDCC4715
+        D541E1208689E38B738372976897D73BA2640484FEA9414B486E1852726E55C6
+        94AB4768248F9556066DAB0FB950FAC49DA090A5CF5DA8934E002064AFBC5B19
+        12E620946387E5063C8BDD9C44F68C78EC5DDAB558AD0AC6BFC5FD77B483A22E
+        598959EA4D4640AEA6301C59BED16B196B5365CA6CF90B1AD2930F7BC48C8B5E
+        60D4EC6341C6247B4534CE25EB4E8634DFC883EC3D5827F29F97D77895D0968C
+        EB009FECAEB5D5DDC6EDF7ACEA2926039C243EDCF14FE2197B24624058762587
+        7929230684C552880161B1146240582C851810164B217340F82BD8582CE3AF60
+        E32FF164B1145FE2C95F03CD6281D9D7406B7E24DDD304486633202C568A4A00
+        52DF0488FFF22904A4587BB94C7B74747A6C2C561CE94FEDF1F87F008A0DDEDB
+        A50E010000000049454E44AE426082}
+      ImageOver.Data = {
+        89504E470D0A1A0A0000000D49484452000000C80000002C0806000000208DF7
+        0A0000001974455874536F6674776172650041646F626520496D616765526561
+        647971C9653C0000032669545874584D4C3A636F6D2E61646F62652E786D7000
+        000000003C3F787061636B657420626567696E3D22EFBBBF222069643D225735
+        4D304D7043656869487A7265537A4E54637A6B633964223F3E203C783A786D70
+        6D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A
+        786D70746B3D2241646F626520584D5020436F726520352E362D633133382037
+        392E3135393832342C20323031362F30392F31342D30313A30393A3031202020
+        2020202020223E203C7264663A52444620786D6C6E733A7264663D2268747470
+        3A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E
+        7461782D6E7323223E203C7264663A4465736372697074696F6E207264663A61
+        626F75743D222220786D6C6E733A786D703D22687474703A2F2F6E732E61646F
+        62652E636F6D2F7861702F312E302F2220786D6C6E733A786D704D4D3D226874
+        74703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F6D6D2F222078
+        6D6C6E733A73745265663D22687474703A2F2F6E732E61646F62652E636F6D2F
+        7861702F312E302F73547970652F5265736F75726365526566232220786D703A
+        43726561746F72546F6F6C3D2241646F62652050686F746F73686F7020434320
+        32303137202857696E646F7773292220786D704D4D3A496E7374616E63654944
+        3D22786D702E6969643A33413635384535363246443831314537413236464433
+        343643363745394138412220786D704D4D3A446F63756D656E7449443D22786D
+        702E6469643A3341363538453537324644383131453741323646443334364336
+        374539413841223E203C786D704D4D3A4465726976656446726F6D2073745265
+        663A696E7374616E636549443D22786D702E6969643A33413635384535343246
+        44383131453741323646443334364336374539413841222073745265663A646F
+        63756D656E7449443D22786D702E6469643A3341363538453535324644383131
+        453741323646443334364336374539413841222F3E203C2F7264663A44657363
+        72697074696F6E3E203C2F7264663A5244463E203C2F783A786D706D6574613E
+        203C3F787061636B657420656E643D2272223F3E3FFE2C71000012EE49444154
+        78DAED9D095C9555FAC77F974D50401414D014447161FAC7A2598A98A5652ADA
+        DFCCA545EED8C058663A8DB63806246EE9404D3A96FEB112C6FE65FF66FC5480
+        0B6506B82BE09298C095251665734176EE3BCF39E7BD702FDC0B7F4B732EBDCF
+        E773C3CBFBDE73CEFBBECFF73CCFEF39E7860A33B74D01F021BDDCA198628AE9
+        AC845E7F501120C50101FEEED58DF66868D44292EEF6B81453ECEE994A05D858
+        5BC0DEBA1AE9E919250C1069E8BD41D014D5A2A959A14331C5AC2C55F0EA6F87
+        8BE752C101F11C1688BC92BABB3D2EC514FB8F314F775BE4FD784800E2E11D88
+        FC520510C514D399879B2DF2B315401453CCA8B5074449B11453ACC53CDC1540
+        1453CCA419023244014431C5F48D0392A300A2986246CD1090C10A208A756612
+        8287D8A1770F4BA4E5D64253ADBDDB03BAA3C601C9D501E2F51B01446A46C6AA
+        61F0F3EE09F586F3883F5343BF54DDC90E113CD8065F47DDC7DFA99E3E46FFB1
+        40E2124F1497D763FDD757C8D13A599C9524443CDA0B33C7F541F83F0A90905B
+        7787C76CC2B44DE2DE0D75A27B770EF1A7EBC4B27317350E88A6AB02226911FB
+        8CD85AF6D177153852DA08EE544DB5C8881A0EBF612E50AF3B85F873CDF46BCB
+        3B380E72FE86EB90BE7884BF55CDF91E5E8EDDB063F12004F9B9A2B4A20EAF6F
+        D7740CAAB611B14FF745E80C2FA8D76720FE6C13874CC03E9C75720B0352C13F
+        F2C2CFBBE6C61A64AC1E21EEDDDA93E2DE5958DDB97B7797CD1090415D0B102F
+        BB469CFEFB28D8DB5961FACA5348D04862B66BAC46C61AF690FB42BDE6283D64
+        D51D7EC8D46F5D15A47F3DCADFA9667D0358DAD2EF2A103DFB1E2C9B3F12D5B5
+        4DF07D391D9A1A134EDB5C4F803823F4BF87D1988FD3982531E6A61A489F07DD
+        F28854735201ABEE06630CF1ED81A0DF39A043D808D4E0B1AE7073E981A44385
+        28AED40A504DF784B04F4A3A39E73FD7382097F40129EE228050F48898D403AB
+        427D90537015DE4B4F00DD9CC483D201329C0059FD6B0042567F950099C8FFA9
+        7A9200B176E0910CF59508097080534F076C3AD240BF674E6B248A34D7094066
+        0E371C73FD356AF711646695C07FC99E8EA30239B7F44D28322F5C81FFCA7380
+        4D4FBD634D887DD6952294E76DBF74D59C4362423043F3E8A70F886717028466
+        DC92AD7E7073EE8EC80F8E222A999CD186CD8E7204592B0312F50B0061E9CD6A
+        968FF7BCF5CF7660AA39C7E4F19076F1668298A0D63660EE78274C1DE781984F
+        CEE34C81969F137FB410D2EE47C9E92FC3FFD5E36DA2421BA3EB96129E1080FC
+        E5BC7C3F64A3F6C7B8D4C3BB8F96C362DAB4080FBB1F43063A2326EE28CEE45C
+        43875AC8CA965247FA69DDE3B6DEA35FCB3820795D0D10A63D9E75A1D970D06D
+        694EFD3609F94C23FA806999B542CBE41454A1BAA6B18356B404A41BFF57E685
+        52FAAF2EE56893CE5004E0CECB1C8A09E23542109B32D58C24485F4D95A34216
+        7DCE9EB719E2EF80B4EC9AD62A13E9A0E8271CB0EC9961484D2FC2F8B539F2B9
+        BA61348B88C65E1D0142134FC63B81FC5AD49107109F5EAD772D46CCB21B8148
+        FD58D8DC9667F16B9B21201E5D0310AFEEA43DB68C847D776B4A3D8AC11F20AF
+        B4E81C5CA219B0171DB721C7AE941DDBD42CA842F80E0DE91755FBF48545A275
+        72247A3309F1C72A4CE7DAE458D2B7CF8B16277E241CC79859D901767D442420
+        678D78CC1E035C583469C6289FBEF01BE18EA4946C149791235B58236CFB4548
+        89BAA8200342D1A064AB3F454FE3698D3AF220454D2BD1578B497C6209F1EF44
+        87484D080E74131A24AD4068900EEE5DD83F8AE568689E952E0E48BE0E90815D
+        00109AFD52567A21C8BF8FC8CB17EFE38E64784E2332FE3E993B9B7A65278ECD
+        1CD9B6B7D00C6DCF6180AC9701792B95A24CA3690DD07803197F1D457DBA61FA
+        AB2948C831E158ECF39636E227393AAB7EA1F1A6A862850D47E853BE5087EF47
+        FC896B2D0E2E25040B4056C8809070FF6C613F0CF3D04BA1C8E18BAFDCC0AE64
+        0D8D932244B7DE46EE0BE990F9A4439EF0BC6D8F4335CB7CF507330E48813E20
+        45660C084B239EEC4569C4608A0A0D78ECE53D3872C5B6FD032207CA880E20C7
+        76A5D9B413C76650B0F4C0821D6FE3D00C90B7654056919639D381966180BCED
+        23EB9E13222FE7655A094BC6F7C4C0BE36787F7F053437F4666E561EA6199BCD
+        EC5CA4ABDD10FAA40FC1784838390389E98AAF1E1580BC210342E7A2AE92F7D9
+        1A0954020896BA3171CE23589BEB613AA48FAC43241369168D25FC8FA4413C48
+        83ECE8448358CAFAC3CA3CF507338FFE5D0610CABBFD6C11B7F25EFE2E72CB61
+        44EDA1D9B75BAFF64E7B2B8EDD91E9B593945688E20A63254F4A33E24B04942D
+        7D1E43FC5976C88A4786943707F388B72BB908F3B61519879501F29C330132DC
+        70CCAC3AF6D5449496DF4442DA65392A887489BF0C86C21CD982B7CFC7D476AC
+        FA3AC414204C83BC1BC823A13A9C34C8A9EA8EA3AFB5F9EA0F6686800C306340
+        E881463CD603AB16DE8BA4EF73306DFD3991CB1B9B2999636FD003E4F42F0044
+        6EC7949556D4C23D34838390B8CC0353C77B2272EB6944EDAFE351698C6B330E
+        6F79809F3B76E1011C29EBDE3EF561C600992F0089D9F903EE7175C243012E70
+        571FA4146BF22D0F5D35533FF59130A69F359E9FE42C43D5D13A086990205983
+        A476AE41D8ABB0AC9126AB4AB35C71E78014EA00B9C78C01619597FA4A44CF75
+        C5F24F724937F415A1DDD843618EBD51A71D7E2120723B311FB74D37B4885BFB
+        38A53E65F07FED3C9F656343C8C167F960FBBF2E927815BA27F1CF0330755C3F
+        823A17D336668B88A76A3B16B6FFC902AB170CA0BEFAB4FCB6B4BC06EECF7D03
+        69EF0CE4E45760F5B663085FF820A53FBD495BED45DBEA9293BD15DE5BF1082F
+        4A38CC4DA354CB516E9E89731BC485FBDE914793F96315A57F17CC329270407E
+        D201D2DF8C0161F97A738D480FC8D93362467570B2164306F490AB58D7505DCB
+        664CE3B3DBEE9472442555750CDA0856C5A274E3845EBAD15C0B29793632B348
+        1BBC96C5C71431D916AB168DE433EFB4E8028CE96F83C3EF8FE6A78F7D3E1147
+        CA1DE4750CB92F72DCC4E51E18EFDF9BC6DA0A4DEAC97C6C8C3B8B840BF53CDA
+        48FB66503FA5F05F7C00B12FFC0EA1B37DB174C3216CFAAE12FA95BB88E9AE58
+        F5D26824A56808C6BCD685424AADBCEC6A316EB0240A0326ECBE214E58B66074
+        CBFB5D893F20E970213A2CF3D2B1CA5A6B24E4B2E2831DCCCD3820453A40FA99
+        3120CCF8FFAB88E5D17594763C745B9ADCBE5B83B01D578CA73D0448C98E513C
+        DD183C672F34758EADFAA181B4C19EC9029057B3B8A00EF195101735564495E5
+        E790F8C6301E3D76256561DEE63C5159D28F1E0459C94723A97D3B1E611C7A58
+        21689407458764C49FA4E764EDC853AF967E5E3989E0E136F8FA6F9308C24282
+        20BF75DCDA7A947CCCC6DA9D603E4851D3B27551914F2ED45E93A89619B9B108
+        1ED1039FAE1BC72715F5EB5F624BE4147EC437643F34370CCFF672B4C08E37FC
+        F1CDB112447D592CFA61D1DC0CF76C71408ABB0A203A630FBAF63217C6468D2D
+        C06D9D0A3F1F77A8572420FE709971A1C99CCBC64916FA46D283866B9012E50D
+        8853F6D179CEAD9186019238B115102BB1F74ADA3B951F56471E45DCAA0779B5
+        CD37640F34F5BDE5B2AD5EA4A2EB08F103D2CE164373AD11B18BEEE3D1411D71
+        18F19910552C3E06B99FE567B988CEFE9F317C9D67EC0BC770E4B22597141153
+        983E1B41E75D86FF9F4E500ADAC7D06175934B3BF92161C9438E58FB82375F57
+        8ADC7C0851BBF3113DDF9BA2C9FDD8B52F1FF3B6E80A0B5A44CF71C5C2990379
+        C42B2DAF45E0D20C686E5AC9F7D74C358801203F750140981E6133A2A94A0CAB
+        28BD379A5223579A4D536836AE3531BBA984C86770B4038884AD6B3D0E6F0BE4
+        1524F790A30226F958889F0A716F8DA474A808E323734479B5BE0AD95B479146
+        E8D5D2CAD2F5DF63534A834877DA56AF58BAC32097AB51B17FE88FD0A77C0810
+        D24D99B26E622026E90039CFFBE6302C1E8DD4F42B18FFD6257839A8703AD69F
+        3BB87A25A5829916F22A7AC70ECB3EB76EBE2BE63ED69FBF57AFD82FEE15BB96
+        86EBC8FEF0617E2D91DB7E44DEE5266C7869305F9C64D07F969885F5BB0A29AA
+        F66C0FBE1999C73DFA80B87711403A33A61D6264EDC09C2DE367887472DA2541
+        D678EF553F82E0278C8FC816290F3FD6CC67FEB8A8D1D8FEC579847D5C2E520C
+        EA377AB603CDBC01FCB4A4833998B6E607319B5334081E6E8B09F739E09F87AE
+        E248919CEA48B23ED2D621F6F72E04C870C331F3544E06645996887A7565C8D8
+        FC209F0022B76661E6043712F7BD4833502AF75E2E453A17E32963CBB551D498
+        E08015211E9492B5AE21A926EDA6CFB2B15AF3C5CB31AE37B1FFFDC93CED62C6
+        C4FF6789E7B17E671634D5D6027A2B07B34CAD74C60129D101E2F61B02E41D19
+        90F09F0908E5EA9FBD44B3EB944188D99189E59F5F6F5D10A363D1B31DB14CED
+        43806411201542A036D592EE1880A9E33DF86963D524CCAFD8CB9F6B46F45C67
+        2C7B6E086276E662F9AE0AC388C2CABC0B9C0520E16D00D92B03F2E72CD156D3
+        0D040F69C0A71B1E6E71DE9CFC4A4CFE532AA572BD0C0B010646916F540FBC32
+        D71D7EC344344C3D910FF7BEF67C6150353959A49B1C588ACE0D5508196989B8
+        F5621B3F07305ADE25CCFAB0E866B6DBDC75C601295500B97540C8D94BE203B8
+        E89DBEE400BC06BA61F2832E282EAB87437715A605B9F29466FAD2EF9090CB1C
+        C51A89AF111C416E2D4D6CFFE745010F4BE14844C72EA008316B288DE9188D49
+        329CE5FFBF80F0BD588D18D3F726E223FD79C997F7F57F6711B6BDD4782AC744
+        F8B06E887DC3BB65FF566979355E8F4E43FCA152646C7B9CF49A1B548F7F6B90
+        467AD93721D8D71257ABCAB02562128791E98EF57179D874F0A659AE7BB43543
+        405C7F4380BCAB0748FAAD0242336D00CD9CABFC515A560DF779DF2124D09D52
+        2AC3D2F2F6CFCF202CB6085E2ECED8B7C18784B33D9FC9576F4943DCC619FC9C
+        E9CB329070B199039011339CC6E482C14FED83A6D6C9704C0C90E7F50049D703
+        649F0CC82B22822C79D81E6B5F1CCC01CDC9AB805B5F07EEBC9917AAB0E8DD7C
+        1C2966DA4CCF79591AD7544DE29E748A9D253EF83413515FE4116C3D7904C8D8
+        7C3FBF57AAC9DF72C05894993BB137A68E73A5362BE1FFE241048FB0C1BBAF8F
+        6D01B2B4BC0EDF9FAA44D2D16BA45B6EC2AC35C8657D400ACD1410B6C53DD40D
+        A13307DC91E6B7EF2E1433304B19D866C798A1E434BD11F3713A96FF6F05BC7A
+        5A629C373981C4B48316D93FD5908E0082FD062076E57FF15C9EA7392F274373
+        5542ECE211089DE3CBF3F697365E44DAF92A9CDEF10017B8EE4F1F2247ECCD67
+        60AF9E16D05CD3F2926FCAEAC1081AE50EF59B6D00D92F00591493830D8B8621
+        28C0998F7917E98179EB8E628CA703E2D74D6C71DEA4D4CBF8E0CB32245CD07D
+        AF5D129AC28DC6ACA914691AD3534C5CB3AD257FF3E180ECDA938787EE776BD1
+        25AC38F149C225BAFE525150A8AF42F4026F3C3BDD076E7D5AB7D2A7A657607C
+        78EE9DFD5AF31D328F01FA80F4356340E8014504DB63E6236EE8FC6F37B0E3BA
+        7D4A2ABD97092347DD7DA0145109D53C555AF2B02D89F37B79F4080C3B084D9D
+        9C76E8D6111844749E9753379C8E1FCB4B9EA9270AF0FBD5C7A1A9711029557D
+        251257F962EA8421065D251DBC8469EB2E89D95B6A42CA9A212D0EAFB3B10B0E
+        E2C8653BB166C200499E48F055B554C718642BDF49C3A6E40AE1E86C8F159D17
+        BBD807F3C879C502E90D4C7EED47686EC8D7CD3485B64EDC3BBE9BD886DF121E
+        2957FBB7F4CD804E395E40B0E420FE70B9182787D94254DC1AAFF14D92117306
+        61D2D881F0F67441E0C2348A888EE6B992CE00B9D2250069140F871CC16479F7
+        E71A7344967B5BCBF97B4325B23F1C8DCD3BCF52AEDD207ECF0193D711B8CF59
+        F0593FD8BB0913021CB17C47AE5808B472949D8960AA2F43C493EE78F1193F3E
+        E3669E2FC5AC15C7C59A0813F52CAD0AED4369D5503E0CE6F87FDD7E0A515F13
+        A8D6F2D7876540D8674F9EBB4CFAC71A7FD97A069A9BF4799B5E62BF154FA1A8
+        BFC6ABA41B1AB022C4075FA6562221DB4ADE8F254791D60B163F282A7B75BF81
+        431F3C4093C175EC4ECEC1CEE42268AEAB4494B1EC2E3ECFCBE02AD10F8B24CD
+        B53C65E33FD97D60C29E81AA32BF6A9621207DCC1810BE35BC515E09BEDD7FDF
+        44DE2AAE9245337BF80C46DD42A285892F3FF1758C6A3126E64C5676AD4EC2B7
+        B0D708A01BAF8B599E41C14AB0FCBB27965CB8A3BE82578B781BCC11597F6CC6
+        D66DC264EDD75D918F5B8BF6ADE5CA98CAA65528B3FE587B6C96673F9963F312
+        6CC7E55E345D8797DD0D682A6F8A367975CAD6F45700DA3D0B957CAEF9C1C18C
+        0352A603C4C58C01F9358D45286D534B2A65BA5A2309C7E751C5B2FD79DC911A
+        8423B1F3585B3CBDD1838841C61C9A9DDBF2652A3DC7E7A951BDE88BF761213E
+        6F2ADFE7DBE09BC5E755261C5CDF74A91733DD2461E6A5DB5B310E48B9028862
+        1D9AE9CD9C5DDD0C01715600514C317DE38054288028A698516B0F4881028862
+        8AE9CC63A01E209EA441F2F2154014534C679E1EB6C8D36990A1EE41D05CAA45
+        5393F267A01553CCCA4A05AF4176B85822FE0C74F1C811FEEE37AEDAA3A141DB
+        F962B4628A75616355701B1B0B383855E35456462903847DD5ED437AB9FDD2C6
+        1553AC0B5911BDFEF86F5E02DE15941249770000000049454E44AE426082}
+      ButtonStyle = pbsNoFrame
+      OnClick = pbGenerateClick
+    end
+    object cbFillZero: TCheckBox
+      Left = 974
+      Top = 20
+      Width = 97
+      Height = 17
+      Caption = #23567#25968#34917'0'
       TabOrder = 0
-      OnClick = btnGenerateSignOnlineClick
+    end
+    object pnlPageControl: TPanel
+      Left = 1064
+      Top = 10
+      Width = 224
+      Height = 35
+      BevelOuter = bvNone
+      TabOrder = 1
+      Visible = False
+      object lblPages: TLabel
+        Left = 93
+        Top = 11
+        Width = 40
+        Height = 12
+        Alignment = taCenter
+        AutoSize = False
+        Caption = '1/N'
+      end
+      object btnPre: TButton
+        Left = 14
+        Top = 7
+        Width = 75
+        Height = 21
+        Caption = #19978#19968#39029
+        TabOrder = 0
+        OnClick = btnPreClick
+      end
+      object btnNext: TButton
+        Left = 136
+        Top = 7
+        Width = 75
+        Height = 21
+        Caption = #19979#19968#39029
+        TabOrder = 1
+        OnClick = btnNextClick
+      end
     end
   end
   object msbReportsPreview: TMScrollBox
     Left = 225
     Top = 0
     Width = 1070
-    Height = 603
+    Height = 594
     Align = alClient
     AutoScroll = False
     BevelInner = bvNone

+ 140 - 22
Forms/SignOnlineReportsFrm.pas

@@ -7,8 +7,12 @@ uses
   PrintComTypeDefUnit, ADODB, DB,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, sdIDTree, sdDB, ComCtrls, ExtCtrls, VirtualTrees, PrintCom,
-  PrintComXML, MScrollBox, StdCtrls, Buttons;
+  PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton;
 
+const
+  crNext = -25;
+  crPrevious = -26; 
+  offset = 150;
 type
   TSignOnlineReportsForm = class(TForm)
     tvReports: TTreeView;
@@ -16,7 +20,13 @@ type
     PreviewComXML: TPrintComXML;
     previewBox: TImage;
     msbReportsPreview: TMScrollBox;
-    btnGenerateSignOnline: TButton;
+    lblAlreadyUpload: TLabel;
+    cbFillZero: TCheckBox;
+    pnlPageControl: TPanel;
+    btnPre: TButton;
+    btnNext: TButton;
+    lblPages: TLabel;
+    pbGenerate: TPNGButton;
     procedure FormShow(Sender: TObject);
     procedure tvReportsClick(Sender: TObject);
     procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
@@ -35,7 +45,9 @@ type
       MousePos: TPoint; var Handled: Boolean);
     procedure ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
       MousePos: TPoint; var Handled: Boolean);
-    procedure btnGenerateSignOnlineClick(Sender: TObject);
+    procedure btnPreClick(Sender: TObject);
+    procedure btnNextClick(Sender: TObject);
+    procedure pbGenerateClick(Sender: TObject);
   private
     FProjectData: TProjectData;
     // 数据库管理
@@ -44,6 +56,10 @@ type
     FReportDataPrepare: TReportPrepare;
 
     FPreviewList: TList;
+    FCurPage: Integer;
+
+    procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
+    procedure OnViewMouseDown(Sender: TObject;  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 
     procedure ExportReports(const AFileName: string);
 
@@ -61,6 +77,7 @@ type
 
     procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
     procedure LoadTemplateAndDisplay(ATemplate: TTemplateNode);
+    procedure SetCurPage(const Value: Integer);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
@@ -68,6 +85,7 @@ type
     procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
 
     property ProjectData: TProjectData read FProjectData;
+    property CurPage: Integer read FCurPage write SetCurPage;
   end;
 
 procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
@@ -149,13 +167,13 @@ procedure TSignOnlineReportsForm.FormShow(Sender: TObject);
 var
   vNode: TTreeNode;
 begin
-  tvReports.Selected := tvReports.Items.GetFirstNode;
   vNode := tvReports.Items.GetFirstNode;
   while Assigned(vNode) do
   begin
     vNode.Expand(True);
     vNode := vNode.getNextSibling;
-  end;
+  end;    
+  tvReports.Selected := tvReports.Items[0];
 end;
 
 procedure TSignOnlineReportsForm.tvReportsClick(Sender: TObject);
@@ -165,8 +183,11 @@ begin
   if Assigned(tvReports.Selected) then
   begin
     vTemplate := TTemplateNode(tvReports.Selected.Data);
-    ReportTemplateManager.Current := vTemplate;
-    LoadTemplateAndDisplay(vTemplate);
+    if Assigned(vTemplate) then
+    begin
+      ReportTemplateManager.Current := vTemplate;
+      LoadTemplateAndDisplay(vTemplate);
+    end;
   end;
 end;
 
@@ -178,16 +199,16 @@ procedure TSignOnlineReportsForm.LoadTemplateAndDisplay(ATemplate: TTemplateNode
   begin
     TipMessage(AStr, Handle);
     ClearObjects(FPreviewList);
+    pnlPageControl.Visible := False;
   end;
 
-  procedure PreviewTemplet;
+  procedure ShowAllPages;
   const
     Indent = 5;
   var
     iPage: Integer;
     vPreviewImage: TImage;
   begin
-    try
       ClearObjects(FPreviewList);
       msbReportsPreview.HorzScrollBar.Range := 0;
       msbReportsPreview.HorzScrollBar.Position := 0;
@@ -204,6 +225,37 @@ procedure TSignOnlineReportsForm.LoadTemplateAndDisplay(ATemplate: TTemplateNode
       end;
       msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
       msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight * PreviewComXML.TotalPages + 10 * (PreviewComXML.TotalPages - 1);
+  end;
+
+  procedure ShowCurPages;
+  var
+    vPreviewImage: TImage;
+  begin
+    ClearObjects(FPreviewList);
+    msbReportsPreview.HorzScrollBar.Position := 0;
+    msbReportsPreview.VertScrollBar.Position := 0;
+    vPreviewImage := TImage.Create(msbReportsPreview);
+    vPreviewImage.Parent := msbReportsPreview;
+    vPreviewImage.Top := 0;
+    vPreviewImage.Left := 0;
+    FPreviewList.Add(vPreviewImage);
+    msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
+    msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight;
+
+    vPreviewImage.OnMouseMove := OnViewMouseMove;
+    vPreviewImage.OnMouseDown := OnViewMouseDown;
+
+    CurPage := 1;
+  end;
+
+  procedure PreviewTemplet(AIsShowAllPages: Boolean);
+  begin
+    try
+      if AIsShowAllPages then
+        ShowAllPages
+      else
+        ShowCurPages;
+      pnlPageControl.Visible := not AIsShowAllPages;
       msbReportsPreview.SetFocus;
     except
       WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
@@ -228,7 +280,7 @@ begin
   try
     LoadTemplet(ATemplate, PreviewComXML);
     if PreviewComXML.TotalPages > 0 then
-      PreviewTemplet
+      PreviewTemplet(False)
     else
       LoadEmptyTempletAndDisplay;
   finally
@@ -261,7 +313,7 @@ begin
     APrintCom.ReadReportStream(Mem);
     // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
     // To Do
-    //APrintCom.FillZero := chkFillZero.Checked;
+    APrintCom.FillZero := cbFillZero.Checked;
     InitPageSettings(APrintCom);
     APrintCom.ReadDBData;
     APrintCom.AnalyseData(PreviewBox.Canvas);
@@ -760,8 +812,9 @@ begin
   InitPageSettings(APrintCom);
   InitPaperSettings(ATemplate, APrintCom);
 
-  {APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
-  APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;}
+  APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
+  APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;
+
   if FProjectData.ProjProperties.ReportShowState then
   begin
     if FProjectData.ProjProperties.ReportShowStateWithoutReply and (FProjectData.ProjProperties.AuditStatus = -1) then
@@ -856,20 +909,33 @@ end;
 procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
   APageIndex: Integer);
 begin
-  AImage.Height := PreviewComXML.PrintHeight ;
-  AImage.Picture.Bitmap.Height := PreviewComXML.PrintHeight;
-  AImage.Width := PreviewComXML.PrintWidth;
-  AImage.Picture.Bitmap.Width := PreviewComXML.PrintWidth;
-  PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
+  if Assigned(AImage) then
+  begin
+    AImage.Height := PreviewComXML.PrintHeight ;
+    AImage.Picture.Bitmap.Height := PreviewComXML.PrintHeight;
+    AImage.Width := PreviewComXML.PrintWidth;
+    AImage.Picture.Bitmap.Width := PreviewComXML.PrintWidth;
+    PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
+  end;
 end;
 
 constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
+
+  procedure LoadCursor(AIndex: Integer; const AFileName: string);
+  var
+    rst: Integer;
+  begin
+    rst := LoadCursorFromFile(PChar(AFileName));
+    if rst <> 0 then
+      Screen.Cursors[AIndex] := rst;
+  end;
+
 begin
   inherited;
   FPreviewList := TList.Create;
 
-  msbReportsPreview.OnMouseWheelDown := msbReportsPreviewMouseWheelDown;
-  msbReportsPreview.OnMouseWheelUp := msbReportsPreviewMouseWheelUp;
+  LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
+  LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
 end;
 
 procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
@@ -927,8 +993,30 @@ begin
   ZipFolder(ATempFolder, AFileName);
 end;
 
-procedure TSignOnlineReportsForm.btnGenerateSignOnlineClick(
-  Sender: TObject);
+procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
+begin
+  if CurPage > 1 then
+    CurPage := CurPage - 1
+  else
+    WarningMessage('已经是最前了');
+end;
+
+procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
+begin
+  if CurPage < PreviewComXML.TotalPages then
+    CurPage := CurPage + 1
+  else
+    WarningMessage('已经是最后了');
+end;
+
+procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
+begin
+  FCurPage := Value;
+  PreviewPage(TImage(FPreviewList.Items[0]), FCurPage); 
+  lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
+end;
+
+procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
 var
   sFileName: string;
 begin
@@ -938,4 +1026,34 @@ begin
   end;
 end;
 
+procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if (X < offset) and (CurPage > 1) then
+  begin
+    TControl(Sender).Cursor := crPrevious;
+  end
+  else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
+  begin
+    TControl(Sender).Cursor := crNext;
+  end
+  else
+  begin
+    TControl(Sender).Cursor := crDefault;
+  end;
+end;
+
+procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
+   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if (X < offset) and (CurPage > 1) then
+  begin
+    CurPage := CurPage - 1;
+  end
+  else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
+  begin
+    CurPage := CurPage + 1;
+  end;
+end;
+
 end.

+ 2 - 0
TenderPartition/tpBaseGatherData.pas

@@ -70,6 +70,7 @@ begin
     Result.Name := ANode.Rec.Name.AsString;
     Result.Units := ANode.Rec.Units.AsString;
     Result.Price := ANode.Rec.Price.AsFloat;
+    Result.DrawingCode := ANode.Rec.DrawingCode.AsString;
   end;
 
   Result.Quantity := Result.Quantity + ANode.Rec.Quantity.AsFloat;
@@ -194,6 +195,7 @@ begin
   Result.TotalPrice := AOrgNode.TotalPrice;
   Result.DgnQuantity1 := AOrgNode.DgnQuantity1;
   Result.DgnQuantity2 := AOrgNode.DgnQuantity2;
+  Result.DrawingCode := AOrgNode.DrawingCode;
 end;
 
 procedure TtpBaseGatherData.FilterNoPegTree;

+ 4 - 0
TenderPartition/tpGatherTree.pas

@@ -23,6 +23,7 @@ type
 
     FRelaPeg: Boolean;
     FParted: Boolean;
+    FDrawingCode: string;
   public
     property Code: string read FCode write FCode;
     property B_Code: string read FB_Code write FB_Code;
@@ -38,6 +39,8 @@ type
     // 节点为桩号/节点的父项为桩号/节点的子项全为桩号
     property RelaPeg: Boolean read FRelaPeg write FRelaPeg;
     property Parted: Boolean read FParted write FParted;
+
+    property DrawingCode: string read FDrawingCode write FDrawingCode;
   end;
 
   TtpGatherTree = class(TCacheTree)
@@ -291,6 +294,7 @@ begin
       Rec.ValueByName('TotalPrice').AsFloat := vNode.TotalPrice;
       Rec.ValueByName('DgnQuantity1').AsFloat := vNode.DgnQuantity1;
       Rec.ValueByName('DgnQuantity2').AsFloat := vNode.DgnQuantity2;
+      Rec.ValueByName('DrawingCode').AsString := vNode.DrawingCode;
     end;
   finally
     AfterWrite;

+ 32 - 15
TenderPartition/tpMainFrm.dfm

@@ -18,7 +18,7 @@ object tpMainForm: TtpMainForm
   TextHeight = 13
   object jtsMainDatas: TJimTabSet
     Left = 0
-    Top = 26
+    Top = 27
     Width = 1096
     Height = 21
     Align = alTop
@@ -44,9 +44,9 @@ object tpMainForm: TtpMainForm
   end
   object jpsMain: TJimPages
     Left = 0
-    Top = 47
+    Top = 48
     Width = 1096
-    Height = 594
+    Height = 596
     ActivePage = jpsMainBaseTender
     ActivePageIndex = 0
     Align = alClient
@@ -55,12 +55,12 @@ object tpMainForm: TtpMainForm
       Left = 0
       Top = 0
       Width = 1096
-      Height = 594
+      Height = 596
       TabName = 'BaseTender'
       Caption = 'BaseTender'
       object labGatherResult: TJimGradLabel
         Left = 0
-        Top = 574
+        Top = 576
         Width = 1096
         Height = 20
         Align = alBottom
@@ -79,13 +79,13 @@ object tpMainForm: TtpMainForm
       object sprNoPegData: TSplitter
         Left = 390
         Top = 0
-        Height = 574
+        Height = 576
       end
       object pnlNoPegData: TPanel
         Left = 393
         Top = 0
         Width = 703
-        Height = 574
+        Height = 576
         Align = alClient
         BevelOuter = bvNone
         TabOrder = 0
@@ -111,10 +111,10 @@ object tpMainForm: TtpMainForm
           Left = 0
           Top = 20
           Width = 703
-          Height = 554
+          Height = 556
           Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection, goShowTreeLine]
           OptionsEx = []
-          ColCount = 8
+          ColCount = 9
           ShowGridLine = False
           DefaultColWidth = 73
           DefaultFixedColWidth = 25
@@ -129,7 +129,7 @@ object tpMainForm: TtpMainForm
         Left = 0
         Top = 0
         Width = 390
-        Height = 574
+        Height = 576
         Align = alLeft
         BevelOuter = bvNone
         TabOrder = 1
@@ -155,7 +155,7 @@ object tpMainForm: TtpMainForm
           Left = 0
           Top = 20
           Width = 401
-          Height = 554
+          Height = 556
           Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
           OptionsEx = []
           ColCount = 4
@@ -174,7 +174,7 @@ object tpMainForm: TtpMainForm
       Left = 0
       Top = 0
       Width = 1096
-      Height = 594
+      Height = 596
       TabName = 'Trial'
       Caption = 'Result'
     end
@@ -182,7 +182,7 @@ object tpMainForm: TtpMainForm
       Left = 0
       Top = 0
       Width = 1096
-      Height = 594
+      Height = 596
       TabName = 'Part'
       Caption = 'Part'
     end
@@ -191,7 +191,7 @@ object tpMainForm: TtpMainForm
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -12
-    Font.Name = #23435#20307
+    Font.Name = 'Microsoft YaHei UI'
     Font.Style = []
     Bars = <
       item
@@ -263,7 +263,7 @@ object tpMainForm: TtpMainForm
     DockControlHeights = (
       0
       0
-      26
+      27
       0)
     object dxsiPart: TdxBarSubItem
       Caption = #26631#27573#21010#20998
@@ -502,6 +502,23 @@ object tpMainForm: TtpMainForm
         FieldName = 'TotalPrice'
         Width = 60
         ReadOnly = True
+      end
+      item
+        Title.Caption = #22270#21495
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'DrawingCode'
+        ReadOnly = False
       end>
     Grid = zgNoPeg
     ExtendRowCount = 0

+ 43 - 29
TenderPartition/tpNoPegDm.dfm

@@ -16,35 +16,46 @@ object tpNoPegData: TtpNoPegData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65080001044E616D650608506172656E744944094669656C644E61
-      6D650608506172656E7449440844617461547970650203084461746153697A65
-      02040549734B6579080F4E65656450726F636573734E616D65080001044E616D
-      65060D4E6578745369626C696E674944094669656C644E616D65060D4E657874
-      5369626C696E6749440844617461547970650203084461746153697A65020405
-      49734B6579080F4E65656450726F636573734E616D65080001044E616D650604
-      436F6465094669656C644E616D650604436F6465084461746154797065020108
-      4461746153697A6502320549734B6579080F4E65656450726F636573734E616D
-      65080001044E616D650606425F436F6465094669656C644E616D650606425F43
-      6F64650844617461547970650201084461746153697A6502320549734B657908
-      0F4E65656450726F636573734E616D65080001044E616D6506044E616D650946
-      69656C644E616D6506044E616D65084461746154797065021808446174615369
-      7A6503C8000549734B6579080F4E65656450726F636573734E616D6508000104
-      4E616D650605556E697473094669656C644E616D650605556E69747308446174
-      61547970650218084461746153697A6502140549734B6579080F4E6565645072
-      6F636573734E616D65080001044E616D6506055072696365094669656C644E61
-      6D65060550726963650844617461547970650206084461746153697A65020805
-      49734B6579080F4E65656450726F636573734E616D65080001044E616D650608
-      5175616E74697479094669656C644E616D6506085175616E7469747908446174
-      61547970650206084461746153697A6502080549734B6579080F4E6565645072
-      6F636573734E616D65080001044E616D65060A546F74616C5072696365094669
-      656C644E616D65060A546F74616C507269636508446174615479706502060844
-      61746153697A6502080549734B6579080F4E65656450726F636573734E616D65
-      080001044E616D65060C44676E5175616E7469747931094669656C644E616D65
-      060C44676E5175616E7469747931084461746154797065020608446174615369
-      7A6502080549734B6579080F4E65656450726F636573734E616D65080001044E
-      616D65060C44676E5175616E7469747932094669656C644E616D65060C44676E
-      5175616E74697479320844617461547970650206084461746153697A65020805
-      49734B6579080F4E65656450726F636573734E616D65080000}
+      73734E616D650809507265636973696F6E02000453697A6502000001044E616D
+      650608506172656E744944094669656C644E616D650608506172656E74494408
+      44617461547970650203084461746153697A6502040549734B6579080F4E6565
+      6450726F636573734E616D650809507265636973696F6E02000453697A650200
+      0001044E616D65060D4E6578745369626C696E674944094669656C644E616D65
+      060D4E6578745369626C696E6749440844617461547970650203084461746153
+      697A6502040549734B6579080F4E65656450726F636573734E616D6508095072
+      65636973696F6E02000453697A6502000001044E616D650604436F6465094669
+      656C644E616D650604436F64650844617461547970650201084461746153697A
+      6502320549734B6579080F4E65656450726F636573734E616D65080950726563
+      6973696F6E02000453697A6502000001044E616D650606425F436F6465094669
+      656C644E616D650606425F436F64650844617461547970650201084461746153
+      697A6502320549734B6579080F4E65656450726F636573734E616D6508095072
+      65636973696F6E02000453697A6502000001044E616D6506044E616D65094669
+      656C644E616D6506044E616D650844617461547970650218084461746153697A
+      6503C8000549734B6579080F4E65656450726F636573734E616D650809507265
+      636973696F6E02000453697A6502000001044E616D650605556E697473094669
+      656C644E616D650605556E697473084461746154797065021808446174615369
+      7A6502140549734B6579080F4E65656450726F636573734E616D650809507265
+      636973696F6E02000453697A6502000001044E616D6506055072696365094669
+      656C644E616D6506055072696365084461746154797065020608446174615369
+      7A6502080549734B6579080F4E65656450726F636573734E616D650809507265
+      636973696F6E02000453697A6502000001044E616D6506085175616E74697479
+      094669656C644E616D6506085175616E74697479084461746154797065020608
+      4461746153697A6502080549734B6579080F4E65656450726F636573734E616D
+      650809507265636973696F6E02000453697A6502000001044E616D65060A546F
+      74616C5072696365094669656C644E616D65060A546F74616C50726963650844
+      617461547970650206084461746153697A6502080549734B6579080F4E656564
+      50726F636573734E616D650809507265636973696F6E02000453697A65020000
+      01044E616D65060C44676E5175616E7469747931094669656C644E616D65060C
+      44676E5175616E74697479310844617461547970650206084461746153697A65
+      02080549734B6579080F4E65656450726F636573734E616D6508095072656369
+      73696F6E02000453697A6502000001044E616D65060C44676E5175616E746974
+      7932094669656C644E616D65060C44676E5175616E7469747932084461746154
+      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
+      6573734E616D650809507265636973696F6E02000453697A6502000001044E61
+      6D65060B44726177696E67436F6465094669656C644E616D65060B4472617769
+      6E67436F64650844617461547970650218084461746153697A6503FF00054973
+      4B6579080F4E65656450726F636573734E616D650809507265636973696F6E02
+      000453697A6502000000}
   end
   object sdvNoPegBills: TsdDataView
     Active = True
@@ -86,6 +97,9 @@ object tpNoPegData: TtpNoPegData
       end
       item
         FieldName = 'NextSiblingID'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
     OnGetText = sdvNoPegBillsGetText
     Left = 64

+ 22 - 0
TenderPartition/tpPartTenderSetFme.dfm

@@ -50,6 +50,7 @@ object tpPartTenderSetFrame: TtpPartTenderSetFrame
       FrozenCol = 0
       FrozenRow = 0
       OnCurrentChanged = zgPartTendersInfoCurrentChanged
+      OnMouseDown = zgPartTendersInfoMouseDown
       Font.Charset = ANSI_CHARSET
       Font.Color = clWindowText
       Font.Height = -12
@@ -68,4 +69,25 @@ object tpPartTenderSetFrame: TtpPartTenderSetFrame
     BevelOuter = bvNone
     TabOrder = 1
   end
+  object dxpmPartTenders: TdxBarPopupMenu
+    BarManager = MainForm.dxBarManager
+    ItemLinks = <
+      item
+        Item = MainForm.dxbtnExportTpExcel
+        Visible = True
+      end>
+    UseOwnFont = False
+    OnPopup = dxpmPartTendersPopup
+    Left = 120
+    Top = 184
+  end
+  object alPartTenders: TActionList
+    Left = 184
+    Top = 184
+    object actnExportTpExcel: TAction
+      Caption = #23548#20986'Excel'
+      OnExecute = actnExportTpExcelExecute
+      OnUpdate = actnExportTpExcelUpdate
+    end
+  end
 end

+ 86 - 2
TenderPartition/tpPartTenderSetFme.pas

@@ -5,7 +5,8 @@ interface
 uses
   tpPartTenderSet, tpPartTenderFme,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
-  Dialogs, sdGridDBA, StdCtrls, JimLabels, ZJGrid, ExtCtrls;
+  Dialogs, sdGridDBA, StdCtrls, JimLabels, ZJGrid, ExtCtrls, ActnList,
+  dxBar;
 
 type
   TtpPartTenderSetFrame = class(TFrame)
@@ -14,13 +15,24 @@ type
     labGatherTenders: TJimGradLabel;
     pnlCurPartTender: TPanel;
     sprTenderData: TSplitter;
+    dxpmPartTenders: TdxBarPopupMenu;
+    alPartTenders: TActionList;
+    actnExportTpExcel: TAction;
     procedure zgPartTendersInfoCurrentChanged(Sender: TObject; Col,
       Row: Integer);
+    procedure dxpmPartTendersPopup(Sender: TObject);
+    procedure actnExportTpExcelExecute(Sender: TObject);
+    procedure zgPartTendersInfoMouseDown(Sender: TObject;
+      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+    procedure actnExportTpExcelUpdate(Sender: TObject);
   private
     FPartTenderSetData: TtpPartTenderSet;
     FCurPartTenderFrame: TtpPartTenderFrame;
 
     procedure AssignTenderInfo;
+
+    procedure ExportPegGclExcel;
+    procedure ExportGclPegExcel;
   public
     constructor Create(APartTenderSetData: TtpPartTenderSet);
     destructor Destroy; override;
@@ -31,7 +43,7 @@ type
 implementation
 
 uses
-  UtilMethods, tpPartTender;
+  UtilMethods, tpPartTender, MainFrm, ExportExcel;
 
 {$R *.dfm}
 
@@ -84,4 +96,76 @@ begin
   FCurPartTenderFrame.PartTenderData := FPartTenderSetData.PartTender[iTender];
 end;
 
+procedure TtpPartTenderSetFrame.dxpmPartTendersPopup(Sender: TObject);
+begin
+  SetDxBtnAction(actnExportTpExcel, MainForm.dxbtnExportTpExcel);
+end;
+
+procedure TtpPartTenderSetFrame.actnExportTpExcelExecute(Sender: TObject);
+begin
+  if (FCurPartTenderFrame.tobtnInPegs.Down) then
+    ExportPegGclExcel
+  else if (FCurPartTenderFrame.tobtnInGcls.Down) then
+    ExportGclPegExcel;
+end;
+
+procedure TtpPartTenderSetFrame.ExportGclPegExcel;
+var
+  sFileName: string;
+  Exportor: TMasterExcelExportor;
+begin
+  if SaveFile(sFileName, '.xls') then
+  begin
+    Exportor := TMasterExcelExportor.Create;
+    try
+      Exportor.DefineCol(@ciTpGclPeg_Gcl, Length(ciTpGclPeg_Gcl), @ciTpGclPeg_Peg);
+      with FCurPartTenderFrame.PartTenderData.InGclGatherData do
+      begin
+        Exportor.DefineMasterDataSet(sddGclGather, 'ID');
+        Exportor.DefineRelaDataSet(sddGclRela, 'GclID');
+      end;
+      Exportor.ExportToFile(sFileName);
+    finally
+      Exportor.Free;
+    end;
+  end;
+end;
+
+procedure TtpPartTenderSetFrame.ExportPegGclExcel;
+var
+  sFileName: string;
+  Exportor: TMasterExcelExportor;
+begin
+  if SaveFile(sFileName, '.xls') then
+  begin
+    Exportor := TMasterExcelExportor.Create;
+    try
+      Exportor.DefineCol(@ciTpPegGcl, Length(ciTpPegGcl));
+      with FCurPartTenderFrame.PartTenderData.InPegData do
+      begin
+        Exportor.DefineMasterDataSet(sddPeg, 'ID');
+        Exportor.DefineRelaDataSet(sddGclBills, 'PegID');
+      end;
+      Exportor.ExportToFile(sFileName);
+    finally
+      Exportor.Free;
+    end;
+  end;
+end;
+
+procedure TtpPartTenderSetFrame.zgPartTendersInfoMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if (Button = mbRight) and (FPartTenderSetData.TenderCount > 0) then
+    dxpmPartTenders.PopupFromCursorPos;
+end;
+
+procedure TtpPartTenderSetFrame.actnExportTpExcelUpdate(Sender: TObject);
+begin
+  if (FCurPartTenderFrame.tobtnInPegs.Down) then
+    TAction(Sender).Caption := '导出Excel(范围内桩号)'
+  else if (FCurPartTenderFrame.tobtnInGcls.Down) then
+    TAction(Sender).Caption := '导出Excel(范围内清单)';
+end;
+
 end.

+ 57 - 38
TenderPartition/tpPegGclGatherDm.dfm

@@ -16,24 +16,29 @@ object tpPegGclGatherData: TtpPegGclGatherData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65080001044E616D650609496E646578436F6465094669656C644E
-      616D650609496E646578436F6465084461746154797065021808446174615369
-      7A6502320549734B6579080F4E65656450726F636573734E616D65080001044E
-      616D650606425F436F6465094669656C644E616D650606425F436F6465084461
-      7461547970650201084461746153697A6502320549734B6579080F4E65656450
-      726F636573734E616D65080001044E616D6506044E616D65094669656C644E61
-      6D6506044E616D650844617461547970650218084461746153697A6503C80005
-      49734B6579080F4E65656450726F636573734E616D65080001044E616D650605
-      556E697473094669656C644E616D650605556E69747308446174615479706502
-      18084461746153697A6502140549734B6579080F4E65656450726F636573734E
-      616D65080001044E616D6506055072696365094669656C644E616D6506055072
-      6963650844617461547970650206084461746153697A6502080549734B657908
-      0F4E65656450726F636573734E616D65080001044E616D6506085175616E7469
-      7479094669656C644E616D6506085175616E7469747908446174615479706502
-      06084461746153697A6502080549734B6579080F4E65656450726F636573734E
-      616D65080001044E616D65060A546F74616C5072696365094669656C644E616D
-      65060A546F74616C50726963650844617461547970650206084461746153697A
-      6502080549734B6579080F4E65656450726F636573734E616D65080000}
+      73734E616D650809507265636973696F6E02000453697A6502000001044E616D
+      650609496E646578436F6465094669656C644E616D650609496E646578436F64
+      650844617461547970650218084461746153697A6502320549734B6579080F4E
+      65656450726F636573734E616D650809507265636973696F6E02000453697A65
+      02000001044E616D650606425F436F6465094669656C644E616D650606425F43
+      6F64650844617461547970650201084461746153697A6502320549734B657908
+      0F4E65656450726F636573734E616D650809507265636973696F6E0200045369
+      7A6502000001044E616D6506044E616D65094669656C644E616D6506044E616D
+      650844617461547970650218084461746153697A6503C8000549734B6579080F
+      4E65656450726F636573734E616D650809507265636973696F6E02000453697A
+      6502000001044E616D650605556E697473094669656C644E616D650605556E69
+      74730844617461547970650218084461746153697A6502140549734B6579080F
+      4E65656450726F636573734E616D650809507265636973696F6E02000453697A
+      6502000001044E616D6506055072696365094669656C644E616D650605507269
+      63650844617461547970650206084461746153697A6502080549734B6579080F
+      4E65656450726F636573734E616D650809507265636973696F6E02000453697A
+      6502000001044E616D6506085175616E74697479094669656C644E616D650608
+      5175616E746974790844617461547970650206084461746153697A6502080549
+      734B6579080F4E65656450726F636573734E616D650809507265636973696F6E
+      02000453697A6502000001044E616D65060A546F74616C507269636509466965
+      6C644E616D65060A546F74616C50726963650844617461547970650206084461
+      746153697A6502080549734B6579080F4E65656450726F636573734E616D6508
+      09507265636973696F6E02000453697A6502000000}
   end
   object sdvGclGather: TsdDataView
     Active = True
@@ -77,26 +82,37 @@ object tpPegGclGatherData: TtpPegGclGatherData
     FieldListData = {
       0101044E616D65060B44657461696C47636C4944094669656C644E616D65060B
       44657461696C47636C49440844617461547970650203084461746153697A6502
-      040549734B6579080F4E65656450726F636573734E616D65080001044E616D65
-      060547636C4944094669656C644E616D65060547636C49440844617461547970
-      650203084461746153697A6502040549734B6579080F4E65656450726F636573
-      734E616D65080001044E616D650608506567586D6A4944094669656C644E616D
-      650608506567586D6A49440844617461547970650203084461746153697A6502
-      040549734B6579080F4E65656450726F636573734E616D65080001044E616D65
-      060A506567586D6A436F6465094669656C644E616D65060A506567586D6A436F
-      64650844617461547970650201084461746153697A6502320549734B6579080F
-      4E65656450726F636573734E616D65080001044E616D65060A506567586D6A4E
-      616D65094669656C644E616D65060A506567586D6A4E616D6508446174615479
-      70650218084461746153697A6503C8000549734B6579080F4E65656450726F63
-      6573734E616D65080001044E616D65060B506567586D6A556E69747309466965
-      6C644E616D65060B506567586D6A556E69747308446174615479706502180844
-      61746153697A6502140549734B6579080F4E65656450726F636573734E616D65
-      080001044E616D6506085175616E74697479094669656C644E616D6506085175
-      616E746974790844617461547970650206084461746153697A6502080549734B
-      6579080F4E65656450726F636573734E616D65080001044E616D65060A546F74
-      616C5072696365094669656C644E616D65060A546F74616C5072696365084461
-      7461547970650206084461746153697A6502080549734B6579080F4E65656450
-      726F636573734E616D65080000}
+      040549734B6579080F4E65656450726F636573734E616D650809507265636973
+      696F6E02000453697A6502000001044E616D65060547636C4944094669656C64
+      4E616D65060547636C49440844617461547970650203084461746153697A6502
+      040549734B6579080F4E65656450726F636573734E616D650809507265636973
+      696F6E02000453697A6502000001044E616D650608506567586D6A4944094669
+      656C644E616D650608506567586D6A4944084461746154797065020308446174
+      6153697A6502040549734B6579080F4E65656450726F636573734E616D650809
+      507265636973696F6E02000453697A6502000001044E616D65060A506567586D
+      6A436F6465094669656C644E616D65060A506567586D6A436F64650844617461
+      547970650201084461746153697A6502320549734B6579080F4E65656450726F
+      636573734E616D650809507265636973696F6E02000453697A6502000001044E
+      616D65060A506567586D6A4E616D65094669656C644E616D65060A506567586D
+      6A4E616D650844617461547970650218084461746153697A6503C8000549734B
+      6579080F4E65656450726F636573734E616D650809507265636973696F6E0200
+      0453697A6502000001044E616D65060B506567586D6A556E697473094669656C
+      644E616D65060B506567586D6A556E6974730844617461547970650218084461
+      746153697A6502140549734B6579080F4E65656450726F636573734E616D6508
+      09507265636973696F6E02000453697A6502000001044E616D6506085175616E
+      74697479094669656C644E616D6506085175616E746974790844617461547970
+      650206084461746153697A6502080549734B6579080F4E65656450726F636573
+      734E616D650809507265636973696F6E02000453697A6502000001044E616D65
+      060A546F74616C5072696365094669656C644E616D65060A546F74616C507269
+      63650844617461547970650206084461746153697A6502080549734B6579080F
+      4E65656450726F636573734E616D650809507265636973696F6E02000453697A
+      6502000001044E616D6506044E616D65094669656C644E616D6506044E616D65
+      0844617461547970650218084461746153697A6503FF000549734B6579080F4E
+      65656450726F636573734E616D650809507265636973696F6E02000453697A65
+      02000001044E616D65060B44726177696E67436F6465094669656C644E616D65
+      060B44726177696E67436F64650844617461547970650218084461746153697A
+      6503FF000549734B6579080F4E65656450726F636573734E616D650809507265
+      636973696F6E02000453697A6502000000}
   end
   object sdvGclRela: TsdDataView
     Active = True
@@ -123,6 +139,9 @@ object tpPegGclGatherData: TtpPegGclGatherData
       end
       item
         FieldName = 'TotalPrice'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
     OnFilterRecord = sdvGclRelaFilterRecord
     Left = 152

+ 1 - 0
TenderPartition/tpPegGclGatherDm.pas

@@ -75,6 +75,7 @@ procedure TtpPegGclGatherData.LoadGclGatherData(AGcls: TtpGatherGclList);
       Rec.ValueByName('PegXmjUnits').AsString := vRela.RelaPegXmj.Units;
       Rec.ValueByName('Quantity').AsFloat := vRela.RelaGcl.Quantity;
       Rec.ValueByName('TotalPrice').AsFloat := vRela.RelaPegXmj.TotalPrice;
+      Rec.ValueByName('DrawingCode').AsString := vRela.RelaPegXmj.DrawingCode;
     end;
   end;
 

+ 18 - 1
TenderPartition/tpPegGclGatherFme.dfm

@@ -36,7 +36,7 @@ object tpPegGclGatherFrame: TtpPegGclGatherFrame
     Height = 200
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     OptionsEx = []
-    ColCount = 6
+    ColCount = 7
     ShowGridLine = False
     DefaultColWidth = 73
     DefaultFixedColWidth = 25
@@ -252,6 +252,23 @@ object tpPegGclGatherFrame: TtpPegGclGatherFrame
         FieldName = 'TotalPrice'
         Width = 80
         ReadOnly = True
+      end
+      item
+        Title.Caption = #22270#21495
+        Title.CaptionAcrossCols = '1'
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'DrawingCode'
+        ReadOnly = False
       end>
     Grid = zgGclRela
     ExtendRowCount = 0

+ 58 - 38
TenderPartition/tpPeg_GclDm.dfm

@@ -16,27 +16,39 @@ object tpPeg_GclData: TtpPeg_GclData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65080001044E616D650604436F6465094669656C644E616D650604
-      436F64650844617461547970650201084461746153697A6502320549734B6579
-      080F4E65656450726F636573734E616D65080001044E616D6506044E616D6509
-      4669656C644E616D6506044E616D650844617461547970650218084461746153
-      697A6503C8000549734B6579080F4E65656450726F636573734E616D65080001
-      044E616D650605556E697473094669656C644E616D650605556E697473084461
-      7461547970650218084461746153697A6502140549734B6579080F4E65656450
-      726F636573734E616D65080001044E616D65060A546F74616C50726963650946
-      69656C644E616D65060A546F74616C5072696365084461746154797065020608
-      4461746153697A6502080549734B6579080F4E65656450726F636573734E616D
-      65080001044E616D650608426567696E506567094669656C644E616D65060842
-      6567696E5065670844617461547970650201084461746153697A650232054973
-      4B6579080F4E65656450726F636573734E616D65080001044E616D65060B4265
-      67696E5065674E756D094669656C644E616D65060B426567696E5065674E756D
+      73734E616D650809507265636973696F6E02000453697A6502000001044E616D
+      650604436F6465094669656C644E616D650604436F6465084461746154797065
+      0201084461746153697A6502320549734B6579080F4E65656450726F63657373
+      4E616D650809507265636973696F6E02000453697A6502000001044E616D6506
+      044E616D65094669656C644E616D6506044E616D650844617461547970650218
+      084461746153697A6503C8000549734B6579080F4E65656450726F636573734E
+      616D650809507265636973696F6E02000453697A6502000001044E616D650605
+      556E697473094669656C644E616D650605556E69747308446174615479706502
+      18084461746153697A6502140549734B6579080F4E65656450726F636573734E
+      616D650809507265636973696F6E02000453697A6502000001044E616D65060A
+      546F74616C5072696365094669656C644E616D65060A546F74616C5072696365
       0844617461547970650206084461746153697A6502080549734B6579080F4E65
-      656450726F636573734E616D65080001044E616D650606456E64506567094669
-      656C644E616D650606456E645065670844617461547970650201084461746153
-      697A6502320549734B6579080F4E65656450726F636573734E616D6508000104
-      4E616D650609456E645065674E756D094669656C644E616D650609456E645065
-      674E756D0844617461547970650206084461746153697A6502080549734B6579
-      080F4E65656450726F636573734E616D65080000}
+      656450726F636573734E616D650809507265636973696F6E02000453697A6502
+      000001044E616D650608426567696E506567094669656C644E616D6506084265
+      67696E5065670844617461547970650201084461746153697A6502320549734B
+      6579080F4E65656450726F636573734E616D650809507265636973696F6E0200
+      0453697A6502000001044E616D65060B426567696E5065674E756D094669656C
+      644E616D65060B426567696E5065674E756D0844617461547970650206084461
+      746153697A6502080549734B6579080F4E65656450726F636573734E616D6508
+      09507265636973696F6E02000453697A6502000001044E616D650606456E6450
+      6567094669656C644E616D650606456E64506567084461746154797065020108
+      4461746153697A6502320549734B6579080F4E65656450726F636573734E616D
+      650809507265636973696F6E02000453697A6502000001044E616D650609456E
+      645065674E756D094669656C644E616D650609456E645065674E756D08446174
+      61547970650206084461746153697A6502080549734B6579080F4E6565645072
+      6F636573734E616D650809507265636973696F6E02000453697A650200000104
+      4E616D65060B44726177696E67436F6465094669656C644E616D65060B447261
+      77696E67436F64650844617461547970650218084461746153697A6503FF0005
+      49734B6579080F4E65656450726F636573734E616D650809507265636973696F
+      6E02000453697A6502000001044E616D650603506567094669656C644E616D65
+      06035065670844617461547970650218084461746153697A6503FF000549734B
+      6579080F4E65656450726F636573734E616D650809507265636973696F6E0200
+      0453697A6502000000}
   end
   object sdvPeg: TsdDataView
     Active = True
@@ -66,6 +78,9 @@ object tpPeg_GclData: TtpPeg_GclData
       end
       item
         FieldName = 'EndPegNum'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
     OnCurrentChanged = sdvPegCurrentChanged
     Left = 56
@@ -83,24 +98,29 @@ object tpPeg_GclData: TtpPeg_GclData
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
-      73734E616D65080001044E616D6506055065674944094669656C644E616D6506
-      0550656749440844617461547970650203084461746153697A6502040549734B
-      6579080F4E65656450726F636573734E616D65080001044E616D650606425F43
-      6F6465094669656C644E616D650606425F436F64650844617461547970650201
-      084461746153697A6502320549734B6579080F4E65656450726F636573734E61
-      6D65080001044E616D6506044E616D65094669656C644E616D6506044E616D65
-      0844617461547970650218084461746153697A6503C8000549734B6579080F4E
-      65656450726F636573734E616D65080001044E616D650605556E697473094669
-      656C644E616D650605556E697473084461746154797065020108446174615369
-      7A6502140549734B6579080F4E65656450726F636573734E616D65080001044E
-      616D6506055072696365094669656C644E616D65060550726963650844617461
-      547970650206084461746153697A6502080549734B6579080F4E65656450726F
-      636573734E616D65080001044E616D6506085175616E74697479094669656C64
-      4E616D6506085175616E74697479084461746154797065020608446174615369
-      7A6502080549734B6579080F4E65656450726F636573734E616D65080001044E
-      616D65060A546F74616C5072696365094669656C644E616D65060A546F74616C
-      50726963650844617461547970650206084461746153697A6502080549734B65
-      79080F4E65656450726F636573734E616D65080000}
+      73734E616D650809507265636973696F6E02000453697A6502000001044E616D
+      6506055065674944094669656C644E616D650605506567494408446174615479
+      70650203084461746153697A6502040549734B6579080F4E65656450726F6365
+      73734E616D650809507265636973696F6E02000453697A6502000001044E616D
+      650606425F436F6465094669656C644E616D650606425F436F64650844617461
+      547970650201084461746153697A6502320549734B6579080F4E65656450726F
+      636573734E616D650809507265636973696F6E02000453697A6502000001044E
+      616D6506044E616D65094669656C644E616D6506044E616D6508446174615479
+      70650218084461746153697A6503C8000549734B6579080F4E65656450726F63
+      6573734E616D650809507265636973696F6E02000453697A6502000001044E61
+      6D650605556E697473094669656C644E616D650605556E697473084461746154
+      7970650201084461746153697A6502140549734B6579080F4E65656450726F63
+      6573734E616D650809507265636973696F6E02000453697A6502000001044E61
+      6D6506055072696365094669656C644E616D6506055072696365084461746154
+      7970650206084461746153697A6502080549734B6579080F4E65656450726F63
+      6573734E616D650809507265636973696F6E02000453697A6502000001044E61
+      6D6506085175616E74697479094669656C644E616D6506085175616E74697479
+      0844617461547970650206084461746153697A6502080549734B6579080F4E65
+      656450726F636573734E616D650809507265636973696F6E02000453697A6502
+      000001044E616D65060A546F74616C5072696365094669656C644E616D65060A
+      546F74616C50726963650844617461547970650206084461746153697A650208
+      0549734B6579080F4E65656450726F636573734E616D65080950726563697369
+      6F6E02000453697A6502000000}
   end
   object sdvGclBills: TsdDataView
     Active = True

+ 4 - 0
TenderPartition/tpPeg_GclDm.pas

@@ -95,6 +95,10 @@ procedure TtpPeg_GclData.LoadData(APegs: TList);
     Rec.ValueByName('BeginPegNum').AsFloat := APeg.BeginPegNum;
     Rec.ValueByName('EndPeg').AsString := APeg.EndPeg;
     Rec.ValueByName('EndPegNum').AsFloat := APeg.EndPegNum;
+
+    Rec.ValueByName('Peg').AsString := APeg.Peg;
+
+    Rec.ValueByName('DrawingCode').AsString := APeg.RelaNode.DrawingCode;
     LoadGclBills(APeg);
   end;
 

+ 19 - 1
TenderPartition/tpPeg_GclFme.dfm

@@ -36,7 +36,7 @@ object tpPeg_GclFrame: TtpPeg_GclFrame
     Height = 281
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     OptionsEx = []
-    ColCount = 9
+    ColCount = 10
     RowCount = 6
     FixedRowCount = 2
     ShowGridLine = False
@@ -310,6 +310,24 @@ object tpPeg_GclFrame: TtpPeg_GclFrame
         FieldName = 'EndPegNum'
         Width = 60
         ReadOnly = True
+      end
+      item
+        Title.Caption = #22270#21495
+        Title.CaptionAcrossCols = '1'
+        Title.CaptionAcrossRows = 2
+        Title.Font.Charset = GB2312_CHARSET
+        Title.Font.Color = clWindowText
+        Title.Font.Height = -12
+        Title.Font.Name = #23435#20307
+        Title.Font.Style = []
+        Alignment = taLeftJustify
+        Font.Charset = GB2312_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -12
+        Font.Name = #23435#20307
+        Font.Style = []
+        FieldName = 'DrawingCode'
+        ReadOnly = False
       end>
     Grid = zgPeg
     ExtendRowCount = 0

+ 45 - 15
Units/DbTreeImport.pas

@@ -41,7 +41,7 @@ implementation
 
 uses
   UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
-  ExcelImport, sdDB, SysUtils;
+  ExcelImport, sdDB, SysUtils, ConditionalDefines;
 
 procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
 var
@@ -63,21 +63,51 @@ var
   iChild: Integer;
   vChild: TsdIDTreeNode;
 begin
-  if Assigned(ADbNode) and Assigned(AParent) then
+  if _IsDebugView then
   begin
-    Result := FCacheTree.AddNode(AParent, ANextSibling);
-    Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
-    Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
-    Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
-    Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
-    Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat; 
-    Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
-    Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
-    Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
-    Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
-
-    for iChild := 0 to ADbNode.ChildCount - 1 do
-      AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
+    if Assigned(ADbNode) and Assigned(AParent) then
+    begin
+      if (ADbNode.Rec.ValueByName('B_Code').AsString <> '') and ADbNode.HasChildren then
+      begin
+        for iChild := 0 to ADbNode.ChildCount - 1 do
+          AddDbNode(ADbNode.ChildNodes[iChild], AParent, nil);
+      end
+      else
+      begin
+        Result := FCacheTree.AddNode(AParent, ANextSibling);
+        Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
+        Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
+        Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
+        Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
+        Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
+        Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
+        Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
+        Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
+        Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
+
+        for iChild := 0 to ADbNode.ChildCount - 1 do
+          AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
+      end;
+    end;
+  end
+  else
+  begin
+    if Assigned(ADbNode) and Assigned(AParent) then
+    begin
+      Result := FCacheTree.AddNode(AParent, ANextSibling);
+      Result.Code := ADbNode.Rec.ValueByName('Code').AsString;
+      Result.B_Code := ADbNode.Rec.ValueByName('B_Code').AsString;
+      Result.Name := ADbNode.Rec.ValueByName('Name').AsString;
+      Result.Units := ADbNode.Rec.ValueByName('Units').AsString;
+      Result.Price := ADbNode.Rec.ValueByName('UnitPrice').AsFloat;
+      Result.OrgQuantity := ADbNode.Rec.ValueByName('Quantity').AsFloat;
+      Result.DgnQuantity1 := ADbNode.Rec.ValueByName('DesignQuantity').AsFloat;
+      Result.DgnQuantity2 := ADbNode.Rec.ValueByName('DesignQuantity2').AsFloat;
+      Result.DrawingCode := ADbNode.Rec.ValueByName('DrawingCode').AsString;
+
+      for iChild := 0 to ADbNode.ChildCount - 1 do
+        AddDbNode(ADbNode.ChildNodes[iChild], Result, nil);
+    end;
   end;
 end;
 

+ 249 - 2
Units/ExportExcel.pas

@@ -83,7 +83,39 @@ type
     property HasLevelCode: Boolean read FHasLevelCode write FHasLevelCode;
   end;
 
-const  
+  TMasterExcelExportor = class
+  private
+    FXlsOutPut: TXlsOutPut;
+    FColInfos: PColInfos;
+    FRelaColInfos: PColInfos;
+    FColCount: Integer;
+    FTempFile: string;
+
+    FMasterDataSet: TsdDataSet;
+    FKeyFieldName: string;
+    FRelaDataSet: TsdDataSet;
+    FMasterFieldName: string;
+
+    function GetCellValue(ARec: TsdDataRecord; ColInfo: TColInfo): Variant;
+    procedure ExportRecord(ARec: TsdDataRecord; AXlsPage: TXlsCustomPage; ARow: Integer; AColInfos: PColInfos);
+    procedure ExportData(AXlsPage: TXlsCustomPage);
+    procedure DefineHeader(AXlsPage: TXlsCustomPage);
+  protected
+    procedure BeforeExport;
+    procedure EndExport;
+  public
+    constructor Create;
+    destructor Destroy; override;
+
+    procedure DefineCol(AColInfos: PColInfos; AColCount: Integer; ARelaColInfo: PColInfos = nil);
+    procedure DefineMasterDataSet(ADataSet: TsdDataSet; const AKeyFieldName: string);
+    procedure DefineRelaDataSet(ADataSet: TsdDataSet; const AMasterFieldName: string);
+
+    procedure ExportToXlsPage(AXlsPage: TXlsCustomPage);
+    procedure ExportToFile(const AFileName: string);
+  end;
+
+const
   ciLedger: array [0..8] of TColInfo =(
     (FieldName: 'Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
     (FieldName: 'B_Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '清单编号'; Width: 80; HorTextAlign: htaLeft),
@@ -140,10 +172,49 @@ const
     (FieldName: 'MemoStr'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '备注'; Width: 80; HorTextAlign: htaLeft)
   );
 
+  ciTpPegGcl: array [0..9] of TColInfo =(
+    (FieldName: 'Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
+    (FieldName: 'B_Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '清单编号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'Name'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '名称'; Width: 200; HorTextAlign: htaLeft),
+    (FieldName: 'Units'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单位'; Width: 40; HorTextAlign: htaCenter),
+    (FieldName: 'Price'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单价'; Width: 60; HorTextAlign: htaRight),
+    (FieldName: 'Quantity'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '数量'; Width: 90; HorTextAlign: htaRight),
+    (FieldName: 'TotalPrice'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '金额'; Width: 80; HorTextAlign: htaRight),
+    (FieldName: 'Peg'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '桩号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'DrawingCode'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '图号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'MemoStr'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '备注'; Width: 80; HorTextAlign: htaLeft)
+  );
+
+  ciTpGclPeg_Gcl: array [0..9] of TColInfo =(
+    (FieldName: 'B_Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '清单编号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
+    (FieldName: 'Name'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '名称'; Width: 200; HorTextAlign: htaLeft),
+    (FieldName: 'Units'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单位'; Width: 40; HorTextAlign: htaCenter),
+    (FieldName: 'Price'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单价'; Width: 60; HorTextAlign: htaRight),
+    (FieldName: 'Quantity'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '数量'; Width: 90; HorTextAlign: htaRight),
+    (FieldName: 'TotalPrice'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '金额'; Width: 80; HorTextAlign: htaRight),
+    (FieldName: 'Peg'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '桩号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'DrawingCode'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '图号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'MemoStr'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '备注'; Width: 80; HorTextAlign: htaLeft)
+  );
+
+  ciTpGclPeg_Peg: array [0..9] of TColInfo =(
+    (FieldName: 'B_Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '清单编号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'PegXmjCode'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
+    (FieldName: 'PegXmjName'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '名称'; Width: 200; HorTextAlign: htaLeft),
+    (FieldName: 'PegXmjUnits'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单位'; Width: 40; HorTextAlign: htaCenter),
+    (FieldName: 'Price'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '单价'; Width: 60; HorTextAlign: htaRight),
+    (FieldName: 'Quantity'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '数量'; Width: 90; HorTextAlign: htaRight),
+    (FieldName: 'TotalPrice'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '金额'; Width: 80; HorTextAlign: htaRight),
+    (FieldName: 'Peg'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '桩号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'DrawingCode'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '图号'; Width: 80; HorTextAlign: htaLeft),
+    (FieldName: 'MemoStr'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '备注'; Width: 80; HorTextAlign: htaLeft)
+  );
+
 implementation
 
 uses
-  ZhAPI, Variants, UtilMethods;
+  ZhAPI, Variants, UtilMethods, Math;
 
 { TExcelExportor }
 
@@ -539,4 +610,180 @@ begin
     Result := '';
 end;
 
+{ TMasterExcelExportor }
+
+procedure TMasterExcelExportor.BeforeExport;
+begin
+  Screen.Cursor := crHourGlass;
+end;
+
+constructor TMasterExcelExportor.Create;
+begin
+  FXlsOutPut := TXlsOutPut.Create;
+  FTempFile := GetTempFileName;
+end;
+
+procedure TMasterExcelExportor.DefineCol(AColInfos: PColInfos;
+  AColCount: Integer; ARelaColInfo: PColInfos);
+begin
+  FColInfos := AColInfos;
+  FColCount := AColCount;
+  FRelaColInfos := ARelaColInfo;
+end;
+
+procedure TMasterExcelExportor.DefineHeader(AXlsPage: TXlsCustomPage);
+var
+  iCol: Integer;
+  ColInfo: TColInfo;
+  XlsCell: TXlsCustomCell;
+begin
+  for iCol := 0 to FColCount - 1 do
+  begin
+    ColInfo := FColInfos[iCol];
+    XlsCell := AXlsPage.AddCell(iCol, 0, ColInfo.TitleCaption);
+    XlsCell.HTextAlign := htaCenter;
+    XlsCell.Font.Name := '黑体';
+    XlsCell.Font.Size := 10;
+    XlsCell.Font.Style := [fsBold];
+    AXlsPage.Widths[iCol] := ColInfo.Width;
+  end;
+end;
+
+procedure TMasterExcelExportor.DefineMasterDataSet(ADataSet: TsdDataSet;
+  const AKeyFieldName: string);
+begin
+  FMasterDataSet := ADataSet;
+  FKeyFieldName := AKeyFieldName;
+end;
+
+procedure TMasterExcelExportor.DefineRelaDataSet(ADataSet: TsdDataSet;
+  const AMasterFieldName: string);
+begin
+  FRelaDataSet := ADataSet;
+  FMasterFieldName := AMasterFieldName;
+end;
+
+destructor TMasterExcelExportor.Destroy;
+begin
+  if FileExists(FTempFile) then
+    DeleteFileOrFolder(FTempFile);
+  FXlsOutPut.Free;
+  inherited;
+end;
+
+procedure TMasterExcelExportor.EndExport;
+begin
+  CloseProgressHint;
+end;
+
+procedure TMasterExcelExportor.ExportData(AXlsPage: TXlsCustomPage);
+var
+  i, j, iRow: Integer;
+  Rec, RelaRec: TsdDataRecord;
+begin
+  iRow := 1;
+  for i := 0 to FMasterDataSet.RecordCount - 1 do
+  begin
+    Rec := FMasterDataSet.Records[i];
+    ExportRecord(Rec, AXlsPage, iRow, FColInfos);
+    Inc(iRow);
+    for j := 0 to FRelaDataSet.RecordCount - 1 do
+    begin
+      RelaRec := FRelaDataSet.Records[j];
+      if (RelaRec.ValueByName(FMasterFieldName).Value = Rec.ValueByName(FKeyFieldName).Value) then
+      begin
+        if Assigned(FRelaColInfos) then
+          ExportRecord(RelaRec, AXlsPage, iRow, FRelaColInfos)
+        else
+          ExportRecord(RelaRec, AXlsPage, iRow, FColInfos);
+        Inc(iRow);
+      end;
+    end;
+  end;
+end;
+
+procedure TMasterExcelExportor.ExportRecord(ARec: TsdDataRecord;
+  AXlsPage: TXlsCustomPage; ARow: Integer; AColInfos: PColInfos);
+
+  function ExportCell(ACol, ARow: Integer; AValue: Variant): TXlsCustomCell;
+  begin
+    Result := nil;
+
+    // -----------
+    if VarIsNull(AValue) then Exit;
+    // -----------
+    // 当数据超过3w3k行时,运行至某行时,AddCell会内存溢出
+    // 可能是Cell的数目超过某个限度时,报错
+    // 如果AValue为Null时不AddCell,则3w3k行可以安全度过
+
+    case VarType(AValue) of
+      varSmallInt, varInteger, varSingle, varDouble,
+      varCurrency, varShortInt, varByte, varWord,
+      varLongWord, varInt64:
+      begin
+        if AValue <> 0 then
+          Result := AXlsPage.AddCell(ACol, ARow, AValue);
+      end
+      else Result := AXlsPage.AddCell(ACol, ARow, AValue);
+    end;
+  end;
+
+var
+  iCol: Integer;
+  ColInfo: TColInfo;
+  XlsCell: TXlsCustomCell;
+  sStr: string;
+begin
+  if not Assigned(ARec) then Exit;
+
+  for iCol := 0 to FColCount - 1 do
+  begin
+    ColInfo := AColInfos[iCol];
+    XlsCell := ExportCell(iCol, ARow, GetCellValue(ARec, ColInfo));
+    if Assigned(XlsCell) then
+    begin
+      XlsCell.HTextAlign := ColInfo.HorTextAlign;
+      XlsCell.Font.Name := 'SmartSimSun';
+      XlsCell.Font.Size := 9;
+    end;
+  end;
+end;
+
+procedure TMasterExcelExportor.ExportToFile(const AFileName: string);
+begin
+  if not Assigned(FMasterDataSet) then Exit;
+
+  BeforeExport;
+  try
+    ExportToXlsPage(FXlsOutPut.AddPage);
+    FXlsOutPut.SaveToFile(FTempFile);
+    if not FileExists(AFileName) or QuestMessage('存在同名文件,是否替换?') then
+      CopyFile(PChar(FTempFile), PChar(AFileName), False);
+  finally
+    EndExport;
+  end;
+end;
+
+procedure TMasterExcelExportor.ExportToXlsPage(AXlsPage: TXlsCustomPage);
+begin
+  if not Assigned(FMasterDataSet) then Exit;
+
+  DefineHeader(AXlsPage);
+  ExportData(AXlsPage);
+end;
+
+function TMasterExcelExportor.GetCellValue(ARec: TsdDataRecord;
+  ColInfo: TColInfo): Variant;
+var
+  Value: TsdValue;
+begin
+  Result := '';
+  if Assigned(ARec) then
+  begin
+    Value := ARec.ValueByName(ColInfo.FieldName);
+    if Assigned(Value) then
+      Result := Value.AsVariant;
+  end;
+end;
+
 end.

+ 25 - 1
Units/UtilMethods.pas

@@ -101,6 +101,8 @@ type
   {Copy By Stream}
   procedure CopyFileByStream(const ASourceFile, ADestFile: string);
 
+  procedure AppendTestLog(const AFileName, ALog: string);
+
   // Add by chenshilong, 2014-04-11
   function GetVersion(APartCount: Integer = 4): string;
   function ExtractFileNameWithoutExt(const AFileName: string): string;
@@ -876,7 +878,7 @@ var
   iSize1, iSize2: Integer;
 begin
   iSize1 := FileSizeByName(AFileName);
-  Sleep(200);
+  Sleep(300);
   iSize2 := FileSizeByName(AFileName);
   Result := iSize1 = iSize2;
 end;
@@ -955,6 +957,28 @@ begin
   end;
 end;
 
+procedure AppendTestLog(const AFileName, ALog: string);
+var
+  f: TextFile;
+begin
+  try
+    if FileExists(AFileName) then
+    begin
+      AssignFile(f, AFileName);
+      Append(f);
+      Writeln(f, ALog);
+    end
+    else
+    begin
+      AssignFile(f, AFileName);
+      Rewrite(f);
+      Writeln(f, ALog);
+    end;
+  finally
+    CloseFile(f);
+  end;
+end;
+
 function GetVersion(APartCount: Integer = 4): string;
 var
   V1, V2, V3, V4: Word;