| 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. |