fpspreadsheet / BiffExplorer: Add info on records COLINFO, COLWIDTH, NOTE, OBJ; some cosmetics in MainForm.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2940 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-04-17 17:36:43 +00:00
parent afcb50a0be
commit 1f84822607
4 changed files with 267 additions and 7 deletions

View File

@ -31,6 +31,8 @@ type
procedure ShowCalcMode; procedure ShowCalcMode;
procedure ShowClrtClient; procedure ShowClrtClient;
procedure ShowCodePage; procedure ShowCodePage;
procedure ShowColInfo;
procedure ShowColWidth;
procedure ShowCountry; procedure ShowCountry;
procedure ShowDateMode; procedure ShowDateMode;
procedure ShowDefColWidth; procedure ShowDefColWidth;
@ -56,7 +58,9 @@ type
procedure ShowLabelSSTCell; procedure ShowLabelSSTCell;
procedure ShowLeftMargin; procedure ShowLeftMargin;
procedure ShowMMS; procedure ShowMMS;
procedure ShowNote;
procedure ShowNumberCell; procedure ShowNumberCell;
procedure ShowObj;
procedure ShowPalette; procedure ShowPalette;
procedure ShowPassword; procedure ShowPassword;
procedure ShowPrecision; procedure ShowPrecision;
@ -255,12 +259,16 @@ begin
ShowFooter; ShowFooter;
$0019: $0019:
ShowWindowProtect; ShowWindowProtect;
$001C:
ShowNote;
$001D: $001D:
ShowSelection; ShowSelection;
$001E, $041E: $001E, $041E:
ShowFormat; ShowFormat;
$0022: $0022:
ShowDateMode; ShowDateMode;
$0024:
ShowColWidth;
$0025, $0225: $0025, $0225:
ShowDefRowHeight; ShowDefRowHeight;
$0026: $0026:
@ -293,8 +301,12 @@ begin
ShowFileSharing; ShowFileSharing;
$005C: $005C:
ShowWriteAccess; ShowWriteAccess;
$005D:
ShowObj;
$005F: $005F:
ShowRecalc; ShowRecalc;
$007D:
ShowColInfo;
$0085: $0085:
ShowSheet; ShowSheet;
$0086: $0086:
@ -580,7 +592,7 @@ begin
w := WordLEToN(w); w := WordLEToN(w);
s := CodePageName(w); s := CodePageName(w);
if Row = FCurrRow then begin if Row = FCurrRow then begin
FDetails.Add('Code page:'); FDetails.Add('Code page:'#13);
FDetails.Add(Format('$%.04x = %s', [w, s])); FDetails.Add(Format('$%.04x = %s', [w, s]));
end; end;
if s <> '' then s := 'Code page identifier (' + s + ')' else s := 'Code page identifier'; if s <> '' then s := 'Code page identifier (' + s + ')' else s := 'Code page identifier';
@ -588,6 +600,80 @@ begin
end; end;
procedure TBIFFGrid.ShowColInfo;
var
numBytes: Integer;
w: Word;
begin
if FFormat = sfExcel2 then
exit;
RowCount := FixedRows + 5;
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Index of first column in range');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Index of last column in range');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Width of the columns in 1/256 of the width of the zero character, using default font (first FONT record in the file)');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numbytes, IntToStr(WordLEToN(w)),
'Index to XF record for default column formattingg');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
w := WordLEToN(w);
if Row = FCurrRow then begin
FDetails.Add('Column options:'#13);
if w and $0001 = 0
then FDetails.Add('Bit $0001 = 0: Columns are NOT hidden')
else FDetails.Add('Bit $0001 = 1: Columns are hidden');
FDetails.Add(Format('Bits $0700 = %d: Outline level of the columns (0 = no outline)', [(w and $0700) shr 8]));
if w and $1000 = 0
then FDetails.Add('Bit $1000 = 0: Columns are NOT collapsed')
else FDetails.Add('Bit $1000 = 1: Columns are collapsed');
end;
ShowInRow(FCurrRow, FBufferIndex, numbytes, IntToStr(w), 'Option flags');
end;
procedure TBIFFGrid.ShowColWidth;
var
numBytes: Integer;
w: Word;
begin
if FFormat <> sfExcel2 then
exit;
RowCount := FixedRows + 3;
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Index of first column');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Index of last column');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(WordLEToN(w)),
'Width of the columns in 1/256 of the width of the zero character, using default font (first FONT record in the file)');
end;
procedure TBIFFGrid.ShowCountry; procedure TBIFFGrid.ShowCountry;
var var
numBytes: Integer; numBytes: Integer;
@ -1754,6 +1840,60 @@ begin
end; end;
procedure TBIFFGrid.ShowNote;
var
numBytes: Integer;
w: Word = 0;
s: String;
begin
RowCount := IfThen(FFormat = sfExcel8, 6, 4);
// Offset 0: Row and Col index
ShowRowColData(FBufferIndex);
if FFormat = sfExcel8 then begin
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
if Row = FCurrRow then begin
FDetails.Add('Comment flags:'#13);
if (w and $0002 <> 0)
then FDetails.Add('Bit 1=1: Comment is shown at all times')
else FDetails.Add('Bit 1=0: Comment is not shown at all tiems');
if (w and $0080 <> 0)
then FDetails.Add('Bit 7=1: Row with comment is hidden')
else FDetails.Add('Bit 7=0: Row with comment is visible');
if (w and $0100 <> 0)
then FDetails.Add('Bit 8=1: Column with comment is hidden')
else FDetails.Add('Bit 8=0: Column with comment is visible');
FDetails.Add('All other bits are reserved and must be ignored.');
end;
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('%d ($%.4x)', [w, w]),
'Flags');
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(w), 'Object ID');
ExtractString(FBufferIndex, IfThen(FFormat=sfExcel8, 2, 1), FFormat=sfExcel8,
s, numbytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, s, 'Author');
end else begin
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
ShowInRow(FCurrRow, FBufferIndex, numBytes, IntToStr(w),
'Total length of comment');
numBytes := Min(Length(FBuffer) - FBufferIndex, 2048);
SetLength(s, numBytes);
Move(FBuffer[FBufferIndex], s[1], numBytes);
SetLength(s, Length(s));
ShowInRow(FCurrRow, FBufferIndex, numBytes, s, 'Comment text');
end;
end;
procedure TBIFFGrid.ShowNumberCell; procedure TBIFFGrid.ShowNumberCell;
var var
numBytes: Integer; numBytes: Integer;
@ -1795,6 +1935,104 @@ begin
end; end;
procedure TBIFFGrid.ShowObj;
var
numBytes: Integer;
w: Word;
begin
RowCount := FixedRows + 5;
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.04x', [WordLEToN(w)]),
'ft (must be $15)');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.04x', [WordLEToN(w)]),
'cb (must be $12)');
numBytes := 2;
w := WordLEToN(w);
Move(FBuffer[FBufferIndex], w, numBytes);
if Row = FCurrRow then begin
FDetails.Add('Object type:'#13);
case w of
$00: FDetails.Add('$00 = Group');
$01: FDetails.Add('$01 = Line');
$02: FDetails.Add('$02 = Rectangle');
$03: FDetails.Add('$03 = Oval');
$04: FDetails.Add('$04 = Arc');
$05: FDetails.Add('$05 = Chart');
$06: FDetails.Add('$06 = Text');
$07: FDetails.Add('$07 = Button');
$08: FDetails.Add('$08 = Picture');
$09: FDetails.Add('$09 = Polygon');
$0B: FDetails.Add('$0B = Checkbox');
$0C: FDetails.Add('$0C = Radio button');
$0D: FDetails.Add('$0D = Edit box');
$0E: FDetails.Add('$0E = Label');
$0F: FDetails.Add('$0F = Dialog box');
$10: FDetails.Add('$10 = Spin control');
$11: FDetails.Add('$11 = Scrollbar');
$12: FDetails.Add('$12 = List');
$13: FDetails.Add('$13 = Group box');
$14: FDetails.ADd('$14 = Dropdown list');
$19: FDetails.Add('$19 = Note');
$1E: FDetails.Add('$1E = OfficeArt object');
else FDetails.Add(IntToStr(w) + ' = (unknown object)');
end;
end;
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.04x', [w]),
'Object type (ot)');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.04x', [WordLEToN(w)]),
'Object ID');
numBytes := 2;
Move(FBuffer[FBufferIndex], w, numBytes);
w := WordLEToN(w);
if Row = FCurrRow then begin
FDetails.Add('Object flags:'#13);
if w and $0001 <> 0
then FDetails.Add('Bit $0001 = 1: Object is locked')
else FDetails.Add('Bit $0001 = 0: Object is NOT locked');
if w and $0002 <> 0
then FDetails.Add('Bit $0002 = 1: Reserved - must be zero!!!d')
else FDetails.Add('Bit $0002 = 0: Reserved - must be zero');
if w and $0004 <> 0
then FDetails.Add('Bit $0004 = 1: Application is expected to choose object size')
else FDetails.Add('Bit $0004 = 0: Application is NOT expected to choose object size');
if w and $0008 <> 0
then FDetails.Add('Bit $0008 = 1: Is a chart that is expected to be published when sheet is published')
else FDetails.Add('Bit $0008 = 0: Is NOT a chart that is expected to be published when sheet is published');
if w and $0010 <> 0
then FDetails.Add('Bit $0010 = 1: Image of this object is intended to be included when printing')
else FDetails.Add('Bit $0010 = 0: Image of this object is NOT intended to be included when printing');
FDetails.Add('Bit $0020 : unused');
FDetails.Add('Bit $0040 : unused');
if w and $0080 <> 0
then FDetails.Add('Bit $0080 = 1: Object is disabled')
else FDetails.ADd('Bit $0080 = 0: Object is NOT disabled');
if w and $0100 <> 0
then FDetails.Add('Bit $0100 = 1: is an auxiliary object that can only be automatically inserted by the application')
else FDetails.Add('Bit $0100 = 0: is NOT an auxiliary object that can only be automatically inserted by the application');
if w and $0200 <> 0
then FDetails.Add('Bit $0200 = 1: is expected to be updated on load to reflect the values in the range associated with the object')
else FDetails.Add('Bit $0200 = 0: is NOT expected to be updated on load to reflect the values in the range associated with the object');
FDetails.Add('Bit $0400 : unused');
FDetails.Add('Bit $0800 : unused');
if w and $1000 <> 0
then FDetails.Add('Bit $1000 = 1: is expected to be updated whenever the value of a cell in the range associated with the object changes')
else FDetails.Add('Bit $1000 = 0: is NOT expected to be updated whenever the value of a cell in the range associated with the object changes');
end;
ShowInRow(FCurrRow, FBufferIndex, numBytes, Format('$%.04x', [w]),
'Flags');
end;
procedure TBIFFGrid.ShowPalette; procedure TBIFFGrid.ShowPalette;
var var
numBytes: Integer; numBytes: Integer;

View File

@ -158,6 +158,7 @@ begin
$005A: Result := 'CRN: Non-resident operands'; $005A: Result := 'CRN: Non-resident operands';
$005B: Result := 'FILESHARING: File-sharing information'; $005B: Result := 'FILESHARING: File-sharing information';
$005C: Result := 'WRITEACCESS: Write access user name'; $005C: Result := 'WRITEACCESS: Write access user name';
$005D: Result := 'OBJ';
$005E: Result := 'UNCALCED: Recalculation status'; $005E: Result := 'UNCALCED: Recalculation status';
$005F: Result := 'SAVERECALC: Recalculate before saving'; $005F: Result := 'SAVERECALC: Recalculate before saving';
$0060: Result := 'TEMPLATE: Workbook is a template'; $0060: Result := 'TEMPLATE: Workbook is a template';

View File

@ -275,11 +275,11 @@ object MainForm: TMainForm
OnChange = PageControlChange OnChange = PageControlChange
object PgAnalysis: TTabSheet object PgAnalysis: TTabSheet
Caption = 'Analysis' Caption = 'Analysis'
ClientHeight = 230 ClientHeight = 225
ClientWidth = 657 ClientWidth = 657
object AnalysisDetails: TMemo object AnalysisDetails: TMemo
Left = 428 Left = 428
Height = 230 Height = 225
Top = 0 Top = 0
Width = 229 Width = 229
Align = alRight Align = alRight
@ -295,7 +295,7 @@ object MainForm: TMainForm
end end
object DetailsSplitter: TSplitter object DetailsSplitter: TSplitter
Left = 423 Left = 423
Height = 230 Height = 225
Top = 0 Top = 0
Width = 5 Width = 5
Align = alRight Align = alRight
@ -319,6 +319,7 @@ object MainForm: TMainForm
RowCount = 9 RowCount = 9
TabOrder = 0 TabOrder = 0
TitleStyle = tsNative TitleStyle = tsNative
OnPrepareCanvas = ValueGridPrepareCanvas
ColWidths = ( ColWidths = (
112 112
142 142
@ -452,10 +453,10 @@ object MainForm: TMainForm
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
} }
end end
object SpeedButton3: TSpeedButton object BtnCloseFind: TSpeedButton
Left = 3 Left = 3
Height = 22 Height = 22
Hint = 'Close "find" panel' Hint = 'Close "Find" panel'
Top = 6 Top = 6
Width = 23 Width = 23
Action = AcFindClose Action = AcFindClose
@ -547,6 +548,7 @@ object MainForm: TMainForm
Width = 125 Width = 125
end> end>
Header.DefaultHeight = 24 Header.DefaultHeight = 24
Header.Font.Style = [fsBold]
Header.Height = 24 Header.Height = 24
Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoShowSortGlyphs, hoVisible] Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoShowSortGlyphs, hoVisible]
HintMode = hmTooltip HintMode = hmTooltip

View File

@ -68,7 +68,7 @@ type
BtnFindNext: TSpeedButton; BtnFindNext: TSpeedButton;
BtnFindPrev: TSpeedButton; BtnFindPrev: TSpeedButton;
RecentFilesPopupMenu: TPopupMenu; RecentFilesPopupMenu: TPopupMenu;
SpeedButton3: TSpeedButton; BtnCloseFind: TSpeedButton;
Splitter1: TSplitter; Splitter1: TSplitter;
HexSplitter: TSplitter; HexSplitter: TSplitter;
AlphaGrid: TStringGrid; AlphaGrid: TStringGrid;
@ -121,6 +121,8 @@ type
procedure ListViewSelectItem(Sender: TObject; Item: TListItem; procedure ListViewSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean); Selected: Boolean);
procedure PageControlChange(Sender: TObject); procedure PageControlChange(Sender: TObject);
procedure ValueGridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
aState: TGridDrawState);
private private
MemStream: TMemoryStream; MemStream: TMemoryStream;
@ -134,6 +136,8 @@ type
FMRUMenuManager : TMRUMenuManager; FMRUMenuManager : TMRUMenuManager;
procedure AddToHistory(const AText: String); procedure AddToHistory(const AText: String);
procedure AnalysisGridDetails(Sender: TObject; ADetails: TStrings); procedure AnalysisGridDetails(Sender: TObject; ADetails: TStrings);
procedure AnalysisGridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
aState: TGridDrawState);
procedure ExecFind(ANext, AKeep: Boolean); procedure ExecFind(ANext, AKeep: Boolean);
function GetNodeData(ANode: PVirtualNode): TBiffNodeData; function GetNodeData(ANode: PVirtualNode): TBiffNodeData;
function GetRecType: Word; function GetRecType: Word;
@ -338,6 +342,13 @@ begin
end; end;
procedure TMainForm.AnalysisGridPrepareCanvas(sender: TObject; aCol,
aRow: Integer; aState: TGridDrawState);
begin
if ARow = 0 then FAnalysisGrid.Canvas.Font.Style := [fsBold];
end;
procedure TMainForm.BeforeRun; procedure TMainForm.BeforeRun;
begin begin
ReadFromIni; ReadFromIni;
@ -593,6 +604,7 @@ begin
Options := Options + [goDrawFocusSelected]; Options := Options + [goDrawFocusSelected];
TitleStyle := tsNative; TitleStyle := tsNative;
OnDetails := @AnalysisGridDetails; OnDetails := @AnalysisGridDetails;
OnPrepareCanvas := @AnalysisGridPrepareCanvas;
end; end;
with ValueGrid do begin with ValueGrid do begin
@ -1107,6 +1119,13 @@ begin
end; end;
procedure TMainForm.ValueGridPrepareCanvas(sender: TObject; aCol,
aRow: Integer; aState: TGridDrawState);
begin
if ARow = 0 then ValueGrid.Canvas.Font.Style := [fsBold];
end;
procedure TMainForm.WriteToIni; procedure TMainForm.WriteToIni;
var var
ini: TCustomIniFile; ini: TCustomIniFile;