| 1 | 
 UNIT Unit8_binedit; | 
 
 
 
 
 
 | 2 | 
 INTERFACE | 
 
 
 
 
 
 | 3 | 
 USES | 
 
 
 
 
 
 | 4 | 
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, | 
 
 
 
 
 
 | 5 | 
   Dialogs, Wrapgrid, StdCtrls, Grids, StrUtils, MPHexEditor, ExtCtrls, | 
 
 
 
 
 
 | 6 | 
   Unit3_data, Unit2_functions, Unit9_data_structures, Unit4_exporters; | 
 
 
 
 
 
 | 7 | 
  | 
 
 
 
 
 
 | 8 | 
 TYPE | 
 
 
 
 
 
 | 9 | 
   TForm8 = Class(TForm) | 
 
 
 
 
 
 | 10 | 
     Splitter1: TSplitter; | 
 
 
 
 
 
 | 11 | 
     panel_data: TPanel; | 
 
 
 
 
 
 | 12 | 
     hex: TMPHexEditor; | 
 
 
 
 
 
 | 13 | 
     Splitter2: TSplitter; | 
 
 
 
 
 
 | 14 | 
     structs: TWrapGrid; | 
 
 
 
 
 
 | 15 | 
     panel_files: TPanel; | 
 
 
 
 
 
 | 16 | 
     list: TListBox; | 
 
 
 
 
 
 | 17 | 
     panel_extension: TPanel; | 
 
 
 
 
 
 | 18 | 
     lbl_filter: TLabel; | 
 
 
 
 
 
 | 19 | 
     combo_extension: TComboBox; | 
 
 
 
 
 
 | 20 | 
     Bevel1: TBevel; | 
 
 
 
 
 
 | 21 | 
     panel_imexport: TPanel; | 
 
 
 
 
 
 | 22 | 
     btn_export: TButton; | 
 
 
 
 
 
 | 23 | 
     btn_import: TButton; | 
 
 
 
 
 
 | 24 | 
     opend: TOpenDialog; | 
 
 
 
 
 
 | 25 | 
     saved: TSaveDialog; | 
 
 
 
 
 
 | 26 | 
 {    PROCEDURE structsGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string); | 
 
 
 
 
 
 | 27 | 
     PROCEDURE structsSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); | 
 
 
 
 
 
 | 28 | 
     PROCEDURE structsKeyPress(Sender: TObject; var Key: Char); | 
 
 
 
 
 
 | 29 | 
 }    PROCEDURE FormActivate(Sender: TObject); | 
 
 
 
 
 
 | 30 | 
     PROCEDURE btn_importClick(Sender: TObject); | 
 
 
 
 
 
 | 31 | 
     PROCEDURE btn_exportClick(Sender: TObject); | 
 
 
 
 
 
 | 32 | 
     PROCEDURE panel_imexportResize(Sender: TObject); | 
 
 
 
 
 
 | 33 | 
     FUNCTION Save:Boolean; | 
 
 
 
 
 
 | 34 | 
     PROCEDURE FormClose(Sender: TObject; var Action: TCloseAction); | 
 
 
 
 
 
 | 35 | 
     PROCEDURE combo_extensionClick(Sender: TObject); | 
 
 
 
 
 
 | 36 | 
     PROCEDURE panel_extensionResize(Sender: TObject); | 
 
 
 
 
 
 | 37 | 
     FUNCTION GetValue(datatype:Byte; offset:LongWord):String; | 
 
 
 
 
 
 | 38 | 
     PROCEDURE WriteStructureInfos(structinfoid:Integer); | 
 
 
 
 
 
 | 39 | 
     PROCEDURE hexSelectionChanged(Sender: TObject); | 
 
 
 
 
 
 | 40 | 
     PROCEDURE hexChange(Sender: TObject); | 
 
 
 
 
 
 | 41 | 
     PROCEDURE panel_dataResize(Sender: TObject); | 
 
 
 
 
 
 | 42 | 
     PROCEDURE structsClick(Sender: TObject); | 
 
 
 
 
 
 | 43 | 
     PROCEDURE FormResize(Sender: TObject); | 
 
 
 
 
 
 | 44 | 
     PROCEDURE ClearStructViewer; | 
 
 
 
 
 
 | 45 | 
     PROCEDURE listClick(Sender: TObject); | 
 
 
 
 
 
 | 46 | 
     PROCEDURE FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
 
 
 
 
 
 | 47 | 
     PROCEDURE FormCreate(Sender: TObject); | 
 
 
 
 
 
 | 48 | 
     PROCEDURE Recreatelist; | 
 
 
 
 
 
 | 49 | 
   PRIVATE | 
 
 
 
 
 
 | 50 | 
   PUBLIC | 
 
 
 
 
 
 | 51 | 
   END; | 
 
 
 
 
 
 | 52 | 
  | 
 
 
 
 
 
 | 53 | 
 VAR | 
 
 
 
 
 
 | 54 | 
   Form8: TForm8; | 
 
 
 
 
 
 | 55 | 
  | 
 
 
 
 
 
 | 56 | 
 IMPLEMENTATION | 
 
 
 
 
 
 | 57 | 
 {$R *.dfm} | 
 
 
 
 
 
 | 58 | 
 USES Unit1_main; | 
 
 
 
 
 
 | 59 | 
 VAR | 
 
 
 
 
 
 | 60 | 
   fileid:LongWord; | 
 
 
 
 
 
 | 61 | 
  | 
 
 
 
 
 
 | 62 | 
 FUNCTION IntToBin(value:Byte):String; | 
 
 
 
 
 
 | 63 | 
   VAR i:Byte; | 
 
 
 
 
 
 | 64 | 
   BEGIN | 
 
 
 
 
 
 | 65 | 
     Result:=''; | 
 
 
 
 
 
 | 66 | 
     FOR i:=7 DOWNTO 0 DO BEGIN | 
 
 
 
 
 
 | 67 | 
       Result:=Result+IntToStr((value SHR i) AND $01); | 
 
 
 
 
 
 | 68 | 
     END; | 
 
 
 
 
 
 | 69 | 
   END; | 
 
 
 
 
 
 | 70 | 
  | 
 
 
 
 
 
 | 71 | 
 FUNCTION TForm8.GetValue(datatype:Byte; offset:LongWord):String; | 
 
 
 
 
 
 | 72 | 
   VAR | 
 
 
 
 
 
 | 73 | 
     data:Tdata; | 
 
 
 
 
 
 | 74 | 
     i:Byte; | 
 
 
 
 
 
 | 75 | 
   BEGIN | 
 
 
 
 
 
 | 76 | 
     CASE datatype OF | 
 
 
 
 
 
 | 77 | 
       1: Result:=IntToStr(hex.data[offset]); | 
 
 
 
 
 
 | 78 | 
       2: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256); | 
 
 
 
 
 
 | 79 | 
       3: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256); | 
 
 
 
 
 
 | 80 | 
       4: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256+hex.data[offset+3]*256*256*256); | 
 
 
 
 
 
 | 81 | 
       5: Result:='0x'+IntToHex(hex.data[offset],2); | 
 
 
 
 
 
 | 82 | 
       6: Result:='0x'+IntToHex(hex.data[offset]+hex.data[offset+1]*256,4); | 
 
 
 
 
 
 | 83 | 
       7: Result:='0x'+IntToHex(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256,6); | 
 
 
 
 
 
 | 84 | 
       8: Result:='0x'+IntToHex(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256+hex.data[offset+3]*256*256*256,8); | 
 
 
 
 
 
 | 85 | 
       9: BEGIN | 
 
 
 
 
 
 | 86 | 
           SetLength(data,4); | 
 
 
 
 
 
 | 87 | 
           data[0]:=hex.data[offset]; | 
 
 
 
 
 
 | 88 | 
           data[1]:=hex.data[offset+1]; | 
 
 
 
 
 
 | 89 | 
           data[2]:=hex.data[offset+2]; | 
 
 
 
 
 
 | 90 | 
           data[3]:=hex.data[offset+3]; | 
 
 
 
 
 
 | 91 | 
           Result:=FloatToStr(Decode_Float(data)); | 
 
 
 
 
 
 | 92 | 
         END; | 
 
 
 
 
 
 | 93 | 
       10: Result:=IntToBin(hex.data[offset]); | 
 
 
 
 
 
 | 94 | 
       11..255: BEGIN | 
 
 
 
 
 
 | 95 | 
           Result:=''; | 
 
 
 
 
 
 | 96 | 
           FOR i:=1 TO datatype-10 DO BEGIN | 
 
 
 
 
 
 | 97 | 
             IF hex.Data[offset+i-1]>=32 THEN | 
 
 
 
 
 
 | 98 | 
               Result:=Result+Chr(hex.Data[offset+i-1]) | 
 
 
 
 
 
 | 99 | 
             ELSE | 
 
 
 
 
 
 | 100 | 
               Result:=Result+'.'; | 
 
 
 
 
 
 | 101 | 
           END; | 
 
 
 
 
 
 | 102 | 
         END; | 
 
 
 
 
 
 | 103 | 
     END; | 
 
 
 
 
 
 | 104 | 
   END; | 
 
 
 
 
 
 | 105 | 
  | 
 
 
 
 
 
 | 106 | 
 PROCEDURE TForm8.WriteStructureInfos(structinfoid:Integer); | 
 
 
 
 
 
 | 107 | 
   VAR | 
 
 
 
 
 
 | 108 | 
     i:Byte; | 
 
 
 
 
 
 | 109 | 
   BEGIN | 
 
 
 
 
 
 | 110 | 
     IF structinfoid>=0 THEN BEGIN | 
 
 
 
 
 
 | 111 | 
       structs.Enabled:=True; | 
 
 
 
 
 
 | 112 | 
       WITH structure_infos[structinfoid] DO BEGIN | 
 
 
 
 
 
 | 113 | 
         Self.structs.RowCount:=Length(entries)+1; | 
 
 
 
 
 
 | 114 | 
         FOR i:=1 TO Length(entries) DO BEGIN | 
 
 
 
 
 
 | 115 | 
           Self.structs.Cells[0,i]:=entries[i-1].name; | 
 
 
 
 
 
 | 116 | 
           Self.structs.Cells[1,i]:='0x'+IntToHex(entries[i-1].offset,6); | 
 
 
 
 
 
 | 117 | 
           Self.structs.Cells[2,i]:=GetDataType(entries[i-1].datatype); | 
 
 
 
 
 
 | 118 | 
           Self.structs.Cells[3,i]:=GetValue(entries[i-1].datatype,entries[i-1].offset); | 
 
 
 
 
 
 | 119 | 
           Self.structs.Cells[4,i]:=entries[i-1].description; | 
 
 
 
 
 
 | 120 | 
         END; | 
 
 
 
 
 
 | 121 | 
       END; | 
 
 
 
 
 
 | 122 | 
     END; | 
 
 
 
 
 
 | 123 | 
   END; | 
 
 
 
 
 
 | 124 | 
  | 
 
 
 
 
 
 | 125 | 
 PROCEDURE TForm8.Recreatelist; | 
 
 
 
 
 
 | 126 | 
   VAR | 
 
 
 
 
 
 | 127 | 
     i:LongWord; | 
 
 
 
 
 
 | 128 | 
   BEGIN | 
 
 
 
 
 
 | 129 | 
     combo_extension.Items.Clear; | 
 
 
 
 
 
 | 130 | 
     combo_extension.Items.Add('_All files_ ('+IntToStr(dat_header.Files)+')'); | 
 
 
 
 
 
 | 131 | 
     FOR i:=0 TO dat_header.Extensions-1 DO BEGIN | 
 
 
 
 
 
 | 132 | 
       WITH dat_extensionsmap[i] DO BEGIN | 
 
 
 
 
 
 | 133 | 
         combo_extension.Items.Add( | 
 
 
 
 
 
 | 134 | 
           Extension[3]+Extension[2]+Extension[1]+Extension[0]+' ('+ | 
 
 
 
 
 
 | 135 | 
           IntToStr(ExtCount)+')'); | 
 
 
 
 
 
 | 136 | 
       END; | 
 
 
 
 
 
 | 137 | 
     END; | 
 
 
 
 
 
 | 138 | 
     combo_extension.ItemIndex:=0; | 
 
 
 
 
 
 | 139 | 
     combo_extensionClick(Self); | 
 
 
 
 
 
 | 140 | 
   END; | 
 
 
 
 
 
 | 141 | 
  | 
 
 
 
 
 
 | 142 | 
 PROCEDURE TForm8.FormCreate(Sender: TObject); | 
 
 
 
 
 
 | 143 | 
   BEGIN | 
 
 
 
 
 
 | 144 | 
     Self.Caption:=''; | 
 
 
 
 
 
 | 145 | 
     fileid:=0; | 
 
 
 
 
 
 | 146 | 
     structs.ColCount:=5; | 
 
 
 
 
 
 | 147 | 
     structs.RowCount:=2; | 
 
 
 
 
 
 | 148 | 
     structs.FixedRows:=1; | 
 
 
 
 
 
 | 149 | 
     structs.Cells[0,0]:='Name'; | 
 
 
 
 
 
 | 150 | 
     structs.Cells[1,0]:='Offset'; | 
 
 
 
 
 
 | 151 | 
     structs.Cells[2,0]:='Type'; | 
 
 
 
 
 
 | 152 | 
     structs.Cells[3,0]:='Value'; | 
 
 
 
 
 
 | 153 | 
     structs.Cells[4,0]:='Description'; | 
 
 
 
 
 
 | 154 | 
     structs.ColWidths[0]:=75; | 
 
 
 
 
 
 | 155 | 
     structs.ColWidths[1]:=60; | 
 
 
 
 
 
 | 156 | 
     structs.ColWidths[2]:=75; | 
 
 
 
 
 
 | 157 | 
     structs.ColWidths[3]:=75; | 
 
 
 
 
 
 | 158 | 
     Self.panel_dataResize(Self); | 
 
 
 
 
 
 | 159 | 
   END; | 
 
 
 
 
 
 | 160 | 
  | 
 
 
 
 
 
 | 161 | 
 FUNCTION TForm8.Save:Boolean; | 
 
 
 
 
 
 | 162 | 
   VAR | 
 
 
 
 
 
 | 163 | 
     mem:TMemoryStream; | 
 
 
 
 
 
 | 164 | 
     data:Tdata; | 
 
 
 
 
 
 | 165 | 
   BEGIN | 
 
 
 
 
 
 | 166 | 
     CASE MessageBox(Self.Handle,PChar('Save changes to file '+dat_files[fileid].FileName+'?'),PChar('Data changed...'),MB_YESNOCANCEL) OF | 
 
 
 
 
 
 | 167 | 
       IDYES: BEGIN | 
 
 
 
 
 
 | 168 | 
           mem:=TMemoryStream.Create; | 
 
 
 
 
 
 | 169 | 
           hex.SaveToStream(mem); | 
 
 
 
 
 
 | 170 | 
           mem.Seek(0,soFromBeginning); | 
 
 
 
 
 
 | 171 | 
           SetLength(data,mem.Size); | 
 
 
 
 
 
 | 172 | 
           mem.Read(data[0],mem.Size); | 
 
 
 
 
 
 | 173 | 
           mem.Free; | 
 
 
 
 
 
 | 174 | 
           SaveDatFile(fileid,data); | 
 
 
 
 
 
 | 175 | 
           Result:=True; | 
 
 
 
 
 
 | 176 | 
         END; | 
 
 
 
 
 
 | 177 | 
       IDNO: Result:=True; | 
 
 
 
 
 
 | 178 | 
       IDCANCEL: BEGIN | 
 
 
 
 
 
 | 179 | 
           Result:=False; | 
 
 
 
 
 
 | 180 | 
         END; | 
 
 
 
 
 
 | 181 | 
     END; | 
 
 
 
 
 
 | 182 | 
   END; | 
 
 
 
 
 
 | 183 | 
  | 
 
 
 
 
 
 | 184 | 
 PROCEDURE TForm8.FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
 
 
 
 
 
 | 185 | 
   BEGIN | 
 
 
 
 
 
 | 186 | 
     IF hex.Modified THEN BEGIN | 
 
 
 
 
 
 | 187 | 
       IF NOT Save THEN CanClose:=False; | 
 
 
 
 
 
 | 188 | 
     END; | 
 
 
 
 
 
 | 189 | 
   END; | 
 
 
 
 
 
 | 190 | 
  | 
 
 
 
 
 
 | 191 | 
 PROCEDURE TForm8.listClick(Sender: TObject); | 
 
 
 
 
 
 | 192 | 
   VAR | 
 
 
 
 
 
 | 193 | 
     mem:TMemoryStream; | 
 
 
 
 
 
 | 194 | 
     data:Tdata; | 
 
 
 
 
 
 | 195 | 
     i:LongWord; | 
 
 
 
 
 
 | 196 | 
   BEGIN | 
 
 
 
 
 
 | 197 | 
     IF hex.Modified THEN BEGIN | 
 
 
 
 
 
 | 198 | 
       IF NOT Save THEN BEGIN | 
 
 
 
 
 
 | 199 | 
         FOR i:=0 TO list.Count-1 DO BEGIN | 
 
 
 
 
 
 | 200 | 
           IF StrToInt(MidStr(list.Items.Strings[i],1,5))=fileid THEN BEGIN | 
 
 
 
 
 
 | 201 | 
             list.ItemIndex:=i; | 
 
 
 
 
 
 | 202 | 
             Exit; | 
 
 
 
 
 
 | 203 | 
           END; | 
 
 
 
 
 
 | 204 | 
         END; | 
 
 
 
 
 
 | 205 | 
       END; | 
 
 
 
 
 
 | 206 | 
     END; | 
 
 
 
 
 
 | 207 | 
     Self.ClearStructViewer; | 
 
 
 
 
 
 | 208 | 
     fileid:=StrToInt(MidStr(list.Items.Strings[list.ItemIndex],1,5)); | 
 
 
 
 
 
 | 209 | 
     data:=LoadDatFile(fileid); | 
 
 
 
 
 
 | 210 | 
     mem:=TMemoryStream.Create; | 
 
 
 
 
 
 | 211 | 
     mem.Write(data[0],Length(data)); | 
 
 
 
 
 
 | 212 | 
     hex.LoadFromStream(mem); | 
 
 
 
 
 
 | 213 | 
     mem.Free; | 
 
 
 
 
 
 | 214 | 
     WriteStructureInfos(GetStructureInfoId(dat_files[fileid].Extension)); | 
 
 
 
 
 
 | 215 | 
   END; | 
 
 
 
 
 
 | 216 | 
  | 
 
 
 
 
 
 | 217 | 
 PROCEDURE TForm8.ClearStructViewer; | 
 
 
 
 
 
 | 218 | 
   VAR | 
 
 
 
 
 
 | 219 | 
     x:Word; | 
 
 
 
 
 
 | 220 | 
   BEGIN | 
 
 
 
 
 
 | 221 | 
     structs.RowCount:=2; | 
 
 
 
 
 
 | 222 | 
     FOR x:=0 TO structs.ColCount-1 DO structs.Cells[x,1]:=''; | 
 
 
 
 
 
 | 223 | 
     structs.Enabled:=False; | 
 
 
 
 
 
 | 224 | 
   END; | 
 
 
 
 
 
 | 225 | 
  | 
 
 
 
 
 
 | 226 | 
 PROCEDURE TForm8.FormResize(Sender: TObject); | 
 
 
 
 
 
 | 227 | 
   BEGIN | 
 
 
 
 
 
 | 228 | 
     IF Self.Width>=650 THEN BEGIN | 
 
 
 
 
 
 | 229 | 
     END ELSE Self.Width:=650; | 
 
 
 
 
 
 | 230 | 
     IF Self.Height>=450 THEN BEGIN | 
 
 
 
 
 
 | 231 | 
     END ELSE Self.Height:=450; | 
 
 
 
 
 
 | 232 | 
   END; | 
 
 
 
 
 
 | 233 | 
  | 
 
 
 
 
 
 | 234 | 
 PROCEDURE TForm8.structsClick(Sender: TObject); | 
 
 
 
 
 
 | 235 | 
   VAR | 
 
 
 
 
 
 | 236 | 
     offset:LongWord; | 
 
 
 
 
 
 | 237 | 
     length:Byte; | 
 
 
 
 
 
 | 238 | 
   BEGIN | 
 
 
 
 
 
 | 239 | 
     IF structs.Row>0 THEN BEGIN | 
 
 
 
 
 
 | 240 | 
       offset:=structure_infos[GetStructureInfoId(dat_files[fileid].extension)].entries[structs.Row-1].offset; | 
 
 
 
 
 
 | 241 | 
       length:=GetTypeDataLength(structure_infos[GetStructureInfoId(dat_files[fileid].extension)].entries[structs.Row-1].datatype); | 
 
 
 
 
 
 | 242 | 
       hex.SelStart:=offset; | 
 
 
 
 
 
 | 243 | 
       hex.SelEnd:=offset+length-1; | 
 
 
 
 
 
 | 244 | 
 {      IF structs.Cells[structs.Col,0]='Value' THEN | 
 
 
 
 
 
 | 245 | 
         IF structure_infos[GetStructureInfoId(dat_files[fileid].Extension)].entries[structs.Row-1].datatype<=10 THEN | 
 
 
 
 
 
 | 246 | 
           structs.Options:=structs.Options+[goEditing] | 
 
 
 
 
 
 | 247 | 
       ELSE | 
 
 
 
 
 
 | 248 | 
         structs.Options:=structs.Options-[goEditing]; | 
 
 
 
 
 
 | 249 | 
 }    END; | 
 
 
 
 
 
 | 250 | 
   END; | 
 
 
 
 
 
 | 251 | 
  | 
 
 
 
 
 
 | 252 | 
 PROCEDURE TForm8.panel_dataResize(Sender: TObject); | 
 
 
 
 
 
 | 253 | 
   BEGIN | 
 
 
 
 
 
 | 254 | 
     structs.ColWidths[4]:=structs.Width-structs.ColWidths[0]-structs.ColWidths[1]-structs.ColWidths[2]-structs.ColWidths[3]-28; | 
 
 
 
 
 
 | 255 | 
   END; | 
 
 
 
 
 
 | 256 | 
  | 
 
 
 
 
 
 | 257 | 
 PROCEDURE TForm8.hexChange(Sender: TObject); | 
 
 
 
 
 
 | 258 | 
   BEGIN | 
 
 
 
 
 
 | 259 | 
     IF hex.DataSize>0 THEN | 
 
 
 
 
 
 | 260 | 
       WriteStructureInfos(GetStructureInfoId(dat_files[fileid].Extension)); | 
 
 
 
 
 
 | 261 | 
   END; | 
 
 
 
 
 
 | 262 | 
  | 
 
 
 
 
 
 | 263 | 
 PROCEDURE TForm8.hexSelectionChanged(Sender: TObject); | 
 
 
 
 
 
 | 264 | 
   VAR | 
 
 
 
 
 
 | 265 | 
     selstart:Integer; | 
 
 
 
 
 
 | 266 | 
     i,j:Word; | 
 
 
 
 
 
 | 267 | 
   BEGIN | 
 
 
 
 
 
 | 268 | 
     FOR i:=1 TO structs.RowCount-1 DO BEGIN | 
 
 
 
 
 
 | 269 | 
       FOR j:=0 TO structs.ColCount-1 DO BEGIN | 
 
 
 
 
 
 | 270 | 
         structs.CellColors[j,i]:=clWhite; | 
 
 
 
 
 
 | 271 | 
         structs.CellFontColors[j,i]:=clBlack; | 
 
 
 
 
 
 | 272 | 
       END; | 
 
 
 
 
 
 | 273 | 
     END; | 
 
 
 
 
 
 | 274 | 
     IF hex.DataSize>0 THEN BEGIN | 
 
 
 
 
 
 | 275 | 
       selstart:=hex.SelStart; | 
 
 
 
 
 
 | 276 | 
       IF GetStructureInfoId(dat_files[fileid].Extension)>=0 THEN BEGIN | 
 
 
 
 
 
 | 277 | 
         WITH structure_infos[GetStructureInfoId(dat_files[fileid].Extension)] DO BEGIN | 
 
 
 
 
 
 | 278 | 
           FOR i:=0 TO High(entries) DO BEGIN | 
 
 
 
 
 
 | 279 | 
             IF ((selstart-entries[i].offset)<GetTypeDataLength(entries[i].datatype)) AND ((selstart-entries[i].offset)>=0) THEN BEGIN | 
 
 
 
 
 
 | 280 | 
               FOR j:=0 TO structs.ColCount-1 DO BEGIN | 
 
 
 
 
 
 | 281 | 
                 structs.CellColors[j,i+1]:=clBlue; | 
 
 
 
 
 
 | 282 | 
                 structs.CellFontColors[j,i+1]:=clWhite; | 
 
 
 
 
 
 | 283 | 
               END; | 
 
 
 
 
 
 | 284 | 
               structs.Row:=i+1; | 
 
 
 
 
 
 | 285 | 
             END; | 
 
 
 
 
 
 | 286 | 
           END; | 
 
 
 
 
 
 | 287 | 
         END; | 
 
 
 
 
 
 | 288 | 
       END; | 
 
 
 
 
 
 | 289 | 
     END; | 
 
 
 
 
 
 | 290 | 
   END; | 
 
 
 
 
 
 | 291 | 
  | 
 
 
 
 
 
 | 292 | 
 PROCEDURE TForm8.panel_extensionResize(Sender: TObject); | 
 
 
 
 
 
 | 293 | 
   BEGIN | 
 
 
 
 
 
 | 294 | 
     combo_extension.Width:=panel_extension.Width-5; | 
 
 
 
 
 
 | 295 | 
   END; | 
 
 
 
 
 
 | 296 | 
  | 
 
 
 
 
 
 | 297 | 
 PROCEDURE TForm8.combo_extensionClick(Sender: TObject); | 
 
 
 
 
 
 | 298 | 
   VAR | 
 
 
 
 
 
 | 299 | 
     Extension:String[4]; | 
 
 
 
 
 
 | 300 | 
     i:LongWord; | 
 
 
 
 
 
 | 301 | 
   BEGIN | 
 
 
 
 
 
 | 302 | 
     Extension:=MidStr(combo_extension.Items.Strings[combo_extension.ItemIndex],1,4); | 
 
 
 
 
 
 | 303 | 
     list.Items.Clear; | 
 
 
 
 
 
 | 304 | 
     IF Extension='_All' THEN BEGIN | 
 
 
 
 
 
 | 305 | 
       FOR i:=0 TO dat_header.Files-1 DO | 
 
 
 
 
 
 | 306 | 
         IF (dat_files[i].FileType AND $02)=0 THEN | 
 
 
 
 
 
 | 307 | 
           list.Items.Add(dat_files[i].FileName); | 
 
 
 
 
 
 | 308 | 
     END ELSE BEGIN | 
 
 
 
 
 
 | 309 | 
       FOR i:=0 TO dat_header.Files-1 DO | 
 
 
 
 
 
 | 310 | 
         IF dat_files[i].Extension=Extension THEN | 
 
 
 
 
 
 | 311 | 
           IF (dat_files[i].FileType AND $02)=0 THEN | 
 
 
 
 
 
 | 312 | 
             list.Items.Add(dat_files[i].FileName); | 
 
 
 
 
 
 | 313 | 
     END; | 
 
 
 
 
 
 | 314 | 
     IF list.Count>0 THEN BEGIN | 
 
 
 
 
 
 | 315 | 
       list.ItemIndex:=0; | 
 
 
 
 
 
 | 316 | 
       listClick(Self); | 
 
 
 
 
 
 | 317 | 
     END; | 
 
 
 
 
 
 | 318 | 
   END; | 
 
 
 
 
 
 | 319 | 
  | 
 
 
 
 
 
 | 320 | 
 PROCEDURE TForm8.FormClose(Sender: TObject; var Action: TCloseAction); | 
 
 
 
 
 
 | 321 | 
   BEGIN | 
 
 
 
 
 
 | 322 | 
     Action:=caFree; | 
 
 
 
 
 
 | 323 | 
     Form1.close_window(Self.Name); | 
 
 
 
 
 
 | 324 | 
   END; | 
 
 
 
 
 
 | 325 | 
  | 
 
 
 
 
 
 | 326 | 
 PROCEDURE TForm8.panel_imexportResize(Sender: TObject); | 
 
 
 
 
 
 | 327 | 
   BEGIN | 
 
 
 
 
 
 | 328 | 
     btn_import.Width:=panel_imexport.Width-8; | 
 
 
 
 
 
 | 329 | 
     btn_export.Width:=panel_imexport.Width-8; | 
 
 
 
 
 
 | 330 | 
   END; | 
 
 
 
 
 
 | 331 | 
  | 
 
 
 
 
 
 | 332 | 
 PROCEDURE TForm8.btn_exportClick(Sender: TObject); | 
 
 
 
 
 
 | 333 | 
   BEGIN | 
 
 
 
 
 
 | 334 | 
     saved.Filter:='Files of matching extension (*.'+dat_files[fileid].Extension+')|*.'+dat_files[fileid].Extension+'|All files|*.*'; | 
 
 
 
 
 
 | 335 | 
     saved.DefaultExt:=dat_files[fileid].Extension; | 
 
 
 
 
 
 | 336 | 
     IF saved.Execute THEN BEGIN | 
 
 
 
 
 
 | 337 | 
       ExportDatFile(fileid,saved.FileName); | 
 
 
 
 
 
 | 338 | 
     END; | 
 
 
 
 
 
 | 339 | 
   END; | 
 
 
 
 
 
 | 340 | 
  | 
 
 
 
 
 
 | 341 | 
 PROCEDURE TForm8.btn_importClick(Sender: TObject); | 
 
 
 
 
 
 | 342 | 
   VAR | 
 
 
 
 
 
 | 343 | 
     data:Tdata; | 
 
 
 
 
 
 | 344 | 
     fs:TFileStream; | 
 
 
 
 
 
 | 345 | 
   BEGIN | 
 
 
 
 
 
 | 346 | 
     opend.Filter:='Files of matching extension (*.'+dat_files[fileid].Extension+')|*.'+dat_files[fileid].Extension+'|All files|*.*'; | 
 
 
 
 
 
 | 347 | 
     IF opend.Execute THEN BEGIN | 
 
 
 
 
 
 | 348 | 
       fs:=TFileStream.Create(opend.FileName,fmOpenRead); | 
 
 
 
 
 
 | 349 | 
       IF fs.Size<>dat_files[fileid].size THEN BEGIN | 
 
 
 
 
 
 | 350 | 
         ShowMessage('Can''t import '+ExtractFilename(opend.FileName)+ | 
 
 
 
 
 
 | 351 | 
                     ', file has to have same size as file in .dat.'+CrLf+ | 
 
 
 
 
 
 | 352 | 
                     'Size of file in .dat: '+FormatFileSize(dat_files[fileid].size)+CrLf+ | 
 
 
 
 
 
 | 353 | 
                     'Size of chosen file: '+FormatFileSize(fs.Size)); | 
 
 
 
 
 
 | 354 | 
       END ELSE BEGIN | 
 
 
 
 
 
 | 355 | 
         SetLength(data,fs.Size); | 
 
 
 
 
 
 | 356 | 
         fs.Read(data[0],fs.Size); | 
 
 
 
 
 
 | 357 | 
         fs.Free; | 
 
 
 
 
 
 | 358 | 
         fs:=TFileStream.Create(dat_filename,fmOpenReadWrite); | 
 
 
 
 
 
 | 359 | 
         fs.Seek(dat_files[fileid].dataddr,soFromBeginning); | 
 
 
 
 
 
 | 360 | 
         fs.Write(data[0],Length(data));   | 
 
 
 
 
 
 | 361 | 
       END; | 
 
 
 
 
 
 | 362 | 
       fs.Free; | 
 
 
 
 
 
 | 363 | 
       listClick(Self); | 
 
 
 
 
 
 | 364 | 
     END; | 
 
 
 
 
 
 | 365 | 
   END; | 
 
 
 
 
 
 | 366 | 
  | 
 
 
 
 
 
 | 367 | 
 PROCEDURE TForm8.FormActivate(Sender: TObject); | 
 
 
 
 
 
 | 368 | 
   BEGIN | 
 
 
 
 
 
 | 369 | 
     Form1.SetActiveWindow(Self.Name); | 
 
 
 
 
 
 | 370 | 
   END; | 
 
 
 
 
 
 | 371 | 
 { | 
 
 
 
 
 
 | 372 | 
 PROCEDURE TForm8.structsKeyPress(Sender: TObject; VAR Key: Char); | 
 
 
 
 
 
 | 373 | 
   VAR | 
 
 
 
 
 
 | 374 | 
     dt:Byte; | 
 
 
 
 
 
 | 375 | 
   BEGIN | 
 
 
 
 
 
 | 376 | 
     IF structs.EditorMode THEN BEGIN | 
 
 
 
 
 
 | 377 | 
       dt:=structure_infos[GetStructureInfoId(dat_files[fileid].Extension)].entries[structs.Row-1].datatype; | 
 
 
 
 
 
 | 378 | 
       CASE dt OF | 
 
 
 
 
 
 | 379 | 
         1..4: BEGIN | 
 
 
 
 
 
 | 380 | 
                 IF NOT (Key IN [#8,#13,#27,'0'..'9']) THEN Key:=#0; | 
 
 
 
 
 
 | 381 | 
               END; | 
 
 
 
 
 
 | 382 | 
         5..8: BEGIN | 
 
 
 
 
 
 | 383 | 
                 IF NOT (Key IN [#8,#13,#27,'0'..'9','A'..'F','a'..'f']) THEN Key:=#0; | 
 
 
 
 
 
 | 384 | 
                 IF Key IN ['a'..'f'] THEN Key:=UpCase(Key); | 
 
 
 
 
 
 | 385 | 
                 IF NOT (Key IN [#8,#13,#27]) AND ( Length(structs.Cells[structs.Col,structs.Row])>=2*(dt-4) ) THEN Key:=#0; | 
 
 
 
 
 
 | 386 | 
               END; | 
 
 
 
 
 
 | 387 | 
         9:    BEGIN | 
 
 
 
 
 
 | 388 | 
                 IF (Key IN ['.']) AND (Pos('.',structs.Cells[structs.Col,structs.Row])>0) THEN Key:=#0; | 
 
 
 
 
 
 | 389 | 
                 IF NOT (Key IN [#8,#13,#27,'0'..'9','.','-']) THEN Key:=#0; | 
 
 
 
 
 
 | 390 | 
               END; | 
 
 
 
 
 
 | 391 | 
         10:   BEGIN | 
 
 
 
 
 
 | 392 | 
                 IF NOT (Key IN [#8,#13,#27,'0'..'1']) THEN Key:=#0; | 
 
 
 
 
 
 | 393 | 
                 IF NOT (Key IN [#8,#13,#27]) AND ( Length(structs.Cells[structs.Col,structs.Row])>=8 ) THEN Key:=#0; | 
 
 
 
 
 
 | 394 | 
               END; | 
 
 
 
 
 
 | 395 | 
       END; | 
 
 
 
 
 
 | 396 | 
     END; | 
 
 
 
 
 
 | 397 | 
   END; | 
 
 
 
 
 
 | 398 | 
  | 
 
 
 
 
 
 | 399 | 
 PROCEDURE TForm8.structsSetEditText(Sender: TObject; ACol, ARow: Integer; CONST Value: string); | 
 
 
 
 
 
 | 400 | 
   BEGIN | 
 
 
 
 
 
 | 401 | 
     IF NOT TWrapGrid(Sender).EditorMode THEN | 
 
 
 
 
 
 | 402 | 
       ShowMessage('['+IntToStr(ACol)+'|'+IntToStr(ARow)+']='+Value); | 
 
 
 
 
 
 | 403 | 
   END; | 
 
 
 
 
 
 | 404 | 
  | 
 
 
 
 
 
 | 405 | 
 PROCEDURE TForm8.structsGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string); | 
 
 
 
 
 
 | 406 | 
   BEGIN | 
 
 
 
 
 
 | 407 | 
     IF structs.EditorMode THEN | 
 
 
 
 
 
 | 408 | 
       ShowMessage('EditorMode - '+Value) | 
 
 
 
 
 
 | 409 | 
     ELSE | 
 
 
 
 
 
 | 410 | 
       ShowMessage('NOT EditorMode - '+Value); | 
 
 
 
 
 
 | 411 | 
   END; | 
 
 
 
 
 
 | 412 | 
 } | 
 
 
 
 
 
 | 413 | 
 END. |