diff --git a/components/fpspreadsheet/reference/BIFFExplorer/BIFFExplorer.lpi b/components/fpspreadsheet/reference/BIFFExplorer/BIFFExplorer.lpi
index 84e573648..ae8bd0e7a 100644
--- a/components/fpspreadsheet/reference/BIFFExplorer/BIFFExplorer.lpi
+++ b/components/fpspreadsheet/reference/BIFFExplorer/BIFFExplorer.lpi
@@ -135,7 +135,6 @@
-
@@ -145,7 +144,6 @@
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/bebiffgrid.pas b/components/fpspreadsheet/reference/BIFFExplorer/bebiffgrid.pas
index 3faeb94b9..7d165414e 100644
--- a/components/fpspreadsheet/reference/BIFFExplorer/bebiffgrid.pas
+++ b/components/fpspreadsheet/reference/BIFFExplorer/bebiffgrid.pas
@@ -38,6 +38,7 @@ type
procedure ShowDateMode;
procedure ShowDBCell;
procedure ShowDefColWidth;
+ procedure ShowDefinedName;
procedure ShowDefRowHeight;
procedure ShowDelta;
procedure ShowDimensions;
@@ -269,6 +270,8 @@ begin
ShowHeader;
$0015:
ShowFooter;
+ $0018, $0218:
+ ShowDefinedName;
$0019:
ShowWindowProtect;
$001C:
@@ -874,6 +877,208 @@ begin
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;
var
numBytes: Integer;
@@ -886,7 +1091,7 @@ begin
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
if Row = FCurrRow then begin
- FDetails.Add('Default height for unused rows');
+ FDetails.Add('Default height for unused rows:'#13);
FDetails.Add(Format(
'Bits $7FFF = %d: Default height for unused rows, in twips = 1/20 of a point',
[w and $7FFF]));
@@ -902,7 +1107,7 @@ begin
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
if Row = FCurrRow then begin
- FDetails.Add('Option flags');
+ FDetails.Add('Option flags:'#13);
if w and $0001 = 0
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');