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
This commit is contained in:
wp_xxyyzz
2014-04-20 20:31:36 +00:00
parent 313daa2eaf
commit be497cb19e
9 changed files with 744 additions and 320 deletions

View File

@ -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]);

View File

@ -27,7 +27,6 @@
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="2">
@ -38,7 +37,7 @@
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="23">
<Units Count="24">
<Unit0>
<Filename Value="fpsgrid.lpr"/>
<IsPartOfProject Value="True"/>
@ -47,7 +46,7 @@
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="11"/>
<UsageCount Value="88"/>
<UsageCount Value="93"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
@ -59,20 +58,20 @@
<UnitName Value="mainform"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="50"/>
<CursorPos X="30" Y="57"/>
<UsageCount Value="88"/>
<TopLine Value="1"/>
<CursorPos X="8" Y="1"/>
<UsageCount Value="93"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="..\..\fpspreadsheet.pas"/>
<UnitName Value="fpspreadsheet"/>
<EditorIndex Value="9"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="161"/>
<CursorPos X="3" Y="180"/>
<UsageCount Value="42"/>
<TopLine Value="464"/>
<CursorPos X="9" Y="496"/>
<UsageCount Value="44"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
@ -80,9 +79,9 @@
<UnitName Value="fpspreadsheetgrid"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="206"/>
<CursorPos X="45" Y="223"/>
<UsageCount Value="43"/>
<TopLine Value="1"/>
<CursorPos X="52" Y="6"/>
<UsageCount Value="45"/>
<Bookmarks Count="1">
<Item0 X="1" Y="194" ID="1"/>
</Bookmarks>
@ -138,12 +137,10 @@
<Unit10>
<Filename Value="..\..\wikitable.pas"/>
<UnitName Value="wikitable"/>
<EditorIndex Value="10"/>
<WindowIndex Value="0"/>
<TopLine Value="48"/>
<CursorPos X="41" Y="60"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
<UsageCount Value="21"/>
</Unit10>
<Unit11>
<Filename Value="..\..\fpsopendocument.pas"/>
@ -156,58 +153,50 @@
<Unit12>
<Filename Value="d:\lazarus-svn\lcl\grids.pas"/>
<UnitName Value="Grids"/>
<EditorIndex Value="13"/>
<WindowIndex Value="0"/>
<TopLine Value="4124"/>
<CursorPos X="3" Y="4129"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
<UsageCount Value="21"/>
</Unit12>
<Unit13>
<Filename Value="..\..\fpsutils.pas"/>
<UnitName Value="fpsutils"/>
<EditorIndex Value="12"/>
<WindowIndex Value="0"/>
<TopLine Value="413"/>
<CursorPos X="45" Y="447"/>
<UsageCount Value="19"/>
<Loaded Value="True"/>
<UsageCount Value="20"/>
</Unit13>
<Unit14>
<Filename Value="d:\lazarus-svn\lcl\include\canvas.inc"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="1212"/>
<CursorPos X="3" Y="1218"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
<UsageCount Value="13"/>
</Unit14>
<Unit15>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<UnitName Value="Graphics"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="84"/>
<CursorPos X="3" Y="101"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
<TopLine Value="81"/>
<CursorPos X="3" Y="100"/>
<UsageCount Value="13"/>
</Unit15>
<Unit16>
<Filename Value="d:\lazarus-svn\fpc\2.6.2\source\rtl\objpas\classes\classesh.inc"/>
<WindowIndex Value="0"/>
<TopLine Value="76"/>
<CursorPos X="3" Y="95"/>
<UsageCount Value="12"/>
<CursorPos X="28" Y="88"/>
<UsageCount Value="13"/>
</Unit16>
<Unit17>
<Filename Value="..\..\xlsbiff8.pas"/>
<UnitName Value="xlsbiff8"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="5"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="1518"/>
<CursorPos X="38" Y="1529"/>
<UsageCount Value="17"/>
<TopLine Value="375"/>
<CursorPos X="1" Y="367"/>
<UsageCount Value="19"/>
<Loaded Value="True"/>
</Unit17>
<Unit18>
@ -220,164 +209,164 @@
</Unit18>
<Unit19>
<Filename Value="d:\lazarus-svn\lcl\include\wincontrol.inc"/>
<EditorIndex Value="8"/>
<WindowIndex Value="0"/>
<TopLine Value="7344"/>
<CursorPos X="30" Y="7349"/>
<UsageCount Value="14"/>
<Loaded Value="True"/>
<UsageCount Value="15"/>
</Unit19>
<Unit20>
<Filename Value="..\..\xlscommon.pas"/>
<UnitName Value="xlscommon"/>
<EditorIndex Value="11"/>
<WindowIndex Value="0"/>
<TopLine Value="464"/>
<CursorPos X="1" Y="485"/>
<UsageCount Value="14"/>
<Loaded Value="True"/>
<TopLine Value="918"/>
<CursorPos X="52" Y="946"/>
<UsageCount Value="15"/>
</Unit20>
<Unit21>
<Filename Value="..\..\xlsbiff5.pas"/>
<UnitName Value="xlsbiff5"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="1110"/>
<CursorPos X="1" Y="1134"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
<UsageCount Value="11"/>
</Unit21>
<Unit22>
<Filename Value="..\..\xlsbiff2.pas"/>
<UnitName Value="xlsbiff2"/>
<EditorIndex Value="7"/>
<WindowIndex Value="0"/>
<TopLine Value="93"/>
<CursorPos X="35" Y="83"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
<UsageCount Value="11"/>
</Unit22>
<Unit23>
<Filename Value="d:\lazarus-svn\lcl\lclproc.pas"/>
<UnitName Value="LCLProc"/>
<WindowIndex Value="0"/>
<TopLine Value="841"/>
<CursorPos X="19" Y="852"/>
<UsageCount Value="10"/>
</Unit23>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="193" Column="14" TopLine="186"/>
<Caret Line="422" Column="1" TopLine="400"/>
</Position1>
<Position2>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="194" Column="1" TopLine="186"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1446" Column="1" TopLine="1427"/>
</Position2>
<Position3>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="180" Column="58" TopLine="171"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1447" Column="1" TopLine="1427"/>
</Position3>
<Position4>
<Filename Value="..\..\fpsutils.pas"/>
<Caret Line="56" Column="1" TopLine="34"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1365" Column="1" TopLine="1346"/>
</Position4>
<Position5>
<Filename Value="..\..\fpsutils.pas"/>
<Caret Line="445" Column="1" TopLine="411"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1366" Column="1" TopLine="1346"/>
</Position5>
<Position6>
<Filename Value="..\..\fpsutils.pas"/>
<Caret Line="59" Column="1" TopLine="21"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1367" Column="1" TopLine="1346"/>
</Position6>
<Position7>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="191" Column="1" TopLine="181"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1368" Column="1" TopLine="1346"/>
</Position7>
<Position8>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1905" Column="39" TopLine="1869"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1375" Column="1" TopLine="1346"/>
</Position8>
<Position9>
<Filename Value="..\..\xlsbiff5.pas"/>
<Caret Line="1372" Column="3" TopLine="1367"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1448" Column="1" TopLine="1429"/>
</Position9>
<Position10>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="205" Column="1" TopLine="186"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1450" Column="1" TopLine="1429"/>
</Position10>
<Position11>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="204" Column="23" TopLine="186"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1454" Column="1" TopLine="1429"/>
</Position11>
<Position12>
<Filename Value="..\..\xlsbiff2.pas"/>
<Caret Line="464" Column="1" TopLine="435"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1455" Column="1" TopLine="1429"/>
</Position12>
<Position13>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="128" Column="45" TopLine="125"/>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="2178" Column="1" TopLine="2171"/>
</Position13>
<Position14>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="148" Column="28" TopLine="148"/>
<Filename Value="mainform.pas"/>
<Caret Line="115" Column="21" TopLine="87"/>
</Position14>
<Position15>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="222" Column="29" TopLine="188"/>
<Caret Line="420" Column="3" TopLine="410"/>
</Position15>
<Position16>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="221" Column="47" TopLine="203"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1476" Column="55" TopLine="1413"/>
</Position16>
<Position17>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="200" Column="3" TopLine="180"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="498" Column="36" TopLine="479"/>
</Position17>
<Position18>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="222" Column="45" TopLine="196"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1342" Column="11" TopLine="1308"/>
</Position18>
<Position19>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1218" Column="14" TopLine="1200"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="496" Column="1" TopLine="468"/>
</Position19>
<Position20>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="211" Column="71" TopLine="241"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="498" Column="36" TopLine="468"/>
</Position20>
<Position21>
<Filename Value="d:\lazarus-svn\lcl\grids.pas"/>
<Caret Line="4129" Column="3" TopLine="4124"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1309" Column="1" TopLine="1309"/>
</Position21>
<Position22>
<Filename Value="d:\lazarus-svn\lcl\include\canvas.inc"/>
<Caret Line="1187" Column="3" TopLine="1178"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position22>
<Position23>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1207" Column="15" TopLine="1188"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="498" Column="27" TopLine="466"/>
</Position23>
<Position24>
<Filename Value="d:\lazarus-svn\lcl\graphics.pp"/>
<Caret Line="1208" Column="40" TopLine="1188"/>
<Filename Value="..\..\fpspreadsheetgrid.pas"/>
<Caret Line="420" Column="3" TopLine="410"/>
</Position24>
<Position25>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1558" Column="3" TopLine="1520"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="292" Column="15" TopLine="267"/>
</Position25>
<Position26>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="162" Column="78" TopLine="147"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="498" Column="11" TopLine="466"/>
</Position26>
<Position27>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="1531" Column="29" TopLine="1518"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="500" Column="10" TopLine="468"/>
</Position27>
<Position28>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="409" Column="1" TopLine="382"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="1473" Column="38" TopLine="1435"/>
</Position28>
<Position29>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="613" Column="81" TopLine="588"/>
<Filename Value="..\..\fpspreadsheet.pas"/>
<Caret Line="20" Column="26" TopLine="1"/>
</Position29>
<Position30>
<Filename Value="..\..\xlsbiff8.pas"/>
<Caret Line="163" Column="37" TopLine="144"/>
<Caret Line="2" Column="7" TopLine="1"/>
</Position30>
</JumpHistory>
</ProjectOptions>

View File

@ -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

View File

@ -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'<s@'#255#160
+#161#161#255#163#163#163#255#163#163#163#255#164#164#164#255'6t'#170#255'}'
+#175#212#255'['#154#201#255'T'#149#199#255'X'#150#200#255'A'#128#174#255#19
+'\'#148#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#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
+#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'<s@'#255
+#160#161#161#255#163#163#163#255#163#163#163#255#164#164#164#255'6t'#170#255
+'}'#175#212#255'['#154#201#255'T'#149#199#255'X'#150#200#255'A'#128#174#255
+#19'\'#148#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'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';'#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'<s@'#255#160#161#161
+#255#163#163#163#255#163#163#163#255#164#164#164#255'6t'#170#255'}'#175#212
+#255'['#154#201#255'T'#149#199#255'X'#150#200#255'A'#128#174#255#19'\'#148
+#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#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#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
]);

View File

@ -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;
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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;