Преглед изворни кода

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

MaiXinRong пре 8 година
родитељ
комит
a7ac7f756a

+ 3 - 2
DataModules/BillsCompileDm.pas

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

+ 6 - 0
Forms/MainFrm.dfm

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

+ 1 - 0
Forms/MainFrm.pas

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

+ 342 - 13
Forms/SelectOnlineSignPhaseFrm.dfm

@@ -13,15 +13,353 @@ object SelectOnlineSignPhaseForm: TSelectOnlineSignPhaseForm
   PixelsPerInch = 96
   PixelsPerInch = 96
   TextHeight = 12
   TextHeight = 12
   object lblHint: TLabel
   object lblHint: TLabel
-    Left = 50
-    Top = 86
+    Left = 62
+    Top = 85
     Width = 228
     Width = 228
     Height = 12
     Height = 12
     Caption = #21482#33021#23545#24050#23457#25209#23436#25104#30340#26631#27573#36827#34892#31614#32626#25253#34920#29983#25104
     Caption = #21482#33021#23545#24050#23457#25209#23436#25104#30340#26631#27573#36827#34892#31614#32626#25253#34920#29983#25104
   end
   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
   object pnlPhase: TPanel
-    Left = 48
-    Top = 48
+    Left = 60
+    Top = 47
     Width = 145
     Width = 145
     Height = 25
     Height = 25
     BevelOuter = bvNone
     BevelOuter = bvNone
@@ -46,13 +384,4 @@ object SelectOnlineSignPhaseForm: TSelectOnlineSignPhaseForm
       ItemHeight = 14
       ItemHeight = 14
     end
     end
   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
 end

+ 4 - 4
Forms/SelectOnlineSignPhaseFrm.pas

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

+ 536 - 14
Forms/SignOnlineReportsFrm.dfm

@@ -5,15 +5,15 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
   ClientHeight = 644
   ClientHeight = 644
   ClientWidth = 1295
   ClientWidth = 1295
   Color = clBtnFace
   Color = clBtnFace
-  Font.Charset = DEFAULT_CHARSET
+  Font.Charset = ANSI_CHARSET
   Font.Color = clWindowText
   Font.Color = clWindowText
-  Font.Height = -11
-  Font.Name = 'MS Sans Serif'
+  Font.Height = -12
+  Font.Name = #23435#20307
   Font.Style = []
   Font.Style = []
   OldCreateOrder = False
   OldCreateOrder = False
   OnShow = FormShow
   OnShow = FormShow
   PixelsPerInch = 96
   PixelsPerInch = 96
-  TextHeight = 13
+  TextHeight = 12
   object previewBox: TImage
   object previewBox: TImage
     Left = 116
     Left = 116
     Top = 60
     Top = 60
@@ -25,7 +25,7 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
     Left = 0
     Left = 0
     Top = 0
     Top = 0
     Width = 225
     Width = 225
-    Height = 603
+    Height = 594
     Align = alLeft
     Align = alLeft
     Indent = 19
     Indent = 19
     ReadOnly = True
     ReadOnly = True
@@ -38,27 +38,549 @@ object SignOnlineReportsForm: TSignOnlineReportsForm
   end
   end
   object pnlBottom: TPanel
   object pnlBottom: TPanel
     Left = 0
     Left = 0
-    Top = 603
+    Top = 594
     Width = 1295
     Width = 1295
-    Height = 41
+    Height = 50
     Align = alBottom
     Align = alBottom
     BevelOuter = bvNone
     BevelOuter = bvNone
     TabOrder = 1
     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
       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
       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
   end
   end
   object msbReportsPreview: TMScrollBox
   object msbReportsPreview: TMScrollBox
     Left = 225
     Left = 225
     Top = 0
     Top = 0
     Width = 1070
     Width = 1070
-    Height = 603
+    Height = 594
     Align = alClient
     Align = alClient
     AutoScroll = False
     AutoScroll = False
     BevelInner = bvNone
     BevelInner = bvNone

+ 140 - 22
Forms/SignOnlineReportsFrm.pas

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

+ 2 - 0
TenderPartition/tpBaseGatherData.pas

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

+ 4 - 0
TenderPartition/tpGatherTree.pas

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

+ 32 - 15
TenderPartition/tpMainFrm.dfm

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

+ 43 - 29
TenderPartition/tpNoPegDm.dfm

@@ -16,35 +16,46 @@ object tpNoPegData: TtpNoPegData
     FieldListData = {
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
       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
   end
   object sdvNoPegBills: TsdDataView
   object sdvNoPegBills: TsdDataView
     Active = True
     Active = True
@@ -86,6 +97,9 @@ object tpNoPegData: TtpNoPegData
       end
       end
       item
       item
         FieldName = 'NextSiblingID'
         FieldName = 'NextSiblingID'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
       end>
     OnGetText = sdvNoPegBillsGetText
     OnGetText = sdvNoPegBillsGetText
     Left = 64
     Left = 64

+ 22 - 0
TenderPartition/tpPartTenderSetFme.dfm

@@ -50,6 +50,7 @@ object tpPartTenderSetFrame: TtpPartTenderSetFrame
       FrozenCol = 0
       FrozenCol = 0
       FrozenRow = 0
       FrozenRow = 0
       OnCurrentChanged = zgPartTendersInfoCurrentChanged
       OnCurrentChanged = zgPartTendersInfoCurrentChanged
+      OnMouseDown = zgPartTendersInfoMouseDown
       Font.Charset = ANSI_CHARSET
       Font.Charset = ANSI_CHARSET
       Font.Color = clWindowText
       Font.Color = clWindowText
       Font.Height = -12
       Font.Height = -12
@@ -68,4 +69,25 @@ object tpPartTenderSetFrame: TtpPartTenderSetFrame
     BevelOuter = bvNone
     BevelOuter = bvNone
     TabOrder = 1
     TabOrder = 1
   end
   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
 end

+ 86 - 2
TenderPartition/tpPartTenderSetFme.pas

@@ -5,7 +5,8 @@ interface
 uses
 uses
   tpPartTenderSet, tpPartTenderFme,
   tpPartTenderSet, tpPartTenderFme,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
-  Dialogs, sdGridDBA, StdCtrls, JimLabels, ZJGrid, ExtCtrls;
+  Dialogs, sdGridDBA, StdCtrls, JimLabels, ZJGrid, ExtCtrls, ActnList,
+  dxBar;
 
 
 type
 type
   TtpPartTenderSetFrame = class(TFrame)
   TtpPartTenderSetFrame = class(TFrame)
@@ -14,13 +15,24 @@ type
     labGatherTenders: TJimGradLabel;
     labGatherTenders: TJimGradLabel;
     pnlCurPartTender: TPanel;
     pnlCurPartTender: TPanel;
     sprTenderData: TSplitter;
     sprTenderData: TSplitter;
+    dxpmPartTenders: TdxBarPopupMenu;
+    alPartTenders: TActionList;
+    actnExportTpExcel: TAction;
     procedure zgPartTendersInfoCurrentChanged(Sender: TObject; Col,
     procedure zgPartTendersInfoCurrentChanged(Sender: TObject; Col,
       Row: Integer);
       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
   private
     FPartTenderSetData: TtpPartTenderSet;
     FPartTenderSetData: TtpPartTenderSet;
     FCurPartTenderFrame: TtpPartTenderFrame;
     FCurPartTenderFrame: TtpPartTenderFrame;
 
 
     procedure AssignTenderInfo;
     procedure AssignTenderInfo;
+
+    procedure ExportPegGclExcel;
+    procedure ExportGclPegExcel;
   public
   public
     constructor Create(APartTenderSetData: TtpPartTenderSet);
     constructor Create(APartTenderSetData: TtpPartTenderSet);
     destructor Destroy; override;
     destructor Destroy; override;
@@ -31,7 +43,7 @@ type
 implementation
 implementation
 
 
 uses
 uses
-  UtilMethods, tpPartTender;
+  UtilMethods, tpPartTender, MainFrm, ExportExcel;
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -84,4 +96,76 @@ begin
   FCurPartTenderFrame.PartTenderData := FPartTenderSetData.PartTender[iTender];
   FCurPartTenderFrame.PartTenderData := FPartTenderSetData.PartTender[iTender];
 end;
 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.
 end.

+ 57 - 38
TenderPartition/tpPegGclGatherDm.dfm

@@ -16,24 +16,29 @@ object tpPegGclGatherData: TtpPegGclGatherData
     FieldListData = {
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
       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
   end
   object sdvGclGather: TsdDataView
   object sdvGclGather: TsdDataView
     Active = True
     Active = True
@@ -77,26 +82,37 @@ object tpPegGclGatherData: TtpPegGclGatherData
     FieldListData = {
     FieldListData = {
       0101044E616D65060B44657461696C47636C4944094669656C644E616D65060B
       0101044E616D65060B44657461696C47636C4944094669656C644E616D65060B
       44657461696C47636C49440844617461547970650203084461746153697A6502
       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
   end
   object sdvGclRela: TsdDataView
   object sdvGclRela: TsdDataView
     Active = True
     Active = True
@@ -123,6 +139,9 @@ object tpPegGclGatherData: TtpPegGclGatherData
       end
       end
       item
       item
         FieldName = 'TotalPrice'
         FieldName = 'TotalPrice'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
       end>
     OnFilterRecord = sdvGclRelaFilterRecord
     OnFilterRecord = sdvGclRelaFilterRecord
     Left = 152
     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('PegXmjUnits').AsString := vRela.RelaPegXmj.Units;
       Rec.ValueByName('Quantity').AsFloat := vRela.RelaGcl.Quantity;
       Rec.ValueByName('Quantity').AsFloat := vRela.RelaGcl.Quantity;
       Rec.ValueByName('TotalPrice').AsFloat := vRela.RelaPegXmj.TotalPrice;
       Rec.ValueByName('TotalPrice').AsFloat := vRela.RelaPegXmj.TotalPrice;
+      Rec.ValueByName('DrawingCode').AsString := vRela.RelaPegXmj.DrawingCode;
     end;
     end;
   end;
   end;
 
 

+ 18 - 1
TenderPartition/tpPegGclGatherFme.dfm

@@ -36,7 +36,7 @@ object tpPegGclGatherFrame: TtpPegGclGatherFrame
     Height = 200
     Height = 200
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     OptionsEx = []
     OptionsEx = []
-    ColCount = 6
+    ColCount = 7
     ShowGridLine = False
     ShowGridLine = False
     DefaultColWidth = 73
     DefaultColWidth = 73
     DefaultFixedColWidth = 25
     DefaultFixedColWidth = 25
@@ -252,6 +252,23 @@ object tpPegGclGatherFrame: TtpPegGclGatherFrame
         FieldName = 'TotalPrice'
         FieldName = 'TotalPrice'
         Width = 80
         Width = 80
         ReadOnly = True
         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>
       end>
     Grid = zgGclRela
     Grid = zgGclRela
     ExtendRowCount = 0
     ExtendRowCount = 0

+ 58 - 38
TenderPartition/tpPeg_GclDm.dfm

@@ -16,27 +16,39 @@ object tpPeg_GclData: TtpPeg_GclData
     FieldListData = {
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
       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
       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
   end
   object sdvPeg: TsdDataView
   object sdvPeg: TsdDataView
     Active = True
     Active = True
@@ -66,6 +78,9 @@ object tpPeg_GclData: TtpPeg_GclData
       end
       end
       item
       item
         FieldName = 'EndPegNum'
         FieldName = 'EndPegNum'
+      end
+      item
+        FieldName = 'DrawingCode'
       end>
       end>
     OnCurrentChanged = sdvPegCurrentChanged
     OnCurrentChanged = sdvPegCurrentChanged
     Left = 56
     Left = 56
@@ -83,24 +98,29 @@ object tpPeg_GclData: TtpPeg_GclData
     FieldListData = {
     FieldListData = {
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       0101044E616D6506024944094669656C644E616D650602494408446174615479
       70650203084461746153697A6502040549734B6579080F4E65656450726F6365
       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
   end
   object sdvGclBills: TsdDataView
   object sdvGclBills: TsdDataView
     Active = True
     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('BeginPegNum').AsFloat := APeg.BeginPegNum;
     Rec.ValueByName('EndPeg').AsString := APeg.EndPeg;
     Rec.ValueByName('EndPeg').AsString := APeg.EndPeg;
     Rec.ValueByName('EndPegNum').AsFloat := APeg.EndPegNum;
     Rec.ValueByName('EndPegNum').AsFloat := APeg.EndPegNum;
+
+    Rec.ValueByName('Peg').AsString := APeg.Peg;
+
+    Rec.ValueByName('DrawingCode').AsString := APeg.RelaNode.DrawingCode;
     LoadGclBills(APeg);
     LoadGclBills(APeg);
   end;
   end;
 
 

+ 19 - 1
TenderPartition/tpPeg_GclFme.dfm

@@ -36,7 +36,7 @@ object tpPeg_GclFrame: TtpPeg_GclFrame
     Height = 281
     Height = 281
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     Options = [goRangeSelect, goRowSizing, goColSizing, goCellNotMaintainData, goFixedRowShowNo, goFixedColShowNo, goAlwaysShowSelection]
     OptionsEx = []
     OptionsEx = []
-    ColCount = 9
+    ColCount = 10
     RowCount = 6
     RowCount = 6
     FixedRowCount = 2
     FixedRowCount = 2
     ShowGridLine = False
     ShowGridLine = False
@@ -310,6 +310,24 @@ object tpPeg_GclFrame: TtpPeg_GclFrame
         FieldName = 'EndPegNum'
         FieldName = 'EndPegNum'
         Width = 60
         Width = 60
         ReadOnly = True
         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>
       end>
     Grid = zgPeg
     Grid = zgPeg
     ExtendRowCount = 0
     ExtendRowCount = 0

+ 45 - 15
Units/DbTreeImport.pas

@@ -41,7 +41,7 @@ implementation
 
 
 uses
 uses
   UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
   UtilMethods, TransFile, mDataRecord, BillsDm, CacheTree, BillsTree,
-  ExcelImport, sdDB, SysUtils;
+  ExcelImport, sdDB, SysUtils, ConditionalDefines;
 
 
 procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
 procedure ImportDbTreeTo(const AFileName: string; AProjectData: TProjectData);
 var
 var
@@ -63,21 +63,51 @@ var
   iChild: Integer;
   iChild: Integer;
   vChild: TsdIDTreeNode;
   vChild: TsdIDTreeNode;
 begin
 begin
-  if Assigned(ADbNode) and Assigned(AParent) then
+  if _IsDebugView then
   begin
   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;
 end;
 end;
 
 

+ 249 - 2
Units/ExportExcel.pas

@@ -83,7 +83,39 @@ type
     property HasLevelCode: Boolean read FHasLevelCode write FHasLevelCode;
     property HasLevelCode: Boolean read FHasLevelCode write FHasLevelCode;
   end;
   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 =(
   ciLedger: array [0..8] of TColInfo =(
     (FieldName: 'Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
     (FieldName: 'Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '项目节编号'; Width: 120; HorTextAlign: htaLeft),
     (FieldName: 'B_Code'; KeyField: ''; LookupKeyField: ''; LookupDataSetIndex: -1; TitleCaption: '清单编号'; Width: 80; 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)
     (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
 implementation
 
 
 uses
 uses
-  ZhAPI, Variants, UtilMethods;
+  ZhAPI, Variants, UtilMethods, Math;
 
 
 { TExcelExportor }
 { TExcelExportor }
 
 
@@ -539,4 +610,180 @@ begin
     Result := '';
     Result := '';
 end;
 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.
 end.

+ 25 - 1
Units/UtilMethods.pas

@@ -101,6 +101,8 @@ type
   {Copy By Stream}
   {Copy By Stream}
   procedure CopyFileByStream(const ASourceFile, ADestFile: string);
   procedure CopyFileByStream(const ASourceFile, ADestFile: string);
 
 
+  procedure AppendTestLog(const AFileName, ALog: string);
+
   // Add by chenshilong, 2014-04-11
   // Add by chenshilong, 2014-04-11
   function GetVersion(APartCount: Integer = 4): string;
   function GetVersion(APartCount: Integer = 4): string;
   function ExtractFileNameWithoutExt(const AFileName: string): string;
   function ExtractFileNameWithoutExt(const AFileName: string): string;
@@ -876,7 +878,7 @@ var
   iSize1, iSize2: Integer;
   iSize1, iSize2: Integer;
 begin
 begin
   iSize1 := FileSizeByName(AFileName);
   iSize1 := FileSizeByName(AFileName);
-  Sleep(200);
+  Sleep(300);
   iSize2 := FileSizeByName(AFileName);
   iSize2 := FileSizeByName(AFileName);
   Result := iSize1 = iSize2;
   Result := iSize1 = iSize2;
 end;
 end;
@@ -955,6 +957,28 @@ begin
   end;
   end;
 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;
 function GetVersion(APartCount: Integer = 4): string;
 var
 var
   V1, V2, V3, V4: Word;
   V1, V2, V3, V4: Word;