From be497cb19ecb8cd82af6ffa6cde3a7d0c21e692d Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 20 Apr 2014 20:31:36 +0000 Subject: [PATCH] fpspreadsheet: Add support for horizontal and vertical text alignment in cells for biff8 and fpspreadsheetgrid. Fix failure to reckognize file format in case of uppercase filename. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2955 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../examples/excel8demo/excel8write.lpr | 2 +- .../examples/fpsgrid/fpsgrid.lpi | 203 ++++--- .../examples/fpsgrid/mainform.lfm | 110 +++- .../examples/fpsgrid/mainform.lrs | 510 ++++++++++++------ components/fpspreadsheet/fpspreadsheet.pas | 52 +- .../fpspreadsheet/fpspreadsheetgrid.pas | 33 +- .../fpspreadsheet/tests/formattests.pas | 70 ++- components/fpspreadsheet/xlsbiff8.pas | 77 ++- components/fpspreadsheet/xlscommon.pas | 7 +- 9 files changed, 744 insertions(+), 320 deletions(-) diff --git a/components/fpspreadsheet/examples/excel8demo/excel8write.lpr b/components/fpspreadsheet/examples/excel8demo/excel8write.lpr index 2f30a19f3..d3034e28d 100644 --- a/components/fpspreadsheet/examples/excel8demo/excel8write.lpr +++ b/components/fpspreadsheet/examples/excel8demo/excel8write.lpr @@ -52,7 +52,7 @@ begin lCell^.BackgroundColor := scPURPLE; lCell^.UsedFormattingFields := [uffBackgroundColor]; - // Word-wrapped long text + // Word-wrapped long text in D7 MyWorksheet.WriteUTF8Text(6, 3, 'This is a very, very, very, very long text.'); MyWorksheet.WriteUsedFormatting(6, 3, [uffWordwrap]); diff --git a/components/fpspreadsheet/examples/fpsgrid/fpsgrid.lpi b/components/fpspreadsheet/examples/fpsgrid/fpsgrid.lpi index a53fadb58..749b9c68c 100644 --- a/components/fpspreadsheet/examples/fpsgrid/fpsgrid.lpi +++ b/components/fpspreadsheet/examples/fpsgrid/fpsgrid.lpi @@ -27,7 +27,6 @@ - @@ -38,7 +37,7 @@ - + @@ -47,7 +46,7 @@ - + @@ -59,20 +58,20 @@ - - - + + + - + - - - + + + @@ -80,9 +79,9 @@ - - - + + + @@ -138,12 +137,10 @@ - - - + @@ -156,58 +153,50 @@ - - - + - - - + - - - + - - - - - + + + - - + + - + - - - + + + @@ -220,164 +209,164 @@ - - - + - - - - - + + + - - - + - - - + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/components/fpspreadsheet/examples/fpsgrid/mainform.lfm b/components/fpspreadsheet/examples/fpsgrid/mainform.lfm index ce41b2d06..6f884f756 100644 --- a/components/fpspreadsheet/examples/fpsgrid/mainform.lfm +++ b/components/fpspreadsheet/examples/fpsgrid/mainform.lfm @@ -72,7 +72,7 @@ object Form1: TForm1 Top = 0 Width = 392 Align = alClient - Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goThumbTracking, goSmoothScroll, goCellEllipsis] + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSizing, goColSizing, goThumbTracking, goSmoothScroll, goCellEllipsis] TabOrder = 0 TitleStyle = tsNative end @@ -132,10 +132,82 @@ object Form1: TForm1 Caption = '&File' object mnuOpen: TMenuItem Action = AcOpen + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 20000000000000040000640000006400000000000000000000002C86D8002D88 + D8F72D87D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88 + D8F72D88D8F72D87D8F72D88D8F72C86D800FFFFFF00FFFFFF00338ED9FBDCF0 + FAFF98E1F6FF95E0F6FF92DFF6FF8EDEF5FF89DCF5FF85DAF4FF80D9F4FF7AD7 + F3FF74D5F3FF70D3F2FFC2EAF8FF3594DAFFFFFFFF00FFFFFF003594DAF7EFFA + FEFF93E5F8FF8FE4F8FF89E3F8FF82E1F7FF7ADFF7FF71DEF6FF67DBF5FF5BD8 + F4FF4DD4F3FF40D1F2FFCAF2FBFF3594DAFFFFFFFF00FFFFFF00369ADAF8F2FA + FDFF94E6F8FF92E5F8FF90E5F8FF8BE3F8FF86E2F7FF7FE1F7FF77DEF6FF6CDC + F6FF5ED9F4FF4FD5F3FFCCF2FBFF3594DAFFFFFFFF00FFFFFF0036A1DAF9F6FC + FEFF94E5F8FF93E5F8FF93E5F8FF91E5F8FF93DBE9FF93D7E3FF93D2DCFF90CE + D7FF8CC8CFFF86C1C6FFC9D8D6FF3594DAFFC57444E8CA7F53F137A6DAFAFEFF + FFFFF8FDFFFFF6FDFFFFF5FCFFFFF3FCFEFF9AE4F4FF9AE6F7FF9BE6F6FF9DE5 + F5FF9EE5F5FF9FE5F4FFDAF3F8FF3594DAFFFDF4EEFFCA8054F935ABDAFAE8F6 + FBFF70BCE7FF55AAE2FF4DA5E0FF91C9EBFFFAF3EFFFFDFEFDFFFFFDFCFFFFFD + FCFFFEFDFCFFFEFCFBFFFEFEFDFF3594DAFFEFF2E8FFCE8156FF36AADAF2F1FA + FDFF94DEF5FF93DCF4FF64BCE9FF3594DAFF3594DAFF3594DAFF3594DAFF3594 + DAFF3594DAFF3594DAFF3594DAFF3594DAFFFBF6EFFFCC8355FE35AFDAF0F7FC + FEFF8EE4F8FF91DEF5FF9FE0F5FFACE1F6FFCA8452FFFFF7F1FFFFE9D9FFFFEA + DBFFFFE9D9FFFFE7D7FFFFE5D2FFFFE2CBFFFFF7F1FFCB8555FE36B3DAF8FDFE + FEFFFEFFFFFFFEFEFFFFFDFEFFFFFEFFFFFFE4BA91FFFFF7F0FFFFE7D5FFFDE7 + D6FFFDE6D4FFFCE4D0FFFBE3CBFFFADCC2FFFEF3E8FFCC8656FE34B4D9D05EC2 + E1FA60C3E2FA60C3E2FA60C3E2FA5FC3E2FAE4BB91FFFFF7F2FFFEE7D5FFFEE7 + D5FFFDE5D1FFFAE0CAFFF9DEC4FFF7D9BCFFFDF2E7FFCC8757FEFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF7F1FFFCE5D2FFFCE4 + D1FFFBE2CCFFF9DDC4FFF6D7BBFFF3D1AFFFFAEFE4FFCC8758FEFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB92FFFEF6F0FFFCE2CDFFFCE3 + CDFFFADFC8FFF7D9BCFFF5E9DDFFFAF3EBFFFBF8F3FFCA8353FEFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E4BB93FFFEF5EDFFFCDEC5FFFBE0 + C7FFF9DCC2FFF5D3B4FFFEF9F3FFFAE2C4FFECC193FFC37D4893FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E5BE96FFFFFFFEFFFDF3E9FFFDF3 + EAFFFCF2E8FFFAEFE3FFFAF2E7FFEABB88FFCF8555B3B4693D0CFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EAC39DFFE6BF96FFE4BB92FFE4BB + 92FFD1A06CF5D09E6DF6CC965FDAC479427EB2673C09FFFFFF00 + } OnClick = acOpenExecute end object mnuSaveAs: TMenuItem Action = AcSaveAs + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000BA6A3600B969 + 35B5B86935EEB76835FFB56835FFB46734FFB26634FFB06533FFAE6433FFAC63 + 32FFAA6232FFA96132FFA86031FFA76031FEA66031F1A86131C4BA6A35DEEBC6 + ADFFEAC5ADFFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB + F8FFFEFBF8FFFEFBF8FFFEFBF8FFC89A7CFFC79879FFA76031EDBA6B37FEEDCA + B3FFE0A27AFFFEFAF7FF62C088FF62C088FF62C088FF62C088FF62C088FF62C0 + 88FF62C088FF62C088FFFDF9F6FFCA8D65FFC99B7CFFA76031FEBB6C38FFEECC + B6FFE1A27AFFFEFAF7FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDCC2FFBFDC + C2FFBFDCC2FFBFDCC2FFFDF9F6FFCD9068FFCC9E81FFA86132FFBB6B38FFEFCE + B8FFE1A279FFFEFAF7FF62C088FF62C088FF62C088FF62C088FF62C088FF62C0 + 88FF62C088FF62C088FFFDF9F6FFCF936AFFCEA384FFAA6132FFBA6A36FFEFD0 + BBFFE2A27AFFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFBF8FFFEFB + F8FFFEFBF8FFFEFBF8FFFEFBF8FFD3966DFFD2A78AFFAB6232FFBB6A36FFF0D2 + BEFFE2A37AFFE2A37AFFE1A37AFFE2A37BFFE1A37BFFE0A178FFDE9F77FFDD9F + 76FFDC9D74FFD99B72FFD89971FFD69970FFD5AB8EFFAD6333FFBB6A36FFF2D5 + C2FFE3A37AFFE3A37AFFE2A37BFFE2A37BFFE2A47BFFE1A279FFE0A178FFDEA0 + 77FFDE9E75FFDC9D74FFDA9B73FFD99B73FFDAB095FFAF6433FFBB6A36FFF2D8 + C5FFE3A47BFFE3A37AFFE3A47AFFE2A47BFFE2A37BFFE1A37BFFE1A279FFDFA0 + 77FFDE9F76FFDD9E74FFDB9C72FFDC9D74FFDDB59AFFB16534FFBB6B36FFF4D9 + C7FFE6A67DFFC88C64FFC98D65FFC98E67FFCB926CFFCB926DFFCA9069FFC88C + 65FFC88C64FFC88C64FFC88C64FFDA9C74FFE1BA9FFFB36634FFBB6B36FEF4DC + C9FFE7A77DFFF9ECE1FFF9ECE1FFF9EDE3FFFCF4EEFFFDFAF7FFFDF7F3FFFAED + E5FFF7E7DBFFF7E5D9FFF6E5D8FFDEA077FFE4BEA4FFB46734FFBC6B36FAF5DD + CCFFE7A87EFFFAF0E8FFFAF0E8FFC98D66FFFAF0E9FFFDF8F3FFFEFAF8FFFCF4 + EFFFF9E9DFFFF7E7DBFFF7E5D9FFE0A278FFE7C2A9FFB66835FFBC6B36F0F6DF + D0FFE8A87EFFFCF6F1FFFCF6F1FFC88C64FFFAF1E9FFFBF4EEFFFDFAF7FFFDF9 + F6FFFAF0E8FFF8E8DDFFF7E6DBFFE1A37AFFEFD5C3FFB76935FEBC6B36D8F6DF + D1FFE9AA80FFFEFAF6FFFDFAF6FFC88C64FFFBF3EEFFFBF1EAFFFCF6F2FFFEFB + F8FFFCF6F1FFF9ECE2FFF8E7DBFFEED0BAFFECD0BDFFBB703EF8BC6B369BF6E0 + D1FFF7E0D1FFFEFBF8FFFEFBF7FFFDF9F6FFFCF5F0FFFAF0EAFFFBF2EDFFFDF9 + F6FFFDFAF7FFFBF1EBFFF8E9DFFEECD0BDFBC9895EECB5693563BC6B3671BC6B + 3690BC6B36CCBC6B36EEBC6B36FABB6B36FEBB6B36FFBB6A36FFBB6A36FFBC6C + 39FFBD6E3BFFBB6D3AFFBB6B38EFBB703ECBB6693554FFFFFF00 + } OnClick = acSaveAsExecute end object MenuItem1: TMenuItem @@ -143,6 +215,42 @@ object Form1: TForm1 end object mnuQuit: TMenuItem Action = AcQuit + Bitmap.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001D63 + 9B1619609839145D9562105A92880D5890A4135C92FC0C578FED999999FF7171 + 71FF545454FF515151FF4F4F4FFF4C4C4CFF4A4A4AFF474747FF454545FF2567 + 9DFF3274A8FF3D7CAFFF4784B5FF4E8ABAFF3E7EADFF0C578FEAFFFFFF00FFFF + FF00585858FFA2A2A2FFA2A2A2FFA3A3A3FFA4A4A4FFA4A4A4FFA5A5A5FF2F6F + A5FF78ABD2FF78ABD3FF73A7D1FF69A0CDFF407FAEFF0F5991EAFFFFFF00FFFF + FF005C5C5CFFA1A1A1FF3C7340FFA0A1A1FFA3A3A3FFA3A3A3FFA4A4A4FF3674 + AAFF7DAFD4FF5B9AC9FF5495C7FF5896C8FF4180AEFF135C94EAFFFFFF00FFFF + FF00606060FFA0A0A0FF3D7641FF367139FFA2A2A2FFA2A2A2FFA3A3A3FF3D79 + B0FF82B3D7FF629FCCFF5A9AC9FF5E9BCAFF4381AFFF196098EA37823EFF347E + 3BFF317937FF2E7534FF499150FF468F4CFF39733DFFA1A1A1FFA2A2A2FF457E + B4FF88B7D9FF67A3CFFF619ECCFF639FCCFF4583B1FF1F649CEA3B8742FF89CB + 92FF84C88DFF80C688FF7BC383FF77C17FFF478F4DFF3B743FFFA1A1A1FF4C84 + BAFF8DBBDBFF6EA8D1FF66A6D1FF5FB4DFFF4785B1FF2569A1EA3E8B46FF8FCE + 99FF7DC687FF78C381FF73C07CFF74C07CFF79C281FF49904FFF547F57FF5489 + BFFF94BFDDFF75ADD4FF63B8E1FF4BD4FFFF428BB8FF2C6EA6EA41904AFF94D2 + 9FFF91D09AFF8DCD96FF89CB92FF84C88DFF519858FF417C46FF9F9F9FFF5A8E + C4FF98C3E0FF7CB3D7FF74AFD6FF5EC4EDFF4B88B3FF3473ABEA44944DFF4291 + 4BFF3F8D48FF3D8945FF5DA465FF5AA061FF45834BFF9E9E9EFF9E9E9EFF6092 + C9FF9EC7E2FF83B8DAFF7DB4D7FF7EB3D7FF4F89B4FF3B79B1EAFFFFFF00FFFF + FF00777777FF9A9A9AFF3D8A45FF498A4FFF9C9C9CFF9D9D9DFF9D9D9DFF6696 + CCFFA2CBE3FF89BDDCFF83B9DAFF84B9DAFF518BB5FF437EB6EAFFFFFF00FFFF + FF007A7A7AFF999999FF529159FF999A99FF9B9B9BFF9C9C9CFF9C9C9CFF6C9A + D0FFA7CEE5FF8FC1DFFF89BDDCFF8BBDDCFF538DB6FF4B84BCEAFFFFFF00FFFF + FF007D7D7DFF999999FF999999FF9A9A9AFF9A9A9AFF9B9B9BFF9B9B9BFF6F9D + D3FFAAD1E7FFABD1E7FF98C7E1FF91C2DEFF568FB7FF5289C1EAFFFFFF00FFFF + FF00808080FF7E7E7EFF7C7C7CFF7A7A7AFF777777FF757575FF727272FF719E + D4FF6F9ED6FF87B2DCFFABD3E8FFA9D0E6FF5890B8FF598EC6EAFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00709ED6DB6D9CD4FF85B1DAFF5A91B9FF6093CBEAFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF006D9CD4896A9AD2FB6697CFEE + } OnClick = acQuitExecute end end diff --git a/components/fpspreadsheet/examples/fpsgrid/mainform.lrs b/components/fpspreadsheet/examples/fpsgrid/mainform.lrs index ca9452d3f..d524c0afe 100644 --- a/components/fpspreadsheet/examples/fpsgrid/mainform.lrs +++ b/components/fpspreadsheet/examples/fpsgrid/mainform.lrs @@ -21,186 +21,342 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#7'Caption'#6#6'Sheet1'#12'ClientHeight'#3#210#0#11'ClientWidth'#3#136#1#0#15 +'TsWorksheetGrid'#15'sWorksheetGrid1'#4'Left'#2#0#6'Height'#3#210#0#3'Top'#2 +#0#5'Width'#3#136#1#5'Align'#7#8'alClient'#7'Options'#11#15'goFixedVertLine' - +#15'goFixedHorzLine'#10'goVertLine'#10'goHorzLine'#13'goRangeSelect'#11'goCo' - +'lSizing'#15'goThumbTracking'#14'goSmoothScroll'#14'goCellEllipsis'#0#8'TabO' - +'rder'#2#0#10'TitleStyle'#7#8'tsNative'#0#0#0#0#8'TToolBar'#8'ToolBar1'#4'Le' - +'ft'#2#0#6'Height'#2#26#3'Top'#2#0#5'Width'#3#144#1#7'Caption'#6#8'ToolBar1' - +#11'EdgeBorders'#11#0#6'Images'#7#10'ImageList1'#8'TabOrder'#2#2#0#11'TToolB' - +'utton'#11'ToolButton1'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#6'AcOpen'#0#0#11 - +'TToolButton'#11'ToolButton2'#4'Left'#2#24#3'Top'#2#0#6'Action'#7#8'AcSaveAs' - +#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#2'4'#3'Top'#2#0#6'Action'#7#6'A' - +'cQuit'#0#0#11'TToolButton'#11'ToolButton5'#4'Left'#2'/'#3'Top'#2#0#5'Width' - +#2#5#7'Caption'#6#11'ToolButton5'#5'Style'#7#10'tbsDivider'#0#0#0#11'TOpenDi' - +'alog'#11'OpenDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#192'Excel spread' - +'sheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|LibreOffice/OpenO' - +'ffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_pipes)|.wikit' - +'able_pipes|All files (*.*)|*.*'#7'Options'#11#20'ofExtensionDifferent'#14'o' - +'fEnableSizing'#12'ofViewDetail'#0#4'left'#2'@'#3'top'#3#176#0#0#0#11'TSaveD' - +'ialog'#11'SaveDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#185'Excel sprea' - +'dsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/Open' - +'Office spreadsheet (*.ods)|*.ods|Wikitable (wikimedia) (.wikitable_wikimedi' - +'a)|*.wikitable_wikimedia'#7'Options'#11#20'ofExtensionDifferent'#14'ofEnabl' - +'eSizing'#12'ofViewDetail'#0#4'left'#3#176#0#3'top'#3#176#0#0#0#9'TMainMenu' - +#9'MainMenu1'#6'Images'#7#10'ImageList1'#4'left'#3' '#1#3'top'#3#176#0#0#9'T' - +'MenuItem'#7'mnuFile'#7'Caption'#6#5'&File'#0#9'TMenuItem'#7'mnuOpen'#6'Acti' - +'on'#7#6'AcOpen'#7'OnClick'#7#13'acOpenExecute'#0#0#9'TMenuItem'#9'mnuSaveAs' - +#6'Action'#7#8'AcSaveAs'#7'OnClick'#7#15'acSaveAsExecute'#0#0#9'TMenuItem'#9 - +'MenuItem1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#7'mnuQuit'#6'Action'#7#6'AcQu' - +'it'#7'OnClick'#7#13'acQuitExecute'#0#0#0#0#10'TImageList'#10'ImageList1'#4 - +'left'#3#176#0#3'top'#2'x'#6'Bitmap'#10#14#12#0#0'Li'#3#0#0#0#16#0#0#0#16#0#0 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228#187#146#255 - +#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#15'goFixedHorzLine'#10'goVertLine'#10'goHorzLine'#13'goRangeSelect'#11'goRo' + +'wSizing'#11'goColSizing'#15'goThumbTracking'#14'goSmoothScroll'#14'goCellEl' + +'lipsis'#0#8'TabOrder'#2#0#10'TitleStyle'#7#8'tsNative'#0#0#0#0#8'TToolBar'#8 + +'ToolBar1'#4'Left'#2#0#6'Height'#2#26#3'Top'#2#0#5'Width'#3#144#1#7'Caption' + +#6#8'ToolBar1'#11'EdgeBorders'#11#0#6'Images'#7#10'ImageList1'#8'TabOrder'#2 + +#2#0#11'TToolButton'#11'ToolButton1'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#6'Ac' + +'Open'#0#0#11'TToolButton'#11'ToolButton2'#4'Left'#2#24#3'Top'#2#0#6'Action' + +#7#8'AcSaveAs'#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#2'4'#3'Top'#2#0#6 + +'Action'#7#6'AcQuit'#0#0#11'TToolButton'#11'ToolButton5'#4'Left'#2'/'#3'Top' + +#2#0#5'Width'#2#5#7'Caption'#6#11'ToolButton5'#5'Style'#7#10'tbsDivider'#0#0 + +#0#11'TOpenDialog'#11'OpenDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#192 + +'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|Libre' + +'Office/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_p' + +'ipes)|.wikitable_pipes|All files (*.*)|*.*'#7'Options'#11#20'ofExtensionDif' + +'ferent'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2'@'#3'top'#3#176#0#0 + +#0#11'TSaveDialog'#11'SaveDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#185 + +'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|Libre' + +'Office/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (wikimedia) (.wikitab' + +'le_wikimedia)|*.wikitable_wikimedia'#7'Options'#11#20'ofExtensionDifferent' + +#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#3#176#0#3'top'#3#176#0#0#0#9 + +'TMainMenu'#9'MainMenu1'#6'Images'#7#10'ImageList1'#4'left'#3' '#1#3'top'#3 + +#176#0#0#9'TMenuItem'#7'mnuFile'#7'Caption'#6#5'&File'#0#9'TMenuItem'#7'mnuO' + +'pen'#6'Action'#7#6'AcOpen'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0 + +#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0 + +'d'#0#0#0#0#0#0#0#0#0#0#0','#134#216#0'-'#136#216#247'-'#135#216#247'-'#136 + +#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136 + +#216#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134 + +#216#0#255#255#255#0#255#255#255#0'3'#142#217#251#220#240#250#255#152#225#246 + +#255#149#224#246#255#146#223#246#255#142#222#245#255#137#220#245#255#133#218 + +#244#255#128#217#244#255'z'#215#243#255't'#213#243#255'p'#211#242#255#194#234 + +#248#255'5'#148#218#255#255#255#255#0#255#255#255#0'5'#148#218#247#239#250 + +#254#255#147#229#248#255#143#228#248#255#137#227#248#255#130#225#247#255'z' + +#223#247#255'q'#222#246#255'g'#219#245#255'['#216#244#255'M'#212#243#255'@' + +#209#242#255#202#242#251#255'5'#148#218#255#255#255#255#0#255#255#255#0'6' + +#154#218#248#242#250#253#255#148#230#248#255#146#229#248#255#144#229#248#255 + +#139#227#248#255#134#226#247#255#127#225#247#255'w'#222#246#255'l'#220#246 + +#255'^'#217#244#255'O'#213#243#255#204#242#251#255'5'#148#218#255#255#255#255 + +#0#255#255#255#0'6'#161#218#249#246#252#254#255#148#229#248#255#147#229#248 + +#255#147#229#248#255#145#229#248#255#147#219#233#255#147#215#227#255#147#210 + +#220#255#144#206#215#255#140#200#207#255#134#193#198#255#201#216#214#255'5' + +#148#218#255#197'tD'#232#202#127'S'#241'7'#166#218#250#254#255#255#255#248 + +#253#255#255#246#253#255#255#245#252#255#255#243#252#254#255#154#228#244#255 + +#154#230#247#255#155#230#246#255#157#229#245#255#158#229#245#255#159#229#244 + +#255#218#243#248#255'5'#148#218#255#253#244#238#255#202#128'T'#249'5'#171#218 + ,#250#232#246#251#255'p'#188#231#255'U'#170#226#255'M'#165#224#255#145#201#235 + +#255#250#243#239#255#253#254#253#255#255#253#252#255#255#253#252#255#254#253 + +#252#255#254#252#251#255#254#254#253#255'5'#148#218#255#239#242#232#255#206 + +#129'V'#255'6'#170#218#242#241#250#253#255#148#222#245#255#147#220#244#255'd' + +#188#233#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5' + +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255#251 + +#246#239#255#204#131'U'#254'5'#175#218#240#247#252#254#255#142#228#248#255 + +#145#222#245#255#159#224#245#255#172#225#246#255#202#132'R'#255#255#247#241 + +#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215#255#255#229 + +#210#255#255#226#203#255#255#247#241#255#203#133'U'#254'6'#179#218#248#253 + +#254#254#255#254#255#255#255#254#254#255#255#253#254#255#255#254#255#255#255 + +#228#186#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253#230#212 + +#255#252#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255#204#134 + +'V'#254'4'#180#217#208'^'#194#225#250'`'#195#226#250'`'#195#226#250'`'#195 + +#226#250'_'#195#226#250#228#187#145#255#255#247#242#255#254#231#213#255#254 + +#231#213#255#253#229#209#255#250#224#202#255#249#222#196#255#247#217#188#255 + +#253#242#231#255#204#135'W'#254#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254#247#241#255#252 + +#229#210#255#252#228#209#255#251#226#204#255#249#221#196#255#246#215#187#255 + +#243#209#175#255#250#239#228#255#204#135'X'#254#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254 + +#246#240#255#252#226#205#255#252#227#205#255#250#223#200#255#247#217#188#255 + +#245#233#221#255#250#243#235#255#251#248#243#255#202#131'S'#254#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228 + +#187#147#255#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255 + +#245#211#180#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#229#190#150#255#255#255#254#255#253#243#233#255#253#243#234#255 +#252#242#232#255#250#239#227#255#250#242#231#255#234#187#136#255#207#133'U' +#179#180'i='#12#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#228#187#147#255#254#245#237#255#252#222#197#255#251 - +#224#199#255#249#220#194#255#245#211#180#255#254#249#243#255#250#226#196#255 - +#236#193#147#255#195'}H'#147#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254#246#240#255#252 - +#226#205#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255 - +#250#243#235#255#251#248#243#255#202#131'S'#254#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254 - +#247#241#255#252#229#210#255#252#228#209#255#251#226#204#255#249#221#196#255 - +#246#215#187#255#243#209#175#255#250#239#228#255#204#135'X'#254'4'#180#217 - +#208'^'#194#225#250'`'#195#226#250'`'#195#226#250'`'#195#226#250'_'#195#226 - ,#250#228#187#145#255#255#247#242#255#254#231#213#255#254#231#213#255#253#229 - +#209#255#250#224#202#255#249#222#196#255#247#217#188#255#253#242#231#255#204 - +#135'W'#254'6'#179#218#248#253#254#254#255#254#255#255#255#254#254#255#255 - +#253#254#255#255#254#255#255#255#228#186#145#255#255#247#240#255#255#231#213 - +#255#253#231#214#255#253#230#212#255#252#228#208#255#251#227#203#255#250#220 - +#194#255#254#243#232#255#204#134'V'#254'5'#175#218#240#247#252#254#255#142 - +#228#248#255#145#222#245#255#159#224#245#255#172#225#246#255#202#132'R'#255 - +#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255#255#231#215 - +#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133'U'#254'6'#170 - +#218#242#241#250#253#255#148#222#245#255#147#220#244#255'd'#188#233#255'5' - +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5' - +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255#251#246#239#255#204 - +#131'U'#254'5'#171#218#250#232#246#251#255'p'#188#231#255'U'#170#226#255'M' - +#165#224#255#145#201#235#255#250#243#239#255#253#254#253#255#255#253#252#255 - +#255#253#252#255#254#253#252#255#254#252#251#255#254#254#253#255'5'#148#218 - +#255#239#242#232#255#206#129'V'#255'7'#166#218#250#254#255#255#255#248#253 - +#255#255#246#253#255#255#245#252#255#255#243#252#254#255#154#228#244#255#154 - +#230#247#255#155#230#246#255#157#229#245#255#158#229#245#255#159#229#244#255 - +#218#243#248#255'5'#148#218#255#253#244#238#255#202#128'T'#249'6'#161#218#249 - +#246#252#254#255#148#229#248#255#147#229#248#255#147#229#248#255#145#229#248 - +#255#147#219#233#255#147#215#227#255#147#210#220#255#144#206#215#255#140#200 - +#207#255#134#193#198#255#201#216#214#255'5'#148#218#255#197'tD'#232#202#127 - +'S'#241'6'#154#218#248#242#250#253#255#148#230#248#255#146#229#248#255#144 - +#229#248#255#139#227#248#255#134#226#247#255#127#225#247#255'w'#222#246#255 - +'l'#220#246#255'^'#217#244#255'O'#213#243#255#204#242#251#255'5'#148#218#255 - +#255#255#255#0#255#255#255#0'5'#148#218#247#239#250#254#255#147#229#248#255 - +#143#228#248#255#137#227#248#255#130#225#247#255'z'#223#247#255'q'#222#246 - +#255'g'#219#245#255'['#216#244#255'M'#212#243#255'@'#209#242#255#202#242#251 - +#255'5'#148#218#255#255#255#255#0#255#255#255#0'3'#142#217#251#220#240#250 - +#255#152#225#246#255#149#224#246#255#146#223#246#255#142#222#245#255#137#220 - +#245#255#133#218#244#255#128#217#244#255'z'#215#243#255't'#213#243#255'p'#211 - +#242#255#194#234#248#255'5'#148#218#255#255#255#255#0#255#255#255#0','#134 - +#216#0'-'#136#216#247'-'#135#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 - +#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 - +#247'-'#135#216#247'-'#136#216#247','#134#216#0#255#255#255#0#255#255#255#0 - +#188'k6q'#188'k6'#144#188'k6'#204#188'k6'#238#188'k6'#250#187'k6'#254#187'k6' - +#255#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239 - +#187'p>'#203#182'i5T'#255#255#255#0#188'k6'#155#246#224#209#255#247#224#209 - +#255#254#251#248#255#254#251#247#255#253#249#246#255#252#245#240#255#250#240 - +#234#255#251#242#237#255#253#249#246#255#253#250#247#255#251#241#235#255#248 - +#233#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188'k6'#216#246#223#209 - +#255#233#170#128#255#254#250#246#255#253#250#246#255#200#140'd'#255#251#243 - +#238#255#251#241#234#255#252#246#242#255#254#251#248#255#252#246#241#255#249 - +#236#226#255#248#231#219#255#238#208#186#255#236#208#189#255#187'p>'#248#188 - +'k6'#240#246#223#208#255#232#168'~'#255#252#246#241#255#252#246#241#255#200 - +#140'd'#255#250#241#233#255#251#244#238#255#253#250#247#255#253#249#246#255 - +#250#240#232#255#248#232#221#255#247#230#219#255#225#163'z'#255#239#213#195 - +#255#183'i5'#254#188'k6'#250#245#221#204#255#231#168'~'#255#250#240#232#255 - +#250#240#232#255#201#141'f'#255#250#240#233#255#253#248#243#255#254#250#248 - +#255#252#244#239#255#249#233#223#255#247#231#219#255#247#229#217#255#224#162 - +'x'#255#231#194#169#255#182'h5'#255#187'k6'#254#244#220#201#255#231#167'}' - +#255#249#236#225#255#249#236#225#255#249#237#227#255#252#244#238#255#253#250 - +#247#255#253#247#243#255#250#237#229#255#247#231#219#255#247#229#217#255#246 - +#229#216#255#222#160'w'#255#228#190#164#255#180'g4'#255#187'k6'#255#244#217 - +#199#255#230#166'}'#255#200#140'd'#255#201#141'e'#255#201#142'g'#255#203#146 - +'l'#255#203#146'm'#255#202#144'i'#255#200#140'e'#255#200#140'd'#255#200#140 - +'d'#255#200#140'd'#255#218#156't'#255#225#186#159#255#179'f4'#255#187'j6'#255 - +#242#216#197#255#227#164'{'#255#227#163'z'#255#227#164'z'#255#226#164'{'#255 - +#226#163'{'#255#225#163'{'#255#225#162'y'#255#223#160'w'#255#222#159'v'#255 - +#221#158't'#255#219#156'r'#255#220#157't'#255#221#181#154#255#177'e4'#255#187 - +'j6'#255#242#213#194#255#227#163'z'#255#227#163'z'#255#226#163'{'#255#226#163 - +'{'#255#226#164'{'#255#225#162'y'#255#224#161'x'#255#222#160'w'#255#222#158 - +'u'#255#220#157't'#255#218#155's'#255#217#155's'#255#218#176#149#255#175'd3' - +#255#187'j6'#255#240#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z'#255 - ,#226#163'{'#255#225#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v'#255 - +#220#157't'#255#217#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142#255 - +#173'c3'#255#186'j6'#255#239#208#187#255#226#162'z'#255#254#251#248#255#254 - +#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255 - +#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#211#150'm' - +#255#210#167#138#255#171'b2'#255#187'k8'#255#239#206#184#255#225#162'y'#255 - +#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255 - +'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246#255 - +#207#147'j'#255#206#163#132#255#170'a2'#255#187'l8'#255#238#204#182#255#225 - +#162'z'#255#254#250#247#255#191#220#194#255#191#220#194#255#191#220#194#255 + +#255#255#0#255#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228 + +#187#146#255#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9 + +#255#255#255#0#7'OnClick'#7#13'acOpenExecute'#0#0#9'TMenuItem'#9'mnuSaveAs'#6 + +'Action'#7#8'AcSaveAs'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0 + +#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0 + +#0#0#0#0#0#0#0#0#0#0#186'j6'#0#185'i5'#181#184'i5'#238#183'h5'#255#181'h5' + +#255#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255 + +#169'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196#186'j5'#222#235 + +#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254#251#248#255 + +#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248 + +#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y'#255#167'`1' + +#237#186'k7'#254#237#202#179#255#224#162'z'#255#254#250#247#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255#253#249#246#255#202#141'e'#255#201#155'|' + +#255#167'`1'#254#187'l8'#255#238#204#182#255#225#162'z'#255#254#250#247#255 +#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194 - +#255#253#249#246#255#205#144'h'#255#204#158#129#255#168'a2'#255#186'k7'#254 - +#237#202#179#255#224#162'z'#255#254#250#247#255'b'#192#136#255'b'#192#136#255 - +'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255 - +'b'#192#136#255#253#249#246#255#202#141'e'#255#201#155'|'#255#167'`1'#254#186 - +'j5'#222#235#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254 - +#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255 - +#254#251#248#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y' - +#255#167'`1'#237#186'j6'#0#185'i5'#181#184'i5'#238#183'h5'#255#181'h5'#255 - +#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255#169 - +'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0'm'#156#212#137'j'#154#210#251'f'#151#207#238#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219 - +'m'#156#212#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0 - +#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255'www'#255'uuu'#255 - +'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171#211#232#255#169 - +#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255#255#255#0'}}}' - +#255#153#153#153#255#153#153#153#255#154#154#154#255#154#154#154#255#155#155 - +#155#255#155#155#155#255'o'#157#211#255#170#209#231#255#171#209#231#255#152 - +#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193#234#255#255#255#0#255 - +#255#255#0'zzz'#255#153#153#153#255'R'#145'Y'#255#153#154#153#255#155#155#155 - +#255#156#156#156#255#156#156#156#255'l'#154#208#255#167#206#229#255#143#193 - +#223#255#137#189#220#255#139#189#220#255'S'#141#182#255'K'#132#188#234#255 - +#255#255#0#255#255#255#0'www'#255#154#154#154#255'='#138'E'#255'I'#138'O'#255 - +#156#156#156#255#157#157#157#255#157#157#157#255'f'#150#204#255#162#203#227 - +#255#137#189#220#255#131#185#218#255#132#185#218#255'Q'#139#181#255'C~'#182 - +#234'D'#148'M'#255'B'#145'K'#255'?'#141'H'#255'='#137'E'#255']'#164'e'#255'Z' - +#160'a'#255'E'#131'K'#255#158#158#158#255#158#158#158#255'`'#146#201#255#158 - +#199#226#255#131#184#218#255'}'#180#215#255'~'#179#215#255'O'#137#180#255';y' - +#177#234'A'#144'J'#255#148#210#159#255#145#208#154#255#141#205#150#255#137 - +#203#146#255#132#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159#255'Z'#142 - +#196#255#152#195#224#255'|'#179#215#255't'#175#214#255'^'#196#237#255'K'#136 - +#179#255'4s'#171#234'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129 - +#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255 - +'T'#137#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255 - +'B'#139#184#255',n'#166#234';'#135'B'#255#137#203#146#255#132#200#141#255#128 - +#198#136#255'{'#195#131#255'w'#193#127#255'G'#143'M'#255';t?'#255#161#161#161 - +#255'L'#132#186#255#141#187#219#255'n'#168#209#255'f'#166#209#255'_'#180#223 - +#255'G'#133#177#255'%i'#161#234'7'#130'>'#255'4~;'#255'1y7'#255'.u4'#255'I' - +#145'P'#255'F'#143'L'#255'9s='#255#161#161#161#255#162#162#162#255'E~'#180 - +#255#136#183#217#255'g'#163#207#255'a'#158#204#255'c'#159#204#255'E'#131#177 - +#255#31'd'#156#234#255#255#255#0#255#255#255#0'```'#255#160#160#160#255'=vA' - +#255'6q9'#255#162#162#162#255#162#162#162#255#163#163#163#255'=y'#176#255#130 - +#179#215#255'b'#159#204#255'Z'#154#201#255'^'#155#202#255'C'#129#175#255#25 - +'`'#152#234#255#255#255#0#255#255#255#0'\\\'#255#161#161#161#255'~'#173#255#12'W'#143#234#255#255#255#0#255#255#255#0 + +#255#191#220#194#255#191#220#194#255#191#220#194#255#253#249#246#255#205#144 + +'h'#255#204#158#129#255#168'a2'#255#187'k8'#255#239#206#184#255#225#162'y' + +#255#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136 + +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246 + +#255#207#147'j'#255#206#163#132#255#170'a2'#255#186'j6'#255#239#208#187#255 + +#226#162'z'#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248 + +#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251 + +#248#255#254#251#248#255#211#150'm'#255#210#167#138#255#171'b2'#255#187'j6' + +#255#240#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z'#255#226#163'{' + +#255#225#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v'#255#220#157't' + +#255#217#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142#255#173'c3'#255 + +#187'j6'#255#242#213#194#255#227#163'z'#255#227#163'z'#255#226#163'{'#255#226 + +#163'{'#255#226#164'{'#255#225#162'y'#255#224#161'x'#255#222#160'w'#255#222 + +#158'u'#255#220#157't'#255#218#155's'#255#217#155's'#255#218#176#149#255#175 + +'d3'#255#187'j6'#255#242#216#197#255#227#164'{'#255#227#163'z'#255#227#164'z' + +#255#226#164'{'#255#226#163'{'#255#225#163'{'#255#225#162'y'#255#223#160'w' + +#255#222#159'v'#255#221#158't'#255#219#156'r'#255#220#157't'#255#221#181#154 + +#255#177'e4'#255#187'k6'#255#244#217#199#255#230#166'}'#255#200#140'd'#255 + ,#201#141'e'#255#201#142'g'#255#203#146'l'#255#203#146'm'#255#202#144'i'#255 + +#200#140'e'#255#200#140'd'#255#200#140'd'#255#200#140'd'#255#218#156't'#255 + +#225#186#159#255#179'f4'#255#187'k6'#254#244#220#201#255#231#167'}'#255#249 + +#236#225#255#249#236#225#255#249#237#227#255#252#244#238#255#253#250#247#255 + +#253#247#243#255#250#237#229#255#247#231#219#255#247#229#217#255#246#229#216 + +#255#222#160'w'#255#228#190#164#255#180'g4'#255#188'k6'#250#245#221#204#255 + +#231#168'~'#255#250#240#232#255#250#240#232#255#201#141'f'#255#250#240#233 + +#255#253#248#243#255#254#250#248#255#252#244#239#255#249#233#223#255#247#231 + +#219#255#247#229#217#255#224#162'x'#255#231#194#169#255#182'h5'#255#188'k6' + +#240#246#223#208#255#232#168'~'#255#252#246#241#255#252#246#241#255#200#140 + +'d'#255#250#241#233#255#251#244#238#255#253#250#247#255#253#249#246#255#250 + +#240#232#255#248#232#221#255#247#230#219#255#225#163'z'#255#239#213#195#255 + +#183'i5'#254#188'k6'#216#246#223#209#255#233#170#128#255#254#250#246#255#253 + +#250#246#255#200#140'd'#255#251#243#238#255#251#241#234#255#252#246#242#255 + +#254#251#248#255#252#246#241#255#249#236#226#255#248#231#219#255#238#208#186 + +#255#236#208#189#255#187'p>'#248#188'k6'#155#246#224#209#255#247#224#209#255 + +#254#251#248#255#254#251#247#255#253#249#246#255#252#245#240#255#250#240#234 + +#255#251#242#237#255#253#249#246#255#253#250#247#255#251#241#235#255#248#233 + +#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188'k6q'#188'k6'#144#188'k6' + +#204#188'k6'#238#188'k6'#250#187'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255 + +#188'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239#187'p>'#203#182'i5T'#255#255 + +#255#0#7'OnClick'#7#15'acSaveAsExecute'#0#0#9'TMenuItem'#9'MenuItem1'#7'Capt' + +'ion'#6#1'-'#0#0#9'TMenuItem'#7'mnuQuit'#6'Action'#7#6'AcQuit'#11'Bitmap.Dat' + +'a'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0 + +#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']'#149'b'#16'Z'#146#136 - +#13'X'#144#164#19'\'#146#252#12'W'#143#237#0#0#11'TActionList'#11'ActionList' - +'1'#4'left'#3#176#0#3'top'#2'@'#0#7'TAction'#6'AcOpen'#7'Caption'#6#7'Open..' - +'.'#10'ImageIndex'#2#0#9'OnExecute'#7#13'acOpenExecute'#0#0#7'TAction'#8'AcS' - +'aveAs'#7'Caption'#6#10'Save as...'#10'ImageIndex'#2#1#9'OnExecute'#7#15'acS' - +'aveAsExecute'#0#0#7'TAction'#6'AcQuit'#7'Caption'#6#4'Quit'#10'ImageIndex'#2 - +#2#9'OnExecute'#7#13'acQuitExecute'#0#0#0#0 + +#255#255#0#255#255#255#0#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']'#149'b' + +#16'Z'#146#136#13'X'#144#164#19'\'#146#252#12'W'#143#237#153#153#153#255'qqq' + +#255'TTT'#255'QQQ'#255'OOO'#255'LLL'#255'JJJ'#255'GGG'#255'EEE'#255'%g'#157 + +#255'2t'#168#255'=|'#175#255'G'#132#181#255'N'#138#186#255'>~'#173#255#12'W' + +#143#234#255#255#255#0#255#255#255#0'XXX'#255#162#162#162#255#162#162#162#255 + +#163#163#163#255#164#164#164#255#164#164#164#255#165#165#165#255'/o'#165#255 + +'x'#171#210#255'x'#171#211#255's'#167#209#255'i'#160#205#255'@'#127#174#255 + +#15'Y'#145#234#255#255#255#0#255#255#255#0'\\\'#255#161#161#161#255''#255'4~;'#255'1y7'#255'.u4'#255'I'#145'P'#255'F'#143'L'#255 + +'9s='#255#161#161#161#255#162#162#162#255'E~'#180#255#136#183#217#255'g'#163 + +#207#255'a'#158#204#255'c'#159#204#255'E'#131#177#255#31'd'#156#234';'#135'B' + +#255#137#203#146#255#132#200#141#255#128#198#136#255'{'#195#131#255'w'#193 + +#127#255'G'#143'M'#255';t?'#255#161#161#161#255'L'#132#186#255#141#187#219 + +#255'n'#168#209#255'f'#166#209#255'_'#180#223#255'G'#133#177#255'%i'#161#234 + +'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129#255's'#192'|'#255't' + +#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255'T'#137#191#255#148#191 + +#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255'B'#139#184#255',n'#166 + +#234'A'#144'J'#255#148#210#159#255#145#208#154#255#141#205#150#255#137#203 + +#146#255#132#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159#255'Z'#142#196 + +#255#152#195#224#255'|'#179#215#255't'#175#214#255'^'#196#237#255'K'#136#179 + +#255'4s'#171#234'D'#148'M'#255'B'#145'K'#255'?'#141'H'#255'='#137'E'#255']' + +#164'e'#255'Z'#160'a'#255'E'#131'K'#255#158#158#158#255#158#158#158#255'`' + +#146#201#255#158#199#226#255#131#184#218#255'}'#180#215#255'~'#179#215#255'O' + +#137#180#255';y'#177#234#255#255#255#0#255#255#255#0'www'#255#154#154#154#255 + +'='#138'E'#255'I'#138'O'#255#156#156#156#255#157#157#157#255#157#157#157#255 + +'f'#150#204#255#162#203#227#255#137#189#220#255#131#185#218#255#132#185#218 + +#255'Q'#139#181#255'C~'#182#234#255#255#255#0#255#255#255#0'zzz'#255#153#153 + +#153#255'R'#145'Y'#255#153#154#153#255#155#155#155#255#156#156#156#255#156 + +#156#156#255'l'#154#208#255#167#206#229#255#143#193#223#255#137#189#220#255 + +#139#189#220#255'S'#141#182#255'K'#132#188#234#255#255#255#0#255#255#255#0'}' + +'}}'#255#153#153#153#255#153#153#153#255#154#154#154#255#154#154#154#255#155 + +#155#155#255#155#155#155#255'o'#157#211#255#170#209#231#255#171#209#231#255 + +#152#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193#234#255#255#255#0 + ,#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255'www'#255'uuu'#255 + +'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171#211#232#255#169 + +#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219'm'#156#212 + +#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'm'#156#212#137'j'#154#210#251'f'#151#207#238#7'OnClick'#7#13'acQuitEx' + +'ecute'#0#0#0#0#10'TImageList'#10'ImageList1'#4'left'#3#176#0#3'top'#2'x'#6 + +'Bitmap'#10#14#12#0#0'Li'#3#0#0#0#16#0#0#0#16#0#0#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#234#195#157#255 + +#230#191#150#255#228#187#146#255#228#187#146#255#209#160'l'#245#208#158'm' + +#246#204#150'_'#218#196'yB~'#178'g<'#9#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#229#190#150 + +#255#255#255#254#255#253#243#233#255#253#243#234#255#252#242#232#255#250#239 + +#227#255#250#242#231#255#234#187#136#255#207#133'U'#179#180'i='#12#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#228#187#147#255#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194 + +#255#245#211#180#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H' + +#147#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#228#187#146#255#254#246#240#255#252#226#205#255#252#227#205 + +#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243#235#255#251#248 + +#243#255#202#131'S'#254#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#228#187#146#255#254#247#241#255#252#229#210 + +#255#252#228#209#255#251#226#204#255#249#221#196#255#246#215#187#255#243#209 + +#175#255#250#239#228#255#204#135'X'#254'4'#180#217#208'^'#194#225#250'`'#195 + +#226#250'`'#195#226#250'`'#195#226#250'_'#195#226#250#228#187#145#255#255#247 + +#242#255#254#231#213#255#254#231#213#255#253#229#209#255#250#224#202#255#249 + +#222#196#255#247#217#188#255#253#242#231#255#204#135'W'#254'6'#179#218#248 + +#253#254#254#255#254#255#255#255#254#254#255#255#253#254#255#255#254#255#255 + +#255#228#186#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253#230 + +#212#255#252#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255#204 + +#134'V'#254'5'#175#218#240#247#252#254#255#142#228#248#255#145#222#245#255 + +#159#224#245#255#172#225#246#255#202#132'R'#255#255#247#241#255#255#233#217 + +#255#255#234#219#255#255#233#217#255#255#231#215#255#255#229#210#255#255#226 + +#203#255#255#247#241#255#203#133'U'#254'6'#170#218#242#241#250#253#255#148 + +#222#245#255#147#220#244#255'd'#188#233#255'5'#148#218#255'5'#148#218#255'5' + +#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5'#148#218#255'5' + +#148#218#255'5'#148#218#255#251#246#239#255#204#131'U'#254'5'#171#218#250#232 + +#246#251#255'p'#188#231#255'U'#170#226#255'M'#165#224#255#145#201#235#255#250 + +#243#239#255#253#254#253#255#255#253#252#255#255#253#252#255#254#253#252#255 + +#254#252#251#255#254#254#253#255'5'#148#218#255#239#242#232#255#206#129'V' + +#255'7'#166#218#250#254#255#255#255#248#253#255#255#246#253#255#255#245#252 + +#255#255#243#252#254#255#154#228#244#255#154#230#247#255#155#230#246#255#157 + +#229#245#255#158#229#245#255#159#229#244#255#218#243#248#255'5'#148#218#255 + +#253#244#238#255#202#128'T'#249'6'#161#218#249#246#252#254#255#148#229#248 + +#255#147#229#248#255#147#229#248#255#145#229#248#255#147#219#233#255#147#215 + +#227#255#147#210#220#255#144#206#215#255#140#200#207#255#134#193#198#255#201 + +#216#214#255'5'#148#218#255#197'tD'#232#202#127'S'#241'6'#154#218#248#242#250 + +#253#255#148#230#248#255#146#229#248#255#144#229#248#255#139#227#248#255#134 + +#226#247#255#127#225#247#255'w'#222#246#255'l'#220#246#255'^'#217#244#255'O' + +#213#243#255#204#242#251#255'5'#148#218#255#255#255#255#0#255#255#255#0'5' + +#148#218#247#239#250#254#255#147#229#248#255#143#228#248#255#137#227#248#255 + +#130#225#247#255'z'#223#247#255'q'#222#246#255'g'#219#245#255'['#216#244#255 + +'M'#212#243#255'@'#209#242#255#202#242#251#255'5'#148#218#255#255#255#255#0 + +#255#255#255#0'3'#142#217#251#220#240#250#255#152#225#246#255#149#224#246#255 + +#146#223#246#255#142#222#245#255#137#220#245#255#133#218#244#255#128#217#244 + +#255'z'#215#243#255't'#213#243#255'p'#211#242#255#194#234#248#255'5'#148#218 + +#255#255#255#255#0#255#255#255#0','#134#216#0'-'#136#216#247'-'#135#216#247 + +'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247 + +'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247 + +','#134#216#0#255#255#255#0#255#255#255#0#188'k6q'#188'k6'#144#188'k6'#204 + +#188'k6'#238#188'k6'#250#187'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255#188 + ,'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239#187'p>'#203#182'i5T'#255#255#255 + +#0#188'k6'#155#246#224#209#255#247#224#209#255#254#251#248#255#254#251#247 + +#255#253#249#246#255#252#245#240#255#250#240#234#255#251#242#237#255#253#249 + +#246#255#253#250#247#255#251#241#235#255#248#233#223#254#236#208#189#251#201 + +#137'^'#236#181'i5c'#188'k6'#216#246#223#209#255#233#170#128#255#254#250#246 + +#255#253#250#246#255#200#140'd'#255#251#243#238#255#251#241#234#255#252#246 + +#242#255#254#251#248#255#252#246#241#255#249#236#226#255#248#231#219#255#238 + +#208#186#255#236#208#189#255#187'p>'#248#188'k6'#240#246#223#208#255#232#168 + +'~'#255#252#246#241#255#252#246#241#255#200#140'd'#255#250#241#233#255#251 + +#244#238#255#253#250#247#255#253#249#246#255#250#240#232#255#248#232#221#255 + +#247#230#219#255#225#163'z'#255#239#213#195#255#183'i5'#254#188'k6'#250#245 + +#221#204#255#231#168'~'#255#250#240#232#255#250#240#232#255#201#141'f'#255 + +#250#240#233#255#253#248#243#255#254#250#248#255#252#244#239#255#249#233#223 + +#255#247#231#219#255#247#229#217#255#224#162'x'#255#231#194#169#255#182'h5' + +#255#187'k6'#254#244#220#201#255#231#167'}'#255#249#236#225#255#249#236#225 + +#255#249#237#227#255#252#244#238#255#253#250#247#255#253#247#243#255#250#237 + +#229#255#247#231#219#255#247#229#217#255#246#229#216#255#222#160'w'#255#228 + +#190#164#255#180'g4'#255#187'k6'#255#244#217#199#255#230#166'}'#255#200#140 + +'d'#255#201#141'e'#255#201#142'g'#255#203#146'l'#255#203#146'm'#255#202#144 + +'i'#255#200#140'e'#255#200#140'd'#255#200#140'd'#255#200#140'd'#255#218#156 + +'t'#255#225#186#159#255#179'f4'#255#187'j6'#255#242#216#197#255#227#164'{' + +#255#227#163'z'#255#227#164'z'#255#226#164'{'#255#226#163'{'#255#225#163'{' + +#255#225#162'y'#255#223#160'w'#255#222#159'v'#255#221#158't'#255#219#156'r' + +#255#220#157't'#255#221#181#154#255#177'e4'#255#187'j6'#255#242#213#194#255 + +#227#163'z'#255#227#163'z'#255#226#163'{'#255#226#163'{'#255#226#164'{'#255 + +#225#162'y'#255#224#161'x'#255#222#160'w'#255#222#158'u'#255#220#157't'#255 + +#218#155's'#255#217#155's'#255#218#176#149#255#175'd3'#255#187'j6'#255#240 + +#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z'#255#226#163'{'#255#225 + +#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v'#255#220#157't'#255#217 + +#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142#255#173'c3'#255#186'j6' + +#255#239#208#187#255#226#162'z'#255#254#251#248#255#254#251#248#255#254#251 + +#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254 + +#251#248#255#254#251#248#255#254#251#248#255#211#150'm'#255#210#167#138#255 + +#171'b2'#255#187'k8'#255#239#206#184#255#225#162'y'#255#254#250#247#255'b' + +#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b' + +#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246#255#207#147'j'#255#206 + +#163#132#255#170'a2'#255#187'l8'#255#238#204#182#255#225#162'z'#255#254#250 + +#247#255#191#220#194#255#191#220#194#255#191#220#194#255#191#220#194#255#191 + +#220#194#255#191#220#194#255#191#220#194#255#191#220#194#255#253#249#246#255 + +#205#144'h'#255#204#158#129#255#168'a2'#255#186'k7'#254#237#202#179#255#224 + +#162'z'#255#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b' + +#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253 + +#249#246#255#202#141'e'#255#201#155'|'#255#167'`1'#254#186'j5'#222#235#198 + +#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254#251#248#255#254 + +#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255 + +#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y'#255#167'`1'#237 + +#186'j6'#0#185'i5'#181#184'i5'#238#183'h5'#255#181'h5'#255#180'g4'#255#178'f' + +'4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255#169'a2'#255#168'`1' + +#255#167'`1'#254#166'`1'#241#168'a1'#196#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'm'#156 + +#212#137'j'#154#210#251'f'#151#207#238#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219'm'#156#212#255#133 + +#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0#255#255#255#0#128 + +#128#128#255'~~~'#255'|||'#255'zzz'#255'www'#255'uuu'#255'rrr'#255'q'#158#212 + +#255'o'#158#214#255#135#178#220#255#171#211#232#255#169#208#230#255'X'#144 + +#184#255'Y'#142#198#234#255#255#255#0#255#255#255#0'}}}'#255#153#153#153#255 + +#153#153#153#255#154#154#154#255#154#154#154#255#155#155#155#255#155#155#155 + +#255'o'#157#211#255#170#209#231#255#171#209#231#255#152#199#225#255#145#194 + +#222#255'V'#143#183#255'R'#137#193#234#255#255#255#0#255#255#255#0'zzz'#255 + +#153#153#153#255'R'#145'Y'#255#153#154#153#255#155#155#155#255#156#156#156 + +#255#156#156#156#255'l'#154#208#255#167#206#229#255#143#193#223#255#137#189 + +#220#255#139#189#220#255'S'#141#182#255'K'#132#188#234#255#255#255#0#255#255 + ,#255#0'www'#255#154#154#154#255'='#138'E'#255'I'#138'O'#255#156#156#156#255 + +#157#157#157#255#157#157#157#255'f'#150#204#255#162#203#227#255#137#189#220 + +#255#131#185#218#255#132#185#218#255'Q'#139#181#255'C~'#182#234'D'#148'M'#255 + +'B'#145'K'#255'?'#141'H'#255'='#137'E'#255']'#164'e'#255'Z'#160'a'#255'E'#131 + +'K'#255#158#158#158#255#158#158#158#255'`'#146#201#255#158#199#226#255#131 + +#184#218#255'}'#180#215#255'~'#179#215#255'O'#137#180#255';y'#177#234'A'#144 + +'J'#255#148#210#159#255#145#208#154#255#141#205#150#255#137#203#146#255#132 + +#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159#255'Z'#142#196#255#152#195 + +#224#255'|'#179#215#255't'#175#214#255'^'#196#237#255'K'#136#179#255'4s'#171 + +#234'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129#255's'#192'|' + +#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255'T'#137#191#255 + +#148#191#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255'B'#139#184#255 + +',n'#166#234';'#135'B'#255#137#203#146#255#132#200#141#255#128#198#136#255'{' + +#195#131#255'w'#193#127#255'G'#143'M'#255';t?'#255#161#161#161#255'L'#132#186 + +#255#141#187#219#255'n'#168#209#255'f'#166#209#255'_'#180#223#255'G'#133#177 + +#255'%i'#161#234'7'#130'>'#255'4~;'#255'1y7'#255'.u4'#255'I'#145'P'#255'F' + +#143'L'#255'9s='#255#161#161#161#255#162#162#162#255'E~'#180#255#136#183#217 + +#255'g'#163#207#255'a'#158#204#255'c'#159#204#255'E'#131#177#255#31'd'#156 + +#234#255#255#255#0#255#255#255#0'```'#255#160#160#160#255'=vA'#255'6q9'#255 + +#162#162#162#255#162#162#162#255#163#163#163#255'=y'#176#255#130#179#215#255 + +'b'#159#204#255'Z'#154#201#255'^'#155#202#255'C'#129#175#255#25'`'#152#234 + +#255#255#255#0#255#255#255#0'\\\'#255#161#161#161#255'~'#173#255#12'W'#143#234#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']'#149'b'#16'Z'#146#136#13'X'#144 + +#164#19'\'#146#252#12'W'#143#237#0#0#11'TActionList'#11'ActionList1'#4'left' + +#3#176#0#3'top'#2'@'#0#7'TAction'#6'AcOpen'#7'Caption'#6#7'Open...'#10'Image' + +'Index'#2#0#9'OnExecute'#7#13'acOpenExecute'#0#0#7'TAction'#8'AcSaveAs'#7'Ca' + +'ption'#6#10'Save as...'#10'ImageIndex'#2#1#9'OnExecute'#7#15'acSaveAsExecut' + +'e'#0#0#7'TAction'#6'AcQuit'#7'Caption'#6#4'Quit'#10'ImageIndex'#2#2#9'OnExe' + +'cute'#7#13'acQuitExecute'#0#0#0#0 ]); diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas index 7b43aadad..e89aa71a3 100755 --- a/components/fpspreadsheet/fpspreadsheet.pas +++ b/components/fpspreadsheet/fpspreadsheet.pas @@ -132,7 +132,7 @@ type {@@ List of possible formatting fields } TsUsedFormattingField = (uffTextRotation, uffBold, uffBorder, uffBackgroundColor, - uffNumberFormat, uffWordWrap); + uffNumberFormat, uffWordWrap, uffHorAlign, uffVertAlign); {@@ Describes which formatting fields are active } @@ -173,6 +173,10 @@ type TsCellBorders = set of TsCellBorder; + {@@ Indicates horizontal and vertical text alignment in cells } + TsHorAlignment = (haDefault, haLeft, haCenter, haRight); + TsVertAlignment = (vaDefault, vaTop, vaCenter, vaBottom); + {@@ Colors in FPSpreadsheet as given by a palette to be compatible with Excel. However, please note that they are physically written to XLS file as ABGR (where A is 0) } @@ -228,6 +232,8 @@ type { Formatting fields } UsedFormattingFields: TsUsedFormattingFields; TextRotation: TsTextRotation; + HorAlignment: TsHorAlignment; + VertAlignment: TsVertAlignment; Border: TsCellBorders; BackgroundColor: TsColor; NumberFormat: TsNumberFormat; @@ -298,6 +304,8 @@ type procedure WriteTextRotation(ARow, ACol: Cardinal; ARotation: TsTextRotation); procedure WriteUsedFormatting(ARow, ACol: Cardinal; AUsedFormatting: TsUsedFormattingFields); procedure WriteBackgroundColor(ARow, ACol: Cardinal; AColor: TsColor); + procedure WriteHorAlignment(ARow, ACol: Cardinal; AValue: TsHorAlignment); + procedure WriteVertAlignment(ARow, ACol: Cardinal; AValue: TsVertAlignment); { Data manipulation methods - For Rows and Cols } function FindRow(ARow: Cardinal): PRow; function FindCol(ACol: Cardinal): PCol; @@ -485,9 +493,11 @@ implementation uses Math, StrUtils; -var - { Translatable strings } - lpUnsupportedReadFormat, lpUnsupportedWriteFormat: string; +{ Translatable strings } +resourcestring + lpUnsupportedReadFormat = 'Tried to read a spreadsheet using an unsupported format'; + lpUnsupportedWriteFormat = 'Tried to write a spreadsheet using an unsupported format'; + lpNoValidSpreadsheetFile = '"%s" is not a valid spreadsheet file.'; {@@ Registers a new reader/writer pair for a format @@ -1193,6 +1203,24 @@ begin ACell^.BackgroundColor := AColor; end; +procedure TsWorksheet.WriteHorAlignment(ARow, ACol: Cardinal; AValue: TsHorAlignment); +var + lCell: PCell; +begin + lCell := GetCell(ARow, ACol); + lCell^.UsedFormattingFields := lCell^.UsedFormattingFields + [uffHorAlign]; + lCell^.HorAlignment := AValue; +end; + +procedure TsWorksheet.WriteVertAlignment(ARow, ACol: Cardinal; AValue: TsVertAlignment); +var + lCell: PCell; +begin + lCell := GetCell(ARow, ACol); + lCell^.UsedFormattingFields := lCell^.UsedFormattingFields + [uffVertAlign]; + lCell^.VertAlignment := AValue; +end; + function TsWorksheet.FindRow(ARow: Cardinal): PRow; var LElement: TRow; @@ -1307,12 +1335,7 @@ end; constructor TsWorkbook.Create; begin inherited Create; - FWorksheets := TFPList.Create; - - // In the future: add support for translations - lpUnsupportedReadFormat := 'Tried to read a spreadsheet using an unsupported format'; - lpUnsupportedWriteFormat := 'Tried to write a spreadsheet using an unsupported format'; end; {@@ @@ -1338,7 +1361,7 @@ var suffix: String; begin Result := True; - suffix := ExtractFileExt(AFileName); + suffix := Lowercase(ExtractFileExt(AFileName)); if suffix = STR_EXCEL_EXTENSION then SheetType := sfExcel8 else if suffix = STR_OOXML_EXCEL_EXTENSION then SheetType := sfOOXML else if suffix = STR_OPENDOCUMENT_CALC_EXTENSION then SheetType := sfOpenDocument @@ -1446,7 +1469,8 @@ begin end else ReadFromFile(AFileName, SheetType); - end; + end else + raise Exception.CreateFmt(lpNoValidSpreadsheetFile, [AFileName]); end; procedure TsWorkbook.ReadFromFileIgnoringExtension(AFileName: string); @@ -1713,6 +1737,12 @@ begin begin if (FFormattingStyles[i].UsedFormattingFields <> AFormat^.UsedFormattingFields) then Continue; + if uffHorAlign in AFormat^.UsedFormattingFields then + if (FFormattingStyles[i].HorAlignment <> AFormat^.HorAlignment) then Continue; + + if uffVertAlign in AFormat^.UsedFormattingFields then + if (FFormattingStyles[i].VertAlignment <> AFormat^.VertAlignment) then Continue; + if uffTextRotation in AFormat^.UsedFormattingFields then if (FFormattingStyles[i].TextRotation <> AFormat^.TextRotation) then Continue; diff --git a/components/fpspreadsheet/fpspreadsheetgrid.pas b/components/fpspreadsheet/fpspreadsheetgrid.pas index 35cf90eb4..1e54b2db5 100644 --- a/components/fpspreadsheet/fpspreadsheetgrid.pas +++ b/components/fpspreadsheet/fpspreadsheetgrid.pas @@ -3,7 +3,7 @@ fpspreadsheetgrid.pas Grid component which can load and write data from / to FPSpreadsheet documents -AUTHORS: Felipe Monteiro de Carvalho +AUTHORS: Felipe Monteiro de Carvalho, Werner Pamler } unit fpspreadsheetgrid; @@ -190,7 +190,7 @@ end; // Converts the row height, given in mm, to pixels function TsCustomWorksheetGrid.CalcRowHeight(AHeight: Single): Integer; begin - Result := round(AHeight / 25.4 * Screen.PixelsPerInch); + Result := round(AHeight / 25.4 * Screen.PixelsPerInch) + 4; end; procedure TsCustomWorksheetGrid.DoPrepareCanvas(ACol, ARow: Integer; @@ -203,20 +203,35 @@ begin ts := Canvas.TextStyle; if FDisplayFixedColRow then begin // Formatting of row and column headers - if ARow = 0 then - ts.Alignment := taCenter - else - if ACol = 0 then + if ARow = 0 then begin + ts.Alignment := taCenter; + ts.Layout := tlCenter; + end else + if ACol = 0 then begin ts.Alignment := taRightJustify; + ts.Layout := tlCenter; + end; end; if FWorksheet <> nil then begin r := ARow - FixedRows; c := ACol - FixedCols; lCell := FWorksheet.FindCell(r, c); if lCell <> nil then begin - // Default alignment of number is right-justify - if lCell^.ContentType = cctNumber then - ts.Alignment := taRightJustify; + case lCell^.HorAlignment of + haDefault: if lCell^.ContentType = cctNumber then + ts.Alignment := taRightJustify + else + ts.Alignment := taLeftJustify; + haLeft : ts.Alignment := taLeftJustify; + haCenter : ts.Alignment := taCenter; + haRight : ts.Alignment := taRightJustify; + end; + case lCell^.VertAlignment of + vaDefault: ts.Layout := tlBottom; + vaTop : ts.Layout := tlTop; + vaCenter : ts.Layout := tlCenter; + vaBottom : ts.layout := tlBottom; + end; // Word wrap? if (uffWordWrap in lCell^.UsedFormattingFields) then begin ts.Wordbreak := true; diff --git a/components/fpspreadsheet/tests/formattests.pas b/components/fpspreadsheet/tests/formattests.pas index ad5564a50..d8b77cab7 100644 --- a/components/fpspreadsheet/tests/formattests.pas +++ b/components/fpspreadsheet/tests/formattests.pas @@ -51,6 +51,8 @@ type procedure TestWriteReadColWidths; // Test word wrapping procedure TestWriteReadWordWrap; + // Test alignments + procedure TestWriteReadAlignments; end; implementation @@ -323,12 +325,78 @@ begin if MyCell = nil then fail('Error in test code. Failed to get non-wrapped cell.'); CheckEquals((uffWordWrap in MyCell^.UsedFormattingFields), false, 'failed to return correct word-wrap flag, cell ' + CellNotation(MyWorksheet,0,0)); - // Finalization MyWorkbook.Free; DeleteFile(TempFile); end; +procedure TSpreadWriteReadFormatTests.TestWriteReadAlignments; +const + CELLTEXT = 'This is a text.'; +var + MyWorksheet: TsWorksheet; + MyWorkbook: TsWorkbook; + horAlign: TsHorAlignment; + vertAlign: TsVertAlignment; + row, col: Integer; + MyCell: PCell; + TempFile: string; //write xls/xml to this file and read back from it +begin + TempFile:=GetTempFileName; + {// Not needed: use workbook.writetofile with overwrite=true + if fileexists(TempFile) then + DeleteFile(TempFile); + } + // Write out all test values: HorAlignments along columns, VertAlignments along rows + MyWorkbook := TsWorkbook.Create; + MyWorkSheet:= MyWorkBook.AddWorksheet(FmtNumbersSheet); + + row := 0; + for horAlign in TsHorAlignment do begin + col := 0; + for vertAlign in TsVertAlignment do begin + MyWorksheet.WriteUTF8Text(row, col, CELLTEXT); + MyWorksheet.WriteHorAlignment(row, col, horAlign); + MyWorksheet.WriteVertAlignment(row, col, vertAlign); + MyCell := MyWorksheet.FindCell(row, col); + if MyCell = nil then + fail('Error in test code. Failed to get cell.'); + CheckEquals(vertAlign = MyCell^.VertAlignment, true, + 'Test unsaved word vertical alignment, cell ' + CellNotation(MyWorksheet,0,0)); + CheckEquals(horAlign = MyCell^.HorAlignment, true, + 'Test unsaved word horizontal alignment, cell ' + CellNotation(MyWorksheet,0,0)); + inc(col); + end; + inc(row); + end; + MyWorkBook.WriteToFile(TempFile,sfExcel8,true); + MyWorkbook.Free; + + // Open the spreadsheet, as biff8 + MyWorkbook := TsWorkbook.Create; + MyWorkbook.ReadFromFile(TempFile, sfExcel8); + MyWorksheet:=GetWorksheetByName(MyWorkBook, FmtNumbersSheet); + if MyWorksheet=nil then + fail('Error in test code. Failed to get named worksheet'); + for row := 0 to MyWorksheet.GetLastRowNumber do + for col := 0 to MyWorksheet.GetLastColNumber do begin + MyCell := MyWorksheet.FindCell(row, col); + if MyCell = nil then + fail('Error in test code. Failed to get cell.'); + vertAlign := TsVertAlignment(col); + if vertAlign = vaDefault then vertAlign := vaBottom; + CheckEquals(vertAlign = MyCell^.VertAlignment, true, + 'Test saved vertical alignment mismatch, cell '+CellNotation(MyWorksheet,Row,Col)); + horAlign := TsHorAlignment(row); + CheckEquals(horAlign = MyCell^.HorAlignment, true, + 'Test saved horizontal mismatch, cell '+CellNotation(MyWorksheet,Row,Col)); + end; + MyWorkbook.Free; + + DeleteFile(TempFile); +end; + + initialization RegisterTest(TSpreadWriteReadFormatTests); InitSollFmtData; diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas index 6beae8cde..38440deb9 100755 --- a/components/fpspreadsheet/xlsbiff8.pas +++ b/components/fpspreadsheet/xlsbiff8.pas @@ -66,6 +66,8 @@ type TXFRecordData = class public FormatIndex: Integer; + HorAlignment: TsHorAlignment; + VertAlignment: TsVertAlignment; WordWrap: Boolean; Borders: TsCellBorders; { @@ -159,7 +161,8 @@ type procedure WriteColInfo(AStream: TStream; ASheet: TsWorksheet; ACol: PCol); procedure WriteXF(AStream: TStream; AFontIndex: Word; AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders; - AddWordWrap: Boolean = false; AddBackground: Boolean = false; + AHorAlignment: TsHorAlignment = haDefault; AVertAlignment: TsVertAlignment = vaDefault; + AWordWrap: Boolean = false; AddBackground: Boolean = false; ABackgroundColor: TsColor = scSilver); public // constructor Create; @@ -289,9 +292,18 @@ const MASK_XF_USED_ATTRIB_BACKGROUND = $40; MASK_XF_USED_ATTRIB_CELL_PROTECTION = $80; + { XF HORIZONTAL ALIGN } + MASK_XF_HOR_ALIGN_LEFT = $01; + MASK_XF_HOR_ALIGN_CENTER = $02; + MASK_XF_HOR_ALIGN_RIGHT = $03; + MASK_XF_HOR_ALIGN_FILLED = $04; + MASK_XF_HOR_ALIGN_JUSTIFIED = $05; // BIFF4-BIFF8 + MASK_XF_HOR_ALIGN_CENTERED_SELECTION= $06; // BIFF4-BIFF8 + MASK_XF_HOR_ALIGN_DISTRIBUTED = $07; // BIFF8 + { XF_VERT_ALIGN } MASK_XF_VERT_ALIGN_TOP = $00; - MASK_XF_VERT_ALIGN_CENTRED = $10; + MASK_XF_VERT_ALIGN_CENTER = $10; MASK_XF_VERT_ALIGN_BOTTOM = $20; MASK_XF_VERT_ALIGN_JUSTIFIED = $30; @@ -300,6 +312,12 @@ const XF_ROTATION_90_DEGREE_COUNTERCLOCKWISE = 90; XF_ROTATION_90_DEGREE_CLOCKWISE = 180; + { XF CELL BORDER } + MASK_XF_BORDER_LEFT = $0000000F; + MASK_XF_BORDER_RIGHT = $000000F0; + MASK_XF_BORDER_TOP = $00000F00; + MASK_XF_BORDER_BOTTOM = $0000F000; + { XF record constants } MASK_XF_TYPE_PROT = $0007; MASK_XF_TYPE_PROT_PARENT = $FFF0; @@ -308,6 +326,7 @@ const MASK_XF_VERT_ALIGN = $70; MASK_XF_TEXTWRAP = $08; + { Exported functions } @@ -396,6 +415,8 @@ var lBorders: TsCellBorders; lAddBackground: Boolean; lBackgroundColor: TsColor; + lHorAlign: TsHorAlignment; + lVertAlign: TsVertAlignment; lWordWrap: Boolean; fmt: String; begin @@ -407,6 +428,8 @@ begin lFormatIndex := 0; //General format (one of the built-in number formats) lTextRotation := XF_ROTATION_HORIZONTAL; lBorders := []; + lHorAlign := FFormattingStyles[i].HorAlignment; + lVertAlign := FFormattingStyles[i].VertAlignment; lBackgroundColor := FFormattingStyles[i].BackgroundColor; // Now apply the modifications. @@ -488,8 +511,8 @@ begin lWordwrap := (uffWordwrap in FFormattingStyles[i].UsedFormattingFields); // And finally write the style - WriteXF(AStream, lFontIndex, lFormatIndex, 0, lTextRotation, lBorders, lWordwrap, - lAddBackground, lBackgroundColor); + WriteXF(AStream, lFontIndex, lFormatIndex, 0, lTextRotation, lBorders, + lHorAlign, lVertAlign, lWordwrap, lAddBackground, lBackgroundColor); end; end; @@ -648,6 +671,7 @@ begin WriteXF(AStream, 0, 0, 0, XF_ROTATION_90_DEGREE_CLOCKWISE, []); // XF18 - Bold WriteXF(AStream, 1, 0, 0, XF_ROTATION_HORIZONTAL, []); + // Add all further non-standard/built-in formatting styles ListAllFormattingStyles(AData); WriteXFFieldsForFormattingStyles(AStream); @@ -1525,7 +1549,8 @@ end; *******************************************************************} procedure TsSpreadBIFF8Writer.WriteXF(AStream: TStream; AFontIndex: Word; AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders; - AddWordWrap: Boolean = false; AddBackground: Boolean = false; + AHorAlignment: TsHorAlignment = haDefault; AVertAlignment: TsVertAlignment = vaDefault; + AWordWrap: Boolean = false; AddBackground: Boolean = false; ABackgroundColor: TsColor = scSilver); var XFOptions: Word; @@ -1551,8 +1576,19 @@ begin AStream.WriteWord(WordToLE(XFOptions)); { Alignment and text break } - XFAlignment := MASK_XF_VERT_ALIGN_BOTTOM; - if AddWordWrap then + XFAlignment := 0; + case AHorAlignment of + haLeft : XFAlignment := XFAlignment or MASK_XF_HOR_ALIGN_LEFT; + haCenter : XFAlignment := XFAlignment or MASK_XF_HOR_ALIGN_CENTER; + haRight : XFAlignment := XFAlignment or MASK_XF_HOR_ALIGN_RIGHT; + end; + case AVertAlignment of + vaTop : XFAlignment := XFAlignment or MASK_XF_VERT_ALIGN_TOP; + vaCenter : XFAlignment := XFAlignment or MASK_XF_VERT_ALIGN_CENTER; + vaBottom : XFAlignment := XFAlignment or MASK_XF_VERT_ALIGN_BOTTOM; + else XFAlignment := XFAlignment or MASK_XF_VERT_ALIGN_BOTTOM; + end; + if AWordWrap then XFAlignment := XFAlignment or MASK_XF_TEXTWRAP; AStream.WriteByte(XFAlignment); @@ -2058,6 +2094,10 @@ begin if Assigned(lCell) then begin XFData := TXFRecordData(FXFList.Items[XFIndex]); + // Alignment + lCell^.HorAlignment := XFData.HorAlignment; + lCell^.VertAlignment := XFData.VertAlignment; + // Word wrap if XFData.WordWrap then Include(lCell^.UsedFormattingFields, uffWordWrap) @@ -2395,6 +2435,7 @@ type var lData: TXFRecordData; xf: TXFRecord; + b: Byte; begin AStream.ReadBuffer(xf, SizeOf(xf)); @@ -2403,6 +2444,20 @@ begin // Format index lData.FormatIndex := WordLEToN(xf.FormatIndex); + // Horizontal text alignment + b := xf.Align_TextBreak AND MASK_XF_HOR_ALIGN; + if (b <= ord(High(TsHorAlignment))) then + lData.HorAlignment := TsHorAlignment(b) + else + lData.HorAlignment := haDefault; + + // Vertical text alignment + b := (xf.Align_TextBreak AND MASK_XF_VERT_ALIGN) shr 4; + if (b + 1 <= ord(high(TsVertAlignment))) then + lData.VertAlignment := tsVertAlignment(b + 1) // + 1 due to vaDefault + else + lData.VertAlignment := vaDefault; + // Word wrap lData.WordWrap := (xf.Align_TextBreak and MASK_XF_TEXTWRAP) <> 0; @@ -2411,13 +2466,13 @@ begin lData.Borders := []; // the 4 masked bits encode the line style of the border line. 0 = no line // We ignore the line style here. --> check against "no line" - if xf.Border_Background_1 and $0000000F <> 0 then + if xf.Border_Background_1 and MASK_XF_BORDER_LEFT <> 0 then Include(lData.Borders, cbWest); - if xf.Border_Background_1 and $000000F0 <> 0 then + if xf.Border_Background_1 and MASK_XF_BORDER_RIGHT <> 0 then Include(lData.Borders, cbEast); - if xf.Border_Background_1 and $00000F00 <> 0 then + if xf.Border_Background_1 and MASK_XF_BORDER_TOP <> 0 then Include(lData.Borders, cbNorth); - if xf.Border_Background_1 and $0000F000 <> 0 then + if xf.Border_Background_1 and MASK_XF_BORDER_BOTTOM <> 0 then Include(lData.Borders, cbSouth); // Add the XF to the list diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas index 0c54c269d..7ea6f9d35 100644 --- a/components/fpspreadsheet/xlscommon.pas +++ b/components/fpspreadsheet/xlscommon.pas @@ -862,19 +862,22 @@ begin end; { This function checks whether the format string corresponds to exponential - formatting and determines the number decimals } + formatting and determines the number of decimals } function IsExpNumberFormat(s: String; out Decimals: Word): Boolean; var i, p, pe: Integer; begin + Result := false; Decimals := 0; + if SameText(s, 'General') then + exit; + // Check for a valid format string try FormatDateTime(s, 1.0); except on EConvertError do begin - Result := false; exit; end; end;