You've already forked lazarus-ccr
fpspreadsheet: Expand (some) details on DEFINEDNAME record in BIFFExplorer
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3480 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -135,7 +135,6 @@
|
|||||||
<ComponentName Value="AboutForm"/>
|
<ComponentName Value="AboutForm"/>
|
||||||
<HasResources Value="True"/>
|
<HasResources Value="True"/>
|
||||||
<ResourceBaseClass Value="Form"/>
|
<ResourceBaseClass Value="Form"/>
|
||||||
<UnitName Value="beAbout"/>
|
|
||||||
</Unit1>
|
</Unit1>
|
||||||
<Unit2>
|
<Unit2>
|
||||||
<Filename Value="bebiffgrid.pas"/>
|
<Filename Value="bebiffgrid.pas"/>
|
||||||
@ -145,7 +144,6 @@
|
|||||||
<Unit3>
|
<Unit3>
|
||||||
<Filename Value="bebiffutils.pas"/>
|
<Filename Value="bebiffutils.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
<UnitName Value="beBIFFUtils"/>
|
|
||||||
</Unit3>
|
</Unit3>
|
||||||
<Unit4>
|
<Unit4>
|
||||||
<Filename Value="behtml.pas"/>
|
<Filename Value="behtml.pas"/>
|
||||||
|
@ -38,6 +38,7 @@ type
|
|||||||
procedure ShowDateMode;
|
procedure ShowDateMode;
|
||||||
procedure ShowDBCell;
|
procedure ShowDBCell;
|
||||||
procedure ShowDefColWidth;
|
procedure ShowDefColWidth;
|
||||||
|
procedure ShowDefinedName;
|
||||||
procedure ShowDefRowHeight;
|
procedure ShowDefRowHeight;
|
||||||
procedure ShowDelta;
|
procedure ShowDelta;
|
||||||
procedure ShowDimensions;
|
procedure ShowDimensions;
|
||||||
@ -269,6 +270,8 @@ begin
|
|||||||
ShowHeader;
|
ShowHeader;
|
||||||
$0015:
|
$0015:
|
||||||
ShowFooter;
|
ShowFooter;
|
||||||
|
$0018, $0218:
|
||||||
|
ShowDefinedName;
|
||||||
$0019:
|
$0019:
|
||||||
ShowWindowProtect;
|
ShowWindowProtect;
|
||||||
$001C:
|
$001C:
|
||||||
@ -874,6 +877,208 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TBIFFGrid.ShowDefinedName;
|
||||||
|
var
|
||||||
|
numBytes: Integer;
|
||||||
|
b: Byte;
|
||||||
|
w: Word;
|
||||||
|
isFuncMacro: Boolean;
|
||||||
|
lenName: Word;
|
||||||
|
ansistr: AnsiString;
|
||||||
|
widestr: WideString;
|
||||||
|
s: String;
|
||||||
|
macro: Boolean;
|
||||||
|
begin
|
||||||
|
if FFormat = sfExcel2 then begin
|
||||||
|
RowCount := FixedRows + 7;
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
isFuncMacro := b and $02 <> 0;
|
||||||
|
if Row = FCurrRow then begin
|
||||||
|
FDetails.Add('Option flags:'#13);
|
||||||
|
if b and $02 = 0 then
|
||||||
|
FDetails.Add('Bit $02 = 0: NO function macro or command macro')
|
||||||
|
else
|
||||||
|
FDetails.Add('Bit $02 = 1: Function macro or command macro');
|
||||||
|
if b and $04 = 0 then
|
||||||
|
FDetails.Add('Bit $04 = 0: NO Complex function (array formula or user defined)')
|
||||||
|
else
|
||||||
|
FDetails.Add('Bit $04 = 1: Complex function (array formula or user defined)');
|
||||||
|
end;
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.2x', [b]),
|
||||||
|
'Option flags');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
if isFuncMacro then
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(b),
|
||||||
|
'$01 = Function macro, $02 = Command macro')
|
||||||
|
else
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(b),
|
||||||
|
'unknown');
|
||||||
|
|
||||||
|
numBytes := 2;
|
||||||
|
Move(FBuffer[FBufferIndex], w, numbytes);
|
||||||
|
w := WordLEToN(w);
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('%d ($%.4x)', [w, w]),
|
||||||
|
'Keyboard shortcut (only for command macro names)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(b),
|
||||||
|
'Length of the name (character count)');
|
||||||
|
lenName := b;
|
||||||
|
|
||||||
|
numbytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBUfferIndex, numBytes, IntToStr(b),
|
||||||
|
'Size of the formula data');
|
||||||
|
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, 1, '',
|
||||||
|
'Formula data follow...');
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
RowCount := FixedRows + 12;
|
||||||
|
|
||||||
|
numBytes := 2;
|
||||||
|
Move(FBuffer[FBufferIndex], w, numBytes);
|
||||||
|
w := WordLEToN(w);
|
||||||
|
if Row = FCurrRow then begin
|
||||||
|
macro := (w and $0008 <> 0);
|
||||||
|
FDetails.Add('Option flags:'#13);
|
||||||
|
if w and $0001 = 0
|
||||||
|
then FDetails.Add('Bit $0001 (flag name "hidden") = 0: Visible')
|
||||||
|
else FDetails.Add('Bit $0001 (flag name "hidden")= 1: Hidden');
|
||||||
|
if w and $0002 = 0
|
||||||
|
then FDetails.Add('Bit §0002 (flag name "func") = 0: Command macro')
|
||||||
|
else FDetails.Add('Bit $0002 (flag name "func") = 1: Function macro');
|
||||||
|
if w and $0004 = 0
|
||||||
|
then FDetails.Add('Bit $0004 (flag name "vbasic") = 0: Sheet macro')
|
||||||
|
else FDetails.Add('Bit $0004 (flag name "vbasic") = 1: Visual basic macro');
|
||||||
|
if w and $0008 = 0
|
||||||
|
then FDetails.Add('Bit $0008 (flag name "macro") = 0: Standard name')
|
||||||
|
else FDetails.Add('Bit $0008 (flag name "macro") = 1: Macro name');
|
||||||
|
if w and $0010 = 0
|
||||||
|
then FDetails.Add('Bit $0010 (flag name "complex") = 0: Simple formula')
|
||||||
|
else FDetails.Add('Bit $0010 (flag name "complex") = 1: Complex formula (array formula or user defined)');
|
||||||
|
if w and $0020 = 0
|
||||||
|
then FDetails.Add('Bit $0020 (flag name "builtin") = 0: User-defined name')
|
||||||
|
else FDetails.Add('Bit $0020 (flag name "builtin") = 1: Built-in name');
|
||||||
|
case (w and $0FC0) shr 6 of
|
||||||
|
0: if macro then
|
||||||
|
FDetails.Add('Bit $0FC0 = 0: --- forbidden value, must be > 0 ---')
|
||||||
|
else
|
||||||
|
FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 0: not used (requires "macro" = 1)');
|
||||||
|
1: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 1: financial');
|
||||||
|
2: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 2: date & time');
|
||||||
|
3: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 3: math & trig');
|
||||||
|
4: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 4: statistical');
|
||||||
|
5: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 5: lookup & reference');
|
||||||
|
6: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 6: database');
|
||||||
|
7: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 7: text');
|
||||||
|
8: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 8: logical');
|
||||||
|
9: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 9: information');
|
||||||
|
10: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 10: commands');
|
||||||
|
11: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 11: customizing');
|
||||||
|
12: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 12: macro control');
|
||||||
|
13: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 13: dde/external');
|
||||||
|
14: FDetails.Add('Bit $0FC0 (flag name "funcgroup") = 14: user defined');
|
||||||
|
end;
|
||||||
|
if w and $1000 = 0
|
||||||
|
then FDetails.Add('Bit $1000 (flag name "binary") = 0: formula definition')
|
||||||
|
else FDetails.add('Bit $1000 (flag name "binary") = 1: binary data (BIFF5-BIFF8)');
|
||||||
|
end;
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('%d ($%.4x)', [w, w]),
|
||||||
|
'Option flags');
|
||||||
|
|
||||||
|
numbytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInrow(FCurrRow, FBufferIndex, numBytes, Format('%d ($%.2x)', [b, b]),
|
||||||
|
'Keyboard shortcurt (only for command macro names)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numbytes, IntToStr(b),
|
||||||
|
'Length of the name (character count)');
|
||||||
|
lenName := b;
|
||||||
|
|
||||||
|
numBytes := 2;
|
||||||
|
Move(FBuffer[FBufferIndex], w, numbytes);
|
||||||
|
w := WordLEToN(w);
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(w),
|
||||||
|
'Size of the formula data');
|
||||||
|
|
||||||
|
numBytes := 2;
|
||||||
|
Move(FBuffer[FBufferIndex], w, numBytes);
|
||||||
|
w := WordLEToN(w);
|
||||||
|
if FFormat = sfExcel5 then
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, NumBytes, IntToStr(w),
|
||||||
|
'0 = Global name, otherwise index to EXTERNSHEET record (one-based)')
|
||||||
|
else
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(w),
|
||||||
|
'not used');
|
||||||
|
|
||||||
|
numBytes := 2;
|
||||||
|
Move(FBuffer[FBufferIndex], w, numBytes);
|
||||||
|
w := WordLEToN(w);
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, NumBytes, IntToStr(w),
|
||||||
|
'0 = Global name, otherwise index to sheet (one-based)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, nuMbytes, IntToStr(b),
|
||||||
|
'Length of the menu text (character count)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, nuMbytes, IntToStr(b),
|
||||||
|
'Length of the description text (character count)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, nuMbytes, IntToStr(b),
|
||||||
|
'Length of the help topic text (character count)');
|
||||||
|
|
||||||
|
numBytes := 1;
|
||||||
|
b := FBuffer[FBufferIndex];
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, nuMbytes, IntToStr(b),
|
||||||
|
'Length of the status bar text (character count)');
|
||||||
|
|
||||||
|
if FFormat = sfExcel5 then begin
|
||||||
|
numBytes := lenName * sizeOf(ansiChar);
|
||||||
|
SetLength(ansiStr, lenName);
|
||||||
|
Move(FBuffer[FBufferIndex], ansiStr[1], numbytes);
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numBytes, ansiStr,
|
||||||
|
'Character array of the name');
|
||||||
|
end else begin
|
||||||
|
|
||||||
|
if (FBuffer[FBufferIndex] and $01 = 0) //and (not IgnoreCompressedFlag)
|
||||||
|
then begin // compressed --> 1 byte per character
|
||||||
|
SetLength(ansiStr, lenName);
|
||||||
|
numbytes := lenName*SizeOf(ansiChar) + 1;
|
||||||
|
Move(FBuffer[FBufferIndex + 1], ansiStr[1], lenName*SizeOf(AnsiChar));
|
||||||
|
s := AnsiToUTF8(ansiStr);
|
||||||
|
end else begin
|
||||||
|
SetLength(wideStr, lenName);
|
||||||
|
numBytes := lenName*SizeOf(WideChar) + 1;
|
||||||
|
Move(FBuffer[FBufferIndex + 1], wideStr[1], lenName*SizeOf(WideChar));
|
||||||
|
s := UTF8Encode(WideStringLEToN(wideStr));
|
||||||
|
end;
|
||||||
|
{
|
||||||
|
numBytes := lenName * SizeOf(wideChar);
|
||||||
|
SetLength(wideStr, lenName);
|
||||||
|
Move(FBuffer[FBufferIndex], wideStr[1], numBytes);
|
||||||
|
}
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, numbytes, s,
|
||||||
|
'Name (Unicode string without length field)');
|
||||||
|
end;
|
||||||
|
|
||||||
|
ShowInRow(FCurrRow, FBufferIndex, 1, '',
|
||||||
|
'Formula data follow...');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TBIFFGrid.ShowDefRowHeight;
|
procedure TBIFFGrid.ShowDefRowHeight;
|
||||||
var
|
var
|
||||||
numBytes: Integer;
|
numBytes: Integer;
|
||||||
@ -886,7 +1091,7 @@ begin
|
|||||||
Move(FBuffer[FBufferIndex], w, numBytes);
|
Move(FBuffer[FBufferIndex], w, numBytes);
|
||||||
w := WordLEToN(w);
|
w := WordLEToN(w);
|
||||||
if Row = FCurrRow then begin
|
if Row = FCurrRow then begin
|
||||||
FDetails.Add('Default height for unused rows');
|
FDetails.Add('Default height for unused rows:'#13);
|
||||||
FDetails.Add(Format(
|
FDetails.Add(Format(
|
||||||
'Bits $7FFF = %d: Default height for unused rows, in twips = 1/20 of a point',
|
'Bits $7FFF = %d: Default height for unused rows, in twips = 1/20 of a point',
|
||||||
[w and $7FFF]));
|
[w and $7FFF]));
|
||||||
@ -902,7 +1107,7 @@ begin
|
|||||||
Move(FBuffer[FBufferIndex], w, numBytes);
|
Move(FBuffer[FBufferIndex], w, numBytes);
|
||||||
w := WordLEToN(w);
|
w := WordLEToN(w);
|
||||||
if Row = FCurrRow then begin
|
if Row = FCurrRow then begin
|
||||||
FDetails.Add('Option flags');
|
FDetails.Add('Option flags:'#13);
|
||||||
if w and $0001 = 0
|
if w and $0001 = 0
|
||||||
then FDetails.Add('Bit $0001 = 0: Row height and default font height do match')
|
then FDetails.Add('Bit $0001 = 0: Row height and default font height do match')
|
||||||
else FDetails.Add('Bit $0001 = 1: Row height and default font height do not match');
|
else FDetails.Add('Bit $0001 = 1: Row height and default font height do not match');
|
||||||
|
Reference in New Issue
Block a user