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^.BackgroundColor := scPURPLE;
lCell^.UsedFormattingFields := [uffBackgroundColor]; 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.WriteUTF8Text(6, 3, 'This is a very, very, very, very long text.');
MyWorksheet.WriteUsedFormatting(6, 3, [uffWordwrap]); MyWorksheet.WriteUsedFormatting(6, 3, [uffWordwrap]);

View File

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

View File

@ -72,7 +72,7 @@ object Form1: TForm1
Top = 0 Top = 0
Width = 392 Width = 392
Align = alClient 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 TabOrder = 0
TitleStyle = tsNative TitleStyle = tsNative
end end
@ -132,10 +132,82 @@ object Form1: TForm1
Caption = '&File' Caption = '&File'
object mnuOpen: TMenuItem object mnuOpen: TMenuItem
Action = AcOpen 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 OnClick = acOpenExecute
end end
object mnuSaveAs: TMenuItem object mnuSaveAs: TMenuItem
Action = AcSaveAs 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 OnClick = acSaveAsExecute
end end
object MenuItem1: TMenuItem object MenuItem1: TMenuItem
@ -143,6 +215,42 @@ object Form1: TForm1
end end
object mnuQuit: TMenuItem object mnuQuit: TMenuItem
Action = AcQuit 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 OnClick = acQuitExecute
end end
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 +#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 +'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' +#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' +#15'goFixedHorzLine'#10'goVertLine'#10'goHorzLine'#13'goRangeSelect'#11'goRo'
+'lSizing'#15'goThumbTracking'#14'goSmoothScroll'#14'goCellEllipsis'#0#8'TabO' +'wSizing'#11'goColSizing'#15'goThumbTracking'#14'goSmoothScroll'#14'goCellEl'
+'rder'#2#0#10'TitleStyle'#7#8'tsNative'#0#0#0#0#8'TToolBar'#8'ToolBar1'#4'Le' +'lipsis'#0#8'TabOrder'#2#0#10'TitleStyle'#7#8'tsNative'#0#0#0#0#8'TToolBar'#8
+'ft'#2#0#6'Height'#2#26#3'Top'#2#0#5'Width'#3#144#1#7'Caption'#6#8'ToolBar1' +'ToolBar1'#4'Left'#2#0#6'Height'#2#26#3'Top'#2#0#5'Width'#3#144#1#7'Caption'
+#11'EdgeBorders'#11#0#6'Images'#7#10'ImageList1'#8'TabOrder'#2#2#0#11'TToolB' +#6#8'ToolBar1'#11'EdgeBorders'#11#0#6'Images'#7#10'ImageList1'#8'TabOrder'#2
+'utton'#11'ToolButton1'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#6'AcOpen'#0#0#11 +#2#0#11'TToolButton'#11'ToolButton1'#4'Left'#2#1#3'Top'#2#0#6'Action'#7#6'Ac'
+'TToolButton'#11'ToolButton2'#4'Left'#2#24#3'Top'#2#0#6'Action'#7#8'AcSaveAs' +'Open'#0#0#11'TToolButton'#11'ToolButton2'#4'Left'#2#24#3'Top'#2#0#6'Action'
+#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#2'4'#3'Top'#2#0#6'Action'#7#6'A' +#7#8'AcSaveAs'#0#0#11'TToolButton'#11'ToolButton3'#4'Left'#2'4'#3'Top'#2#0#6
+'cQuit'#0#0#11'TToolButton'#11'ToolButton5'#4'Left'#2'/'#3'Top'#2#0#5'Width' +'Action'#7#6'AcQuit'#0#0#11'TToolButton'#11'ToolButton5'#4'Left'#2'/'#3'Top'
+#2#5#7'Caption'#6#11'ToolButton5'#5'Style'#7#10'tbsDivider'#0#0#0#11'TOpenDi' +#2#0#5'Width'#2#5#7'Caption'#6#11'ToolButton5'#5'Style'#7#10'tbsDivider'#0#0
+'alog'#11'OpenDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#192'Excel spread' +#0#11'TOpenDialog'#11'OpenDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#192
+'sheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|LibreOffice/OpenO' +'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlxs|Libre'
+'ffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_pipes)|.wikit' +'Office/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (pipes) (.wikitable_p'
+'able_pipes|All files (*.*)|*.*'#7'Options'#11#20'ofExtensionDifferent'#14'o' +'ipes)|.wikitable_pipes|All files (*.*)|*.*'#7'Options'#11#20'ofExtensionDif'
+'fEnableSizing'#12'ofViewDetail'#0#4'left'#2'@'#3'top'#3#176#0#0#0#11'TSaveD' +'ferent'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2'@'#3'top'#3#176#0#0
+'ialog'#11'SaveDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#185'Excel sprea' +#0#11'TSaveDialog'#11'SaveDialog1'#10'DefaultExt'#6#4'.xls'#6'Filter'#6#185
+'dsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|LibreOffice/Open' +'Excel spreadsheet (*.xls)|*.xls|Excel XML spreadsheet (*.xlsx)|*.xlsx|Libre'
+'Office spreadsheet (*.ods)|*.ods|Wikitable (wikimedia) (.wikitable_wikimedi' +'Office/OpenOffice spreadsheet (*.ods)|*.ods|Wikitable (wikimedia) (.wikitab'
+'a)|*.wikitable_wikimedia'#7'Options'#11#20'ofExtensionDifferent'#14'ofEnabl' +'le_wikimedia)|*.wikitable_wikimedia'#7'Options'#11#20'ofExtensionDifferent'
+'eSizing'#12'ofViewDetail'#0#4'left'#3#176#0#3'top'#3#176#0#0#0#9'TMainMenu' +#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#3#176#0#3'top'#3#176#0#0#0#9
+#9'MainMenu1'#6'Images'#7#10'ImageList1'#4'left'#3' '#1#3'top'#3#176#0#0#9'T' +'TMainMenu'#9'MainMenu1'#6'Images'#7#10'ImageList1'#4'left'#3' '#1#3'top'#3
+'MenuItem'#7'mnuFile'#7'Caption'#6#5'&File'#0#9'TMenuItem'#7'mnuOpen'#6'Acti' +#176#0#0#9'TMenuItem'#7'mnuFile'#7'Caption'#6#5'&File'#0#9'TMenuItem'#7'mnuO'
+'on'#7#6'AcOpen'#7'OnClick'#7#13'acOpenExecute'#0#0#9'TMenuItem'#9'mnuSaveAs' +'pen'#6'Action'#7#6'AcOpen'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0
+#6'Action'#7#8'AcSaveAs'#7'OnClick'#7#15'acSaveAsExecute'#0#0#9'TMenuItem'#9 +#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
+'MenuItem1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#7'mnuQuit'#6'Action'#7#6'AcQu' +'d'#0#0#0#0#0#0#0#0#0#0#0','#134#216#0'-'#136#216#247'-'#135#216#247'-'#136
+'it'#7'OnClick'#7#13'acQuitExecute'#0#0#0#0#10'TImageList'#10'ImageList1'#4 +#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136
+'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 +#216#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#216#0#255#255#255#0#255#255#255#0'3'#142#217#251#220#240#250#255#152#225#246
+#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228#187#146#255 +#255#149#224#246#255#146#223#246#255#142#222#245#255#137#220#245#255#133#218
+#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9#255#255#255 +#244#255#128#217#244#255'z'#215#243#255't'#213#243#255'p'#211#242#255#194#234
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#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 +#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' +#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 +#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 +#255#255#0#255#255#255#0#234#195#157#255#230#191#150#255#228#187#146#255#228
+#224#199#255#249#220#194#255#245#211#180#255#254#249#243#255#250#226#196#255 +#187#146#255#209#160'l'#245#208#158'm'#246#204#150'_'#218#196'yB~'#178'g<'#9
+#236#193#147#255#195'}H'#147#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#255#0#7'OnClick'#7#13'acOpenExecute'#0#0#9'TMenuItem'#9'mnuSaveAs'#6
+#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254#246#240#255#252 +'Action'#7#8'AcSaveAs'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0
+#226#205#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255 +#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
+#250#243#235#255#251#248#243#255#202#131'S'#254#255#255#255#0#255#255#255#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#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#228#187#146#255#254 +#255#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255
+#247#241#255#252#229#210#255#252#228#209#255#251#226#204#255#249#221#196#255 +#169'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196#186'j5'#222#235
+#246#215#187#255#243#209#175#255#250#239#228#255#204#135'X'#254'4'#180#217 +#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254#251#248#255
+#208'^'#194#225#250'`'#195#226#250'`'#195#226#250'`'#195#226#250'_'#195#226 +#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248
,#250#228#187#145#255#255#247#242#255#254#231#213#255#254#231#213#255#253#229 +#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y'#255#167'`1'
+#209#255#250#224#202#255#249#222#196#255#247#217#188#255#253#242#231#255#204 +#237#186'k7'#254#237#202#179#255#224#162'z'#255#254#250#247#255'b'#192#136
+#135'W'#254'6'#179#218#248#253#254#254#255#254#255#255#255#254#254#255#255 +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136
+#253#254#255#255#254#255#255#255#228#186#145#255#255#247#240#255#255#231#213 +#255'b'#192#136#255'b'#192#136#255#253#249#246#255#202#141'e'#255#201#155'|'
+#255#253#231#214#255#253#230#212#255#252#228#208#255#251#227#203#255#250#220 +#255#167'`1'#254#187'l8'#255#238#204#182#255#225#162'z'#255#254#250#247#255
+#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 +#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 +#255#191#220#194#255#191#220#194#255#191#220#194#255#253#249#246#255#205#144
+#237#202#179#255#224#162'z'#255#254#250#247#255'b'#192#136#255'b'#192#136#255 +'h'#255#204#158#129#255#168'a2'#255#187'k8'#255#239#206#184#255#225#162'y'
+'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255 +#255#254#250#247#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136
+'b'#192#136#255#253#249#246#255#202#141'e'#255#201#155'|'#255#167'`1'#254#186 +#255'b'#192#136#255'b'#192#136#255'b'#192#136#255'b'#192#136#255#253#249#246
+'j5'#222#235#198#173#255#234#197#173#255#254#251#248#255#254#251#248#255#254 +#255#207#147'j'#255#206#163#132#255#170'a2'#255#186'j6'#255#239#208#187#255
+#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255 +#226#162'z'#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248
+#254#251#248#255#254#251#248#255#254#251#248#255#200#154'|'#255#199#152'y' +#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251#248#255#254#251
+#255#167'`1'#237#186'j6'#0#185'i5'#181#184'i5'#238#183'h5'#255#181'h5'#255 +#248#255#254#251#248#255#211#150'm'#255#210#167#138#255#171'b2'#255#187'j6'
+#180'g4'#255#178'f4'#255#176'e3'#255#174'd3'#255#172'c2'#255#170'b2'#255#169 +#255#240#210#190#255#226#163'z'#255#226#163'z'#255#225#163'z'#255#226#163'{'
+'a2'#255#168'`1'#255#167'`1'#254#166'`1'#241#168'a1'#196#255#255#255#0#255 +#255#225#163'{'#255#224#161'x'#255#222#159'w'#255#221#159'v'#255#220#157't'
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#217#155'r'#255#216#153'q'#255#214#153'p'#255#213#171#142#255#173'c3'#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#187'j6'#255#242#213#194#255#227#163'z'#255#227#163'z'#255#226#163'{'#255#226
+#255#255#255#0'm'#156#212#137'j'#154#210#251'f'#151#207#238#255#255#255#0#255 +#163'{'#255#226#164'{'#255#225#162'y'#255#224#161'x'#255#222#160'w'#255#222
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#158'u'#255#220#157't'#255#218#155's'#255#217#155's'#255#218#176#149#255#175
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219 +'d3'#255#187'j6'#255#242#216#197#255#227#164'{'#255#227#163'z'#255#227#164'z'
+'m'#156#212#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0 +#255#226#164'{'#255#226#163'{'#255#225#163'{'#255#225#162'y'#255#223#160'w'
+#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255'www'#255'uuu'#255 +#255#222#159'v'#255#221#158't'#255#219#156'r'#255#220#157't'#255#221#181#154
+'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171#211#232#255#169 +#255#177'e4'#255#187'k6'#255#244#217#199#255#230#166'}'#255#200#140'd'#255
+#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255#255#255#0'}}}' ,#201#141'e'#255#201#142'g'#255#203#146'l'#255#203#146'm'#255#202#144'i'#255
+#255#153#153#153#255#153#153#153#255#154#154#154#255#154#154#154#255#155#155 +#200#140'e'#255#200#140'd'#255#200#140'd'#255#200#140'd'#255#218#156't'#255
+#155#255#155#155#155#255'o'#157#211#255#170#209#231#255#171#209#231#255#152 +#225#186#159#255#179'f4'#255#187'k6'#254#244#220#201#255#231#167'}'#255#249
+#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193#234#255#255#255#0#255 +#236#225#255#249#236#225#255#249#237#227#255#252#244#238#255#253#250#247#255
+#255#255#0'zzz'#255#153#153#153#255'R'#145'Y'#255#153#154#153#255#155#155#155 +#253#247#243#255#250#237#229#255#247#231#219#255#247#229#217#255#246#229#216
+#255#156#156#156#255#156#156#156#255'l'#154#208#255#167#206#229#255#143#193 +#255#222#160'w'#255#228#190#164#255#180'g4'#255#188'k6'#250#245#221#204#255
+#223#255#137#189#220#255#139#189#220#255'S'#141#182#255'K'#132#188#234#255 +#231#168'~'#255#250#240#232#255#250#240#232#255#201#141'f'#255#250#240#233
+#255#255#0#255#255#255#0'www'#255#154#154#154#255'='#138'E'#255'I'#138'O'#255 +#255#253#248#243#255#254#250#248#255#252#244#239#255#249#233#223#255#247#231
+#156#156#156#255#157#157#157#255#157#157#157#255'f'#150#204#255#162#203#227 +#219#255#247#229#217#255#224#162'x'#255#231#194#169#255#182'h5'#255#188'k6'
+#255#137#189#220#255#131#185#218#255#132#185#218#255'Q'#139#181#255'C~'#182 +#240#246#223#208#255#232#168'~'#255#252#246#241#255#252#246#241#255#200#140
+#234'D'#148'M'#255'B'#145'K'#255'?'#141'H'#255'='#137'E'#255']'#164'e'#255'Z' +'d'#255#250#241#233#255#251#244#238#255#253#250#247#255#253#249#246#255#250
+#160'a'#255'E'#131'K'#255#158#158#158#255#158#158#158#255'`'#146#201#255#158 +#240#232#255#248#232#221#255#247#230#219#255#225#163'z'#255#239#213#195#255
+#199#226#255#131#184#218#255'}'#180#215#255'~'#179#215#255'O'#137#180#255';y' +#183'i5'#254#188'k6'#216#246#223#209#255#233#170#128#255#254#250#246#255#253
+#177#234'A'#144'J'#255#148#210#159#255#145#208#154#255#141#205#150#255#137 +#250#246#255#200#140'd'#255#251#243#238#255#251#241#234#255#252#246#242#255
+#203#146#255#132#200#141#255'Q'#152'X'#255'A|F'#255#159#159#159#255'Z'#142 +#254#251#248#255#252#246#241#255#249#236#226#255#248#231#219#255#238#208#186
+#196#255#152#195#224#255'|'#179#215#255't'#175#214#255'^'#196#237#255'K'#136 +#255#236#208#189#255#187'p>'#248#188'k6'#155#246#224#209#255#247#224#209#255
+#179#255'4s'#171#234'>'#139'F'#255#143#206#153#255'}'#198#135#255'x'#195#129 +#254#251#248#255#254#251#247#255#253#249#246#255#252#245#240#255#250#240#234
+#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255'T'#127'W'#255 +#255#251#242#237#255#253#249#246#255#253#250#247#255#251#241#235#255#248#233
+'T'#137#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255'K'#212#255#255 +#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188'k6q'#188'k6'#144#188'k6'
+'B'#139#184#255',n'#166#234';'#135'B'#255#137#203#146#255#132#200#141#255#128 +#204#188'k6'#238#188'k6'#250#187'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255
+#198#136#255'{'#195#131#255'w'#193#127#255'G'#143'M'#255';t?'#255#161#161#161 +#188'l9'#255#189'n;'#255#187'm:'#255#187'k8'#239#187'p>'#203#182'i5T'#255#255
+#255'L'#132#186#255#141#187#219#255'n'#168#209#255'f'#166#209#255'_'#180#223 +#255#0#7'OnClick'#7#15'acSaveAsExecute'#0#0#9'TMenuItem'#9'MenuItem1'#7'Capt'
+#255'G'#133#177#255'%i'#161#234'7'#130'>'#255'4~;'#255'1y7'#255'.u4'#255'I' +'ion'#6#1'-'#0#0#9'TMenuItem'#7'mnuQuit'#6'Action'#7#6'AcQuit'#11'Bitmap.Dat'
+#145'P'#255'F'#143'L'#255'9s='#255#161#161#161#255#162#162#162#255'E~'#180 +'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
+#255#136#183#217#255'g'#163#207#255'a'#158#204#255'c'#159#204#255'E'#131#177 +#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#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#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 +#255#255#0#255#255#255#0#255#255#255#0#29'c'#155#22#25'`'#152'9'#20']'#149'b'
+#13'X'#144#164#19'\'#146#252#12'W'#143#237#0#0#11'TActionList'#11'ActionList' +#16'Z'#146#136#13'X'#144#164#19'\'#146#252#12'W'#143#237#153#153#153#255'qqq'
+'1'#4'left'#3#176#0#3'top'#2'@'#0#7'TAction'#6'AcOpen'#7'Caption'#6#7'Open..' +#255'TTT'#255'QQQ'#255'OOO'#255'LLL'#255'JJJ'#255'GGG'#255'EEE'#255'%g'#157
+'.'#10'ImageIndex'#2#0#9'OnExecute'#7#13'acOpenExecute'#0#0#7'TAction'#8'AcS' +#255'2t'#168#255'=|'#175#255'G'#132#181#255'N'#138#186#255'>~'#173#255#12'W'
+'aveAs'#7'Caption'#6#10'Save as...'#10'ImageIndex'#2#1#9'OnExecute'#7#15'acS' +#143#234#255#255#255#0#255#255#255#0'XXX'#255#162#162#162#255#162#162#162#255
+'aveAsExecute'#0#0#7'TAction'#6'AcQuit'#7'Caption'#6#4'Quit'#10'ImageIndex'#2 +#163#163#163#255#164#164#164#255#164#164#164#255#165#165#165#255'/o'#165#255
+#2#9'OnExecute'#7#13'acQuitExecute'#0#0#0#0 +'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 } {@@ List of possible formatting fields }
TsUsedFormattingField = (uffTextRotation, uffBold, uffBorder, uffBackgroundColor, TsUsedFormattingField = (uffTextRotation, uffBold, uffBorder, uffBackgroundColor,
uffNumberFormat, uffWordWrap); uffNumberFormat, uffWordWrap, uffHorAlign, uffVertAlign);
{@@ Describes which formatting fields are active } {@@ Describes which formatting fields are active }
@ -173,6 +173,10 @@ type
TsCellBorders = set of TsCellBorder; 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. {@@ 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 However, please note that they are physically written to XLS file as
ABGR (where A is 0) } ABGR (where A is 0) }
@ -228,6 +232,8 @@ type
{ Formatting fields } { Formatting fields }
UsedFormattingFields: TsUsedFormattingFields; UsedFormattingFields: TsUsedFormattingFields;
TextRotation: TsTextRotation; TextRotation: TsTextRotation;
HorAlignment: TsHorAlignment;
VertAlignment: TsVertAlignment;
Border: TsCellBorders; Border: TsCellBorders;
BackgroundColor: TsColor; BackgroundColor: TsColor;
NumberFormat: TsNumberFormat; NumberFormat: TsNumberFormat;
@ -298,6 +304,8 @@ type
procedure WriteTextRotation(ARow, ACol: Cardinal; ARotation: TsTextRotation); procedure WriteTextRotation(ARow, ACol: Cardinal; ARotation: TsTextRotation);
procedure WriteUsedFormatting(ARow, ACol: Cardinal; AUsedFormatting: TsUsedFormattingFields); procedure WriteUsedFormatting(ARow, ACol: Cardinal; AUsedFormatting: TsUsedFormattingFields);
procedure WriteBackgroundColor(ARow, ACol: Cardinal; AColor: TsColor); 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 } { Data manipulation methods - For Rows and Cols }
function FindRow(ARow: Cardinal): PRow; function FindRow(ARow: Cardinal): PRow;
function FindCol(ACol: Cardinal): PCol; function FindCol(ACol: Cardinal): PCol;
@ -485,9 +493,11 @@ implementation
uses uses
Math, StrUtils; Math, StrUtils;
var
{ Translatable strings } { 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 Registers a new reader/writer pair for a format
@ -1193,6 +1203,24 @@ begin
ACell^.BackgroundColor := AColor; ACell^.BackgroundColor := AColor;
end; 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; function TsWorksheet.FindRow(ARow: Cardinal): PRow;
var var
LElement: TRow; LElement: TRow;
@ -1307,12 +1335,7 @@ end;
constructor TsWorkbook.Create; constructor TsWorkbook.Create;
begin begin
inherited Create; inherited Create;
FWorksheets := TFPList.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; end;
{@@ {@@
@ -1338,7 +1361,7 @@ var
suffix: String; suffix: String;
begin begin
Result := True; Result := True;
suffix := ExtractFileExt(AFileName); suffix := Lowercase(ExtractFileExt(AFileName));
if suffix = STR_EXCEL_EXTENSION then SheetType := sfExcel8 if suffix = STR_EXCEL_EXTENSION then SheetType := sfExcel8
else if suffix = STR_OOXML_EXCEL_EXTENSION then SheetType := sfOOXML else if suffix = STR_OOXML_EXCEL_EXTENSION then SheetType := sfOOXML
else if suffix = STR_OPENDOCUMENT_CALC_EXTENSION then SheetType := sfOpenDocument else if suffix = STR_OPENDOCUMENT_CALC_EXTENSION then SheetType := sfOpenDocument
@ -1446,7 +1469,8 @@ begin
end end
else else
ReadFromFile(AFileName, SheetType); ReadFromFile(AFileName, SheetType);
end; end else
raise Exception.CreateFmt(lpNoValidSpreadsheetFile, [AFileName]);
end; end;
procedure TsWorkbook.ReadFromFileIgnoringExtension(AFileName: string); procedure TsWorkbook.ReadFromFileIgnoringExtension(AFileName: string);
@ -1713,6 +1737,12 @@ begin
begin begin
if (FFormattingStyles[i].UsedFormattingFields <> AFormat^.UsedFormattingFields) then Continue; 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 uffTextRotation in AFormat^.UsedFormattingFields then
if (FFormattingStyles[i].TextRotation <> AFormat^.TextRotation) then Continue; 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 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; unit fpspreadsheetgrid;
@ -190,7 +190,7 @@ end;
// Converts the row height, given in mm, to pixels // Converts the row height, given in mm, to pixels
function TsCustomWorksheetGrid.CalcRowHeight(AHeight: Single): Integer; function TsCustomWorksheetGrid.CalcRowHeight(AHeight: Single): Integer;
begin begin
Result := round(AHeight / 25.4 * Screen.PixelsPerInch); Result := round(AHeight / 25.4 * Screen.PixelsPerInch) + 4;
end; end;
procedure TsCustomWorksheetGrid.DoPrepareCanvas(ACol, ARow: Integer; procedure TsCustomWorksheetGrid.DoPrepareCanvas(ACol, ARow: Integer;
@ -203,20 +203,35 @@ begin
ts := Canvas.TextStyle; ts := Canvas.TextStyle;
if FDisplayFixedColRow then begin if FDisplayFixedColRow then begin
// Formatting of row and column headers // Formatting of row and column headers
if ARow = 0 then if ARow = 0 then begin
ts.Alignment := taCenter ts.Alignment := taCenter;
else ts.Layout := tlCenter;
if ACol = 0 then end else
if ACol = 0 then begin
ts.Alignment := taRightJustify; ts.Alignment := taRightJustify;
ts.Layout := tlCenter;
end;
end; end;
if FWorksheet <> nil then begin if FWorksheet <> nil then begin
r := ARow - FixedRows; r := ARow - FixedRows;
c := ACol - FixedCols; c := ACol - FixedCols;
lCell := FWorksheet.FindCell(r, c); lCell := FWorksheet.FindCell(r, c);
if lCell <> nil then begin if lCell <> nil then begin
// Default alignment of number is right-justify case lCell^.HorAlignment of
if lCell^.ContentType = cctNumber then haDefault: if lCell^.ContentType = cctNumber then
ts.Alignment := taRightJustify; 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? // Word wrap?
if (uffWordWrap in lCell^.UsedFormattingFields) then begin if (uffWordWrap in lCell^.UsedFormattingFields) then begin
ts.Wordbreak := true; ts.Wordbreak := true;

View File

@ -51,6 +51,8 @@ type
procedure TestWriteReadColWidths; procedure TestWriteReadColWidths;
// Test word wrapping // Test word wrapping
procedure TestWriteReadWordWrap; procedure TestWriteReadWordWrap;
// Test alignments
procedure TestWriteReadAlignments;
end; end;
implementation implementation
@ -323,12 +325,78 @@ begin
if MyCell = nil then if MyCell = nil then
fail('Error in test code. Failed to get non-wrapped cell.'); 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)); CheckEquals((uffWordWrap in MyCell^.UsedFormattingFields), false, 'failed to return correct word-wrap flag, cell ' + CellNotation(MyWorksheet,0,0));
// Finalization
MyWorkbook.Free; MyWorkbook.Free;
DeleteFile(TempFile); DeleteFile(TempFile);
end; 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 initialization
RegisterTest(TSpreadWriteReadFormatTests); RegisterTest(TSpreadWriteReadFormatTests);
InitSollFmtData; InitSollFmtData;

View File

@ -66,6 +66,8 @@ type
TXFRecordData = class TXFRecordData = class
public public
FormatIndex: Integer; FormatIndex: Integer;
HorAlignment: TsHorAlignment;
VertAlignment: TsVertAlignment;
WordWrap: Boolean; WordWrap: Boolean;
Borders: TsCellBorders; Borders: TsCellBorders;
{ {
@ -159,7 +161,8 @@ type
procedure WriteColInfo(AStream: TStream; ASheet: TsWorksheet; ACol: PCol); procedure WriteColInfo(AStream: TStream; ASheet: TsWorksheet; ACol: PCol);
procedure WriteXF(AStream: TStream; AFontIndex: Word; procedure WriteXF(AStream: TStream; AFontIndex: Word;
AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders; 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); ABackgroundColor: TsColor = scSilver);
public public
// constructor Create; // constructor Create;
@ -289,9 +292,18 @@ const
MASK_XF_USED_ATTRIB_BACKGROUND = $40; MASK_XF_USED_ATTRIB_BACKGROUND = $40;
MASK_XF_USED_ATTRIB_CELL_PROTECTION = $80; 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 } { XF_VERT_ALIGN }
MASK_XF_VERT_ALIGN_TOP = $00; 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_BOTTOM = $20;
MASK_XF_VERT_ALIGN_JUSTIFIED = $30; MASK_XF_VERT_ALIGN_JUSTIFIED = $30;
@ -300,6 +312,12 @@ const
XF_ROTATION_90_DEGREE_COUNTERCLOCKWISE = 90; XF_ROTATION_90_DEGREE_COUNTERCLOCKWISE = 90;
XF_ROTATION_90_DEGREE_CLOCKWISE = 180; 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 } { XF record constants }
MASK_XF_TYPE_PROT = $0007; MASK_XF_TYPE_PROT = $0007;
MASK_XF_TYPE_PROT_PARENT = $FFF0; MASK_XF_TYPE_PROT_PARENT = $FFF0;
@ -308,6 +326,7 @@ const
MASK_XF_VERT_ALIGN = $70; MASK_XF_VERT_ALIGN = $70;
MASK_XF_TEXTWRAP = $08; MASK_XF_TEXTWRAP = $08;
{ {
Exported functions Exported functions
} }
@ -396,6 +415,8 @@ var
lBorders: TsCellBorders; lBorders: TsCellBorders;
lAddBackground: Boolean; lAddBackground: Boolean;
lBackgroundColor: TsColor; lBackgroundColor: TsColor;
lHorAlign: TsHorAlignment;
lVertAlign: TsVertAlignment;
lWordWrap: Boolean; lWordWrap: Boolean;
fmt: String; fmt: String;
begin begin
@ -407,6 +428,8 @@ begin
lFormatIndex := 0; //General format (one of the built-in number formats) lFormatIndex := 0; //General format (one of the built-in number formats)
lTextRotation := XF_ROTATION_HORIZONTAL; lTextRotation := XF_ROTATION_HORIZONTAL;
lBorders := []; lBorders := [];
lHorAlign := FFormattingStyles[i].HorAlignment;
lVertAlign := FFormattingStyles[i].VertAlignment;
lBackgroundColor := FFormattingStyles[i].BackgroundColor; lBackgroundColor := FFormattingStyles[i].BackgroundColor;
// Now apply the modifications. // Now apply the modifications.
@ -488,8 +511,8 @@ begin
lWordwrap := (uffWordwrap in FFormattingStyles[i].UsedFormattingFields); lWordwrap := (uffWordwrap in FFormattingStyles[i].UsedFormattingFields);
// And finally write the style // And finally write the style
WriteXF(AStream, lFontIndex, lFormatIndex, 0, lTextRotation, lBorders, lWordwrap, WriteXF(AStream, lFontIndex, lFormatIndex, 0, lTextRotation, lBorders,
lAddBackground, lBackgroundColor); lHorAlign, lVertAlign, lWordwrap, lAddBackground, lBackgroundColor);
end; end;
end; end;
@ -648,6 +671,7 @@ begin
WriteXF(AStream, 0, 0, 0, XF_ROTATION_90_DEGREE_CLOCKWISE, []); WriteXF(AStream, 0, 0, 0, XF_ROTATION_90_DEGREE_CLOCKWISE, []);
// XF18 - Bold // XF18 - Bold
WriteXF(AStream, 1, 0, 0, XF_ROTATION_HORIZONTAL, []); WriteXF(AStream, 1, 0, 0, XF_ROTATION_HORIZONTAL, []);
// Add all further non-standard/built-in formatting styles // Add all further non-standard/built-in formatting styles
ListAllFormattingStyles(AData); ListAllFormattingStyles(AData);
WriteXFFieldsForFormattingStyles(AStream); WriteXFFieldsForFormattingStyles(AStream);
@ -1525,7 +1549,8 @@ end;
*******************************************************************} *******************************************************************}
procedure TsSpreadBIFF8Writer.WriteXF(AStream: TStream; AFontIndex: Word; procedure TsSpreadBIFF8Writer.WriteXF(AStream: TStream; AFontIndex: Word;
AFormatIndex: Word; AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders; 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); ABackgroundColor: TsColor = scSilver);
var var
XFOptions: Word; XFOptions: Word;
@ -1551,8 +1576,19 @@ begin
AStream.WriteWord(WordToLE(XFOptions)); AStream.WriteWord(WordToLE(XFOptions));
{ Alignment and text break } { Alignment and text break }
XFAlignment := MASK_XF_VERT_ALIGN_BOTTOM; XFAlignment := 0;
if AddWordWrap then 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; XFAlignment := XFAlignment or MASK_XF_TEXTWRAP;
AStream.WriteByte(XFAlignment); AStream.WriteByte(XFAlignment);
@ -2058,6 +2094,10 @@ begin
if Assigned(lCell) then begin if Assigned(lCell) then begin
XFData := TXFRecordData(FXFList.Items[XFIndex]); XFData := TXFRecordData(FXFList.Items[XFIndex]);
// Alignment
lCell^.HorAlignment := XFData.HorAlignment;
lCell^.VertAlignment := XFData.VertAlignment;
// Word wrap // Word wrap
if XFData.WordWrap then if XFData.WordWrap then
Include(lCell^.UsedFormattingFields, uffWordWrap) Include(lCell^.UsedFormattingFields, uffWordWrap)
@ -2395,6 +2435,7 @@ type
var var
lData: TXFRecordData; lData: TXFRecordData;
xf: TXFRecord; xf: TXFRecord;
b: Byte;
begin begin
AStream.ReadBuffer(xf, SizeOf(xf)); AStream.ReadBuffer(xf, SizeOf(xf));
@ -2403,6 +2444,20 @@ begin
// Format index // Format index
lData.FormatIndex := WordLEToN(xf.FormatIndex); 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 // Word wrap
lData.WordWrap := (xf.Align_TextBreak and MASK_XF_TEXTWRAP) <> 0; lData.WordWrap := (xf.Align_TextBreak and MASK_XF_TEXTWRAP) <> 0;
@ -2411,13 +2466,13 @@ begin
lData.Borders := []; lData.Borders := [];
// the 4 masked bits encode the line style of the border line. 0 = no line // 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" // 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); 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); 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); 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); Include(lData.Borders, cbSouth);
// Add the XF to the list // Add the XF to the list

View File

@ -862,19 +862,22 @@ begin
end; end;
{ This function checks whether the format string corresponds to exponential { 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; function IsExpNumberFormat(s: String; out Decimals: Word): Boolean;
var var
i, p, pe: Integer; i, p, pe: Integer;
begin begin
Result := false;
Decimals := 0; Decimals := 0;
if SameText(s, 'General') then
exit;
// Check for a valid format string // Check for a valid format string
try try
FormatDateTime(s, 1.0); FormatDateTime(s, 1.0);
except except
on EConvertError do begin on EConvertError do begin
Result := false;
exit; exit;
end; end;
end; end;