';
- end;
-end;
-
-function SheetFuncName(AIndex: Word): String;
-begin
- case AIndex of
- 0 : result := 'COUNT';
- 1 : Result := 'IF';
- 2 : Result := 'ISNA';
- 3 : Result := 'ISERROR';
- 4 : Result := 'SUM';
- 5 : Result := 'AVERAGE';
- 6 : Result := 'MIN';
- 7 : Result := 'MAX';
- 8 : Result := 'ROW';
- 9 : Result := 'COLUMN';
- 10 : Result := 'NA';
- 11 : Result := 'NPV';
- 12 : Result := 'STDEV';
- 13 : Result := 'DOLLAR';
- 14 : Result := 'FIXED';
- 15 : Result := 'SIN';
- 16 : Result := 'COS';
- 17 : Result := 'TAN';
- 18 : Result := 'ATAN';
- 19 : Result := 'PI';
- 20 : Result := 'SQRT';
- 21 : Result := 'EXP';
- 22 : Result := 'LN';
- 23 : Result := 'LOG10';
- 24 : Result := 'ABS';
- 25 : Result := 'INT';
- 26 : Result := 'SIGN';
- 27 : Result := 'ROUND';
- 28 : Result := 'LOOKUP';
- 29 : Result := 'INDEX';
- 30 : Result := 'REPT';
- 31 : Result := 'MID';
- 32 : Result := 'LEN';
- 33 : Result := 'VALUE';
- 34 : Result := 'TRUE';
- 35 : Result := 'FALSE';
- 36 : Result := 'AND';
- 37 : Result := 'OR';
- 38 : Result := 'NOT';
- 39 : Result := 'MOD';
- 40 : Result := 'DCOUNT';
- 41 : Result := 'DSUM';
- 42 : Result := 'DAVERAGE';
- 43 : Result := 'DMIN';
- 44 : Result := 'DMAX';
- 45 : Result := 'DSTDEV';
- 46 : Result := 'VAR';
- 47 : Result := 'DVAR';
- 48 : Result := 'TEXT';
- 49 : Result := 'LINEST';
- 50 : Result := 'TREND';
- 51 : Result := 'LOGEST';
- 52 : Result := 'GROWTH';
- 56 : Result := 'PV';
- 57 : Result := 'FV';
- 58 : Result := 'NPER';
- 59 : Result := 'PMT';
- 60 : Result := 'RATE';
- 61 : Result := 'MIRR';
- 62 : Result := 'IRR';
- 63 : Result := 'RAND';
- 64 : Result := 'MATCH';
- 65 : Result := 'DATE';
- 66 : Result := 'TIME';
- 67 : Result := 'DAY';
- 68 : Result := 'MONTH';
- 69 : Result := 'YEAR';
- 70 : Result := 'WEEKDAY';
- 71 : Result := 'HOUR';
- 72 : Result := 'MINUTE';
- 73 : Result := 'SECOND';
- 74 : Result := 'NOW';
- 75 : Result := 'AREAS';
- 76 : Result := 'ROWS';
- 77 : Result := 'COLUMNS';
- 78 : Result := 'OFFSET';
- 82 : Result := 'SEARCH';
- 83 : Result := 'TRANSPOSE';
- 86 : Result := 'TYPE';
- 97 : Result := 'ATAN2';
- 98 : Result := 'ASIN';
- 99 : Result := 'ACOS';
- 100 : Result := 'CHOOSE';
- 101 : Result := 'HLOOKUP';
- 102 : Result := 'VLOOKUP';
- 105 : Result := 'ISREF';
- 109 : Result := 'LOG';
- 111 : Result := 'CHAR';
- 112 : Result := 'LOWER';
- 113 : Result := 'UPPER';
- 114 : Result := 'PROPER';
- 115 : Result := 'LEFT';
- 116 : Result := 'RIGHT';
- 117 : Result := 'EXACT';
- 118 : Result := 'TRIM';
- 119 : Result := 'REPLACE';
- 120 : Result := 'SUBSTITUTE';
- 121 : Result := 'CODE';
- 124 : Result := 'FIND';
- 125 : Result := 'CELL';
- 126 : Result := 'ISERR';
- 127 : Result := 'ISTEXT';
- 128 : Result := 'ISNUMBER';
- 129 : Result := 'ISBLANK';
- 130 : Result := 'T';
- 131 : Result := 'N';
- 140 : Result := 'DATEVALUE';
- 141 : Result := 'TIMEVALUE';
- 142 : Result := 'SLN';
- 143 : Result := 'SYD';
- 144 : Result := 'DDB';
- 148 : Result := 'INDIRECT';
- 162 : Result := 'CLEAN';
- 163 : Result := 'MDETERM';
- 164 : Result := 'MINVERSE';
- 165 : Result := 'MMULT';
- 167 : Result := 'IPMT';
- 168 : Result := 'PPMT';
- 169 : Result := 'COUNTA';
- 183 : Result := 'PRODUCT';
- 184 : Result := 'FACT';
- 189 : Result := 'DPRODUCT';
- 190 : Result := 'ISNONTEXT';
- 193 : Result := 'STDEVP';
- 194 : Result := 'VARP';
- 195 : Result := 'DSTDEVP';
- 196 : Result := 'DVARP';
- 197 : Result := 'TRUNC';
- 198 : Result := 'ISLOGICAL';
- 199 : Result := 'DCOUNTA';
- 204 : Result := 'YEN/USDOLLAR';
- 205 : Result := 'FINDB';
- 206 : Result := 'SEARCHB';
- 207 : Result := 'REPLACEB';
- 208 : Result := 'LEFTB';
- 209 : Result := 'RIGHTB';
- 210 : Result := 'MIDB';
- 211 : Result := 'LENB';
- 212 : Result := 'ROUNDUP';
- 213 : Result := 'ROUNDDOWN';
- 214 : Result := 'ASC';
- 215 : Result := 'JIS / DBCS';
- 216 : Result := 'RANK';
- 219 : Result := 'ADDRESS';
- 220 : Result := 'DAYS360';
- 221 : Result := 'TODAY';
- 222 : Result := 'VDB';
- 227 : Result := 'MEDIAN';
- 228 : Result := 'SUMPRODUCT';
- 229 : Result := 'SINH';
- 230 : Result := 'COSH';
- 231 : Result := 'TANH';
- 232 : Result := 'ASINH';
- 233 : Result := 'ACOSH';
- 234 : Result := 'ATANH';
- 235 : Result := 'DGET';
- 244 : Result := 'INFO';
- 247 : Result := 'DB';
- 252 : Result := 'FREQUENCY';
- 261 : Result := 'ERROR.TYPE';
- 269 : Result := 'AVEDEV';
- 270 : Result := 'BETADIST';
- 271 : Result := 'GAMMALN';
- 272 : Result := 'BETAINV';
- 273 : Result := 'BINOMDIST';
- 274 : Result := 'CHIDIST';
- 275 : Result := 'CHIINV';
- 276 : Result := 'COMBIN';
- 277 : Result := 'CONFIDENCE';
- 278 : Result := 'CRITBINOM';
- 279 : Result := 'EVEN';
- 280 : Result := 'EXPONDIST';
- 281 : Result := 'FDIST';
- 282 : Result := 'FINV';
- 283 : Result := 'FISHER';
- 284 : Result := 'FISHERINV';
- 285 : Result := 'FLOOR';
- 286 : Result := 'GAMMADIST';
- 287 : Result := 'GAMMAINV';
- 288 : Result := 'CEILING';
- 289 : Result := 'HYPGEOMDIST';
- 290 : Result := 'LOGNORMDIST';
- 291 : Result := 'LOGINV';
- 292 : Result := 'NEGBINOMDIST';
- 293 : Result := 'NORMDIST';
- 294 : Result := 'NORMSDIST';
- 295 : Result := 'NORMINV';
- 296 : Result := 'NORMSINV';
- 297 : Result := 'STANDARDIZE';
- 298 : Result := 'ODD';
- 299 : Result := 'PERMUT';
- 300 : Result := 'POISSON';
- 301 : Result := 'TDIST';
- 302 : Result := 'WEIBULL';
- 303 : Result := 'SUMXMY2';
- 304 : Result := 'SUMX2MY2';
- 305 : Result := 'SUMX2PY2';
- 306 : Result := 'CHITEST';
- 307 : Result := 'CORREL';
- 308 : Result := 'COVAR';
- 309 : Result := 'FORECAST';
- 310 : Result := 'FTEST';
- 311 : Result := 'INTERCEPT';
- 312 : Result := 'PEARSON';
- 313 : Result := 'RSQ';
- 314 : Result := 'STEYX';
- 315 : Result := 'SLOPE';
- 316 : Result := 'TTEST';
- 317 : Result := 'PROB';
- 318 : Result := 'DEVSQ';
- 319 : Result := 'GEOMEAN';
- 320 : Result := 'HARMEAN';
- 321 : Result := 'SUMSQ';
- 322 : Result := 'KURT';
- 323 : Result := 'SKEW';
- 324 : Result := 'ZTEST';
- 325 : Result := 'LARGE';
- 326 : Result := 'SMALL';
- 327 : Result := 'QUARTILE';
- 328 : Result := 'PERCENTILE';
- 329 : Result := 'PERCENTRANK';
- 330 : Result := 'MODE';
- 331 : Result := 'TRIMMEAN';
- 332 : Result := 'TINV';
- 336 : Result := 'CONCATENATE';
- 337 : Result := 'POWER';
- 342 : Result := 'RADIANS';
- 343 : Result := 'DEGREES';
- 344 : Result := 'SUBTOTAL';
- 345 : Result := 'SUMIF';
- 346 : Result := 'COUNTIF';
- 347 : Result := 'COUNTBLANK';
- 350 : Result := 'ISPMT';
- 351 : Result := 'DATEDIF';
- 352 : Result := 'DATESTRING';
- 353 : Result := 'NUMBERSTRING';
- 354 : Result := 'ROMAN';
- 358 : Result := 'GETPIVOTDATA';
- 359 : Result := 'HYPERLINK';
- 360 : Result := 'PHONETIC';
- 361 : Result := 'AVERAGEA';
- 362 : Result := 'MAXA';
- 363 : Result := 'MINA';
- 364 : Result := 'STDEVPA';
- 365 : Result := 'VARPA';
- 366 : Result := 'STDEVA';
- 367 : Result := 'VARA';
- else Result := 'unknown';
- end;
-end;
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/behtml.pas b/components/fpspreadsheet/reference/BIFFExplorer/behtml.pas
deleted file mode 100644
index 71f255619..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/behtml.pas
+++ /dev/null
@@ -1,245 +0,0 @@
-unit beHTML;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, SysUtils, Graphics;
-
-type
- THTMLHeader = (h1, h2, h3, h4, h5);
- THeaderColors = Array[THTMLHeader] of TColor;
-
- THTMLDocument = class
- private
- FLines: TStrings;
- FRawMode: Boolean;
- FIndent: Integer;
- function Indent: String;
- function Raw(const AText: String): String;
- function ColorToHTML(AColor: TColor): String;
- public
- constructor Create;
- destructor Destroy; override;
- procedure AddEmptyLine;
- procedure AddListItem(const AText: String);
- procedure AddHeader(AHeader: THTMLHeader; const AText: String);
- procedure AddParagraph(const AText: String);
- procedure BeginDocument(const ATitle: String; const AHeaderColors: THeaderColors;
- ARawMode: Boolean=false);
- procedure BeginBulletList;
- procedure BeginNumberedList;
- function Bold(const AText: String): String;
- procedure EndDocument;
- procedure EndBulletList;
- procedure EndNumberedList;
- function Hyperlink(const AText, ALink: String): String;
- function Italic(const AText: String): String;
- property Lines: TStrings read FLines;
- end;
-
-implementation
-
-uses
- StrUtils, LCLIntf;
-
-constructor THTMLDocument.Create;
-begin
- inherited;
- FLines := TStringList.Create;
-end;
-
-destructor THTMLDocument.Destroy;
-begin
- FLines.Free;
- inherited;
-end;
-
-procedure THTMLDocument.AddHeader(AHeader: THTMLHeader; const AText: String);
-begin
- if FRawMode then
- FLines.Add(Raw(AText))
- else
- FLines.Add(Format('%s%s', [Indent, ord(AHeader)+1, AText, ord(AHeader)+1]));
-end;
-
- (*
-
-
-
-
-
-
-Title appears in the browser's title bar...
-
-
-
-
-
-Heading goes here...
-Enter your paragraph text here...
-
-
- *)
-
-procedure THTMLDocument.BeginDocument(const ATitle: String;
- const AHeaderColors: THeaderColors; ARawMode: Boolean = false);
-begin
- FRawMode := ARawMode;
- FLines.Clear;
- if not FRawMode then begin
- FLines.Add('');
- FLines.Add('');
- FLines.Add(' ');
- FLines.Add(' ');
- FLines.Add(' ' + ATitle + '');
- FLines.Add(' ');
- FLines.Add(' ');
- FLines.Add(' ');
- FIndent := 4;
- end;
-end;
-
-procedure THTMLDocument.BeginBulletList;
-begin
- if not FRawMode then begin
- FLines.Add(Indent + '');
- inc(FIndent, 2);
- end;
-end;
-
-procedure THTMLDocument.BeginNumberedList;
-begin
- if not FRawMode then begin
- FLines.Add(Indent + '');
- inc(FIndent, 2);
- end;
-end;
-
-procedure THTMLDocument.AddEmptyLine;
-begin
- if FRawMode then
- FLines.Add('')
- else
- FLines.Add('
');
-end;
-
-procedure THTMLDocument.AddListItem(const AText: String);
-begin
- if FRawMode then
- FLines.Add('- ' + Raw(AText))
- else
- FLines.Add(Indent + '- ' + AText + '
');
-end;
-
-procedure THTMLDocument.AddParagraph(const AText: String);
-begin
- if FRawMode then
- FLines.Add(Raw(AText))
- else
- FLines.Add(Indent + '' + AText + '
');
-end;
-
-function THTMLDocument.Bold(const AText: String): String;
-begin
- if FRawMode then
- Result := AText
- else
- Result := '' + AText + '';
-end;
-
-function THTMLDocument.ColorToHTML(AColor: TColor): String;
-var
- tmpRGB: LongInt;
-begin
- tmpRGB := ColorToRGB(AColor) ;
- Result := Format('#%.2x%.2x%.2x', [
- GetRValue(tmpRGB),
- GetGValue(tmpRGB),
- GetBValue(tmpRGB)
- ]) ;
-end;
-
-procedure THTMLDocument.EndDocument;
-begin
- if not FRawMode then begin
- FLines.Add(' ');
- FLines.Add('');
- end;
-end;
-
-procedure THTMLDocument.EndBulletList;
-begin
- if not FRawMode then begin
- dec(FIndent, 2);
- FLines.Add(Indent + '
');
- end;
-end;
-
-procedure THTMLDocument.EndNumberedList;
-begin
- if not FRawMode then begin
- dec(FIndent, 2);
- FLines.Add(Indent + '');
- end;
-end;
-
-function THTMLDocument.Hyperlink(const AText, ALink: String): String;
-begin
- if FRawMode then
- Result := Format('%s (%s)', [AText, ALink])
- else
- Result := Format('%s', [ALink, AText]);
-end;
-
-function THTMLDocument.Indent: String;
-begin
- Result := DupeString(' ', FIndent);
-end;
-
-function THTMLDocument.Italic(const AText: String): String;
-begin
- if FRawMode then
- Result := AText
- else
- Result := '' + AText + '';
-end;
-
-function THTMLDocument.Raw(const AText: String): String;
-var
- i, n: Integer;
-begin
- Result := '';
- if AText = '' then
- exit;
- n := Length(AText);
- i := 1;
- while (i <= n) do begin
- if AText[i] = '<' then
- repeat
- inc(i);
- until (i = n) or (AText[i] = '>')
- else
- Result := Result + AText[i];
- inc(i);
- end;
-end;
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/bemain.lfm b/components/fpspreadsheet/reference/BIFFExplorer/bemain.lfm
deleted file mode 100644
index 0b4b9dd21..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/bemain.lfm
+++ /dev/null
@@ -1,1061 +0,0 @@
-object MainForm: TMainForm
- Left = 352
- Height = 576
- Top = 177
- Width = 1089
- AllowDropFiles = True
- Caption = 'BIFF Explorer'
- ClientHeight = 556
- ClientWidth = 1089
- Menu = MainMenu
- OnCloseQuery = FormCloseQuery
- OnCreate = FormCreate
- OnDestroy = FormDestroy
- OnDropFiles = FormDropFiles
- OnShow = FormShow
- ShowHint = True
- LCLVersion = '1.7'
- object Splitter1: TSplitter
- Left = 419
- Height = 508
- Top = 25
- Width = 5
- end
- object ToolBar: TToolBar
- Left = 4
- Height = 25
- Top = 0
- Width = 1085
- AutoSize = True
- BorderSpacing.Left = 4
- ButtonHeight = 25
- Caption = 'ToolBar'
- EdgeBorders = []
- Images = ImageList
- TabOrder = 1
- object ToolButton1: TToolButton
- Left = 1
- Top = 0
- Action = AcFileOpen
- DropdownMenu = RecentFilesPopupMenu
- Style = tbsDropDown
- end
- object ToolButton2: TToolButton
- Left = 64
- Top = 0
- Action = AcFileQuit
- end
- object ToolButton3: TToolButton
- Left = 36
- Top = 0
- Action = AcFind
- end
- object ToolButton4: TToolButton
- Left = 59
- Height = 25
- Top = 0
- Width = 5
- Caption = 'ToolButton4'
- Style = tbsDivider
- end
- end
- object DetailPanel: TPanel
- Left = 424
- Height = 508
- Top = 25
- Width = 665
- Align = alClient
- BevelOuter = bvNone
- ClientHeight = 508
- ClientWidth = 665
- TabOrder = 3
- object PageControl: TPageControl
- Left = 0
- Height = 508
- Top = 0
- Width = 665
- ActivePage = PgValues
- Align = alClient
- TabIndex = 1
- TabOrder = 0
- OnChange = PageControlChange
- object PgAnalysis: TTabSheet
- Caption = 'Analysis'
- ClientHeight = 480
- ClientWidth = 657
- object AnalysisDetails: TMemo
- Left = 0
- Height = 191
- Top = 289
- Width = 657
- Align = alBottom
- Font.CharSet = ANSI_CHARSET
- Font.Height = -12
- Font.Name = 'Courier New'
- Font.Pitch = fpFixed
- Font.Quality = fqDraft
- ParentFont = False
- ScrollBars = ssAutoBoth
- TabOrder = 0
- WordWrap = False
- end
- object DetailsSplitter: TSplitter
- Cursor = crVSplit
- Left = 0
- Height = 5
- Top = 284
- Width = 657
- Align = alBottom
- ResizeAnchor = akBottom
- end
- end
- object PgValues: TTabSheet
- Caption = 'Values'
- ClientHeight = 480
- ClientWidth = 657
- object ValueGrid: TStringGrid
- Left = 0
- Height = 158
- Top = 322
- Width = 657
- Align = alBottom
- ColCount = 3
- DefaultColWidth = 100
- FixedCols = 0
- MouseWheelOption = mwGrid
- Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goDrawFocusSelected, goColSizing, goThumbTracking, goSmoothScroll]
- RowCount = 9
- TabOrder = 3
- TitleStyle = tsNative
- OnClick = ValueGridClick
- OnPrepareCanvas = ValueGridPrepareCanvas
- ColWidths = (
- 112
- 142
- 141
- )
- Cells = (
- 3
- 0
- 0
- 'Data type'
- 1
- 0
- 'Value'
- 2
- 0
- 'Offset range'
- )
- end
- object HexSplitter: TSplitter
- Cursor = crVSplit
- Left = 0
- Height = 5
- Top = 317
- Width = 657
- Align = alBottom
- ResizeAnchor = akBottom
- end
- object HexEditor: TKHexEditor
- Left = 0
- Height = 286
- Top = 31
- Width = 657
- AddressPrefix = '$'
- Align = alClient
- Colors.HorzLines = clBlack
- Colors.InactiveCaretBkGnd = clGrayText
- Colors.InactiveCaretSelBkGnd = clGrayText
- Colors.InactiveCaretSelText = clHighlightText
- Colors.InactiveCaretText = clHighlightText
- Colors.Separators = clBtnFace
- Colors.VertLines = clScrollBar
- DigitGrouping = 1
- DisabledDrawStyle = eddNormal
- Font.Height = -13
- Font.Name = 'Courier New'
- Font.Pitch = fpFixed
- Font.Style = [fsBold]
- LineHeightPercent = 120
- ReadOnly = True
- TabOrder = 1
- OnClick = HexEditorClick
- OnKeyDown = HexEditorKeyDown
- end
- object HexEditorParamsPanel: TPanel
- Left = 0
- Height = 31
- Top = 0
- Width = 657
- Align = alTop
- BevelOuter = bvNone
- ClientHeight = 31
- ClientWidth = 657
- TabOrder = 0
- object CbHexAddress: TCheckBox
- Left = 3
- Height = 19
- Top = 5
- Width = 131
- Caption = 'Hexadecimal address'
- Checked = True
- OnChange = CbHexAddressChange
- State = cbChecked
- TabOrder = 0
- end
- object CbHexEditorLineSize: TComboBox
- Left = 152
- Height = 23
- Top = 3
- Width = 121
- ItemHeight = 15
- ItemIndex = 0
- Items.Strings = (
- 'normal lines'
- 'long lines'
- )
- OnChange = CbHexEditorLineSizeChange
- Style = csDropDownList
- TabOrder = 1
- Text = 'normal lines'
- end
- object CbHexSingleBytes: TCheckBox
- Left = 296
- Height = 19
- Top = 5
- Width = 83
- Caption = 'Single bytes'
- Checked = True
- OnChange = CbHexSingleBytesChange
- State = cbChecked
- TabOrder = 2
- end
- end
- end
- end
- end
- object TreePanel: TPanel
- Left = 0
- Height = 508
- Top = 25
- Width = 419
- Align = alLeft
- BevelOuter = bvNone
- ClientHeight = 508
- ClientWidth = 419
- Constraints.MinWidth = 275
- TabOrder = 2
- object FindPanel: TPanel
- Left = 0
- Height = 30
- Top = 478
- Width = 419
- Align = alBottom
- BevelOuter = bvNone
- ClientHeight = 30
- ClientWidth = 419
- TabOrder = 1
- Visible = False
- object BtnFindNext: TSpeedButton
- Left = 240
- Height = 22
- Top = 3
- Width = 23
- Action = AcFindNext
- Flat = True
- end
- object BtnFindPrev: TSpeedButton
- Left = 216
- Height = 22
- Top = 3
- Width = 23
- Action = AcFindPrev
- Flat = True
- end
- object SpeedButton3: TSpeedButton
- Left = 3
- Height = 22
- Top = 3
- Width = 23
- Action = AcFindClose
- Flat = True
- end
- object CbFind: TComboBox
- Left = 28
- Height = 23
- Top = 3
- Width = 183
- ItemHeight = 15
- OnChange = CbFindChange
- OnKeyPress = CbFindKeyPress
- TabOrder = 0
- end
- end
- object BIFFTree: TVirtualStringTree
- Left = 0
- Height = 478
- Top = 0
- Width = 419
- Align = alClient
- ButtonStyle = bsTriangle
- DefaultText = 'Node'
- Header.AutoSizeIndex = 4
- Header.Columns = <
- item
- Alignment = taRightJustify
- CaptionAlignment = taRightJustify
- MinWidth = 80
- Options = [coAllowClick, coDraggable, coEnabled, coParentBidiMode, coParentColor, coResizable, coShowDropMark, coVisible, coAllowFocus, coUseCaptionAlignment]
- Position = 0
- Text = 'Offset'
- Width = 80
- end
- item
- Alignment = taCenter
- MinWidth = 60
- Position = 1
- Text = 'Record ID'
- Width = 80
- end
- item
- MinWidth = 80
- Position = 2
- Text = 'Record name'
- Width = 130
- end
- item
- Alignment = taCenter
- MinWidth = 50
- Position = 3
- Text = 'Index'
- end
- item
- MinWidth = 80
- Position = 4
- Text = 'Record description'
- Width = 80
- end>
- Header.DefaultHeight = 24
- Header.Font.Style = [fsBold]
- Header.Height = 24
- Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoShowSortGlyphs, hoVisible]
- HintMode = hmTooltip
- PopupMenu = TreePopupMenu
- TabOrder = 0
- TreeOptions.AutoOptions = [toAutoDropExpand, toAutoScrollOnExpand, toAutoSpanColumns, toAutoTristateTracking, toAutoDeleteMovedNodes]
- TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toShowRoot, toThemeAware, toUseBlendedImages]
- TreeOptions.SelectionOptions = [toFullRowSelect]
- OnBeforeCellPaint = BIFFTreeBeforeCellPaint
- OnFocusChanged = BIFFTreeFocusChanged
- OnFreeNode = BIFFTreeFreeNode
- OnGetText = BIFFTreeGetText
- OnPaintText = BIFFTreePaintText
- OnGetNodeDataSize = BIFFTreeGetNodeDataSize
- end
- end
- object StatusBar: TStatusBar
- Left = 0
- Height = 23
- Top = 533
- Width = 1089
- Panels = <
- item
- Width = 120
- end
- item
- Width = 180
- end
- item
- Width = 150
- end
- item
- Width = 180
- end>
- SimplePanel = False
- end
- object ImageList: TImageList
- left = 80
- top = 64
- Bitmap = {
- 4C69090000001000000010000000FFFFFF00FFFFFF000088CC610088CC810088
- CC810088CC810088CC810088CC810088CC810088CC810088CC810088CC810088
- CC810088CC610087CB00FFFFFF00FFFFFF00FFFFFF000087CA8388DCF4FF60C0
- E9FF5FBFEAFF80D3F4FF9CE3FDFFA2E6FFFFA2E6FFFFA2E6FFFFA2E6FFFFA6EA
- FFFF0087CA830087CA00FFFFFF00FFFFFF00FFFFFF000085C885ACF1FFFFABEF
- FEFF95E2F8FF6EC9EDFF48A8D9FF98DCFEFF98DCFEFF98DCFEFF98DCFEFFA1E5
- FFFF0085C8850085C800FFFFFF00FFFFFF00FFFFFF000084C587A9EEFDFFA4E9
- FCFFA4E9FCFFAAEEFDFF42A1D1FF97DBFDFF97DBFDFF97DBFDFF97DBFDFF9FE3
- FEFF0084C5870084C500FFFFFF00FFFFFF00FFFFFF000082C28AA6EBFCFFA1E6
- FBFFA1E6FBFFA6EBFCFF3C9DCFFF96DAFCFF96DAFCFF96DAFCFF96DAFCFF9EE2
- FDFF0082C28A0082C200FFFFFF00FFFFFF00FFFFFF00007FBF8DA3E8FBFF9DE3
- F9FF9DE3F9FFA3E8FBFF3594C5FF94D8FAFF94D8FAFF94D8FAFF94D8FAFF9BDF
- FCFF007FBF8D007FBE00FFFFFF00FFFFFF00FFFFFF00007DBB909EE5F9FF98DF
- F6FF98DFF6FF9EE5F9FF3290C0FF92D6F8FF92D6F8FF92D6F8FF92D6F8FF99DD
- FAFF007DBB90007DBB33FFFFFF00FFFFFF00FFFFFF00007BB8949BE1F7FF94DB
- F4FF94DBF4FF9BE1F7FF308DBCFF90D4F6FF90D4F6FF90D4F6FF90D4F6FF97DB
- F9FFFEFEFDFF007BB894FFFFFF00FFFFFF00FFFFFF000078B49797DEF6FF90D8
- F2FF90D8F2FF97DEF6FF2D89B7FF8FD3F5FF8FD3F5FF8FD3F5FF8FD3F5FF95D9
- F8FFF5F5EEFF0078B497FFFFFF00FFFFFF00FFFFFF000076B09B92DAF4FF8BD4
- F0FF8BD4F0FF92DAF4FF2B85B3FF8DD1F3FF8DD1F3FF8DD1F3FF8DD1F3FF93D7
- F6FFEBEBDDFF0076B09BFFFFFF00FFFFFF00FFFFFF000073AC9E8ED6F2FF87D0
- EDFF87D0EDFF8ED6F2FF2882AFFF8BCFF1FF8BCFF1FF8BCFF1FF8BCFF1FF91D5
- F5FFFEC941FF0073AC9EFFFFFF00FFFFFF00FFFFFF00006FA7A48AD3F0FF82CD
- EBFF82CDEBFF8AD3F0FF267EABFF8ACEF0FF8ACEF0FF8ACEF0FF8ACEF0FF8FD3
- F4FFF4B62EFF006FA7A4FFFFFF00FFFFFF00FFFFFF00006699B287D1EFFF7FCA
- E9FF7FCAE9FF87D0EFFF267DA9FF8DD1F3FF8DD1F3FF8DD1F3FF8DD1F3FF90D4
- F5FF006699B200679B3EFFFFFF00FFFFFF00FFFFFF00005E8D8E3591BDF169B8
- DDFA81CBECFF84CEEEFF005C8BEF005D8CBE005D8CBE005D8CBE005D8CBE005D
- 8CBE005E8D8E00669900FFFFFF00FFFFFF00FFFFFF00005D8C00006599500064
- 97991C7AA9C052A5CDE0005B89C1005B8900005B8900005B8900005B8900005B
- 8900005D8C0000669900FFFFFF00FFFFFF00FFFFFF00005D8C00006497000062
- 9300005E8E30005C8C7C0059879200598700005B8900005B8900005B8900005B
- 8900005D8C0000669900FFFFFF00003F9300003F9300003F9300003F9424003F
- 948A003E93CC004095CC004095CC004095CC004095CC004095CC004095CC0040
- 95CC004095CC00409599FFFFFF00003F9300003F9324003F938A0E4B9CD33F76
- C0EC5D90D4FF3365A9FFA0A0A0FFA9A9A9FFA9A9A9FFAAAAAAFFACACACFFAEAE
- AEFFB0B0B0FF003E93CCFFFFFF00003F938A0E4A9CD33E75BFEC5487CBFF3669
- ADFF23569AFF3363A6FFA9A9A9FFBCBCBCFFBDBDBDFFBFBFBFFFC1C1C1FFC4C4
- C4FFC7C7C7FF003C90CCFFFFFF00003D91CC5D90D4FF3568ACFF285B9FFF1A4D
- 91FF4477BBFF3361A4FFA9A9A9FFBDBDBDFFBFBFBFFFC1C1C1FFC4C4C4FFC7C7
- C7FFC9C9C9FF003A8DCCFFFFFF00003B8ECC588BCFFF1A4D91FF4376BAFF3265
- A9FF4376BAFF335FA1FFAAAAAAFFBFBFBFFFC1C1C1FFC4C4C4FFC7C7C7FFC9C9
- C9FFCCCCCCFF003789CCFFFFFF0000398BCC5588CCFF275A9EFF4174B8FF3164
- A8FF4174B8FF335D9EFFACACACFFC1C1C1FFC4C4C4FFC7C7C7FFC9C9C9FFCCCC
- CCFFD0D0D0FF003485CCFFFFFF00003688CC5386CAFF295CA0FF3F72B6FF3063
- A7FF3F72B6FF335A9AFFAEAEAEFFC4C4C4FFC7C7C7FFC9C9C9FFCCCCCCFFD0D0
- D0FFD3D3D3FF003181CCFFFFFF00003485CC5083C7FF1D5094FF3265A9FF2D60
- A4FF3D70B4FF335897FFB0B0B0FFC7C7C7FFC9C9C9FFCCCCCCFFD0D0D0FFD3D3
- D3FFD5D5D5FF002E7DCCFFFFFF00003181CC4C7FC3FFBBBBBBFF22518CFF2C5F
- A3FF3B6EB2FF335593FFB3B3B3FFC9C9C9FFCCCCCCFFD0D0D0FFD3D3D3FFD5D5
- D5FFD8D8D8FF002B78CCFFFFFF00002E7DCC497CC0FF09336FFF215090FF2B5E
- A2FF396CB0FF335290FFB5B5B5FFCCCCCCFFD0D0D0FFD3D3D3FFD5D5D5FFD8D8
- D8FFDBDBDBFF002774CCFFFFFF00002B79CC477ABEFF2C5FA3FF376AAEFF2B5E
- A2FF376AAEFF33508CFFB8B8B8FFD0D0D0FFD3D3D3FFD5D5D5FFD8D8D8FFDBDB
- DBFFDCDCDCFF00246FCCFFFFFF00002875CC4477BBFF2C5FA3FF3568ACFF2B5E
- A2FF2E61A5FF334B87FFBBBBBBFFD3D3D3FFD5D5D5FFD8D8D8FFDBDBDBFFDCDC
- DCFFDDDDDDFF001F68CCFFFFFF00002571CC4174B8FF2C5FA3FF2D60A4FF2356
- 9AFF3D70B4FF334179FFBEBEBEFFD5D5D5FFD8D8D8FFDBDBDBFFDCDCDCFFDDDD
- DDFFDDDDDDFF001258CCFFFFFF0000226DCC3F72B6FF225599FF3B6EB2FF2C51
- 96EC0A1C60D3000749A4000648CC000648CC000648CC000648CC000648CC0006
- 48CC000648CC00074A99FFFFFF00001B64CC4174B8FF2A5094EC0A1A5ED30008
- 4A8A000648240006470000044500000445000004450000044500000445000004
- 45000004450000064800FFFFFF0000105500000B4FCC0007498A000546240005
- 4700000648000006470000044500000445000004450000044500000445000004
- 45000004450000064800FFFFFF004E4E4E005151510054545411555555405555
- 555A555555655555555A5555554054545411515151004E4E4E004E4E4E002957
- 27000569000007710000FFFFFF004E4E4E005151512163605E62B1A3948BE6D5
- C5AFF4EADFC7EDE3D9B5B6ACA28E63605E62515151214E4E4E004E4E4E004E4E
- 4E004E4E4E004E4E4E00FFFFFF004D4D4D115F5D5A64D5C1AEA1EBD8C4C2F6EC
- E2CDF6EDE4CEF6EDE4CEF6ECE2CDD9C8B8A4605D5B644D4D4D114C4C4C004C4C
- 4C004C4C4C004C4C4C00FFFFFF0049494943AD9F918EE8D2BBC0F1E3D5C8F6ED
- E4CEF6EDE4CEF6EDE4CEF6EDE4CEF2E4D6C8B0A4979149494943494949004949
- 49004949490049494900FFFFFF0043434360E0CBB6ACE8D2BBC0E8D2BBC0E8D2
- BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E4D3C1B243434360434343004343
- 43004343430043434300FFFFFF003E3E3E6FE9D4BEBEE8D2BBC0E8D2BBC0F6ED
- E4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEEDDBC8C53E3E3E6F3E3E3E003E3E
- 3E003E3E3E003E3E3E00FFFFFF0038383865E1CFBCB1E8D2BBC0F6EDE4CEF6ED
- E4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEE7D8CAB838383865383838003838
- 38003838380038383800FFFFFF0031313149A89D9397EAD5BFC3F5E9DFCBF6ED
- E4CEF6EDE4CEF6EDE4CEF6EDE4CEF6ECE2CEADA69E9D31313149313131003131
- 31003131310031313100FFFFFF00262626143B3A3874D7C9BCAFF3E6D9CBF6ED
- E4CEF6EDE4CEF6EDE4CEF7EFE6D1E4DED9C84544437D34343424383838003939
- 39003A3A3A003C3C3C00FFFFFF001E1E1E001111112A2826257D9D9791A5EEE8
- E3C4F9F3EDD6EFEAE5C5A3A09EA92827278AACACACFF373737753737371F3939
- 39003A3A3A003C3C3C00FFFFFF001E1E1E000E0E0E0004040416040404560404
- 04790404048704040479040404560404042A0F0F0F86B8B5B5FF4241417E3838
- 382A3A3A3A003C3C3C00FFFFFF001E1E1E000E0E0E0004040400040404000404
- 040004040400040404000404040004040400040404251A1A1A8FC8C1C1FF4F4D
- 4D88393939383C3C3C00FFFFFF001E1E1E000E0E0E0004040400040404000404
- 040004040400040404000404040004040400040404000404043328272799D9CE
- CEFF605C5C913A3A3A4DFFFFFF001E1E1E000E0E0E0004040400040404000404
- 0400040404000404040004040400040404000404040004040400040404443B38
- 38A2E8D8D8FF32323276FFFFFF001E1E1E000E0E0E0004040400040404000404
- 0400040404000404040004040400040404000404040004040400040404000404
- 045C090909892525252CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000A7000000AA480000
- AACC0000AA480000A7000000A3000000A3000000A7000000AA480000AACC0000
- AA480000A700FFFFFF00FFFFFF00FFFFFF00FFFFFF000000A7480000A7CC7777
- FFFF0000A7CC0000A7480000A3000000A3000000A7480000A7CC7070F8FF0000
- A7CC0000A748FFFFFF00FFFFFF00FFFFFF00FFFFFF000000A3CC7676FEFF4C4C
- D4FF7272FAFF0000A3CC0000A3480000A3480000A3CC6262EAFF4C4CD4FF5C5C
- E4FF0000A3CCFFFFFF00FFFFFF00FFFFFF00FFFFFF000000A1480000A0CC6767
- EFFF3636BEFF5E5EE6FF0000A0CC0000A0CC4F4FD7FF3636BEFF4545CDFF0000
- A0CC0000A148FFFFFF00FFFFFF00FFFFFF00FFFFFF000000A00000009C480000
- 9BCC5353DBFF2E2EB7FF3D3DC6FF3131BAFF15159FFF1E1EA8FF00009BCC0000
- 9C480000A000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000A00000009B000000
- 9848000097CC2525B4FF1111A2FF1111A2FF1414A5FF000097CC000098480000
- 9B000000A000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000870000008D000000
- 9148000092CC1515AFFF1111ACFF1111ACFF1111ACFF000092CC000091480000
- 8D0000008700FFFFFF00FFFFFF00FFFFFF00FFFFFF000000870000008C480000
- 8DCC1111B8FF1111B8FF1111B8FF1111B8FF1111B8FF1111B8FF00008DCC0000
- 8C4800008700FFFFFF00FFFFFF00FFFFFF00FFFFFF0000008748000087CC1111
- C4FF1111C4FF1111C4FF000087CC000087CC1111C4FF1111C4FF1111C4FF0000
- 87CC00008748FFFFFF00FFFFFF00FFFFFF00FFFFFF00000082CC1111D0FF1111
- D0FF1111D0FF000082CC0000834800008348000082CC1111D0FF1111D0FF1111
- D0FF000082CCFFFFFF00FFFFFF00FFFFFF00FFFFFF0000007548000072CC1111
- D8FF000072CC00007548000082000000820000007548000072CC1111D8FF0000
- 72CC00007548FFFFFF00FFFFFF00FFFFFF00FFFFFF0000007200000061480000
- 5FCC00006148000072000000820000008200000072000000614800005FCC0000
- 614800007200FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00E69B3D33E89D3FCCE89D3FCCE89D
- 3FCCE89D3FCCE89D3FCCE89D3FCCE89D3FCCE89D3FCCE89D3FCCE89D3FCCE89D
- 3FCCE89D3FCCE69B3D33FFFFFF00FFFFFF00E2973A15DF9438AEF0BD69E6FEDE
- 92FFFCD68AFFFCD68AFFFCD68AFFFCD68AFFFCD589FFFCD589FFFDDA8EFFEFBA
- 66E6DF9438AEE2973A15FFFFFF00FFFFFF00E2973A00D98E3315D2872EAEE8B5
- 63E6F7CB7FFFEAAF63FFE0A559FFD69B4FFFD19549FFDDAC60FFDFA553E6D287
- 2EAED98E3315E2973A00FFFFFF00FFFFFF00E2973A00D98E3300CB802915C379
- 23AEDCA553E6E3B25DFFD3953BFFD3953BFFDFA952FFD69A45E6C37923AECB80
- 2915D98E3300E2973A00FFFFFF00FFFFFF00E2973A00D98E3300CB802900BC71
- 1D15B56A18AED69737E6F1B436FFF0B130FFD4922DE6B56A18AEBC711D15CB80
- 2900D98E3300E2973A00FFFFFF00FFFFFF00E2973A00D98E3300CB802900BC71
- 1D00AE631215A75C0DAED38D19E6D38C18E6A75C0DAEAE631215BC711D00CB80
- 2900D98E3300E2973A00FFFFFF00FFFFFF00E2973A00D98E3300CB802900BC71
- 1D00AE631200A05509159B5005AE9B5005AEA0550915AE631200BC711D00CB80
- 2900D98E3300E2973A00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A75C0D00B56A1800C3792300D287
- 2E00DF943800E79C3E5CE89D3FCCE79C3E5CDF943800D2872E00C3792300B56A
- 1800A75C0D00FFFFFF00FFFFFF00FFFFFF00A75C0D00B56A1800C3792300D287
- 2E00DE93375CDF9438CCFFE599FFDF9438CCDE93375CD2872E00C3792300B56A
- 1800A75C0D00FFFFFF00FFFFFF00FFFFFF00A75C0D00B56A1800C3792300D085
- 2D5CD2872ECCFEE195FFF8C77BFFFDDE92FFD2872ECCD0852D5CC3792300B56A
- 1800A75C0D00FFFFFF00FFFFFF00FFFFFF00A75C0D00B56A1800C177225CC379
- 23CCFBD98DFFECB367FFE1A75BFFD79C50FFE7BC70FFC37923CCC177225CB56A
- 1800A75C0D00FFFFFF00FFFFFF00FFFFFF00A75C0D00B368175CB56A18CCF8CF
- 80FFE6A53EFFDE9D2FFFDD9C2EFFDD9C2EFFDD9C2EFFE6AE47FFB56A18CCB368
- 175CA75C0D00FFFFFF00FFFFFF00FFFFFF00A55A0C5CA75C0DCCF9C966FFFAB8
- 27FFFBB71CFFFBB518FFFBB414FFFBB311FFFBB20FFFFBB20EFFFBB516FFA75C
- 0DCCA55A0C5CFFFFFF00FFFFFF00FFFFFF009C5106999B5005CC9B5005CC9B50
- 05CC9B5005CC9B5005CC9B5005CC9B5005CC9B5005CC9B5005CC9B5005CC9B50
- 05CC9C510699FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF004F4F4F005050500052525200535353005454
- 54155555553E555555555555556355555563555555555555553E545454155353
- 530052525200505050004F4F4F004F4F4F0050505000525252075353533D7373
- 7378C8C8C8D2EAEAEAFFE6E6E6FFE6E6E6FFEAEAEAFFC7C7C7D2727272785353
- 533D52525207505050004F4F4F004F4F4F00505050075151514D9F9F9FA1E6E6
- E6FFD7B0A3FFD08C75FFCD6C4BFFCD6C4BFFD08C75FFD6AFA2FFE3E4E4FF9D9D
- 9DA15151514D505050074F4F4F004E4E4E004E4E4E3F9D9D9DA2DFDFDFFFCB79
- 5EFFDB7A58FFEE906EFFF49674FFF49573FFED8E6CFFDA7856FFCB795EFFDBDC
- DCFF999999A24E4E4E3F4E4E4E004B4B4B176C6C6C7CDFE0E0FFC8755AFFE283
- 61FFDC7A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2987FFFDF7E5CFFC875
- 5AFFD8D8D8FF6969697C4B4B4B1748484842BEBFBFD4C9A295FFD57452FFE281
- 5FFFD26C4AFFD5A291FFD5A291FFE6C2B6FFFFFFFFFFE0AD9CFFDF7C5AFFD16E
- 4CFFC7A194FFB2B3B3D4484848424545455CDBDCDCFFC07C65FFDF805EFFCF69
- 47FFCF6947FFCA6442FFC05937FFC28775FFCCCCCCFFBC8877FFAD4624FFC360
- 3EFFC07C65FFCBCCCCFF4545455C4242426CCFCFCFFFBC5B3BFFDD7D5BFFC962
- 40FFBD5330FFB44A26FFBC7259FFD1CFCFFFC7AEA5FFB24824FFB34925FFBD55
- 32FFBC5B3BFFC3C3C3FF4242426C3E3E3E6ECCCCCCFFB95737FFD5714DFFBF50
- 2AFFBD4E27FFB94B26FFDBDBDBFFDBDBDBFFB94C26FFBD4E27FFBD4E27FFC154
- 2EFFB95737FFC0C0C0FF3E3E3E6E3A3A3A61D0CFCFFFB9745DFFCF643EFFC954
- 2AFFC9542AFFC9542AFFBB4D27FFBB4D27FFC9542AFFC9542AFFC9542AFFC554
- 2CFFB9745DFFC2C0C0FF3A3A3A6137373747ACAAAAD7C09789FFBF5631FFD85F
- 33FFD55A2DFFCB542AFFEEEEEEFFEEEEEEFFCB542AFFD55A2DFFD55A2DFFBC4F
- 29FFBF9588FFA29F9FD7373737473434341953515186D4CECEFFB35F44FFC957
- 2FFFE16132FFD3592DFFEEEEEEFFEEEEEEFFD3592DFFE15F30FFC8532AFFB35F
- 44FFD0C9C9FF5150508634343419303030002F2F2F48827E7EACDBD1D1FFAC57
- 3CFFB6461FFFD6592AFFE56230FFE56230FFD6592AFFB6461FFFAC573CFFDACF
- CFFF817C7CAC2F2F2F48303030002E2E2E002C2C2C092626265C807979AFE4D6
- D6FFC69689FFAD644EFF943312FF943312FFAD644EFFC69689FFE3D6D6FF7F79
- 79AF2626265C2C2C2C092E2E2E002E2E2E002C2C2C001E1E1E091717174F3D3A
- 3A92B2A6A6DCEBDADAFFEBDADAFFEBDADAFFEBDADAFFB2A6A6DC3D3A3A921717
- 174F1E1E1E092C2C2C002E2E2E002E2E2E002C2C2C001E1E1E00131313000D0D
- 0D1D0B0B0B540B0B0B740B0B0B870B0B0B870B0B0B740B0B0B540D0D0D1D1313
- 13001E1E1E002C2C2C002E2E2E00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF007A7A7A117C7C7C547C7C7C677C7C7C547A7A
- 7A1177777700555555000000A2000000A200000099000000A6000000A7210000
- A8A60000A8CC0000A8A60000A72165656557CACACAB8FDFDFDFFCACACAB86565
- 65575B5B5B005555550016168E0000009FCC0000993300009E0000009FA73F3F
- D5E87272FEFF3F3FD5E800009FA74545456FF2F2F2FFF2F2F2FFF2F2F2FF4545
- 456F55555566555555662B2B7400000092B3000092CC00009200000092CC5656
- F5FF5656F5FF5656F5FF000092CC2525255E9F9F9FBDE4E4E4FF9F9F9FBD2525
- 255E474747005555550016167700000084CC00008B3300008600000084A71F1F
- BEE83434EBFF1F1FBEE8000084A70E0E0E140B0B0B610B0B0B770B0B0B610E0E
- 0E141010100055555500000080000000800000008B0000006E0000006B210000
- 67A6000067CC000067A600006B21FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF007A7A7A117C7C7C547C7C7C677C7C7C547A7A
- 7A1177777700555555005555550055555500EA846200EB856329EC8664D0EC86
- 64FFEC8664D0EB856329FFFFFF0065656557CACACAB8FDFDFDFFCACACAB86565
- 65575B5B5B0055555500555555005555550079605700E27C5AD0EEA891FFF7CE
- C1FFEEA891FFE27C5AD0FFFFFF004545456FF2F2F2FFF2F2F2FFF2F2F2FF4545
- 456F5454546654545466545454665454546654545466D46F4DFFF0C7BAFFF0C7
- BAFFF0C7BAFFD46F4DFFFFFFFF002525255E9F9F9FBDE4E4E4FF9F9F9FBD2525
- 255E45454500505050004C4C4C66505050006E554D00C4613FD0D7927BFFE8BF
- B2FFD7927BFFC4613FD0FFFFFF000E0E0E140B0B0B610B0B0B770B0B0B610E0E
- 0E1410101000414141004141416641414100B9563400B8553329B65331D0B653
- 31FFB65331D0B8553329FFFFFF000B0B0B000606060006060600060606000B0B
- 0B002323230035353500353535663535350077463500B6533100B3502E00B350
- 2E00B3502E00B6533100FFFFFF000B0B0B000606060006060600060606000B0B
- 0B00282828002828280028282866282828006E372600B1452300AE442200AE44
- 2200AE442200B1452300FFFFFF000B0B0B000606060006060600060606001111
- 11001A1A1A001A1A1A001A1A1A661A1A1A00B3462400B2462429B14523D0B145
- 23FFB14523D0B2462429FFFFFF000B0B0B000606060006060600080808000F0F
- 0F000F0F0F000F0F0F000F0F0F660A0A0A0034180F00BD4B29D0DB9078FFF7CE
- C1FFDB9078FFBD4B29D0FFFFFF000B0B0B000606060006060600070707000707
- 070007070700070707000606064D0505056605050566CC5331FFF0C7BAFFF0C7
- BAFFF0C7BAFFCC5331FFFFFFFF000B0B0B000606060006060600070707000707
- 0700070707000707070005050500030303003A1A1100DB5B39D0E4917AFFE8BF
- B2FFE4917AFFDB5B39D0FFFFFF000B0B0B000606060006060600070707000707
- 070007070700070707000505050003030300E5613F00E7624029E86341D0E863
- 41FFE86341D0E7624029FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00
- }
- end
- object MainMenu: TMainMenu
- Images = ImageList
- left = 168
- top = 136
- object MnuFile: TMenuItem
- Caption = 'File'
- object MnuFileOpen: TMenuItem
- Action = AcFileOpen
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
- FF00005D8C000064970000629300005E8E30005C8C7C0059879200598700005B
- 8900005B8900005B8900005B8900005D8C0000669900FFFFFF00FFFFFF00FFFF
- FF00005D8C0000659950006497991C7AA9C052A5CDE0005B89C1005B8900005B
- 8900005B8900005B8900005B8900005D8C0000669900FFFFFF00FFFFFF00FFFF
- FF00005E8D8E3591BDF169B8DDFA81CBECFF84CEEEFF005C8BEF005D8CBE005D
- 8CBE005D8CBE005D8CBE005D8CBE005E8D8E00669900FFFFFF00FFFFFF00FFFF
- FF00006699B287D1EFFF7FCAE9FF7FCAE9FF87D0EFFF267DA9FF8DD1F3FF8DD1
- F3FF8DD1F3FF8DD1F3FF90D4F5FF006699B200679B3EFFFFFF00FFFFFF00FFFF
- FF00006FA7A48AD3F0FF82CDEBFF82CDEBFF8AD3F0FF267EABFF8ACEF0FF8ACE
- F0FF8ACEF0FF8ACEF0FF8FD3F4FFF4B62EFF006FA7A4FFFFFF00FFFFFF00FFFF
- FF000073AC9E8ED6F2FF87D0EDFF87D0EDFF8ED6F2FF2882AFFF8BCFF1FF8BCF
- F1FF8BCFF1FF8BCFF1FF91D5F5FFFEC941FF0073AC9EFFFFFF00FFFFFF00FFFF
- FF000076B09B92DAF4FF8BD4F0FF8BD4F0FF92DAF4FF2B85B3FF8DD1F3FF8DD1
- F3FF8DD1F3FF8DD1F3FF93D7F6FFEBEBDDFF0076B09BFFFFFF00FFFFFF00FFFF
- FF000078B49797DEF6FF90D8F2FF90D8F2FF97DEF6FF2D89B7FF8FD3F5FF8FD3
- F5FF8FD3F5FF8FD3F5FF95D9F8FFF5F5EEFF0078B497FFFFFF00FFFFFF00FFFF
- FF00007BB8949BE1F7FF94DBF4FF94DBF4FF9BE1F7FF308DBCFF90D4F6FF90D4
- F6FF90D4F6FF90D4F6FF97DBF9FFFEFEFDFF007BB894FFFFFF00FFFFFF00FFFF
- FF00007DBB909EE5F9FF98DFF6FF98DFF6FF9EE5F9FF3290C0FF92D6F8FF92D6
- F8FF92D6F8FF92D6F8FF99DDFAFF007DBB90007DBB33FFFFFF00FFFFFF00FFFF
- FF00007FBF8DA3E8FBFF9DE3F9FF9DE3F9FFA3E8FBFF3594C5FF94D8FAFF94D8
- FAFF94D8FAFF94D8FAFF9BDFFCFF007FBF8D007FBE00FFFFFF00FFFFFF00FFFF
- FF000082C28AA6EBFCFFA1E6FBFFA1E6FBFFA6EBFCFF3C9DCFFF96DAFCFF96DA
- FCFF96DAFCFF96DAFCFF9EE2FDFF0082C28A0082C200FFFFFF00FFFFFF00FFFF
- FF000084C587A9EEFDFFA4E9FCFFA4E9FCFFAAEEFDFF42A1D1FF97DBFDFF97DB
- FDFF97DBFDFF97DBFDFF9FE3FEFF0084C5870084C500FFFFFF00FFFFFF00FFFF
- FF000085C885ACF1FFFFABEFFEFF95E2F8FF6EC9EDFF48A8D9FF98DCFEFF98DC
- FEFF98DCFEFF98DCFEFFA1E5FFFF0085C8850085C800FFFFFF00FFFFFF00FFFF
- FF000087CA8388DCF4FF60C0E9FF5FBFEAFF80D3F4FF9CE3FDFFA2E6FFFFA2E6
- FFFFA2E6FFFFA2E6FFFFA6EAFFFF0087CA830087CA00FFFFFF00FFFFFF00FFFF
- FF000088CC610088CC810088CC810088CC810088CC810088CC810088CC810088
- CC810088CC810088CC810088CC810088CC610087CB00FFFFFF00
- }
- end
- object MnuFileReopen: TMenuItem
- Caption = 'Recently opened files'
- end
- object MenuItem9: TMenuItem
- Caption = '-'
- end
- object MnuDumpToFile: TMenuItem
- Action = AcDumpToFile
- end
- object MenuItem4: TMenuItem
- Caption = '-'
- end
- object MnuFileQuit: TMenuItem
- Action = AcFileQuit
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 200000000000000400006400000064000000000000000000000000105500000B
- 4FCC0007498A0005462400054700000648000006470000044500000445000004
- 45000004450000044500000445000004450000064800FFFFFF00001B64CC4174
- B8FF2A5094EC0A1A5ED300084A8A000648240006470000044500000445000004
- 45000004450000044500000445000004450000064800FFFFFF0000226DCC3F72
- B6FF225599FF3B6EB2FF2C5196EC0A1C60D3000749A4000648CC000648CC0006
- 48CC000648CC000648CC000648CC000648CC00074A99FFFFFF00002571CC4174
- B8FF2C5FA3FF2D60A4FF23569AFF3D70B4FF334179FFBEBEBEFFD5D5D5FFD8D8
- D8FFDBDBDBFFDCDCDCFFDDDDDDFFDDDDDDFF001258CCFFFFFF00002875CC4477
- BBFF2C5FA3FF3568ACFF2B5EA2FF2E61A5FF334B87FFBBBBBBFFD3D3D3FFD5D5
- D5FFD8D8D8FFDBDBDBFFDCDCDCFFDDDDDDFF001F68CCFFFFFF00002B79CC477A
- BEFF2C5FA3FF376AAEFF2B5EA2FF376AAEFF33508CFFB8B8B8FFD0D0D0FFD3D3
- D3FFD5D5D5FFD8D8D8FFDBDBDBFFDCDCDCFF00246FCCFFFFFF00002E7DCC497C
- C0FF09336FFF215090FF2B5EA2FF396CB0FF335290FFB5B5B5FFCCCCCCFFD0D0
- D0FFD3D3D3FFD5D5D5FFD8D8D8FFDBDBDBFF002774CCFFFFFF00003181CC4C7F
- C3FFBBBBBBFF22518CFF2C5FA3FF3B6EB2FF335593FFB3B3B3FFC9C9C9FFCCCC
- CCFFD0D0D0FFD3D3D3FFD5D5D5FFD8D8D8FF002B78CCFFFFFF00003485CC5083
- C7FF1D5094FF3265A9FF2D60A4FF3D70B4FF335897FFB0B0B0FFC7C7C7FFC9C9
- C9FFCCCCCCFFD0D0D0FFD3D3D3FFD5D5D5FF002E7DCCFFFFFF00003688CC5386
- CAFF295CA0FF3F72B6FF3063A7FF3F72B6FF335A9AFFAEAEAEFFC4C4C4FFC7C7
- C7FFC9C9C9FFCCCCCCFFD0D0D0FFD3D3D3FF003181CCFFFFFF0000398BCC5588
- CCFF275A9EFF4174B8FF3164A8FF4174B8FF335D9EFFACACACFFC1C1C1FFC4C4
- C4FFC7C7C7FFC9C9C9FFCCCCCCFFD0D0D0FF003485CCFFFFFF00003B8ECC588B
- CFFF1A4D91FF4376BAFF3265A9FF4376BAFF335FA1FFAAAAAAFFBFBFBFFFC1C1
- C1FFC4C4C4FFC7C7C7FFC9C9C9FFCCCCCCFF003789CCFFFFFF00003D91CC5D90
- D4FF3568ACFF285B9FFF1A4D91FF4477BBFF3361A4FFA9A9A9FFBDBDBDFFBFBF
- BFFFC1C1C1FFC4C4C4FFC7C7C7FFC9C9C9FF003A8DCCFFFFFF00003F938A0E4A
- 9CD33E75BFEC5487CBFF3669ADFF23569AFF3363A6FFA9A9A9FFBCBCBCFFBDBD
- BDFFBFBFBFFFC1C1C1FFC4C4C4FFC7C7C7FF003C90CCFFFFFF00003F9300003F
- 9324003F938A0E4B9CD33F76C0EC5D90D4FF3365A9FFA0A0A0FFA9A9A9FFA9A9
- A9FFAAAAAAFFACACACFFAEAEAEFFB0B0B0FF003E93CCFFFFFF00003F9300003F
- 9300003F9300003F9424003F948A003E93CC004095CC004095CC004095CC0040
- 95CC004095CC004095CC004095CC004095CC00409599FFFFFF00
- }
- end
- end
- object MnuRecord: TMenuItem
- Caption = 'Record'
- object MnuFind: TMenuItem
- Action = AcFind
- AutoCheck = True
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 040004040400040404000404045C090909892525252CFFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 040004040400040404443B3838A2E8D8D8FF32323276FFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 04000404043328272799D9CECEFF605C5C913A3A3A4DFFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 04251A1A1A8FC8C1C1FF4F4D4D88393939383C3C3C00FFFFFF001E1E1E000E0E
- 0E000404041604040456040404790404048704040479040404560404042A0F0F
- 0F86B8B5B5FF4241417E3838382A3A3A3A003C3C3C00FFFFFF001E1E1E001111
- 112A2826257D9D9791A5EEE8E3C4F9F3EDD6EFEAE5C5A3A09EA92827278AACAC
- ACFF373737753737371F393939003A3A3A003C3C3C00FFFFFF00262626143B3A
- 3874D7C9BCAFF3E6D9CBF6EDE4CEF6EDE4CEF6EDE4CEF7EFE6D1E4DED9C84544
- 437D3434342438383800393939003A3A3A003C3C3C00FFFFFF0031313149A89D
- 9397EAD5BFC3F5E9DFCBF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6ECE2CEADA6
- 9E9D3131314931313100313131003131310031313100FFFFFF0038383865E1CF
- BCB1E8D2BBC0F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEE7D8
- CAB83838386538383800383838003838380038383800FFFFFF003E3E3E6FE9D4
- BEBEE8D2BBC0E8D2BBC0F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEEDDB
- C8C53E3E3E6F3E3E3E003E3E3E003E3E3E003E3E3E00FFFFFF0043434360E0CB
- B6ACE8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E4D3
- C1B24343436043434300434343004343430043434300FFFFFF0049494943AD9F
- 918EE8D2BBC0F1E3D5C8F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF2E4D6C8B0A4
- 97914949494349494900494949004949490049494900FFFFFF004D4D4D115F5D
- 5A64D5C1AEA1EBD8C4C2F6ECE2CDF6EDE4CEF6EDE4CEF6ECE2CDD9C8B8A4605D
- 5B644D4D4D114C4C4C004C4C4C004C4C4C004C4C4C00FFFFFF004E4E4E005151
- 512163605E62B1A3948BE6D5C5AFF4EADFC7EDE3D9B5B6ACA28E63605E625151
- 51214E4E4E004E4E4E004E4E4E004E4E4E004E4E4E00FFFFFF004E4E4E005151
- 510054545411555555405555555A555555655555555A55555540545454115151
- 51004E4E4E004E4E4E00295727000569000007710000FFFFFF00
- }
- end
- end
- object MnuHelp: TMenuItem
- Caption = 'Help'
- object MenuItem2: TMenuItem
- Action = AcAbout
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 20000000000000040000640000006400000000000000000000002E2E2E002C2C
- 2C001E1E1E00131313000D0D0D1D0B0B0B540B0B0B740B0B0B870B0B0B870B0B
- 0B740B0B0B540D0D0D1D131313001E1E1E002C2C2C002E2E2E002E2E2E002C2C
- 2C001E1E1E091717174F3D3A3A92B2A6A6DCEBDADAFFEBDADAFFEBDADAFFEBDA
- DAFFB2A6A6DC3D3A3A921717174F1E1E1E092C2C2C002E2E2E002E2E2E002C2C
- 2C092626265C807979AFE4D6D6FFC69689FFAD644EFF943312FF943312FFAD64
- 4EFFC69689FFE3D6D6FF7F7979AF2626265C2C2C2C092E2E2E00303030002F2F
- 2F48827E7EACDBD1D1FFAC573CFFB6461FFFD6592AFFE56230FFE56230FFD659
- 2AFFB6461FFFAC573CFFDACFCFFF817C7CAC2F2F2F4830303000343434195351
- 5186D4CECEFFB35F44FFC9572FFFE16132FFD3592DFFEEEEEEFFEEEEEEFFD359
- 2DFFE15F30FFC8532AFFB35F44FFD0C9C9FF515050863434341937373747ACAA
- AAD7C09789FFBF5631FFD85F33FFD55A2DFFCB542AFFEEEEEEFFEEEEEEFFCB54
- 2AFFD55A2DFFD55A2DFFBC4F29FFBF9588FFA29F9FD7373737473A3A3A61D0CF
- CFFFB9745DFFCF643EFFC9542AFFC9542AFFC9542AFFBB4D27FFBB4D27FFC954
- 2AFFC9542AFFC9542AFFC5542CFFB9745DFFC2C0C0FF3A3A3A613E3E3E6ECCCC
- CCFFB95737FFD5714DFFBF502AFFBD4E27FFB94B26FFDBDBDBFFDBDBDBFFB94C
- 26FFBD4E27FFBD4E27FFC1542EFFB95737FFC0C0C0FF3E3E3E6E4242426CCFCF
- CFFFBC5B3BFFDD7D5BFFC96240FFBD5330FFB44A26FFBC7259FFD1CFCFFFC7AE
- A5FFB24824FFB34925FFBD5532FFBC5B3BFFC3C3C3FF4242426C4545455CDBDC
- DCFFC07C65FFDF805EFFCF6947FFCF6947FFCA6442FFC05937FFC28775FFCCCC
- CCFFBC8877FFAD4624FFC3603EFFC07C65FFCBCCCCFF4545455C48484842BEBF
- BFD4C9A295FFD57452FFE2815FFFD26C4AFFD5A291FFD5A291FFE6C2B6FFFFFF
- FFFFE0AD9CFFDF7C5AFFD16E4CFFC7A194FFB2B3B3D4484848424B4B4B176C6C
- 6C7CDFE0E0FFC8755AFFE28361FFDC7A58FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
- FFFFE2987FFFDF7E5CFFC8755AFFD8D8D8FF6969697C4B4B4B174E4E4E004E4E
- 4E3F9D9D9DA2DFDFDFFFCB795EFFDB7A58FFEE906EFFF49674FFF49573FFED8E
- 6CFFDA7856FFCB795EFFDBDCDCFF999999A24E4E4E3F4E4E4E004F4F4F005050
- 50075151514D9F9F9FA1E6E6E6FFD7B0A3FFD08C75FFCD6C4BFFCD6C4BFFD08C
- 75FFD6AFA2FFE3E4E4FF9D9D9DA15151514D505050074F4F4F004F4F4F005050
- 5000525252075353533D73737378C8C8C8D2EAEAEAFFE6E6E6FFE6E6E6FFEAEA
- EAFFC7C7C7D2727272785353533D52525207505050004F4F4F004F4F4F005050
- 50005252520053535300545454155555553E5555555555555563555555635555
- 55555555553E545454155353530052525200505050004F4F4F00
- }
- end
- end
- end
- object ActionList: TActionList
- Images = ImageList
- left = 168
- top = 64
- object AcFileOpen: TAction
- Caption = 'Open'
- Hint = 'Open xls file'
- ImageIndex = 0
- OnExecute = AcFileOpenExecute
- ShortCut = 16463
- end
- object AcFileQuit: TAction
- Caption = 'Quit'
- Hint = 'Quit application'
- ImageIndex = 1
- OnExecute = AcFileQuitExecute
- ShortCut = 32856
- end
- object AcFind: TAction
- AutoCheck = True
- Caption = 'Find'
- Hint = 'Find record'
- ImageIndex = 2
- OnExecute = AcFindExecute
- ShortCut = 16454
- end
- object AcFindClose: TAction
- ImageIndex = 3
- OnExecute = AcFindCloseExecute
- end
- object AcFindNext: TAction
- ImageIndex = 4
- OnExecute = AcFindNextExecute
- end
- object AcFindPrev: TAction
- ImageIndex = 5
- OnExecute = AcFindPrevExecute
- end
- object AcAbout: TAction
- Caption = 'About...'
- ImageIndex = 6
- OnExecute = AcAboutExecute
- end
- object AcNodeExpand: TAction
- Caption = 'Expand node'
- Hint = 'Expand current node'
- ImageIndex = 8
- OnExecute = AcNodeExpandExecute
- OnUpdate = AcNodeExpandUpdate
- end
- object AcNodeCollapse: TAction
- Caption = 'Collapse node'
- Hint = 'Collapse current node'
- ImageIndex = 7
- OnExecute = AcNodeCollapseExecute
- OnUpdate = AcNodeCollapseUpdate
- end
- object AcDumpToFile: TAction
- Caption = 'Dump to text file'
- OnExecute = AcDumpToFileExecute
- end
- end
- object OpenDialog: TOpenDialog
- DefaultExt = '.xls'
- Filter = 'Excel files (*.xls)|*.xls'
- left = 160
- top = 296
- end
- object RecentFilesPopupMenu: TPopupMenu
- left = 160
- top = 208
- object MenuItem1: TMenuItem
- Caption = 'New Item1'
- end
- end
- object TreePopupMenu: TPopupMenu
- Images = ImageList
- left = 160
- top = 392
- object MenuItem3: TMenuItem
- Action = AcNodeExpand
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000B0B0B000606
- 060006060600070707000707070007070700070707000505050003030300E561
- 3F00E7624029E86341D0E86341FFE86341D0E7624029FFFFFF000B0B0B000606
- 0600060606000707070007070700070707000707070005050500030303003A1A
- 1100DB5B39D0E4917AFFE8BFB2FFE4917AFFDB5B39D0FFFFFF000B0B0B000606
- 060006060600070707000707070007070700070707000606064D050505660505
- 0566CC5331FFF0C7BAFFF0C7BAFFF0C7BAFFCC5331FFFFFFFF000B0B0B000606
- 060006060600080808000F0F0F000F0F0F000F0F0F000F0F0F660A0A0A003418
- 0F00BD4B29D0DB9078FFF7CEC1FFDB9078FFBD4B29D0FFFFFF000B0B0B000606
- 06000606060006060600111111001A1A1A001A1A1A001A1A1A661A1A1A00B346
- 2400B2462429B14523D0B14523FFB14523D0B2462429FFFFFF000B0B0B000606
- 060006060600060606000B0B0B00282828002828280028282866282828006E37
- 2600B1452300AE442200AE442200AE442200B1452300FFFFFF000B0B0B000606
- 060006060600060606000B0B0B00232323003535350035353566353535007746
- 3500B6533100B3502E00B3502E00B3502E00B6533100FFFFFF000E0E0E140B0B
- 0B610B0B0B770B0B0B610E0E0E1410101000414141004141416641414100B956
- 3400B8553329B65331D0B65331FFB65331D0B8553329FFFFFF002525255E9F9F
- 9FBDE4E4E4FF9F9F9FBD2525255E45454500505050004C4C4C66505050006E55
- 4D00C4613FD0D7927BFFE8BFB2FFD7927BFFC4613FD0FFFFFF004545456FF2F2
- F2FFF2F2F2FFF2F2F2FF4545456F545454665454546654545466545454665454
- 5466D46F4DFFF0C7BAFFF0C7BAFFF0C7BAFFD46F4DFFFFFFFF0065656557CACA
- CAB8FDFDFDFFCACACAB8656565575B5B5B005555550055555500555555007960
- 5700E27C5AD0EEA891FFF7CEC1FFEEA891FFE27C5AD0FFFFFF007A7A7A117C7C
- 7C547C7C7C677C7C7C547A7A7A1177777700555555005555550055555500EA84
- 6200EB856329EC8664D0EC8664FFEC8664D0EB856329FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
- }
- end
- object MenuItem5: TMenuItem
- Action = AcNodeCollapse
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000E0E0E140B0B
- 0B610B0B0B770B0B0B610E0E0E14101010005555550000008000000080000000
- 8B0000006E0000006B21000067A6000067CC000067A600006B212525255E9F9F
- 9FBDE4E4E4FF9F9F9FBD2525255E474747005555550016167700000084CC0000
- 8B3300008600000084A71F1FBEE83434EBFF1F1FBEE8000084A74545456FF2F2
- F2FFF2F2F2FFF2F2F2FF4545456F55555566555555662B2B7400000092B30000
- 92CC00009200000092CC5656F5FF5656F5FF5656F5FF000092CC65656557CACA
- CAB8FDFDFDFFCACACAB8656565575B5B5B005555550016168E0000009FCC0000
- 993300009E0000009FA73F3FD5E87272FEFF3F3FD5E800009FA77A7A7A117C7C
- 7C547C7C7C677C7C7C547A7A7A1177777700555555000000A2000000A2000000
- 99000000A6000000A7210000A8A60000A8CC0000A8A60000A721FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
- }
- end
- object MenuItem6: TMenuItem
- Caption = '-'
- end
- object MenuItem7: TMenuItem
- Action = AcFind
- AutoCheck = True
- Bitmap.Data = {
- 36040000424D3604000000000000360000002800000010000000100000000100
- 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
- FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 040004040400040404000404045C090909892525252CFFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 040004040400040404443B3838A2E8D8D8FF32323276FFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 04000404043328272799D9CECEFF605C5C913A3A3A4DFFFFFF001E1E1E000E0E
- 0E00040404000404040004040400040404000404040004040400040404000404
- 04251A1A1A8FC8C1C1FF4F4D4D88393939383C3C3C00FFFFFF001E1E1E000E0E
- 0E000404041604040456040404790404048704040479040404560404042A0F0F
- 0F86B8B5B5FF4241417E3838382A3A3A3A003C3C3C00FFFFFF001E1E1E001111
- 112A2826257D9D9791A5EEE8E3C4F9F3EDD6EFEAE5C5A3A09EA92827278AACAC
- ACFF373737753737371F393939003A3A3A003C3C3C00FFFFFF00262626143B3A
- 3874D7C9BCAFF3E6D9CBF6EDE4CEF6EDE4CEF6EDE4CEF7EFE6D1E4DED9C84544
- 437D3434342438383800393939003A3A3A003C3C3C00FFFFFF0031313149A89D
- 9397EAD5BFC3F5E9DFCBF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6ECE2CEADA6
- 9E9D3131314931313100313131003131310031313100FFFFFF0038383865E1CF
- BCB1E8D2BBC0F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEE7D8
- CAB83838386538383800383838003838380038383800FFFFFF003E3E3E6FE9D4
- BEBEE8D2BBC0E8D2BBC0F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEEDDB
- C8C53E3E3E6F3E3E3E003E3E3E003E3E3E003E3E3E00FFFFFF0043434360E0CB
- B6ACE8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E8D2BBC0E4D3
- C1B24343436043434300434343004343430043434300FFFFFF0049494943AD9F
- 918EE8D2BBC0F1E3D5C8F6EDE4CEF6EDE4CEF6EDE4CEF6EDE4CEF2E4D6C8B0A4
- 97914949494349494900494949004949490049494900FFFFFF004D4D4D115F5D
- 5A64D5C1AEA1EBD8C4C2F6ECE2CDF6EDE4CEF6EDE4CEF6ECE2CDD9C8B8A4605D
- 5B644D4D4D114C4C4C004C4C4C004C4C4C004C4C4C00FFFFFF004E4E4E005151
- 512163605E62B1A3948BE6D5C5AFF4EADFC7EDE3D9B5B6ACA28E63605E625151
- 51214E4E4E004E4E4E004E4E4E004E4E4E004E4E4E00FFFFFF004E4E4E005151
- 510054545411555555405555555A555555655555555A55555540545454115151
- 51004E4E4E004E4E4E00295727000569000007710000FFFFFF00
- }
- end
- end
- object SaveDialog: TSaveDialog
- DefaultExt = '.txt'
- Filter = 'Text files (*.txt)|*.txt'
- left = 289
- top = 296
- end
-end
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/bemain.pas b/components/fpspreadsheet/reference/BIFFExplorer/bemain.pas
deleted file mode 100644
index f7c2a90ea..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/bemain.pas
+++ /dev/null
@@ -1,1472 +0,0 @@
-unit beMain;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- ActnList, Classes, ComCtrls, ExtCtrls, Grids, Menus, StdCtrls, SysUtils,
- FileUtil, Forms, Controls, Graphics, Dialogs, Buttons, Types, VirtualTrees,
- {$ifdef USE_NEW_OLE}
- fpolebasic,
- {$else}
- fpolestorage,
- {$endif}
- fpstypes, KHexEditor,
- mrumanager, beTypes, beBIFFGrid;
-
-type
-
- { TMainForm }
- TMainForm = class(TForm)
- AcFileOpen: TAction;
- AcFileQuit: TAction;
- AcFind: TAction;
- AcFindNext: TAction;
- AcFindPrev: TAction;
- AcAbout: TAction;
- AcFindClose: TAction;
- AcNodeExpand: TAction;
- AcNodeCollapse: TAction;
- AcDumpToFile: TAction;
- ActionList: TActionList;
- BIFFTree: TVirtualStringTree;
- CbFind: TComboBox;
- CbHexAddress: TCheckBox;
- CbHexEditorLineSize: TComboBox;
- CbHexSingleBytes: TCheckBox;
- ImageList: TImageList;
- HexEditor: TKHexEditor;
- MainMenu: TMainMenu;
- AnalysisDetails: TMemo;
- MenuItem1: TMenuItem;
- MenuItem3: TMenuItem;
- MenuItem5: TMenuItem;
- MenuItem6: TMenuItem;
- MenuItem7: TMenuItem;
- MnuDumpToFile: TMenuItem;
- MenuItem9: TMenuItem;
- MnuFind: TMenuItem;
- MnuRecord: TMenuItem;
- MnuFileReopen: TMenuItem;
- MenuItem4: TMenuItem;
- MnuHelp: TMenuItem;
- MenuItem2: TMenuItem;
- MnuFileQuit: TMenuItem;
- MnuFileOpen: TMenuItem;
- MnuFile: TMenuItem;
- OpenDialog: TOpenDialog;
- PageControl: TPageControl;
- DetailPanel: TPanel;
- FindPanel: TPanel;
- HexEditorParamsPanel: TPanel;
- SaveDialog: TSaveDialog;
- SpeedButton3: TSpeedButton;
- TreePopupMenu: TPopupMenu;
- TreePanel: TPanel;
- BtnFindNext: TSpeedButton;
- BtnFindPrev: TSpeedButton;
- RecentFilesPopupMenu: TPopupMenu;
- BtnCloseFind: TSpeedButton;
- Splitter1: TSplitter;
- HexSplitter: TSplitter;
- PgAnalysis: TTabSheet;
- PgValues: TTabSheet;
- DetailsSplitter: TSplitter;
- StatusBar: TStatusBar;
- ToolButton3: TToolButton;
- ToolButton4: TToolButton;
- ValueGrid: TStringGrid;
- ToolBar: TToolBar;
- ToolButton1: TToolButton;
- ToolButton2: TToolButton;
- procedure AcAboutExecute(Sender: TObject);
- procedure AcDumpToFileExecute(Sender: TObject);
- procedure AcFileOpenExecute(Sender: TObject);
- procedure AcFileQuitExecute(Sender: TObject);
- procedure AcFindCloseExecute(Sender: TObject);
- procedure AcFindExecute(Sender: TObject);
- procedure AcFindNextExecute(Sender: TObject);
- procedure AcFindPrevExecute(Sender: TObject);
- procedure AcNodeCollapseExecute(Sender: TObject);
- procedure AcNodeCollapseUpdate(Sender: TObject);
- procedure AcNodeExpandExecute(Sender: TObject);
- procedure AcNodeExpandUpdate(Sender: TObject);
- procedure BIFFTreeBeforeCellPaint(Sender: TBaseVirtualTree;
- TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
- CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
- procedure BIFFTreeFocusChanged(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Column: TColumnIndex);
- procedure BIFFTreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
- procedure BIFFTreeGetNodeDataSize(Sender: TBaseVirtualTree;
- var NodeDataSize: Integer);
- procedure BIFFTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
- Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
-// procedure BIFFTreeInitNode(Sender: TBaseVirtualTree; ParentNode,
-// Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
- procedure BIFFTreePaintText(Sender: TBaseVirtualTree;
- const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
- TextType: TVSTTextType);
- procedure CbFindChange(Sender: TObject);
- procedure CbFindKeyPress(Sender: TObject; var Key: char);
- procedure CbHexAddressChange(Sender: TObject);
- procedure CbHexEditorLineSizeChange(Sender: TObject);
- procedure CbHexSingleBytesChange(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
- procedure FormShow(Sender: TObject);
- procedure HexEditorClick(Sender: TObject);
- procedure HexEditorKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure ListViewSelectItem(Sender: TObject; Item: TListItem;
- Selected: Boolean);
- procedure PageControlChange(Sender: TObject);
- procedure ValueGridClick(Sender: TObject);
- procedure ValueGridPrepareCanvas(Sender: TObject; ACol, ARow: Integer;
- AState: TGridDrawState);
-
- private
- MemStream: TMemoryStream;
- OLEStorage: TOLEStorage;
- FFileName: String;
- FFormat: TsSpreadsheetFormat;
- FBuffer: TBIFFBuffer;
- FCurrOffset: Integer;
- FXFIndex: Integer;
- FFontIndex: Integer;
- FFormatIndex: Integer;
- FRowIndex: Integer;
- FExternSheetIndex: Integer;
- FAnalysisGrid: TBIFFGrid;
- FMRUMenuManager : TMRUMenuManager;
- procedure AddToHistory(const AText: String);
- procedure AnalysisGridDetails(Sender: TObject; ADetails: TStrings);
- procedure AnalysisGridPrepareCanvas(Sender: TObject; ACol, ARow: Integer;
- AState: TGridDrawState);
- procedure AnalysisGridSelection(Sender: TObject; ACol, ARow: Integer);
- procedure DumpToFile(const AFileName: String);
- procedure ExecFind(ANext, AKeep: Boolean);
- function GetBIFFNodeData: PBiffNodeData;
- function GetRecType: Word;
- function GetValueGridDataSize: Integer;
- procedure LoadFile(const AFileName: String); overload;
- procedure LoadFile(const AFileName: String; AFormat: TsSpreadsheetFormat); overload;
- procedure MRUMenuManagerRecentFile(Sender:TObject; const AFileName:string);
- procedure PopulateAnalysisGrid;
- procedure PopulateHexDump;
- procedure PopulateValueGrid;
- procedure ReadCmdLine;
- procedure ReadFromIni;
- procedure ReadFromStream(AStream: TStream);
- procedure UpdateCaption;
- procedure UpdateCmds;
- procedure UpdateStatusbar;
- procedure WriteToIni;
-
- public
- procedure BeforeRun;
- end;
-
-var
- MainForm: TMainForm;
-
-implementation
-
-{$R *.lfm}
-
-uses
- IniFiles, LazUTF8, LazFileUtils, Math, StrUtils, LCLType,
- KFunctions,
- fpsUtils,
- beUtils, beBIFFUtils, beAbout;
-
-const
- VALUE_ROW_INDEX = 1;
- VALUE_ROW_BITS = 2;
- VALUE_ROW_BYTE = 3;
- VALUE_ROW_SHORTINT = 4;
- VALUE_ROW_WORD = 5;
- VALUE_ROW_SMALLINT = 6;
- VALUE_ROW_DWORD = 7;
- VALUE_ROW_LONGINT = 8;
- VALUE_ROW_QWORD = 9;
- VALUE_ROW_INT64 = 10;
- VALUE_ROW_SINGLE = 11;
- VALUE_ROW_DOUBLE = 12;
- VALUE_ROW_ANSISTRING = 13;
- VALUE_ROW_PANSICHAR = 14;
- VALUE_ROW_WIDESTRING = 15;
- VALUE_ROW_PWIDECHAR = 16;
-
- MAX_HISTORY = 16;
-
-
-{ TMyHexEditor }
-
-type
- TMyHexEditor = class(TKHexEditor);
-
- (*
-{ Virtual tree nodes }
-
-type
- TObjectNodeData = record
- Data: TObject;
- end;
- PObjectNodeData = ^TObjectNodeData;
- *)
-
-{ TMainForm }
-
-procedure TMainForm.AcAboutExecute(Sender: TObject);
-var
- F: TAboutForm;
-begin
- F := TAboutForm.Create(nil);
- try
- F.ShowModal;
- finally
- F.Free;
- end;
-end;
-
-
-procedure TMainForm.AcDumpToFileExecute(Sender: TObject);
-begin
- if FFileName = '' then
- exit;
-
- with SaveDialog do begin
- FileName := ChangeFileExt(ExtractFileName(FFileName), '') + '_dumped.txt';
- if Execute then
- DumpToFile(FileName);
- end;
-end;
-
-
-procedure TMainForm.AcFileOpenExecute(Sender: TObject);
-begin
- with OpenDialog do begin
- if Execute then LoadFile(FileName);
- end;
-end;
-
-
-procedure TMainForm.AcFileQuitExecute(Sender: TObject);
-begin
- Close;
-end;
-
-
-procedure TMainForm.AcFindCloseExecute(Sender: TObject);
-begin
- AcFind.Checked := false;
- FindPanel.Hide;
-end;
-
-
-procedure TMainForm.AcFindExecute(Sender: TObject);
-begin
- if AcFind.Checked then begin
- FindPanel.Show;
- CbFind.SetFocus;
- end else begin
- FindPanel.Hide;
- end;
-end;
-
-
-procedure TMainForm.AcFindNextExecute(Sender: TObject);
-begin
- ExecFind(true, false);
-end;
-
-
-procedure TMainForm.AcFindPrevExecute(Sender: TObject);
-begin
- ExecFind(false, false);
-end;
-
-
-procedure TMainForm.AcNodeCollapseExecute(Sender: TObject);
-var
- node: PVirtualNode;
-begin
- node := BiffTree.FocusedNode;
- if node <> nil then begin
- if BiffTree.GetNodeLevel(node) > 0 then
- node := node^.Parent;
- BiffTree.Expanded[node] := false;
- end;
-end;
-
-procedure TMainForm.AcNodeCollapseUpdate(Sender: TObject);
-var
- node: PVirtualNode;
-begin
- node := BiffTree.FocusedNode;
- if node <> nil then begin
- if BiffTree.GetNodeLevel(node) > 0 then
- node := node^.Parent;
- end;
- AcNodeCollapse.Enabled := (node <> nil) and BiffTree.Expanded[node];
-end;
-
-
-procedure TMainForm.AcNodeExpandExecute(Sender: TObject);
-var
- node: PVirtualNode;
-begin
- node := BiffTree.FocusedNode;
- if node <> nil then begin
- if BiffTree.GetNodeLevel(node) > 0 then
- node := node^.Parent;
- BiffTree.Expanded[node] := true;
- end;
-end;
-
-
-procedure TMainForm.AcNodeExpandUpdate(Sender: TObject);
-var
- node: PVirtualNode;
-begin
- node := BiffTree.FocusedNode;
- if node <> nil then begin
- if BiffTree.GetNodeLevel(node) > 0 then
- node := node^.Parent;
- end;
- AcNodeExpand.Enabled := (node <> nil) and not BiffTree.Expanded[node];
-end;
-
-procedure TMainForm.AddToHistory(const AText: String);
-begin
- if (AText <> '') and (CbFind.Items.IndexOf(AText) = -1) then begin
- CbFind.Items.Insert(0, AText);
- while CbFind.Items.Count > MAX_HISTORY do
- CbFind.Items.Delete(CbFind.Items.Count-1);
- end;
-end;
-
-
-procedure TMainForm.AnalysisGridDetails(Sender: TObject; ADetails: TStrings);
-begin
- AnalysisDetails.Lines.Assign(ADetails);
-end;
-
-
-procedure TMainForm.AnalysisGridPrepareCanvas(Sender: TObject; ACol,
- ARow: Integer; AState: TGridDrawState);
-begin
- if ARow = 0 then FAnalysisGrid.Canvas.Font.Style := [fsBold];
-end;
-
-
-procedure TMainForm.AnalysisGridSelection(Sender: TObject; ACol, ARow: Integer);
-var
- s: String;
-begin
- if ARow < FAnalysisGrid.RowCount then
- begin
- s := FAnalysisGrid.Cells[0, ARow];
- if s <> '' then
- begin
- FCurrOffset := StrToInt(s);
- PopulateValueGrid;
- UpdateStatusbar;
- end;
- end;
-end;
-
-
-procedure TMainForm.BeforeRun;
-begin
- ReadFromIni;
- ReadCmdLine;
-end;
-
-
-procedure TMainForm.BIFFTreeBeforeCellPaint(Sender: TBaseVirtualTree;
- TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
- CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
-var
- s: String;
-begin
- if (Sender.GetNodeLevel(Node) = 0) and (Column = 0) then begin
- // Left-align parent nodes (column 0 is right-aligned)
- BiffTreeGetText(Sender, Node, 0, ttNormal, s);
- TargetCanvas.Font.Style := [fsBold];
- ContentRect.Right := CellRect.Left + TargetCanvas.TextWidth(s) + 30;
- end;
-end;
-
-
-procedure TMainForm.BIFFTreeFocusChanged(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Column: TColumnIndex);
-var
- data: PBiffNodeData;
- n: Word;
-begin
- if Node^.Parent = Sender.RootNode then
- begin
- HexEditor.Clear;
- for n:=1 to ValueGrid.RowCount-1 do
- begin
- ValueGrid.Cells[1, n] := '';
- ValueGrid.Cells[2, n] := '';
- end;
- FAnalysisGrid.RowCount := 2;
- FAnalysisGrid.Rows[1].Clear;
- AnalysisDetails.Lines.Clear;
- exit;
- end;
-
- data := Sender.GetNodeData(Node);
-
- // Move to start of record + 2 bytes to skip record type ID.
- MemStream.Position := PtrInt(data^.Offset) + 2;
-
- // Read size of record
- n := WordLEToN(MemStream.ReadWord);
-
- // Read record data
- SetLength(FBuffer, n);
- if n > 0 then
- MemStream.ReadBuffer(FBuffer[0], n);
-
- // Update user interface
- if (BiffTree.FocusedNode <> nil) and (BiffTree.GetNodeLevel(BiffTree.FocusedNode) > 0)
- then begin
- Statusbar.Panels[0].Text := Format('Record ID: $%.4x', [data^.RecordID]);
- Statusbar.Panels[1].Text := data^.RecordName;
- Statusbar.Panels[2].Text := Format('Record size: %d bytes', [n]);
- Statusbar.Panels[3].Text := '';
- end else begin
- Statusbar.Panels[0].Text := '';
- Statusbar.Panels[1].Text := data^.RecordName;
- Statusbar.Panels[2].Text := '';
- Statusbar.Panels[3].Text := '';
- end;
- PopulateHexDump;
- PageControlChange(nil);
-end;
-
-
-procedure TMainForm.BIFFTreeFreeNode(Sender: TBaseVirtualTree;
- Node: PVirtualNode);
-var
- data: PBiffNodeData;
-begin
- data := Sender.GetNodeData(Node);
- if data <> nil then
- begin
- data^.RecordName := '';
- data^.RecordDescription := '';
- end;
-end;
-
-
-procedure TMainForm.BIFFTreeGetNodeDataSize(Sender: TBaseVirtualTree;
- var NodeDataSize: Integer);
-begin
- NodeDataSize := SizeOf(TBiffNodeData);
-end;
-
-
-procedure TMainForm.BIFFTreeGetText(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
- var CellText: String);
-var
- data: PBiffNodeData;
-begin
- CellText := '';
- data := Sender.GetNodeData(Node);
- if data <> nil then
- case Sender.GetNodeLevel(Node) of
- 0: if Column = 0 then CellText := data^.RecordName;
- 1: case Column of
- 0: CellText := IntToStr(data^.Offset);
- 1: CellText := Format('$%.4x', [data^.RecordID]);
- 2: CellText := data^.RecordName;
- 3: if data^.Index > -1 then CellText := IntToStr(data^.Index);
- 4: cellText := data^.RecordDescription;
- end;
- end;
-end;
-
-
-procedure TMainForm.BIFFTreePaintText(Sender: TBaseVirtualTree;
- const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
- TextType: TVSTTextType);
-begin
- // Paint parent node in bold font.
- if (Sender.GetNodeLevel(Node) = 0) and (Column = 0) then
- TargetCanvas.Font.Style := [fsBold];
-end;
-
-
-procedure TMainForm.CbFindChange(Sender: TObject);
-begin
- ExecFind(true, true);
-end;
-
-
-procedure TMainForm.CbFindKeyPress(Sender: TObject; var Key: char);
-begin
- if Key = #13 then
- ExecFind(true, false);
-end;
-
-procedure TMainForm.CbHexAddressChange(Sender: TObject);
-begin
- if CbHexAddress.Checked then
- begin
- HexEditor.AddressMode := eamHex;
- HexEditor.AddressPrefix := '$';
- end else
- begin
- HexEditor.AddressMode := eamDec;
- HexEditor.AddressPrefix := '';
- end;
- CbHexEditorLineSizeChange(nil);
-end;
-
-procedure TMainForm.CbHexEditorLineSizeChange(Sender: TObject);
-begin
- case CbHexEditorLineSize.ItemIndex of
- 0: HexEditor.LineSize := IfThen(HexEditor.AddressMode = eamHex, 16, 10);
- 1: HexEditor.LineSize := IfThen(HexEditor.AddressMode = eamHex, 32, 20);
- end;
-end;
-
-procedure TMainForm.CbHexSingleBytesChange(Sender: TObject);
-begin
- HexEditor.DigitGrouping := IfThen(CbHexSingleBytes.Checked, 1, 2);
-end;
-
-procedure TMainForm.DumpToFile(const AFileName: String);
-var
- list: TStringList;
- parentnode, node: PVirtualNode;
- parentdata, data: PBiffNodeData;
-begin
- list := TStringList.Create;
- try
- parentnode := BiffTree.GetFirst;
- while parentnode <> nil do begin
- parentdata := BiffTree.GetNodeData(parentnode);
- list.Add(parentdata^.RecordName);
- node := BIffTree.GetFirstChild(parentnode);
- while node <> nil do begin
- data := BiffTree.GetNodeData(node);
- List.Add(Format(' %.04x %s (%s)', [data^.RecordID, data^.RecordName, data^.RecordDescription]));
- node := BiffTree.GetNextSibling(node);
- end;
- List.Add('');
- parentnode := BiffTree.GetNextSibling(parentnode);
- end;
-
- list.SaveToFile(AFileName);
- finally
- list.Free;
- end;
-end;
-
-
-procedure TMainForm.ExecFind(ANext, AKeep: Boolean);
-var
- s: String;
- node, node0: PVirtualNode;
-
- function GetRecordname(ANode: PVirtualNode; UseLowercase: Boolean = true): String;
- var
- data: PBIffNodeData;
- begin
- data := BiffTree.GetNodeData(ANode);
- if Assigned(data) then begin
- if UseLowercase then
- Result := lowercase(data^.RecordName)
- else
- Result := data^.RecordName;
- end else
- Result := '';
- end;
-
- function GetNextNode(ANode: PVirtualNode): PVirtualNode;
- var
- nextparent: PVirtualNode;
- begin
- Result := BiffTree.GetNextSibling(ANode);
- if (Result = nil) and (ANode <> nil) then begin
- nextparent := BiffTree.GetNextSibling(ANode^.Parent);
- if nextparent = nil then
- nextparent := BiffTree.GetFirst;
- Result := BiffTree.GetFirstChild(nextparent);
- end;
- end;
-
- function GetPrevNode(ANode: PVirtualNode): PVirtualNode;
- var
- prevparent: PVirtualNode;
- begin
- Result := BiffTree.GetPreviousSibling(ANode);
- if (Result = nil) and (ANode <> nil) then begin
- prevparent := BiffTree.GetPreviousSibling(ANode^.Parent);
- if prevparent = nil then
- prevparent := BiffTree.GetLast;
- Result := BiffTree.GetLastChild(prevparent);
- end;
- end;
-
-begin
- if CbFind.Text = '' then
- exit;
-
- s := Lowercase(CbFind.Text);
- node0 := BiffTree.FocusedNode;
- if node0 = nil then
- node0 := BiffTree.GetFirst;
- if BiffTree.GetNodeLevel(node0) = 0 then
- node0 := BiffTree.GetFirstChild(node0);
-
- if ANext then begin
- if AKeep
- then node := node0
- else node := GetNextNode(node0);
- repeat
- if pos(s, GetRecordname(node)) > 0 then begin
- BiffTree.FocusedNode := node;
- BiffTree.Selected[node] := true;
- BiffTree.ScrollIntoView(node, true);
- AddToHistory(GetRecordname(node, false));
- exit;
- end;
- node := GetNextNode(node);
- until (node = node0) or (node = nil);
- end else begin
- if AKeep
- then node := node0
- else node := GetPrevNode(node0);
- repeat
- if pos(s, GetRecordName(node)) > 0 then begin
- BiffTree.FocusedNode := node;
- BiffTree.Selected[node] := true;
- BiffTree.ScrollIntoView(node, true);
- AddToHistory(GetRecordName(node, false));
- exit;
- end;
- node := GetPrevNode(node);
- until (node = node0) or (node = nil);
- end;
-end;
-
-
-procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
-begin
- if CanClose then
- try
- WriteToIni;
- except
- MessageDlg('Could not write setting to configuration file.', mtError, [mbOK], 0);
- end;
-end;
-
-
-procedure TMainForm.FormCreate(Sender: TObject);
-begin
- FMRUMenuManager := TMRUMenuManager.Create(self);
- with FMRUMenuManager do begin
- Name := 'MRUMenuManager';
- IniFileName := GetAppConfigFile(false);
- IniSection := 'RecentFiles';
- MaxRecent := 16;
- MenuCaptionMask := '&%x - %s'; // & --> create hotkey
- MenuItem := MnuFileReopen;
- PopupMenu := RecentFilesPopupMenu;
- OnRecentFile := @MRUMenuManagerRecentFile;
- end;
-
- HexEditor.Font.Style := [];
-
- FAnalysisGrid := TBIFFGrid.Create(self);
- with FAnalysisGrid do begin
- Parent := PgAnalysis;
- Align := alClient;
- DefaultRowHeight := ValueGrid.DefaultRowHeight;
- Options := Options + [goDrawFocusSelected];
- TitleStyle := tsNative;
- OnDetails := @AnalysisGridDetails;
- OnPrepareCanvas := @AnalysisGridPrepareCanvas;
- OnSelection := @AnalysisGridSelection;
- TabOrder := 0;
- end;
-
- with ValueGrid do begin
- ColCount := 3;
- RowCount := VALUE_ROW_PWIDECHAR + 1;
- Cells[0, 0] := 'Data type';
- Cells[1, 0] := 'Value';
- Cells[2, 0] := 'Offset range';
- Cells[0, VALUE_ROW_INDEX] := 'Offset';
- Cells[0, VALUE_ROW_BITS] := 'Bits';
- Cells[0, VALUE_ROW_BYTE] := 'Byte';
- Cells[0, VALUE_ROW_SHORTINT] := 'ShortInt';
- Cells[0, VALUE_ROW_WORD] := 'Word';
- Cells[0, VALUE_ROW_SMALLINT] := 'SmallInt';
- Cells[0, VALUE_ROW_DWORD] := 'DWord';
- Cells[0, VALUE_ROW_LONGINT] := 'LongInt';
- Cells[0, VALUE_ROW_QWORD] := 'QWord';
- Cells[0, VALUE_ROW_INT64] := 'Int64';
- Cells[0, VALUE_ROW_SINGLE] := 'Single';
- Cells[0, VALUE_ROW_DOUBLE] := 'Double';
- Cells[0, VALUE_ROW_ANSISTRING] := 'AnsiString';
- Cells[0, VALUE_ROW_PANSICHAR] := 'PAnsiChar';
- Cells[0, VALUE_ROW_WIDESTRING] := 'WideString';
- Cells[0, VALUE_ROW_PWIDECHAR] := 'PWideChar';
- end;
-
- BiffTree.DefaultNodeHeight := BiffTree.Canvas.TextHeight('Tg') + 4;
- BiffTree.Header.DefaultHeight := ValueGrid.DefaultRowHeight;
-
- UpdateCmds;
-end;
-
-
-procedure TMainForm.FormDestroy(Sender: TObject);
-begin
- if MemStream <> nil then
- FreeAndNil(MemStream);
- if OLEStorage <> nil then
- FreeAndNil(OLEStorage);
-end;
-
-
-procedure TMainForm.FormDropFiles(Sender: TObject;
- const FileNames: array of String);
-begin
- LoadFile(FileNames[0]);
-end;
-
-
-procedure TMainForm.FormShow(Sender: TObject);
-begin
- Width := Width + 1; // remove black rectangle next to ValueGrid
- Width := Width - 1;
-end;
-
-
-function TMainForm.GetBIFFNodeData: PBiffNodeData;
-begin
- Result := nil;
- if BiffTree.FocusedNode <> nil then
- begin
- Result := BiffTree.GetNodeData(BiffTree.FocusedNode);
- if Result <> nil then
- MemStream.Position := Result^.Offset;
- end;
-end;
-
-
-function TMainForm.GetRecType: Word;
-var
- data: PBiffNodeData;
-begin
- Result := Word(-1);
- if BiffTree.FocusedNode <> nil then
- begin
- data := BiffTree.GetNodedata(BiffTree.FocusedNode);
- if data <> nil then
- begin
- MemStream.Position := data^.Offset;
- Result := WordLEToN(MemStream.ReadWord);
- end;
- end;
-end;
-
-
-function TMainForm.GetValueGridDataSize: Integer;
-begin
- Result := -1;
- case ValueGrid.Row of
- VALUE_ROW_BITS : Result := SizeOf(Byte);
- VALUE_ROW_BYTE : Result := SizeOf(Byte);
- VALUE_ROW_SHORTINT : Result := SizeOf(ShortInt);
- VALUE_ROW_WORD : Result := SizeOf(Word);
- VALUE_ROW_SMALLINT : Result := SizeOf(SmallInt);
- VALUE_ROW_DWORD : Result := SizeOf(DWord);
- VALUE_ROW_LONGINT : Result := SizeOf(LongInt);
- VALUE_ROW_QWORD : Result := SizeOf(QWord);
- VALUE_ROW_INT64 : Result := SizeOf(Int64);
- VALUE_ROW_SINGLE : Result := SizeOf(Single);
- VALUE_ROW_DOUBLE : Result := SizeOf(Double);
- end;
-end;
-
-procedure TMainForm.HexEditorClick(Sender: TObject);
-begin
- FCurrOffset := HexEditor.SelStart.Index;
- PopulateValueGrid;
- ValueGridClick(nil);
- UpdateStatusbar;
-end;
-
-procedure TMainForm.HexEditorKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
-var
- sel: TKHexEditorSelection;
-begin
- case Key of
- VK_LEFT : dec(FCurrOffset);
- VK_RIGHT : inc(FCurrOffset);
- VK_UP : dec(FCurrOffset, HexEditor.LineSize);
- VK_DOWN : inc(FCurrOffset, HexEditor.LineSize);
- VK_HOME : if (Shift = [ssCtrl]) then
- FCurrOffset := 0 else
- FCurrOffset := (FCurrOffset div HexEditor.LineSize) * HexEditor.LineSize;
- VK_END : if (Shift = [ssCtrl]) then
- FCurrOffset := High(FBuffer) else
- FCurrOffset := succ(FCurrOffset div HexEditor.LineSize) * HexEditor.lineSize - 1;
- VK_NEXT : begin
- if (Shift = [ssCtrl]) then
- inc(FCurrOffset, HexEditor.LineSize * HexEditor.LineCount)
- else
- inc(FCurrOffset, HexEditor.LineSize * HexEditor.GetClientHeightChars);
- while (FCurrOffset > High(FBuffer)) do
- dec(FCurrOffset, HexEditor.LineSize);
- end;
- VK_PRIOR : if (Shift = [ssCtrl]) then
- FCurrOffset := FCurrOffset mod HexEditor.LineSize
- else
- begin
- dec(FCurrOffset, HexEditor.LineSize * HexEditor.GetClientHeightChars);
- while (FCurrOffset < 0) do
- inc(FCurrOffset, HexEditor.LineSize);
- end;
- else exit;
- end;
- if FCurrOffset < 0 then FCurrOffset := 0;
- if FCurrOffset > High(FBuffer) then FCurrOffset := High(FBuffer);
- sel.Index := FCurrOffset;
- sel.Digit := 0;
- HexEditor.SelStart := sel;
- HexEditorClick(nil);
- if not HexEditor.CaretInView then
- TMyHexEditor(HexEditor).ScrollTo(HexEditor.SelToPoint(HexEditor.SelStart, HexEditor.EditArea), false, true);
-
- // Don't process these keys any more!
- Key := 0;
-end;
-
-procedure TMainForm.LoadFile(const AFileName: String);
-var
- valid: Boolean;
- excptn: Exception = nil;
- ext: String;
-begin
- if not FileExistsUTF8(AFileName) then begin
- MessageDlg(Format('File "%s" not found.', [AFileName]), mtError, [mbOK], 0);
- exit;
- end;
-
- ext := Lowercase(ExtractFileExt(AFilename));
- if ext <> '.xls' then begin
- MessageDlg('BIFFExplorer can only process binary Excel files (extension ".xls")',
- mtError, [mbOK], 0);
- exit;
- end;
-
- // .xls files can contain several formats. We look into the header first.
- if ext = STR_EXCEL_EXTENSION then
- begin
- valid := GetFormatFromFileHeader(UTF8ToAnsi(AFileName), FFormat);
- // It is possible that valid xls files are not detected correctly. Therefore,
- // we open them explicitly by trial and error - see below.
- if not valid then
- FFormat := sfExcel8;
- valid := true;
- end else
- FFormat := sfExcel8;
-
- while True do begin
- try
- LoadFile(AFileName, FFormat);
- valid := True;
- except
- on E: Exception do begin
- if FFormat = sfExcel8 then excptn := E;
- valid := False
- end;
- end;
- if valid or (FFormat = sfExcel2) then Break;
- FFormat := Pred(FFormat);
- end;
-
- // A failed attempt to read a file should bring an exception, so re-raise
- // the exception if necessary. We re-raise the exception brought by Excel 8,
- // since this is the most common format
- if (not valid) and (excptn <> nil) then
- raise excptn;
-end;
-
-
-procedure TMainForm.LoadFile(const AFileName: String; AFormat: TsSpreadsheetFormat);
-var
- OLEDocument: TOLEDocument;
- streamname: UTF8String;
- filestream: TFileStream;
-begin
- if MemStream <> nil then
- FreeAndNil(MemStream);
-
- if OLEStorage <> nil then
- FreeAndNil(OLEStorage);
-
- MemStream := TMemoryStream.Create;
-
- if AFormat = sfExcel2 then begin
- fileStream := TFileStream.Create(UTF8ToSys(AFileName), fmOpenRead + fmShareDenyNone);
- try
- MemStream.CopyFrom(fileStream, fileStream.Size);
- MemStream.Position := 0;
-// MemStream.LoadFromFile(UTF8ToSys(AFileName));
- finally
- filestream.Free;
- end;
- end else begin
- OLEStorage := TOLEStorage.Create;
-
- // Only one stream is necessary for any number of worksheets
- OLEDocument.Stream := MemStream;
- if AFormat = sfExcel8 then streamname := 'Workbook' else streamname := 'Book';
- OLEStorage.ReadOLEFile(UTF8ToSys(AFileName), OLEDocument, streamname);
-
- // Check if the operation succeded
- if MemStream.Size = 0 then
- raise Exception.Create('BIFF Explorer: Reading the OLE document failed');
- end;
-
- // Rewind the stream and read from it
- MemStream.Position := 0;
- FFileName := ExpandFileName(AFileName);
- ReadFromStream(MemStream);
-
- FFormat := AFormat;
- UpdateCaption;
- UpdateStatusbar;
-
- FMRUMenuManager.AddToRecent(AFileName);
-end;
-
-
-procedure TMainForm.ListViewSelectItem(Sender: TObject; Item: TListItem;
- Selected: Boolean);
-var
- n: Word;
-begin
- if Selected then begin
- // Move to start of record + 2 bytes to skip record type ID.
- MemStream.Position := PtrInt(Item.Data) + 2;
-
- // Read size of record
- n := WordLEToN(MemStream.ReadWord);
-
- // Read record data
- SetLength(FBuffer, n);
- MemStream.ReadBuffer(FBuffer[0], n);
-
- // Update user interface
- Statusbar.Panels[0].Text := Format('Record ID: %s', [Item.SubItems[0]]);
- Statusbar.Panels[1].Text := Item.SubItems[1];
- Statusbar.Panels[2].Text := Format('Record size: %s bytes', [Item.SubItems[3]]);
- PopulateHexDump;
- PageControlChange(nil);
- end;
-end;
-
-
-procedure TMainForm.MRUMenuManagerRecentFile(Sender: TObject;
- const AFileName: string);
-begin
- LoadFile(AFileName);
-end;
-
-
-procedure TMainForm.PopulateAnalysisGrid;
-begin
- FAnalysisGrid.SetBIFFNodeData(GetBiffNodeData, FBuffer, FFormat);
-end;
-
-
-procedure TMainForm.PopulateHexDump;
-var
- data: TDataSize;
-begin
- data.Size := Length(FBuffer);
- data.Data := @FBuffer[0];
- HexEditor.Clear;
- HexEditor.Append(0, data);
-end;
-
-
-procedure TMainForm.PopulateValueGrid;
-var
- buf: array[0..1023] of Byte;
- w: word absolute buf;
- dw: DWord absolute buf;
- qw: QWord absolute buf;
- dbl: double absolute buf;
- sng: single absolute buf;
- idx: Integer;
- i, j: Integer;
- s: String;
- sw: WideString;
- ls: Integer;
-begin
- idx := FCurrOffset;
-// idx := HexEditor.SelStart.Index;
-
- i := ValueGrid.RowCount;
- j := ValueGrid.ColCount;
-
- ValueGrid.Cells[1, VALUE_ROW_INDEX] := IntToStr(idx);
-
- if idx <= Length(FBuffer)-SizeOf(byte) then begin
- ValueGrid.Cells[1, VALUE_ROW_BITS] := IntToBin(FBuffer[idx], 8);
- ValueGrid.Cells[2, VALUE_ROW_BITS] := Format('%d ... %d', [idx, idx]);
- ValueGrid.Cells[1, VALUE_ROW_BYTE] := IntToStr(FBuffer[idx]);
- ValueGrid.Cells[2, VALUE_ROW_BYTE] := ValueGrid.Cells[2, VALUE_ROW_BITS];
- ValueGrid.Cells[1, VALUE_ROW_SHORTINT] := IntToStr(ShortInt(FBuffer[idx]));
- ValueGrid.Cells[2, VALUE_ROW_SHORTINT] := ValueGrid.Cells[2, VALUE_ROW_BITS];
- end
- else begin
- ValueGrid.Cells[1, VALUE_ROW_BYTE] := '';
- ValueGrid.Cells[2, VALUE_ROW_BYTE] := '';
- ValueGrid.Cells[1, VALUE_ROW_SHORTINT] := '';
- ValueGrid.Cells[2, VALUE_ROW_SHORTINT] := '';
- end;
-
- if idx <= Length(FBuffer)-SizeOf(word) then begin
- buf[0] := FBuffer[idx];
- buf[1] := FBuffer[idx+1];
- ValueGrid.Cells[1, VALUE_ROW_WORD] := IntToStr(WordLEToN(w));
- ValueGrid.Cells[2, VALUE_ROW_WORD] := Format('%d ... %d', [idx, idx+SizeOf(Word)-1]);
- ValueGrid.Cells[1, VALUE_ROW_SMALLINT] := IntToStr(SmallInt(WordLEToN(w)));
- ValueGrid.Cells[2, VALUE_ROW_SMALLINT] := ValueGrid.Cells[2, VALUE_ROW_WORD];
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_WORD] := '';
- ValueGrid.Cells[2, VALUE_ROW_WORD] := '';
- ValueGrid.Cells[1, VALUE_ROW_SMALLINT] := '';
- ValueGrid.Cells[2, VALUE_ROW_SMALLINT] := '';
- end;
-
- if idx <= Length(FBuffer) - SizeOf(DWord) then begin
- for i:=0 to SizeOf(DWord)-1 do buf[i] := FBuffer[idx+i];
- ValueGrid.Cells[1, VALUE_ROW_DWORD] := IntToStr(DWordLEToN(dw));
- ValueGrid.Cells[2, VALUE_ROW_DWORD] := Format('%d ... %d', [idx, idx+SizeOf(DWord)-1]);
- ValueGrid.Cells[1, VALUE_ROW_LONGINT] := IntToStr(LongInt(DWordLEToN(dw)));
- ValueGrid.Cells[2, VALUE_ROW_LONGINT] := ValueGrid.Cells[2, VALUE_ROW_DWORD];
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_DWORD] := '';
- ValueGrid.Cells[2, VALUE_ROW_DWORD] := '';
- ValueGrid.Cells[1, VALUE_ROW_LONGINT] := '';
- ValueGrid.Cells[2, VALUE_ROW_LONGINT] := '';
- end;
-
- if idx <= Length(FBuffer) - SizeOf(QWord) then begin
- for i:=0 to SizeOf(QWord)-1 do buf[i] := FBuffer[idx+i];
- ValueGrid.Cells[1, VALUE_ROW_QWORD] := Format('%d', [qw]);
- ValueGrid.Cells[2, VALUE_ROW_QWORD] := Format('%d ... %d', [idx, idx+SizeOf(QWord)-1]);
- ValueGrid.Cells[1, VALUE_ROW_INT64] := Format('%d', [Int64(qw)]);
- ValueGrid.Cells[2, VALUE_ROW_INT64] := ValueGrid.Cells[2, VALUE_ROW_QWORD];
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_QWORD] := '';
- ValueGrid.Cells[2, VALUE_ROW_QWORD] := '';
- ValueGrid.Cells[1, VALUE_ROW_INT64] := '';
- ValueGrid.Cells[2, VALUE_ROW_INT64] := '';
- end;
-
- if idx <= Length(FBuffer) - SizeOf(single) then begin
- for i:=0 to SizeOf(single)-1 do buf[i] := FBuffer[idx+i];
- ValueGrid.Cells[1, VALUE_ROW_SINGLE] := Format('%f', [sng]);
- ValueGrid.Cells[2, VALUE_ROW_SINGLE] := Format('%d ... %d', [idx, idx+SizeOf(Single)-1]);
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_SINGLE] := '';
- ValueGrid.Cells[2, VALUE_ROW_SINGLE] := '';
- end;
-
- if idx <= Length(FBuffer) - SizeOf(double) then begin
- for i:=0 to SizeOf(double)-1 do buf[i] := FBuffer[idx+i];
- ValueGrid.Cells[1, VALUE_ROW_DOUBLE] := Format('%f', [dbl]);
- ValueGrid.Cells[2, VALUE_ROW_DOUBLE] := Format('%d ... %d', [idx, idx+SizeOf(Double)-1]);
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_DOUBLE] := '';
- ValueGrid.Cells[2, VALUE_ROW_DOUBLE] := '';
- end;
-
- if idx < Length(FBuffer) then begin
- ls := FBuffer[idx];
- SetLength(s, ls);
- i := idx + 1;
- j := 0;
- while (i < Length(FBuffer)) and (j < Length(s)) do begin
- inc(j);
- s[j] := char(FBuffer[i]);
- inc(i);
- end;
- SetLength(s, j);
- ValueGrid.Cells[1, VALUE_ROW_ANSISTRING] := s;
- ValueGrid.Cells[2, VALUE_ROW_ANSISTRING] := Format('%d ... %d', [idx, ls * SizeOf(char) + 1]);
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_ANSISTRING] := '';
- ValueGrid.Cells[2, VALUE_ROW_ANSISTRING] := '';
- end;
-
- s := StrPas(PChar(@FBuffer[idx]));
- ValueGrid.Cells[1, VALUE_ROW_PANSICHAR] := s;
- ValueGrid.Cells[2, VALUE_ROW_PANSICHAR] := Format('%d ... %d', [idx, idx + Length(s)]);
-
- if idx < Length(FBuffer) then begin
- ls := FBuffer[idx];
- SetLength(sw, ls);
- j := 0;
- i := idx + 2;
- while (i < Length(FBuffer)-1) and (j < Length(sw)) do begin
- buf[0] := FBuffer[i];
- buf[1] := FBuffer[i+1];
- inc(i, SizeOf(WideChar));
- inc(j);
- sw[j] := WideChar(w);
- end;
- SetLength(sw, j);
- ValueGrid.Cells[1, VALUE_ROW_WIDESTRING] := UTF8Encode(sw);
- ValueGrid.Cells[2, VALUE_ROW_WIDESTRING] := Format('%d ... %d', [idx, idx + ls*SizeOf(wideChar)+1]);
- end else begin
- ValueGrid.Cells[1, VALUE_ROW_WIDESTRING] := '';
- ValueGrid.Cells[2, VALUE_ROW_WIDESTRING] := '';
- end;
-
- s := UTF8Encode(StrPas(PWideChar(@FBuffer[idx])));
- ValueGrid.Cells[1, VALUE_ROW_PWIDECHAR] := s;
- ValueGrid.Cells[2, VALUE_ROW_PWIDECHAR] := Format('%d ... %d', [idx, idx + Length(s)]);
-end;
-
-
-procedure TMainForm.ReadCmdLine;
-begin
- if ParamCount > 0 then
- LoadFile(ParamStr(1));
-end;
-
-
-procedure TMainForm.ReadFromIni;
-var
- ini: TCustomIniFile;
- i: Integer;
-begin
- ini := CreateIni;
- try
- ReadFormFromIni(ini, 'MainForm', self);
-
- TreePanel.Width := ini.ReadInteger('MainForm', 'RecordList_Width', TreePanel.Width);
- for i:=0 to BiffTree.Header.Columns.Count-1 do
- BiffTree.Header.Columns[i].Width := ini.ReadInteger('MainForm',
- Format('RecordList_ColWidth_%d', [i+1]), BiffTree.Header.Columns[i].Width);
-
- ValueGrid.Height := ini.ReadInteger('MainForm', 'ValueGrid_Height', ValueGrid.Height);
- for i:=0 to ValueGrid.ColCount-1 do
- ValueGrid.ColWidths[i] := ini.ReadInteger('MainForm',
- Format('ValueGrid_ColWidth_%d', [i+1]), ValueGrid.ColWidths[i]);
-
- for i:=0 to FAnalysisGrid.ColCount-1 do
- FAnalysisGrid.ColWidths[i] := ini.ReadInteger('MainForm',
- Format('AnalysisGrid_ColWidth_%d', [i+1]), FAnalysisGrid.ColWidths[i]);
-
- AnalysisDetails.Height := ini.ReadInteger('MainForm', 'AnalysisDetails_Height', AnalysisDetails.Height);
-
- HexEditor.AddressMode := TKHexEditorAddressMode(ini.ReadInteger('HexEditor',
- 'AddressMode', ord(HexEditor.AddressMode)));
- CbHexAddress.Checked := HexEditor.AddressMode = eamHex;
- CbHexAddressChange(nil);
-
- HexEditor.DigitGrouping := ini.ReadInteger('HexEditor',
- 'DigitGrouping', HexEditor.DigitGrouping);
- CbHexSingleBytes.Checked := HexEditor.DigitGrouping = 1;
- CbHexSingleBytesChange(nil);
-
- HexEditor.LineSize := ini.ReadInteger('HexEditor',
- 'LineSize', HexEditor.LineSize);
- if HexEditor.LineSize in [10, 16] then
- CbHexEditorLineSize.ItemIndex := 0 else CbHexEditorLineSize.ItemIndex := 1;
- CbHexEditorLineSizeChange(nil);
-
- PageControl.ActivePageIndex := ini.ReadInteger('MainForm', 'PageIndex', PageControl.ActivePageIndex);
- finally
- ini.Free;
- end;
-end;
-
-
-procedure TMainForm.ReadFromStream(AStream: TStream);
-var
- recType: Word;
- recSize: Word;
- p: Cardinal;
- p0: Cardinal;
- s: String;
- i: Integer;
- node, prevnode: PVirtualNode;
- parentnode: PVirtualNode;
- parentdata, data, prevdata: PBiffNodeData;
- w: word;
- crs: TCursor;
-begin
- crs := Screen.Cursor;
- try
- Screen.Cursor := crHourGlass;
- BiffTree.Clear;
- parentnode := nil;
- FXFIndex := -1;
- FFontIndex := -1;
- FFormatIndex := -1;
- FRowIndex := -1;
- FExternSheetIndex := 0; // 1-based!
- AStream.Position := 0;
- while AStream.Position < AStream.Size do begin
- p := AStream.Position;
- recType := WordLEToN(AStream.ReadWord);
- recSize := WordLEToN(AStream.ReadWord);
- if (recType = 0) and (recSize = 0) then
- break;
- s := RecTypeName(recType);
- i := pos(':', s);
- // in case of BOF record: create new parent node for this substream
- if (recType = $0009) or (recType = $0209) or (recType = $0409) or (recType = $0809)
- then begin
- // Read info on substream beginning here
- p0 := AStream.Position;
- AStream.Position := AStream.Position + 2;
- w := WordLEToN(AStream.ReadWord);
- AStream.Position := p0;
- // add parent node for this substream
- parentnode := BiffTree.AddChild(nil);
- // add data to parent node
- parentdata := BiffTree.GetNodeData(parentnode);
- BiffTree.ValidateNode(parentnode, False);
- parentdata^.Offset := p;
- parentdata^.RecordName := BOFName(w);
- FRowIndex := -1;
- end;
- // add node to parent node
- node := BIFFTree.AddChild(parentnode);
- data := BiffTree.GetNodeData(node);
- BiffTree.ValidateNode(node, False);
- data^.Offset := p;
- data^.RecordID := recType;
- if i > 0 then begin
- data^.RecordName := copy(s, 1, i-1);
- data^.RecordDescription := copy(s, i+2, Length(s));
- end else begin
- data^.RecordName := s;
- data^.RecordDescription := '';
- end;
- case recType of
- $0008, $0208: // Row
- begin
- inc(FRowIndex);
- data^.Index := FRowIndex;
- end;
- $0031, $0231: // Font record
- begin
- inc(FFontIndex);
- if FFontIndex > 3 then data^.Index := FFontIndex + 1
- else data^.Index := FFontIndex;
- end;
- $0043, $00E0: // XF record
- begin
- inc(FXFIndex);
- data^.Index := FXFIndex;
- end;
- $0017: // EXTERNSHEET record
- if FFormat < sfExcel8 then begin
- inc(FExternSheetIndex);
- data^.Index := FExternSheetIndex;
- end;
- $001E, $041E: // Format record
- begin
- inc(FFormatIndex);
- data^.Index := FFormatIndex;
- end;
- $003C: // CONTINUE reocrd
- begin
- prevnode := BIFFTree.GetPrevious(node);
- prevdata := BiffTree.GetNodeData(prevnode);
- case prevdata^.RecordID of
- $00FC: data^.Tag := BIFFNODE_SST_CONTINUE; // SST record
- $01B6: data^.Tag := BIFFNODE_TXO_CONTINUE1; // TX0 record
- $003C: begin // CONTINUE record
- prevnode := BiffTree.GetPrevious(prevnode);
- prevdata := BiffTree.GetNodeData(prevnode);
- if prevdata^.RecordID = $01B6 then // TX0 record
- data^.Tag := BIFFNODE_TXO_CONTINUE2;
- end;
- end;
- end;
- else
- data^.Index := -1;
- end;
-
- // advance stream pointer
- AStream.Position := AStream.Position + recSize;
- end;
-
- // expand all parent nodes
- node := BiffTree.GetFirst;
- while node <> nil do begin
- BiffTree.Expanded[node] := true;
- node := BiffTree.GetNextSibling(node);
- end;
- // Select first node
- BiffTree.FocusedNode := BiffTree.GetFirst;
- BiffTree.Selected[BiffTree.FocusedNode] := true;
-
- UpdateCmds;
-
- finally
- Screen.Cursor := crs;
- end;
-end;
-
-
-procedure TMainForm.PageControlChange(Sender: TObject);
-var
- sel: TKHexEditorSelection;
- i, n: Integer;
- s: String;
-begin
- if (BiffTree.FocusedNode = nil) or
- (BiffTree.FocusedNode^.Parent = BiffTree.RootNode)
- then
- exit;
-
- PopulateAnalysisGrid;
- for i:=1 to FAnalysisGrid.RowCount-1 do begin
- s := FAnalysisGrid.Cells[0, i];
- if s = '' then break;
- n := StrToInt(s);
- if (n >= FCurrOffset) then
- begin
- FAnalysisGrid.Row := IfThen(n = FCurrOffset, i, i-1);
- break;
- end;
- end;
-
- sel.Index := FCurrOffset;
- sel.Digit := 0;
- HexEditor.SelStart := sel;
- PopulateValueGrid;
- ValueGridClick(nil);
-{
- if PageControl.ActivePage = PgAnalysis then
- PopulateAnalysisGrid
- else
- if PageControl.ActivePage = PgValues then
- begin
- sel.Index := FCurrOffset;
- sel.Digit := 0;
- HexEditor.SelStart := sel;
- PopulateValueGrid;
- ValueGridClick(nil);
- end;}
-end;
-
-
-procedure TMainForm.UpdateCaption;
-begin
- if FFileName = '' then
- Caption := 'BIFF Explorer - (no file loaded)'
- else
- Caption := Format('BIFF Explorer - "%s [%s]', [
- FFileName,
- GetFileFormatName(FFormat)
- ]);
-end;
-
-
-procedure TMainForm.UpdateCmds;
-begin
- AcDumpToFile.Enabled := FFileName <> '';
- AcFind.Enabled := FFileName <> '';
-end;
-
-
-procedure TMainForm.UpdateStatusbar;
-begin
- if FCurrOffset > -1 then
- Statusbar.Panels[3].Text := Format('HexViewer offset: %d', [FCurrOffset])
- else
- Statusbar.Panels[3].Text := '';
-end;
-
-
-procedure TMainForm.ValueGridClick(Sender: TObject);
-var
- sel: TKHexEditorSelection;
- n: Integer;
-begin
- sel := HexEditor.SelStart;
-
- n := GetValueGridDataSize;
- if n > 0 then begin
- sel.Digit := 0;
- HexEditor.SelStart := sel;
- inc(sel.Index, n-1);
- sel.Digit := 1;
- HexEditor.SelEnd := sel;
- end else
- HexEditor.SelEnd := sel;
-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;
-var
- ini: TCustomIniFile;
- i: Integer;
-begin
- ini := CreateIni;
- try
- WriteFormToIni(ini, 'MainForm', self);
-
- ini.WriteInteger('MainForm', 'RecordList_Width', TreePanel.Width);
- for i:=0 to BiffTree.Header.Columns.Count-1 do
- ini.WriteInteger('MainForm', Format('RecordList_ColWidth_%d', [i+1]), BiffTree.Header.Columns[i].Width);
-
- ini.WriteInteger('MainForm', 'ValueGrid_Height', ValueGrid.Height);
- for i:=0 to ValueGrid.ColCount-1 do
- ini.WriteInteger('MainForm', Format('ValueGrid_ColWidth_%d', [i+1]), ValueGrid.ColWidths[i]);
-
- for i:=0 to FAnalysisGrid.ColCount-1 do
- ini.WriteInteger('MainForm', Format('AnalysisGrid_ColWidth_%d', [i+1]), FAnalysisGrid.ColWidths[i]);
-
- ini.WriteInteger('MainForm', 'AnalysisDetails_Height', AnalysisDetails.Height);
-
- ini.WriteInteger('MainForm', 'PageIndex', PageControl.ActivePageIndex);
-
- ini.WriteInteger('HexEditor', 'AddressMode', ord(HexEditor.AddressMode));
- ini.WriteInteger('HexEditor', 'DigitGrouping', HexEditor.DigitGrouping);
- ini.WriteInteger('HexEditor', 'LineSize', HexEditor.LineSize);
-
- finally
- ini.Free;
- end;
-end;
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/betypes.pas b/components/fpspreadsheet/reference/BIFFExplorer/betypes.pas
deleted file mode 100644
index f7c42631e..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/betypes.pas
+++ /dev/null
@@ -1,30 +0,0 @@
-unit beTypes;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, SysUtils;
-
-const
- BIFFNODE_TXO_CONTINUE1 = 1;
- BIFFNODE_TXO_CONTINUE2 = 2;
- BIFFNODE_SST_CONTINUE = 3;
-
-type
- { Virtual tree node data }
- TBiffNodeData = record //class
- Offset: Integer;
- RecordID: Integer;
- RecordName: String;
- RecordDescription: String;
- Index: Integer;
- Tag: Integer;
- end;
- PBiffNodeData = ^TBiffNodeData;
-
-implementation
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/beutils.pas b/components/fpspreadsheet/reference/BIFFExplorer/beutils.pas
deleted file mode 100644
index 79362d95b..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/beutils.pas
+++ /dev/null
@@ -1,165 +0,0 @@
-unit beUtils;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, SysUtils, IniFiles, Forms,
- fpstypes, fpspreadsheet;
-
-function CreateIni : TCustomIniFile;
-procedure ReadFormFromIni(ini: TCustomIniFile; ASection: String; AForm: TCustomForm);
-procedure WriteFormToIni(ini: TCustomIniFile; ASection: String; AForm: TCustomForm);
-
-function GetFileFormatName(AFormat: TsSpreadsheetFormat): String;
-function GetFormatFromFileHeader(const AFileName: TFileName;
- out SheetType: TsSpreadsheetFormat): Boolean;
-
-
-implementation
-
-uses
- uvirtuallayer_ole;
-
-function CreateIni : TCustomIniFile;
-var
- cfg : string;
-begin
- cfg := GetAppConfigDir(false);
- if not DirectoryExists(cfg) then
- CreateDir(cfg);
- result := TMemIniFile.Create(GetAppConfigFile(false));
-end;
-
-procedure ReadFormFromIni(ini: TCustomIniFile; ASection: String; AForm: TCustomForm);
-var
- L,T,W,H: Integer;
- isMax: Boolean;
-begin
- L := ini.ReadInteger(ASection, 'Left', AForm.Left);
- T := Ini.ReadInteger(ASection, 'Top', AForm.Top);
- W := ini.ReadInteger(ASection, 'Width', AForm.Width);
- H := ini.ReadInteger(ASection, 'Height', AForm.Height);
- isMax := ini.ReadBool(ASection, 'Maximized', AForm.WindowState = wsMaximized);
- if W > Screen.Width then W := Screen.Width;
- if H > Screen.Height then H := Screen.Height;
- if L < 0 then L := 0;
- if T < 0 then T := 0;
- if L + W > Screen.Width then L := Screen.Width - W;
- if T + H > Screen.Height then T := Screen.Height - H;
- AForm.Left := L;
- AForm.Top := T;
- AForm.Width := W;
- AForm.Height := H;
- if IsMax then
- AForm.WindowState := wsMaximized
- else
- AForm.WindowState := wsNormal;
-end;
-
-
-procedure WriteFormToIni(ini: TCustomIniFile; ASection: String; AForm: TCustomForm);
-begin
- ini.WriteBool(ASection, 'Maximized', (AForm.WindowState = wsMaximized));
- if AForm.WindowState = wsNormal then begin
- ini.WriteInteger(ASection, 'Left', AForm.Left);
- ini.WriteInteger(ASection, 'Top', AForm.Top);
- ini.WriteInteger(ASection, 'Width', AForm.Width);
- ini.WriteInteger(ASection, 'Height', AForm.Height);
- end;
-end;
-
-function GetFileFormatName(AFormat: TsSpreadsheetFormat): string;
-begin
- case AFormat of
- sfExcel2 : Result := 'BIFF2';
- { Excel3/4 not supported fpspreadsheet
- sfExcel3 : Result := 'BIFF3';
- sfExcel4 : Result := 'BIFF4';
- }
- sfExcel5 : Result := 'BIFF5';
- sfExcel8 : Result := 'BIFF8';
- sfooxml : Result := 'OOXML';
- sfOpenDocument : Result := 'Open Document';
- sfCSV : Result := 'CSV';
- sfWikiTable_Pipes : Result := 'WikiTable Pipes';
- sfWikiTable_WikiMedia : Result := 'WikiTable WikiMedia';
- else Result := '-unknown format-';
- end;
-end;
-
-function GetFormatFromFileHeader(const AFileName: TFileName;
- out SheetType: TsSpreadsheetFormat): Boolean;
-const
- BIFF2_HEADER: array[0..3] of byte = (
- $09,$00, $04,$00); // they are common to all BIFF2 files that I've seen
- BIFF58_HEADER: array[0..7] of byte = (
- $D0,$CF, $11,$E0, $A1,$B1, $1A,$E1);
-
- function ValidOLEStream(AStream: TStream; AName: String): Boolean;
- var
- fsOLE: TVirtualLayer_OLE;
- begin
- AStream.Position := 0;
- fsOLE := TVirtualLayer_OLE.Create(AStream);
- try
- fsOLE.Initialize;
- Result := fsOLE.FileExists('/'+AName);
- finally
- fsOLE.Free;
- end;
- end;
-
-var
- buf: packed array[0..7] of byte = (0,0,0,0,0,0,0,0);
- stream: TStream;
- i: Integer;
- ok: Boolean;
-begin
- Result := false;
- stream := TFileStream.Create(AFileName, fmOpenRead + fmShareDenyNone);
- try
- // Read first 8 bytes
- stream.ReadBuffer(buf, 8);
-
- // Check for Excel 2
- ok := true;
- for i:=0 to High(BIFF2_HEADER) do
- if buf[i] <> BIFF2_HEADER[i] then
- begin
- ok := false;
- break;
- end;
- if ok then
- begin
- SheetType := sfExcel2;
- Exit(True);
- end;
-
- // Check for Excel 5 or 8
- for i:=0 to High(BIFF58_HEADER) do
- if buf[i] <> BIFF58_HEADER[i] then
- exit;
-
- // Now we know that the file is a Microsoft compound document.
-
- // We check for Excel 5 in which the stream is named "Book"
- if ValidOLEStream(stream, 'Book') then begin
- SheetType := sfExcel5;
- exit(True);
- end;
-
- // Now we check for Excel 8 which names the stream "Workbook"
- if ValidOLEStream(stream, 'Workbook') then begin
- SheetType := sfExcel8;
- exit(True);
- end;
-
- finally
- stream.Free;
- end;
-end;
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/mrumanager.pp b/components/fpspreadsheet/reference/BIFFExplorer/mrumanager.pp
deleted file mode 100644
index 847f886e9..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/mrumanager.pp
+++ /dev/null
@@ -1,485 +0,0 @@
-{ MRU (Most Recent Used) menu item manager
-
- Copyright (C) 2011 Michael Van Canneyt (michael@freepascal.org)
- Modifications by Werner Pamler
-
- This library is free software; you can redistribute it and/or modify it
- under the terms of the GNU Library General Public License as published by
- the Free Software Foundation; either version 2 of the License, or (at your
- option) any later version with the following modification:
-
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent modules,and
- to copy and distribute the resulting executable under terms of your choice,
- provided that you also meet, for each linked independent module, the terms
- and conditions of the license of that module. An independent module is a
- module which is not derived from or based on this library. If you modify
- this library, you may extend this exception to your version of the library,
- but you are not obligated to do so. If you do not wish to do so, delete this
- exception statement from your version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
- for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- modified by wp
-}
-unit mrumanager;
-
-{$mode objfpc}{$H+}
-
-interface
-
-uses
- Classes, SysUtils, inifiles, menus;
-
-Type
- { TRecentMenuItem }
-
- TRecentMenuItem = Class(TMenuItem)
- Private
- FFileName : string;
- Public
- Property FileName : String Read FFileName;
- end;
- TRecentMenuItemClass = Class of TRecentMenuItem;
-
- { TMRUMenuManager }
-
- TOnRecentFileEvent = Procedure(Sender : TObject; Const AFileName : String) of object;
-
- TMRUMenuManager = Class(TComponent)
- Private
- FIniFileName: String;
- FIniSection: String;
- FOnRecent: TOnRecentFileEvent;
- FRecent : TStrings;
- FMaxRecent : Integer;
- FMenuCaptionMask : string;
- FMIRecent : TMenuItem;
- FPMRecent : TPopupMenu;
- FMaxItemLength : integer;
- procedure SetIniFileName(const AValue:string);
- procedure SetIniSection(const AValue:string);
- procedure SetMaxItemLength(const AValue:integer);
- procedure SetMenuCaptionMask(const AValue:string);
- procedure SetMIRecent(const AValue: TMenuItem);
- procedure SetPMRecent(const AValue: TPopupMenu);
- procedure SetRecent(const AValue: TStrings);
- protected
- // Overrides.
- procedure Loaded; override;
- procedure Notification(AComponent: TComponent; Operation: TOperation); override;
- // Return default name and section if either is empty.
- procedure GetFileNameAndSection(Var AFileName,ASection : String); virtual;
- // Override if you want to load additional values.
- procedure LoadFromIni(Ini: TCustomIniFile; ASection: String); virtual;
- // Override if you want to write additional values.
- procedure SaveToIni(Ini: TCustomIniFile; ASection: String); virtual;
- // Called when menu item is clicked.
- procedure DoOnRecentClick(Sender: TObject); virtual;
- // Override this if you want to create a custom class of menu itel.
- function CreateMenuItem(AOwner: TComponent): TRecentMenuItem; virtual;
- // Create a menu caption. Default is index followed by filename.
- // Override if you want to customize.
- Function CreateMenuCaption(AIndex : Integer; Const AFileName : String) : String; virtual;
- Public
- Constructor Create(AOwner : TComponent);override;
- Destructor Destroy; override;
- // Load files from ini file AFileName in section ASection. Calls ShowRecentFiles
- // Need for explicit call only when IniFileName='' and IniSection='' and class created at run-time
- procedure LoadRecentFilesFromIni(const AFileName: string=''; const ASection: String='');
- // Saves files to ini file AFileName in section ASection.
- procedure SaveRecentFilesToIni(const AFileName: string=''; const ASection: String='');
- // Add a filename to the list of files.
- // If an existing file is added, it is moved first in the list.
- // If MaxRecent is attained, the last one is removed.
- // Calls ShowRecentFiles.
- procedure AddToRecent(AFileName: String);
- // Re-populate the menu.
- procedure ShowRecentFiles;
- Published
- // Max. items to be kept in the list.
- Property MaxRecent : Integer Read FMaxRecent write FMaxRecent;
- // Menu item to create a submenu under. Existing items will be removed.
- Property MenuItem : TMenuItem Read FMIRecent Write SetMIRecent;
- // Popupmenu attached to a toolbar button. Existing items will be removed.
- Property PopupMenu : TPopupMenu Read FPMRecent Write SetPMRecent;
- // Default ini filename.
- Property IniFileName : String Read FIniFileName Write SetIniFileName;
- // Default ini section.
- Property IniSection : String Read FIniSection Write SetIniSection;
- // Maximum length of recent menu item
- Property MaxItemLength : integer Read FMaxItemLength Write SetMaxItemLength default 80;
- // Format mask for MenuCaption: first placeholder must be %d, second %s, e.g. '%d - %s'
- Property MenuCaptionMask : string read FMenuCaptionMask Write SetMenuCaptionMask;
- // Recent items. If adding manually to the list, ShowRecentFiles must be called manually.
- Property Recent : TStrings Read FRecent Write SetRecent;
- // Called when the user clicks an recent meu item.
- Property OnRecentFile : TOnRecentFileEvent Read FOnRecent Write FOnRecent;
- end;
- EMRUManager = Class(Exception);
-
-Const
- DefaultIniFile = 'recent.ini';
- DefaultSection = 'Global';
- KeyMaxRecent = 'MaxRecent';
- KeyCount = 'Count';
- KeyFile = 'File%d';
-
-implementation
-
-Resourcestring
- SErrFailedToCreateDir = 'Failed to create directory "%s"';
-
-const
- DEFAULT_MASK = '%d. %s';
-
-function MinimizeFileName(const AFileName:string; AMaxLen:integer) : string;
-
- procedure SplitPath(const APath:String; Parts: TStrings);
- { Splits the provided path into constituent folder names }
- var
- i, j : Integer;
- begin
- if APath = '' then exit;
- if not Assigned(Parts) then exit;
-
- i := Length(APath);
- j := i;
- while (i >= 1) do begin
- if APath[i] = DirectorySeparator then begin
- Parts.Insert(0, copy(APath, i+1, j-i));
- j := i;
- end;
- dec(i);
- end;
- Parts.Insert(0, copy(APath, 1, j));
- end;
-
- function AddStringsFromTo(AList:TStrings; FromIndex,ToIndex:integer) : string;
- var
- i : integer;
- begin
- result := '';
- for i:=FromIndex to ToIndex do
- result := result + AList[i];
- end;
-
-var
- Parts : TStringList;
- i : integer;
- tmp : string;
-begin
- result := AFileName;
- if Length(AFileName) > AMaxLen then begin
- Parts := TStringList.Create;
- try
- SplitPath(AFileName, Parts);
- i := Parts.Count div 2;
- while (i < Parts.Count) do begin
- tmp := Format('%s...%s%s', [
- AddStringsFromTo(Parts, 0, i-1),
- DirectorySeparator,
- AddStringsFromTo(Parts, i+1, Parts.Count-1)
- ]);
- if Length(tmp) < AMaxLen then begin
- result := tmp;
- exit;
- end else
- Parts.Delete(i);
- i := Parts.Count div 2;
- end;
- result := ExtractFileName(AFileName);
- finally
- Parts.Free;
- end;
- end;
-end;
-
-procedure TMRUMenuManager.AddToRecent(AFileName : String);
-
-Var
- I,J : Integer;
- B : Boolean;
-
-begin
- AFileName:=ExpandFileName(AFileName);
- With FRecent do
- begin
- J:=IndexOf(AFileName);
- If (J<>-1) then
- begin
- if (J>0) then
- Exchange(0,J)
- end
- else
- begin
- While (Count>=FMaxRecent) do
- Delete(Count-1);
- Insert(0,AFileName)
- end;
- end;
- ShowRecentFiles;
-end;
-
-function TMRUMenuManager.CreateMenuItem(AOwner :TComponent) : TRecentMenuItem;
-
-begin
- Result:=TRecentMenuItem.Create(AOwner);
-end;
-
-function TMRUMenuManager.CreateMenuCaption(AIndex: Integer;
- const AFileName: String): String;
-var
- fn : string;
- mask : string;
-begin
- if FMaxItemLength > 0 then
- fn := MinimizeFileName(AFileName, FMaxItemLength)
- else
- fn := AFileName;
- if FMenuCaptionMask = '' then
- mask := DEFAULT_MASK
- else
- mask := FMenuCaptionMask;
- Result:=Format(mask, [AIndex+1,fn]);
-end;
-
-procedure TMRUMenuManager.ShowRecentFiles;
-
-Var
- I : Integer;
- M : TRecentMenuItem;
-
-begin
- if Assigned(FMIRecent) then begin
- FMIRecent.clear;
- For I:=0 to FRecent.Count-1 do
- begin
- M:=CreateMenuItem(Self.Owner);
- M.Caption:=CreateMenuCaption(I,FRecent[i]);
- M.FFileName:=FRecent[i];
- M.OnClick:=@DoOnRecentClick;
- FMIRecent.Add(M);
- end;
- end;
- if Assigned(FPMRecent) then begin
- FPMRecent.Items.Clear;
- for i:=0 to FRecent.Count-1 do
- begin
- M := CreateMenuItem(Self.Owner);
- M.Caption := CreateMenuCaption(I, Recent[i]);
- M.FFileName := FRecent[i];
- M.OnClick := @DoOnRecentClick;
- FPMRecent.Items.Add(M);
- end;
- end;
-end;
-
-procedure TMRUMenuManager.LoadFromIni(Ini : TCustomIniFile; ASection : String);
-
-Var
- I,Count : Integer;
- FN : String;
-
-begin
- FRecent.Clear;
- FMaxRecent:=Ini.ReadInteger(ASection,KeyMaxRecent,10);
- Count:=Ini.ReadInteger(ASection,KeyCount,0);
- For I:=1 to Count do
- begin
- FN:=Ini.ReadString(ASection,Format(KeyFile,[i]),'');
- If (FN<>'') then
- FRecent.Add(FN);
- end;
-end;
-
-procedure TMRUMenuManager.GetFileNameAndSection(var AFileName, ASection: String);
-
-begin
- if (AFileName='') then
- begin
- AFileName:=GetAppConfigDir(False);
- AFileName:=IncludeTrailingPathDelimiter(AFileName)+DefaultIniFile;
- end;
- if (ASection='') then
- ASection:=DefaultSection;
-end;
-
-procedure TMRUMenuManager.LoadRecentFilesFromIni(Const AFileName : string = ''; Const ASection : String = '');
-
-Var
- DN,FN,Sec : String;
- Ini : TIniFile;
-
-begin
- FN:=AFileName;
- Sec:=ASection;
- GetFileNameAndSection(FN,Sec);
- DN:=ExtractFilePath(FN);
- If ForceDirectories(DN) then
- begin
- If FileExists(FN) then
- begin
- Ini:=TIniFile.Create(FN);
- try
- LoadFromIni(Ini,Sec);
- finally
- Ini.Free;
- end;
- end;
- end;
- ShowRecentFiles;
-end;
-
-procedure TMRUMenuManager.SaveToIni(Ini : TCustomIniFile; ASection : String);
-
-Var
- I : Integer;
-begin
- Ini.EraseSection(ASection);
- Ini.WriteInteger(ASection,KeyMaxRecent,FMaxRecent);
- Ini.WriteInteger(ASection,KeyCount,FRecent.Count);
- For I:=0 to FRecent.Count-1 do
- Ini.WriteString(ASection,Format(KeyFile,[i+1]),FRecent[i]);
- Ini.UpdateFile;
-end;
-
-procedure TMRUMenuManager.SaveRecentFilesToIni(Const AFileName : string = ''; Const ASection : String = '');
-
-Var
- DN,FN,Sec : String;
- Ini : TMemIniFile;
-
-begin
- FN:=AFileName;
- Sec:=ASection;
- GetFileNameAndSection(FN,Sec);
- DN:=ExtractFilePath(FN);
- If not ForceDirectories(DN) then
- Raise EMRUManager.CreateFmt(SErrFailedToCreateDir,[DN]);
- Ini:=TMemIniFile.Create(FN);
- try
- SaveToIni(Ini,Sec);
- finally
- Ini.Free;
- end;
-end;
-
-procedure TMRUMenuManager.SetIniFileName(const AValue:string);
-begin
- if AValue <> FIniFileName then begin
- FIniFileName := AValue;
- LoadRecentFilesFromIni(FIniFileName, FIniSection);
- end;
-end;
-
-procedure TMRUMenuManager.SetIniSection(const AValue:string);
-begin
- if AValue <> FIniSection then begin
- FIniSection := AValue;
- LoadRecentFilesFromini(FIniFileName, FIniSection);
- end;
-end;
-
-procedure TMRUMenuManager.SetMaxItemLength(const AValue:integer);
-begin
- if FMaxItemLength <> AValue then begin
- FMaxItemLength := AValue;
- ShowRecentFiles;
- end;
-end;
-
-procedure TMRUMenuManager.SetMenuCaptionMask(const AValue:string);
-begin
- if FMenuCaptionMask <> AValue then begin
- FMenuCaptionMask := AValue;
- ShowRecentFiles;
- end;
-end;
-
-procedure TMRUMenuManager.SetMIRecent(const AValue: TMenuItem);
-begin
- if FMIRecent=AValue then exit;
- If Assigned(FMIRecent) then
- FMIRecent.RemoveFreeNotification(Self);
- FMIRecent:=AValue;
- If Assigned(FMIRecent) then
- FMIRecent.FreeNotification(Self);
- ShowRecentFiles;
-end;
-
-procedure TMRUMenuManager.SetPMRecent(const AValue: TPopupMenu);
-begin
- if FPMRecent=AValue then exit;
- if Assigned(FPMRecent) then
- FPMRecent.RemoveFreeNotification(self);
- FPMRecent := AValue;
- if Assigned(FPMRecent) then
- FPMRecent.FreeNotification(self);
- ShowRecentFiles;
-end;
-
-procedure TMRUMenuManager.SetRecent(const AValue: TStrings);
-begin
- if FRecent=AValue then exit;
- FRecent.Assign(AValue);
- ShowRecentFiles;
-end;
-
-procedure TMRUMenuManager.loaded;
-begin
- inherited loaded;
- if (FRecent.Count>0) and (assigned(FMIRecent) or assigned(FPMRecent))then
- LoadRecentFilesFromIni(FIniFileName, FIniSection);
-end;
-
-constructor TMRUMenuManager.Create(AOwner: TComponent);
-begin
- inherited Create(AOwner);
- FRecent:=TStringList.Create;
- FMaxItemLength := 80;
- FMenuCaptionMask := DEFAULT_MASK;
-end;
-
-destructor TMRUMenuManager.Destroy;
-begin
- SaveRecentFilesToIni(FIniFileName, FIniSection);
- FreeAndNil(FRecent);
- inherited Destroy;
-end;
-
-procedure TMRUMenuManager.Notification(AComponent: TComponent;
- Operation: TOperation);
-begin
- inherited Notification(AComponent, Operation);
- if (Operation = opRemove) then begin
- if AComponent = FMIRecent then FMIRecent := nil;
- if AComponent = FPMRecent then FPMRecent := nil;
- end;
- { original code - I think this is not correct:
- inherited Notification(AComponent, Operation);
- if (Operation=opRemove) and ((AComponent=FMIRecent) or (AComponent=FPMRecent)) then
- exit;
- }
-end;
-
-procedure TMRUMenuManager.DoOnRecentClick(Sender: TObject);
-Var
- FN : String;
-begin
- With (Sender as TRecentMenuItem) do
- FN:=FileName;
- if (FN<>'') and (OnRecentFile<>Nil) then
- OnRecentFile(Self,FN);
-end;
-
-end.
-
diff --git a/components/fpspreadsheet/reference/BIFFExplorer/readme.txt b/components/fpspreadsheet/reference/BIFFExplorer/readme.txt
deleted file mode 100644
index 375ddcdfc..000000000
--- a/components/fpspreadsheet/reference/BIFFExplorer/readme.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-BIFF Explorer
---------------------------------------------------------------------------------
-
-"BIFF Explorer" is a tool to peek into the internal structure of a binary
-Excel file in biff format.
-
-It displays a list of the BIFF records contained in the xls file along with
-name and explanation as described in various documentation files (see "About").
-Selecting one of the records loads its bytes into a simple hex viewer; for the
-most important records I tried to decipher the contents of the hex values and
-display their meaning in a grid and a memo (page "Analysis"). For the other
-records select a byte in the hex viewer, and the program will display the
-contents of that byte and the following ones as integer, double, string
-(page "Values").
-
-For compiling, note that the program requires the following packages
-from ccr
-- "KControls"
-- "lclextensions"
-- "VirtualTreeview-new"