| 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; | 
 
 
 
 
 
 | 7 | 
  | 
 
 
 
 
 
 | 8 | 
 TYPE | 
 
 
 
 
 
 | 9 | 
   TForm8 = Class(TForm) | 
 
 
 
 
 
 | 10 | 
     list: TListBox; | 
 
 
 
 
 
 | 11 | 
     Splitter1: TSplitter; | 
 
 
 
 
 
 | 12 | 
     panel_data: TPanel; | 
 
 
 
 
 
 | 13 | 
     hex: TMPHexEditor; | 
 
 
 
 
 
 | 14 | 
     Splitter2: TSplitter; | 
 
 
 
 
 
 | 15 | 
     structs: TWrapGrid; | 
 
 
 
 
 
 | 16 | 
     PROCEDURE hexSelectionChanged(Sender: TObject); | 
 
 
 
 
 
 | 17 | 
     PROCEDURE hexChange(Sender: TObject); | 
 
 
 
 
 
 | 18 | 
     PROCEDURE panel_dataResize(Sender: TObject); | 
 
 
 
 
 
 | 19 | 
     PROCEDURE structsClick(Sender: TObject); | 
 
 
 
 
 
 | 20 | 
     PROCEDURE FormResize(Sender: TObject); | 
 
 
 
 
 
 | 21 | 
     PROCEDURE ClearStructViewer; | 
 
 
 
 
 
 | 22 | 
     PROCEDURE listClick(Sender: TObject); | 
 
 
 
 
 
 | 23 | 
     PROCEDURE FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
 
 
 
 
 
 | 24 | 
     PROCEDURE FormCreate(Sender: TObject); | 
 
 
 
 
 
 | 25 | 
     PROCEDURE Recreatelist; | 
 
 
 
 
 
 | 26 | 
   PRIVATE | 
 
 
 
 
 
 | 27 | 
   PUBLIC | 
 
 
 
 
 
 | 28 | 
   END; | 
 
 
 
 
 
 | 29 | 
  | 
 
 
 
 
 
 | 30 | 
 VAR | 
 
 
 
 
 
 | 31 | 
   Form8: TForm8; | 
 
 
 
 
 
 | 32 | 
  | 
 
 
 
 
 
 | 33 | 
 IMPLEMENTATION | 
 
 
 
 
 
 | 34 | 
 {$R *.dfm} | 
 
 
 
 
 
 | 35 | 
 VAR | 
 
 
 
 
 
 | 36 | 
   fileid:LongWord; | 
 
 
 
 
 
 | 37 | 
  | 
 
 
 
 
 
 | 38 | 
 FUNCTION IntToBin(value:Byte):String; | 
 
 
 
 
 
 | 39 | 
   VAR i:Byte; | 
 
 
 
 
 
 | 40 | 
   BEGIN | 
 
 
 
 
 
 | 41 | 
     Result:=''; | 
 
 
 
 
 
 | 42 | 
     FOR i:=7 DOWNTO 0 DO BEGIN | 
 
 
 
 
 
 | 43 | 
       Result:=Result+IntToStr((value SHR i) AND $01); | 
 
 
 
 
 
 | 44 | 
     END; | 
 
 
 
 
 
 | 45 | 
   END; | 
 
 
 
 
 
 | 46 | 
  | 
 
 
 
 
 
 | 47 | 
 FUNCTION GetTypeDataLength(datatype:Byte):Byte; | 
 
 
 
 
 
 | 48 | 
   BEGIN | 
 
 
 
 
 
 | 49 | 
     CASE datatype OF | 
 
 
 
 
 
 | 50 | 
       1..4: Result:=datatype; | 
 
 
 
 
 
 | 51 | 
       5..8: Result:=datatype-4; | 
 
 
 
 
 
 | 52 | 
       9: Result:=4; | 
 
 
 
 
 
 | 53 | 
       10: Result:=1; | 
 
 
 
 
 
 | 54 | 
       11..255: Result:=datatype-10; | 
 
 
 
 
 
 | 55 | 
     END; | 
 
 
 
 
 
 | 56 | 
   END; | 
 
 
 
 
 
 | 57 | 
  | 
 
 
 
 
 
 | 58 | 
 FUNCTION GetValue(datatype:Byte; offset:LongWord):String; | 
 
 
 
 
 
 | 59 | 
   VAR | 
 
 
 
 
 
 | 60 | 
     data:Tdata; | 
 
 
 
 
 
 | 61 | 
   BEGIN | 
 
 
 
 
 
 | 62 | 
     CASE datatype OF | 
 
 
 
 
 
 | 63 | 
       1: Result:=IntToStr(Form8.hex.data[offset]); | 
 
 
 
 
 
 | 64 | 
       2: Result:=IntToStr(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256); | 
 
 
 
 
 
 | 65 | 
       3: Result:=IntToStr(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256+Form8.hex.data[offset+2]*256*256); | 
 
 
 
 
 
 | 66 | 
       4: Result:=IntToStr(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256+Form8.hex.data[offset+2]*256*256+Form8.hex.data[offset+3]*256*256*256); | 
 
 
 
 
 
 | 67 | 
       5: Result:='0x'+IntToHex(Form8.hex.data[offset],2); | 
 
 
 
 
 
 | 68 | 
       6: Result:='0x'+IntToHex(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256,4); | 
 
 
 
 
 
 | 69 | 
       7: Result:='0x'+IntToHex(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256+Form8.hex.data[offset+2]*256*256,6); | 
 
 
 
 
 
 | 70 | 
       8: Result:='0x'+IntToHex(Form8.hex.data[offset]+Form8.hex.data[offset+1]*256+Form8.hex.data[offset+2]*256*256+Form8.hex.data[offset+3]*256*256*256,8); | 
 
 
 
 
 
 | 71 | 
       9: BEGIN | 
 
 
 
 
 
 | 72 | 
           SetLength(data,4); | 
 
 
 
 
 
 | 73 | 
           data[0]:=Form8.hex.data[offset]; | 
 
 
 
 
 
 | 74 | 
           data[1]:=Form8.hex.data[offset+1]; | 
 
 
 
 
 
 | 75 | 
           data[2]:=Form8.hex.data[offset+2]; | 
 
 
 
 
 
 | 76 | 
           data[3]:=Form8.hex.data[offset+3]; | 
 
 
 
 
 
 | 77 | 
           Result:=FloatToStr(Decode_Float(data)); | 
 
 
 
 
 
 | 78 | 
         END; | 
 
 
 
 
 
 | 79 | 
       10: Result:=IntToBin(Form8.hex.data[offset]); | 
 
 
 
 
 
 | 80 | 
     END; | 
 
 
 
 
 
 | 81 | 
   END; | 
 
 
 
 
 
 | 82 | 
  | 
 
 
 
 
 
 | 83 | 
 PROCEDURE WriteStructureInfos(structinfoid:Integer); | 
 
 
 
 
 
 | 84 | 
   VAR | 
 
 
 
 
 
 | 85 | 
     i:Byte; | 
 
 
 
 
 
 | 86 | 
   BEGIN | 
 
 
 
 
 
 | 87 | 
     IF structinfoid>=0 THEN BEGIN | 
 
 
 
 
 
 | 88 | 
       WITH structure_infos[structinfoid] DO BEGIN | 
 
 
 
 
 
 | 89 | 
         Form8.structs.RowCount:=Length(entries)+1; | 
 
 
 
 
 
 | 90 | 
         FOR i:=1 TO Length(entries) DO BEGIN | 
 
 
 
 
 
 | 91 | 
           Form8.structs.Cells[0,i]:=entries[i-1].name; | 
 
 
 
 
 
 | 92 | 
           Form8.structs.Cells[1,i]:='0x'+IntToHex(entries[i-1].offset,6); | 
 
 
 
 
 
 | 93 | 
           Form8.structs.Cells[2,i]:=GetDataType(entries[i-1].datatype); | 
 
 
 
 
 
 | 94 | 
           Form8.structs.Cells[3,i]:=GetValue(entries[i-1].datatype,entries[i-1].offset); | 
 
 
 
 
 
 | 95 | 
           Form8.structs.Cells[4,i]:=entries[i-1].description; | 
 
 
 
 
 
 | 96 | 
         END; | 
 
 
 
 
 
 | 97 | 
       END; | 
 
 
 
 
 
 | 98 | 
     END; | 
 
 
 
 
 
 | 99 | 
   END; | 
 
 
 
 
 
 | 100 | 
  | 
 
 
 
 
 
 | 101 | 
 PROCEDURE TForm8.Recreatelist; | 
 
 
 
 
 
 | 102 | 
   VAR | 
 
 
 
 
 
 | 103 | 
     i:LongWord; | 
 
 
 
 
 
 | 104 | 
   BEGIN | 
 
 
 
 
 
 | 105 | 
     Form8.list.Items.Clear; | 
 
 
 
 
 
 | 106 | 
     FOR i:=0 TO dat_header.Files-1 DO BEGIN | 
 
 
 
 
 
 | 107 | 
       IF (dat_files[i].FileType AND $02)=0 THEN | 
 
 
 
 
 
 | 108 | 
         Form8.list.Items.Add(dat_files[i].FileName); | 
 
 
 
 
 
 | 109 | 
     END; | 
 
 
 
 
 
 | 110 | 
   END; | 
 
 
 
 
 
 | 111 | 
  | 
 
 
 
 
 
 | 112 | 
 PROCEDURE TForm8.FormCreate(Sender: TObject); | 
 
 
 
 
 
 | 113 | 
   BEGIN | 
 
 
 
 
 
 | 114 | 
     Form8.Caption:=''; | 
 
 
 
 
 
 | 115 | 
     fileid:=0; | 
 
 
 
 
 
 | 116 | 
     structs.ColCount:=5; | 
 
 
 
 
 
 | 117 | 
     structs.RowCount:=2; | 
 
 
 
 
 
 | 118 | 
     structs.FixedRows:=1; | 
 
 
 
 
 
 | 119 | 
     structs.Cells[0,0]:='Name'; | 
 
 
 
 
 
 | 120 | 
     structs.Cells[1,0]:='Offset'; | 
 
 
 
 
 
 | 121 | 
     structs.Cells[2,0]:='Type'; | 
 
 
 
 
 
 | 122 | 
     structs.Cells[3,0]:='Value'; | 
 
 
 
 
 
 | 123 | 
     structs.Cells[4,0]:='Description'; | 
 
 
 
 
 
 | 124 | 
     structs.ColWidths[0]:=75; | 
 
 
 
 
 
 | 125 | 
     structs.ColWidths[1]:=60; | 
 
 
 
 
 
 | 126 | 
     structs.ColWidths[2]:=75; | 
 
 
 
 
 
 | 127 | 
     structs.ColWidths[3]:=75; | 
 
 
 
 
 
 | 128 | 
     Form8.panel_dataResize(Form8); | 
 
 
 
 
 
 | 129 | 
   END; | 
 
 
 
 
 
 | 130 | 
  | 
 
 
 
 
 
 | 131 | 
 PROCEDURE TForm8.FormCloseQuery(Sender: TObject; var CanClose: Boolean); | 
 
 
 
 
 
 | 132 | 
   BEGIN | 
 
 
 
 
 
 | 133 | 
     CanClose:=False; | 
 
 
 
 
 
 | 134 | 
     Form8.Visible:=False; | 
 
 
 
 
 
 | 135 | 
   END; | 
 
 
 
 
 
 | 136 | 
  | 
 
 
 
 
 
 | 137 | 
 PROCEDURE TForm8.listClick(Sender: TObject); | 
 
 
 
 
 
 | 138 | 
   VAR | 
 
 
 
 
 
 | 139 | 
     mem:TMemoryStream; | 
 
 
 
 
 
 | 140 | 
     data:Tdata; | 
 
 
 
 
 
 | 141 | 
   BEGIN | 
 
 
 
 
 
 | 142 | 
     IF hex.Modified THEN BEGIN | 
 
 
 
 
 
 | 143 | 
       IF MessageBox(Form8.Handle,PChar('Save changes to file '+dat_files[fileid].FileName+'?'),PChar('Data changed...'),MB_YESNO)=IDYES THEN BEGIN | 
 
 
 
 
 
 | 144 | 
         mem:=TMemoryStream.Create; | 
 
 
 
 
 
 | 145 | 
         hex.SaveToStream(mem); | 
 
 
 
 
 
 | 146 | 
         mem.Seek(0,soFromBeginning); | 
 
 
 
 
 
 | 147 | 
         SetLength(data,mem.Size); | 
 
 
 
 
 
 | 148 | 
         mem.Read(data[0],mem.Size);  | 
 
 
 
 
 
 | 149 | 
         mem.Free; | 
 
 
 
 
 
 | 150 | 
         SaveDatFile(fileid,data); | 
 
 
 
 
 
 | 151 | 
         ShowMessage('Changes saved...'); | 
 
 
 
 
 
 | 152 | 
       END; | 
 
 
 
 
 
 | 153 | 
     END; | 
 
 
 
 
 
 | 154 | 
     Form8.ClearStructViewer; | 
 
 
 
 
 
 | 155 | 
     fileid:=StrToInt(MidStr(list.Items.Strings[list.ItemIndex],1,5)); | 
 
 
 
 
 
 | 156 | 
     data:=LoadDatFile(fileid); | 
 
 
 
 
 
 | 157 | 
     mem:=TMemoryStream.Create; | 
 
 
 
 
 
 | 158 | 
     mem.Write(data[0],Length(data)); | 
 
 
 
 
 
 | 159 | 
     hex.LoadFromStream(mem); | 
 
 
 
 
 
 | 160 | 
     mem.Free; | 
 
 
 
 
 
 | 161 | 
     WriteStructureInfos(GetStructureInfoId(dat_files[fileid].Extension)); | 
 
 
 
 
 
 | 162 | 
   END; | 
 
 
 
 
 
 | 163 | 
  | 
 
 
 
 
 
 | 164 | 
 PROCEDURE TForm8.ClearStructViewer; | 
 
 
 
 
 
 | 165 | 
   VAR | 
 
 
 
 
 
 | 166 | 
     x:Word; | 
 
 
 
 
 
 | 167 | 
   BEGIN | 
 
 
 
 
 
 | 168 | 
     structs.RowCount:=2; | 
 
 
 
 
 
 | 169 | 
     FOR x:=0 TO structs.ColCount-1 DO structs.Cells[x,1]:=''; | 
 
 
 
 
 
 | 170 | 
   END; | 
 
 
 
 
 
 | 171 | 
  | 
 
 
 
 
 
 | 172 | 
 PROCEDURE TForm8.FormResize(Sender: TObject); | 
 
 
 
 
 
 | 173 | 
   BEGIN | 
 
 
 
 
 
 | 174 | 
     IF Form8.Width>=650 THEN BEGIN | 
 
 
 
 
 
 | 175 | 
     END ELSE Form8.Width:=650; | 
 
 
 
 
 
 | 176 | 
     IF Form8.Height>=450 THEN BEGIN | 
 
 
 
 
 
 | 177 | 
     END ELSE Form8.Height:=450; | 
 
 
 
 
 
 | 178 | 
   END; | 
 
 
 
 
 
 | 179 | 
  | 
 
 
 
 
 
 | 180 | 
 PROCEDURE TForm8.structsClick(Sender: TObject); | 
 
 
 
 
 
 | 181 | 
   VAR | 
 
 
 
 
 
 | 182 | 
     offset:LongWord; | 
 
 
 
 
 
 | 183 | 
     length:Byte; | 
 
 
 
 
 
 | 184 | 
   BEGIN | 
 
 
 
 
 
 | 185 | 
     IF structs.Row>0 THEN BEGIN | 
 
 
 
 
 
 | 186 | 
       offset:=structure_infos[GetStructureInfoId(dat_files[fileid].extension)].entries[structs.Row-1].offset; | 
 
 
 
 
 
 | 187 | 
       length:=GetTypeDataLength(structure_infos[GetStructureInfoId(dat_files[fileid].extension)].entries[structs.Row-1].datatype); | 
 
 
 
 
 
 | 188 | 
       hex.SelStart:=offset; | 
 
 
 
 
 
 | 189 | 
       hex.SelEnd:=offset+length-1; | 
 
 
 
 
 
 | 190 | 
     END; | 
 
 
 
 
 
 | 191 | 
   END; | 
 
 
 
 
 
 | 192 | 
  | 
 
 
 
 
 
 | 193 | 
 PROCEDURE TForm8.panel_dataResize(Sender: TObject); | 
 
 
 
 
 
 | 194 | 
   BEGIN | 
 
 
 
 
 
 | 195 | 
     structs.ColWidths[4]:=structs.Width-structs.ColWidths[0]-structs.ColWidths[1]-structs.ColWidths[2]-structs.ColWidths[3]-12; | 
 
 
 
 
 
 | 196 | 
   END; | 
 
 
 
 
 
 | 197 | 
  | 
 
 
 
 
 
 | 198 | 
 PROCEDURE TForm8.hexChange(Sender: TObject); | 
 
 
 
 
 
 | 199 | 
   BEGIN | 
 
 
 
 
 
 | 200 | 
     IF hex.DataSize>0 THEN | 
 
 
 
 
 
 | 201 | 
       WriteStructureInfos(GetStructureInfoId(dat_files[fileid].Extension)); | 
 
 
 
 
 
 | 202 | 
   END; | 
 
 
 
 
 
 | 203 | 
  | 
 
 
 
 
 
 | 204 | 
 PROCEDURE TForm8.hexSelectionChanged(Sender: TObject); | 
 
 
 
 
 
 | 205 | 
   VAR | 
 
 
 
 
 
 | 206 | 
     selstart,sellength,selend:Integer; | 
 
 
 
 
 
 | 207 | 
     i,j:Word; | 
 
 
 
 
 
 | 208 | 
   BEGIN | 
 
 
 
 
 
 | 209 | 
     FOR i:=1 TO structs.RowCount-1 DO BEGIN | 
 
 
 
 
 
 | 210 | 
       FOR j:=0 TO structs.ColCount-1 DO BEGIN | 
 
 
 
 
 
 | 211 | 
         structs.CellColors[j,i]:=clWhite; | 
 
 
 
 
 
 | 212 | 
         structs.CellFontColors[j,i]:=clBlack; | 
 
 
 
 
 
 | 213 | 
       END; | 
 
 
 
 
 
 | 214 | 
     END; | 
 
 
 
 
 
 | 215 | 
     IF hex.DataSize>0 THEN BEGIN | 
 
 
 
 
 
 | 216 | 
       selstart:=hex.SelStart; | 
 
 
 
 
 
 | 217 | 
       selend:=hex.SelEnd; | 
 
 
 
 
 
 | 218 | 
       sellength:=hex.SelCount; | 
 
 
 
 
 
 | 219 | 
       IF GetStructureInfoId(dat_files[fileid].Extension)>=0 THEN BEGIN | 
 
 
 
 
 
 | 220 | 
         WITH structure_infos[GetStructureInfoId(dat_files[fileid].Extension)] DO BEGIN | 
 
 
 
 
 
 | 221 | 
           FOR i:=0 TO High(entries) DO BEGIN | 
 
 
 
 
 
 | 222 | 
             IF ((selstart-entries[i].offset)<GetTypeDataLength(entries[i].datatype)) AND ((selstart-entries[i].offset)>=0) THEN BEGIN | 
 
 
 
 
 
 | 223 | 
               FOR j:=0 TO structs.ColCount-1 DO BEGIN | 
 
 
 
 
 
 | 224 | 
                 structs.CellColors[j,i+1]:=clBlue; | 
 
 
 
 
 
 | 225 | 
                 structs.CellFontColors[j,i+1]:=clWhite; | 
 
 
 
 
 
 | 226 | 
               END; | 
 
 
 
 
 
 | 227 | 
               structs.Row:=i+1; | 
 
 
 
 
 
 | 228 | 
             END; | 
 
 
 
 
 
 | 229 | 
           END; | 
 
 
 
 
 
 | 230 | 
         END; | 
 
 
 
 
 
 | 231 | 
       END; | 
 
 
 
 
 
 | 232 | 
     END; | 
 
 
 
 
 
 | 233 | 
   END; | 
 
 
 
 
 
 | 234 | 
  | 
 
 
 
 
 
 | 235 | 
 END. |