source: oup/releases/0.29a/Unit13_rawedit.pas@ 128

Last change on this file since 128 was 28, checked in by alloc, 18 years ago
File size: 27.4 KB
RevLine 
[28]1UNIT Unit13_rawedit;
2INTERFACE
3USES
4 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5 Dialogs, Wrapgrid, StdCtrls, Grids, StrUtils, MPHexEditor, ExtCtrls, Clipbrd,
6 Unit3_data, Unit2_functions, Unit9_data_structures, Unit4_exporters, Menus, Math;
7
8TYPE
9 TForm13 = Class(TForm)
10 Splitter1: TSplitter;
11 panel_data: TPanel;
12 hex: TMPHexEditor;
13 Splitter2: TSplitter;
14 structs: TWrapGrid;
15 value_viewer: TWrapGrid;
16 Splitter3: TSplitter;
17 value_viewer_context: TPopupMenu;
18 value_viewer_context_copy: TMenuItem;
19 value_viewer_context_copyashex: TMenuItem;
20 value_viewer_context_copyasdec: TMenuItem;
21 value_viewer_context_copyasfloat: TMenuItem;
22 value_viewer_context_copyasbitset: TMenuItem;
23 value_viewer_context_copyasstring: TMenuItem;
24 panel_files: TPanel;
25 opend: TOpenDialog;
26 saved: TSaveDialog;
27 panel_imexport: TPanel;
28 btn_export: TButton;
29 btn_import: TButton;
30 group_file: TGroupBox;
31 list: TListBox;
32 panel_extension: TPanel;
33 lbl_filter: TLabel;
34 combo_extension: TComboBox;
35 edit_filtername: TEdit;
36 check_filtername: TCheckBox;
37 GroupBox1: TGroupBox;
38 list_offset: TListBox;
39 Splitter4: TSplitter;
40 procedure hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
41 PROCEDURE list_offsetClick(Sender: TObject);
42 PROCEDURE LoadRaw(raw_info:TRawInfo);
43 PROCEDURE LoadFileNames;
44 PROCEDURE check_filternameClick(Sender: TObject);
45 PROCEDURE combo_extensionClick(Sender: TObject);
46 PROCEDURE panel_extensionResize(Sender: TObject);
47 PROCEDURE listClick(Sender: TObject);
48 PROCEDURE Recreatelist;
49
50 PROCEDURE FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
51 PROCEDURE value_viewerDblClick(Sender: TObject);
52 PROCEDURE structsDblClick(Sender: TObject);
53 PROCEDURE value_viewer_context_copyClick(Sender: TObject);
54 PROCEDURE value_viewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
55 PROCEDURE value_viewer_contextPopup(Sender: TObject);
56 PROCEDURE FormActivate(Sender: TObject);
57 PROCEDURE btn_importClick(Sender: TObject);
58 PROCEDURE btn_exportClick(Sender: TObject);
59 PROCEDURE panel_imexportResize(Sender: TObject);
60 FUNCTION Save:Boolean;
61 PROCEDURE FormClose(Sender: TObject; var Action: TCloseAction);
62 FUNCTION GetValue(datatype:Word; offset:LongWord):String;
63 PROCEDURE WriteStructureInfos(structinfoid:Integer);
64 PROCEDURE hexSelectionChanged(Sender: TObject);
65 PROCEDURE hexChange(Sender: TObject);
66 PROCEDURE panel_dataResize(Sender: TObject);
67 PROCEDURE structsClick(Sender: TObject);
68 PROCEDURE FormResize(Sender: TObject);
69 PROCEDURE ClearStructViewer;
70 PROCEDURE FormCloseQuery(Sender: TObject; var CanClose: Boolean);
71 PROCEDURE FormCreate(Sender: TObject);
72 PROCEDURE ClearValues;
73 PROCEDURE WriteValues;
74 PROCEDURE SetNewValue(datatype:Word; offset:LongWord; value:String);
75 PRIVATE
76 PUBLIC
77 END;
78
79VAR
80 Form13: TForm13;
81
82IMPLEMENTATION
83{$R *.dfm}
84USES Unit1_main, Unit12_ValueEdit;
85VAR
86 fileid:LongWord;
87 dat_offset:LongWord;
88 fileid_opened,dat_offset_opened:LongWord;
89
90
91PROCEDURE TForm13.LoadRaw(raw_info:TRawInfo);
92 VAR
93 i:LongWord;
94 data:Tdata;
95 mem:TMemoryStream;
96 BEGIN
97 IF hex.Modified THEN BEGIN
98 IF NOT Save THEN BEGIN
99 Exit;
100 END;
101 END;
102 IF list_offset.Count=0 THEN BEGIN
103 FOR i:=0 TO list.Count-1 DO BEGIN
104 IF GetFileIDByName(list.Items.Strings[i])=raw_info.src_id THEN BEGIN
105 list.ItemIndex:=i;
106 listClick(Self);
107 Break;
108 END;
109 END;
110 FOR i:=0 TO list_offset.Count-1 DO BEGIN
111 IF MidStr(list_offset.Items.Strings[i],3,8)=IntToHex(raw_info.src_offset,8) THEN BEGIN
112 list_offset.ItemIndex:=i;
113 Break;
114 END;
115 END;
116 END;
117 Self.ClearStructViewer;
118 SetLength(data,raw_info.raw_size);
119 LoadRawFilebyIDOffset(raw_info.src_id,raw_info.src_offset,@data[0]);
120 IF Length(data)>0 THEN BEGIN
121 hex.DataSize:=0;
122 hex.DataSize:=raw_info.raw_size;
123 FOR i:=0 TO High(data) DO
124 hex.Data[i]:=data[i];
125 //WriteStructureInfos(GetStructureInfoId(GetFileInfo(fileid).Extension));
126 structs.Height:=structs.RowCount*20;
127 IF structs.Height>120 THEN structs.Height:=120;
128 hexSelectionChanged(Self);
129 fileid_opened:=raw_info.src_id;
130 dat_offset_opened:=raw_info.src_offset;
131 hex.Modified:=False;
132 END ELSE BEGIN
133 ClearValues;
134 hex.DataSize:=0;
135 END;
136 END;
137
138PROCEDURE TForm13.Recreatelist;
139 VAR
140 i:LongWord;
141 exts:TStringList;
142 count:LongWord;
143 BEGIN
144 combo_extension.Items.Clear;
145 combo_extension.Items.Add('_All files_ ('{+IntToStr(dat_header.Files)}+')');
146 exts:=GetExtensionsList;
147 FOR i:=0 TO High(RawListHandlers) DO BEGIN
148 count:=Length(GetFilesList(RawListHandlers[i].Ext,'',True));
149 combo_extension.Items.Add(RawListHandlers[i].ext+' ('+IntToStr(count)+')');
150 END;
151// FOR i:=0 TO High(exts) DO
152// combo_extension.Items.Add(exts[i]);
153 combo_extension.ItemIndex:=0;
154 combo_extensionClick(Self);
155 END;
156
157PROCEDURE TForm13.LoadFileNames;
158 VAR
159 Extension:String;
160 no_zero_bytes:Boolean;
161 pattern:String;
162 files:TStringList;
163 i:LongWord;
164 BEGIN
165 Extension:=MidStr(combo_extension.Items.Strings[combo_extension.ItemIndex],1,4);
166 pattern:='';
167 IF check_filtername.Checked THEN pattern:=edit_filtername.Text;
168 IF Extension='_All' THEN BEGIN
169 Extension:='';
170 FOR i:=0 TO High(RawListHandlers) DO BEGIN
171 IF Length(Extension)>0 THEN Extension:=Extension+',';
172 Extension:=Extension+RawListHandlers[i].Ext;
173 END;
174 END;
175
176 files:=GetFilesList(extension,pattern,TRUE);
177 list.Items.Clear;
178 IF Length(files)>0 THEN
179 FOR i:=0 TO High(files) DO
180 list.Items.Add(files[i]);
181 list_offset.Items.Clear;
182 END;
183
184PROCEDURE TForm13.panel_extensionResize(Sender: TObject);
185 BEGIN
186 combo_extension.Width:=panel_extension.Width-5;
187 edit_filtername.Width:=panel_extension.Width-5;
188 END;
189
190PROCEDURE TForm13.combo_extensionClick(Sender: TObject);
191 BEGIN
192 LoadFileNames;
193 END;
194
195PROCEDURE TForm13.check_filternameClick(Sender: TObject);
196 BEGIN
197 edit_filtername.Enabled:=NOT check_filtername.Checked;
198 LoadFileNames;
199 END;
200
201PROCEDURE TForm13.listClick(Sender: TObject);
202 VAR
203 mem:TMemoryStream;
204 data:Tdata;
205 i:LongWord;
206 offsets:TRawList;
207 BEGIN
208 Self.ClearStructViewer;
209 IF hex.Modified THEN BEGIN
210 IF NOT Save THEN BEGIN
211 Exit;
212 END;
213 END;
214 ClearValues;
215 hex.DataSize:=0;
216 fileid:=GetFileIDByName(list.Items.Strings[list.ItemIndex]);
217 list_offset.Enabled:=True;
218 IF GetFileInfo(fileid).size>0 THEN BEGIN
219 offsets:=GetRawList(fileid);
220 list_offset.Items.Clear;
221 IF Length(offsets)>0 THEN BEGIN
222 FOR i:=0 TO High(offsets) DO BEGIN
223 list_offset.Items.Add('0x'+IntToHex(offsets[i].src_offset,8)+', '+IntToStr(offsets[i].raw_size)+' bytes');
224 END;
225 END ELSE BEGIN
226 list_offset.Enabled:=False;
227 END;
228 END ELSE BEGIN
229 list_offset.Enabled:=False;
230 END;
231 END;
232
233PROCEDURE TForm13.list_offsetClick(Sender: TObject);
234 VAR
235 i:LongWord;
236 raw_info:TRawInfo;
237 BEGIN
238 Self.ClearStructViewer;
239 ClearValues;
240 dat_offset:=StrToInt('$'+MidStr(list_offset.Items.Strings[list_offset.ItemIndex],3,8));
241 LoadRaw(GetRawInfo(fileid,dat_offset));
242 END;
243
244
245
246
247FUNCTION IntToBin(value:Byte):String;
248 VAR i:Byte;
249 BEGIN
250 Result:='';
251 FOR i:=7 DOWNTO 0 DO BEGIN
252 Result:=Result+IntToStr((value SHR i) AND $01);
253 END;
254 END;
255
256FUNCTION TForm13.GetValue(datatype:Word; offset:LongWord):String;
257 VAR
258 data:Tdata;
259 i:Word;
260 BEGIN
261 CASE datatype OF
262 1: Result:=IntToStr(hex.data[offset]);
263 2: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256);
264 3: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256);
265 4: Result:=IntToStr(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256+hex.data[offset+3]*256*256*256);
266 5: Result:='0x'+IntToHex(hex.data[offset],2);
267 6: Result:='0x'+IntToHex(hex.data[offset]+hex.data[offset+1]*256,4);
268 7: Result:='0x'+IntToHex(hex.data[offset]+hex.data[offset+1]*256+hex.data[offset+2]*256*256,6);
269 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);
270 9: BEGIN
271 SetLength(data,4);
272 data[0]:=hex.data[offset];
273 data[1]:=hex.data[offset+1];
274 data[2]:=hex.data[offset+2];
275 data[3]:=hex.data[offset+3];
276 Result:=FloatToStr(Decode_Float(data));
277 END;
278 10: Result:=IntToBin(hex.data[offset]);
279 11: 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);
280 10000..65535: BEGIN
281 Result:='';
282 FOR i:=1 TO datatype-10000 DO BEGIN
283 IF hex.Data[offset+i-1]>=32 THEN
284 Result:=Result+Chr(hex.Data[offset+i-1])
285 ELSE
286 Result:=Result+'.';
287 END;
288 END;
289 END;
290 END;
291
292PROCEDURE TForm13.WriteStructureInfos(structinfoid:Integer);
293 VAR
294 i:Byte;
295 BEGIN
296 IF structinfoid>=0 THEN BEGIN
297 structs.Enabled:=True;
298 WITH structure_infos[structinfoid] DO BEGIN
299 Self.structs.RowCount:=Length(entries)+1;
300 FOR i:=1 TO Length(entries) DO BEGIN
301 Self.structs.Cells[0,i]:=entries[i-1].name;
302 Self.structs.Cells[1,i]:='0x'+IntToHex(entries[i-1].offset,6);
303 Self.structs.Cells[2,i]:=GetDataType(entries[i-1].datatype);
304 IF entries[i-1].datatype>10000 THEN
305 Self.structs.Cells[3,i]:='*String*#HINT:'+GetValue(entries[i-1].datatype,entries[i-1].offset)+'#'
306 ELSE
307 Self.structs.Cells[3,i]:=GetValue(entries[i-1].datatype,entries[i-1].offset);
308 Self.structs.Cells[4,i]:=entries[i-1].description;
309 END;
310 END;
311 END;
312 END;
313
314PROCEDURE TForm13.ClearValues;
315 VAR
316 i:Byte;
317 BEGIN
318 FOR i:=1 TO value_viewer.RowCount-1 DO BEGIN
319 value_viewer.Cells[1,i]:='';
320 END;
321 END;
322
323PROCEDURE TForm13.WriteValues;
324 VAR
325 i,j:Byte;
326 data:Tdata;
327 str:String;
328 value:LongWord;
329 BEGIN
330 FOR i:=1 TO value_viewer.RowCount-1 DO BEGIN
331 IF value_viewer.Cells[0,i]='1 byte, unsigned' THEN BEGIN
332 IF ((hex.SelCount=1) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+1)>hex.DataSize) THEN BEGIN
333 value:=hex.Data[hex.SelStart];
334 value_viewer.Cells[1,i]:=IntToStr( value )+' / 0x'+IntToHex( value , 2 );
335 END ELSE
336 value_viewer.Cells[1,i]:='';
337 END;
338 IF value_viewer.Cells[0,i]='2 bytes, unsigned' THEN BEGIN
339 IF ((hex.SelCount=2) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+2)>hex.DataSize) THEN BEGIN
340 value:=hex.Data[hex.SelStart] + hex.Data[hex.SelStart+1]*256;
341 value_viewer.Cells[1,i]:=IntToStr( value )+' / 0x'+IntToHex( value , 4 );
342 END ELSE
343 value_viewer.Cells[1,i]:='';
344 END;
345 IF value_viewer.Cells[0,i]='4 bytes, unsigned' THEN BEGIN
346 IF ((hex.SelCount=4) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+4)>hex.DataSize) THEN BEGIN
347 value:=hex.Data[hex.SelStart]+hex.Data[hex.SelStart+1]*256+hex.Data[hex.SelStart+2]*256*256+hex.Data[hex.SelStart+3]*256*256*256;
348 value_viewer.Cells[1,i]:=IntToStr( value )+' / 0x'+IntToHex( value , 8 );
349 END ELSE
350 value_viewer.Cells[1,i]:='';
351 END;
352 IF value_viewer.Cells[0,i]='Bitset' THEN BEGIN
353 IF (hex.SelCount<=8) THEN BEGIN
354 IF hex.SelCount=0 THEN BEGIN
355 SetLength(data,1);
356 data[0]:=hex.Data[hex.SelStart];
357 END ELSE BEGIN
358 SetLength(data,hex.SelCount);
359 FOR j:=0 TO hex.SelCount-1 DO
360 data[j]:=hex.Data[hex.SelStart+j];
361 END;
362 value_viewer.Cells[1,i]:=DataToBin(data);
363 END ELSE
364 value_viewer.Cells[1,i]:='';
365 END;
366 IF value_viewer.Cells[0,i]='Float' THEN BEGIN
367 IF ((hex.SelCount=4) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+4)>hex.DataSize) THEN BEGIN
368 SetLength(data,4);
369 FOR j:=0 TO 3 DO
370 data[j]:=hex.Data[hex.SelStart+j];
371 value_viewer.Cells[1,i]:=FloatToStr(Decode_Float(data));
372 END ELSE
373 value_viewer.Cells[1,i]:='';
374 END;
375 IF value_viewer.Cells[0,i]='Selected length' THEN BEGIN
376 value_viewer.Cells[1,i]:=IntToStr(hex.SelCount)+' bytes';
377 END;
378 IF value_viewer.Cells[0,i]='String' THEN BEGIN
379 j:=0;
380 str:='';
381 IF hex.SelCount=0 THEN BEGIN
382{ WHILE (hex.Data[hex.SelStart+j]>0) AND ((hex.SelStart+j)<hex.DataSize) DO BEGIN
383 IF hex.Data[hex.selstart+j]>=32 THEN
384 str:=str+Char(hex.Data[hex.SelStart+j])
385 ELSE
386 str:=str+'.';
387 Inc(j);
388 END;
389} END ELSE BEGIN
390 FOR j:=1 TO hex.SelCount DO
391 str:=str+Char(hex.Data[hex.SelStart+j-1]);
392 END;
393 value_viewer.Cells[1,i]:=str;
394 END;
395 END;
396 END;
397
398PROCEDURE TForm13.FormCreate(Sender: TObject);
399 BEGIN
400 Self.Caption:='';
401 fileid:=0;
402 structs.Height:=40;
403 structs.ColCount:=5;
404 structs.RowCount:=2;
405 structs.FixedRows:=1;
406 structs.Cells[0,0]:='Name';
407 structs.Cells[1,0]:='Offset';
408 structs.Cells[2,0]:='Type';
409 structs.Cells[3,0]:='Value';
410 structs.Cells[4,0]:='Description';
411 structs.ColWidths[0]:=75;
412 structs.ColWidths[1]:=60;
413 structs.ColWidths[2]:=75;
414 structs.ColWidths[3]:=75;
415 value_viewer.ColCount:=2;
416 value_viewer.RowCount:=8;
417 value_viewer.FixedRows:=1;
418 value_viewer.Cells[0,0]:='Type';
419 value_viewer.Cells[1,0]:='Value';
420 value_viewer.Cells[0,1]:='1 byte, unsigned';
421 value_viewer.Cells[0,2]:='2 bytes, unsigned';
422 value_viewer.Cells[0,3]:='4 bytes, unsigned';
423 value_viewer.Cells[0,4]:='Bitset';
424 value_viewer.Cells[0,5]:='Float';
425 value_viewer.Cells[0,6]:='String';
426 value_viewer.Cells[0,7]:='Selected length';
427 value_viewer.ColWidths[0]:=100;
428 hex.Height:=panel_data.Height-215;
429 Self.panel_dataResize(Self);
430 END;
431
432FUNCTION TForm13.Save:Boolean;
433 VAR
434 mem:TMemoryStream;
435 data:Tdata;
436 i:LongWord;
437 BEGIN
438 CASE MessageBox(Self.Handle,PChar('Save changes to .raw-part of file '+GetFileInfo(fileid).FileName+'?'),PChar('Data changed...'),MB_YESNOCANCEL) OF
439 IDYES: BEGIN
440 mem:=TMemoryStream.Create;
441 hex.SaveToStream(mem);
442 mem.Seek(0,soFromBeginning);
443 SetLength(data,mem.Size);
444 mem.Read(data[0],mem.Size);
445 mem.Free;
446 UpdateRawFile(GetRawInfo(fileid_opened,dat_offset_opened),@data[0]);
447 hex.Modified:=False;
448 FOR i:=0 TO hex.Datasize-1 DO hex.ByteChanged[i]:=False;
449 Result:=True;
450 END;
451 IDNO: Result:=True;
452 IDCANCEL: BEGIN
453 Result:=False;
454 END;
455 END;
456 END;
457
458PROCEDURE TForm13.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
459 BEGIN
460 IF hex.Modified THEN BEGIN
461 IF NOT Save THEN CanClose:=False;
462 END;
463 END;
464
465PROCEDURE TForm13.ClearStructViewer;
466 VAR
467 x:Word;
468 BEGIN
469 structs.RowCount:=2;
470 FOR x:=0 TO structs.ColCount-1 DO structs.Cells[x,1]:='';
471 structs.Enabled:=False;
472 structs.Height:=40;
473 END;
474
475PROCEDURE TForm13.FormResize(Sender: TObject);
476 BEGIN
477 IF Self.Width>=650 THEN BEGIN
478 END ELSE Self.Width:=650;
479 IF Self.Height>=450 THEN BEGIN
480 END ELSE Self.Height:=450;
481 END;
482
483PROCEDURE TForm13.structsClick(Sender: TObject);
484 VAR
485 offset:LongWord;
486 length:Byte;
487 BEGIN
488 IF structs.Row>0 THEN BEGIN
489 offset:=structure_infos[GetStructureInfoId(GetFileInfo(fileid).extension)].entries[structs.Row-1].offset;
490 length:=GetTypeDataLength(structure_infos[GetStructureInfoId(GetFileInfo(fileid).extension)].entries[structs.Row-1].datatype);
491 hex.SelStart:=offset;
492 hex.SelEnd:=offset+length-1;
493 END;
494 END;
495
496PROCEDURE TForm13.panel_dataResize(Sender: TObject);
497 BEGIN
498 structs.ColWidths[4]:=structs.Width-structs.ColWidths[0]-structs.ColWidths[1]-structs.ColWidths[2]-structs.ColWidths[3]-28;
499 value_viewer.ColWidths[1]:=value_viewer.Width-value_viewer.ColWidths[0]-28;
500 END;
501
502PROCEDURE TForm13.hexChange(Sender: TObject);
503 BEGIN
504 ClearValues;
505 IF hex.DataSize>0 THEN BEGIN
506 WriteStructureInfos(GetStructureInfoId(GetFileInfo(fileid).Extension));
507 WriteValues;
508 END;
509 END;
510
511PROCEDURE TForm13.hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
512 VAR
513 temps: String;
514 BEGIN
515 IF (Shift=[ssCtrl]) AND (Key=Ord('C')) THEN BEGIN
516 IF hex.SelCount>0 THEN BEGIN
517 IF hex.InCharField THEN
518 Clipboard.AsText:=hex.SelectionAsText
519 ELSE
520 Clipboard.AsText:=hex.SelectionAsHex;
521 END;
522 END;
523 IF (Shift=[ssCtrl]) AND (Key=Ord('V')) THEN BEGIN
524{ temps:=Clipboard.AsText;
525 IF hex.SelStart+Length(temps)>hex.DataSize THEN
526 SetLength(temps, hex.DataSize-hex.SelStart);
527 hex.Sel
528 hex.SelCount:=Length(temps);
529 hex.ReplaceSelection(temps,Length(temps));
530} END;
531 END;
532
533PROCEDURE TForm13.hexSelectionChanged(Sender: TObject);
534 VAR
535 selstart:Integer;
536 i,j:Word;
537 BEGIN
538{ FOR i:=1 TO structs.RowCount-1 DO BEGIN
539 FOR j:=0 TO structs.ColCount-1 DO BEGIN
540 structs.CellColors[j,i]:=clWhite;
541 structs.CellFontColors[j,i]:=clBlack;
542 END;
543 END;
544} IF hex.DataSize>0 THEN BEGIN
545{ selstart:=hex.SelStart;
546 IF GetStructureInfoId(GetFileInfo(fileid).Extension)>=0 THEN BEGIN
547 WITH structure_infos[GetStructureInfoId(GetFileInfo(fileid).Extension)] DO BEGIN
548 FOR i:=0 TO High(entries) DO BEGIN
549 IF ((selstart-entries[i].offset)<GetTypeDataLength(entries[i].datatype)) AND ((selstart-entries[i].offset)>=0) THEN BEGIN
550 FOR j:=0 TO structs.ColCount-1 DO BEGIN
551 structs.CellColors[j,i+1]:=clBlue;
552 structs.CellFontColors[j,i+1]:=clWhite;
553 END;
554 structs.Row:=i+1;
555 END;
556 END;
557 END;
558 END;
559} WriteValues;
560 END;
561 END;
562
563PROCEDURE TForm13.FormClose(Sender: TObject; var Action: TCloseAction);
564 BEGIN
565 Action:=caFree;
566 Form1.close_window(Self.Name);
567 END;
568
569PROCEDURE TForm13.panel_imexportResize(Sender: TObject);
570 BEGIN
571 btn_import.Width:=panel_imexport.Width-8;
572 btn_export.Width:=panel_imexport.Width-8;
573 END;
574
575PROCEDURE TForm13.btn_exportClick(Sender: TObject);
576 VAR
577 fs:TFileStream;
578 BEGIN
579 saved.Filter:='Files of matching extension (*.'+GetFileInfo(fileid).Extension+')|*.'+dat_files[fileid].Extension+'|All files|*.*';
580 saved.DefaultExt:=GetFileInfo(fileid).Extension;
581 IF saved.Execute THEN BEGIN
582 fs:=TFileStream.Create(saved.FileName,fmCreate);
583 hex.SaveToStream(fs);
584 fs.Free;
585 END;
586 END;
587
588PROCEDURE TForm13.btn_importClick(Sender: TObject);
589 VAR
590 data:Tdata;
591 fs:TFileStream;
592 BEGIN
593 opend.Filter:='Files of matching extension (*.'+GetFileInfo(fileid).Extension+')|*.'+dat_files[fileid].Extension+'|All files|*.*';
594 IF opend.Execute THEN BEGIN
595 fs:=TFileStream.Create(opend.FileName,fmOpenRead);
596 IF fs.Size<>hex.DataSize THEN BEGIN
597 ShowMessage('Can''t import '+ExtractFilename(opend.FileName)+
598 ', file has to have same size as file in .dat.'+CrLf+
599 'Size of file in .dat: '+FormatFileSize(hex.datasize)+CrLf+
600 'Size of chosen file: '+FormatFileSize(fs.Size));
601 END ELSE BEGIN
602 hex.LoadFromStream(fs);
603 hex.Modified:=True;
604 END;
605 fs.Free;
606 END;
607 END;
608
609PROCEDURE TForm13.FormActivate(Sender: TObject);
610 BEGIN
611 Form1.SetActiveWindow(Self.Name);
612 END;
613
614PROCEDURE TForm13.value_viewer_contextPopup(Sender: TObject);
615 VAR
616 i:Byte;
617 BEGIN
618 FOR i:=0 TO value_viewer_context.Items.Count-1 DO
619 value_viewer_context.Items.Items[i].Visible:=False;
620 WITH value_viewer DO BEGIN
621 IF (Col=1) AND (Row>0) AND (Length(Cells[Col,Row])>0) THEN BEGIN
622 IF Pos(' byte',Cells[0,Row])=2 THEN BEGIN
623 value_viewer_context.Items.Find('Copy to &clipboard').Visible:=True;
624 value_viewer_context.Items.Find('Copy to clipboard (as &dec)').Visible:=True;
625 value_viewer_context.Items.Find('Copy to clipboard (as &hex)').Visible:=True;
626 END;
627 IF Pos('Float',Cells[0,Row])=1 THEN
628 value_viewer_context.Items.Find('Copy to clipboard (as &float)').Visible:=True;
629 IF Pos('Bitset',Cells[0,Row])=1 THEN
630 value_viewer_context.Items.Find('Copy to clipboard (as &bitset)').Visible:=True;
631 IF Pos('String',Cells[0,Row])=1 THEN
632 value_viewer_context.Items.Find('Copy to clipboard (as &string)').Visible:=True;
633 IF Pos('Selected length',Cells[0,Row])=1 THEN
634 value_viewer_context.Items.Find('Copy to &clipboard').Visible:=True;
635 END;
636 END;
637 END;
638
639PROCEDURE TForm13.value_viewerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
640 VAR
641 ACol,ARow:Integer;
642 BEGIN
643 IF Button=mbRight THEN BEGIN
644 value_viewer.MouseToCell(x,y,ACol,ARow);
645 IF ARow>0 THEN BEGIN
646 value_viewer.Col:=ACol;
647 value_viewer.Row:=ARow;
648 END;
649 END;
650 END;
651
652PROCEDURE TForm13.value_viewer_context_copyClick(Sender: TObject);
653 VAR
654 i:Byte;
655 name:String;
656 value:LongWord;
657 BEGIN
658 name:=TMenuItem(Sender).Name;
659 IF Pos('asstring',name)>0 THEN BEGIN
660 Clipboard.AsText:=value_viewer.Cells[value_viewer.Col,value_viewer.Row];
661 END ELSE
662 IF Pos('asfloat',name)>0 THEN BEGIN
663 Clipboard.AsText:=value_viewer.Cells[value_viewer.Col,value_viewer.Row];
664 END ELSE
665 IF Pos('asbitset',name)>0 THEN BEGIN
666 Clipboard.AsText:=value_viewer.Cells[value_viewer.Col,value_viewer.Row];
667 END ELSE
668 IF (Pos('ashex',name)>0) OR (Pos('asdec',name)>0) THEN BEGIN
669 IF value_viewer.Cells[0,value_viewer.Row]='1 byte, unsigned' THEN BEGIN
670 IF ((hex.SelCount=1) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+1)>hex.DataSize) THEN
671 value:=hex.Data[hex.SelStart];
672 END;
673 IF value_viewer.Cells[0,value_viewer.Row]='2 bytes, unsigned' THEN BEGIN
674 IF ((hex.SelCount=2) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+2)>hex.DataSize) THEN
675 value:=hex.Data[hex.SelStart] + hex.Data[hex.SelStart+1]*256;
676 END;
677 IF value_viewer.Cells[0,value_viewer.Row]='4 bytes, unsigned' THEN BEGIN
678 IF ((hex.SelCount=4) OR (hex.SelCount=0)) AND NOT ((hex.SelStart+4)>hex.DataSize) THEN
679 value:=hex.Data[hex.SelStart]+hex.Data[hex.SelStart+1]*256+hex.Data[hex.SelStart+2]*256*256+hex.Data[hex.SelStart+3]*256*256*256;
680 END;
681 IF Pos('asdec',name)>0 THEN BEGIN
682 Clipboard.AsText:=IntToStr(value);
683 END ELSE BEGIN
684 IF value_viewer.Cells[0,value_viewer.Row]='1 byte, unsigned' THEN
685 Clipboard.AsText:='0x'+IntToHex(value,2);
686 IF value_viewer.Cells[0,value_viewer.Row]='2 bytes, unsigned' THEN
687 Clipboard.AsText:='0x'+IntToHex(value,4);
688 IF value_viewer.Cells[0,value_viewer.Row]='4 bytes, unsigned' THEN
689 Clipboard.AsText:='0x'+IntToHex(value,8);
690 END;
691 END ELSE BEGIN
692 Clipboard.AsText:=value_viewer.Cells[value_viewer.Col,value_viewer.Row];
693 END;
694 END;
695
696PROCEDURE TForm13.structsDblClick(Sender: TObject);
697 VAR
698 offset:LongWord;
699 datatype:Word;
700 objectname:String;
701 value:String;
702 BEGIN
703 IF (structs.Row>0) AND (structs.Cells[structs.Col,0]='Value') THEN BEGIN
704 offset:=structure_infos[GetStructureInfoId(GetFileInfo(fileid).extension)].entries[structs.Row-1].offset;
705 datatype:=structure_infos[GetStructureInfoId(GetFileInfo(fileid).extension)].entries[structs.Row-1].datatype;
706 IF datatype<>11 THEN BEGIN
707 objectname:=structure_infos[GetStructureInfoId(GetFileInfo(fileid).extension)].entries[structs.Row-1].name;
708 value:=GetValue(datatype,offset);
709 Form12.MakeVarInput(objectname,offset,datatype,value,Self);
710 END ELSE BEGIN
711 {LOAD RAW-EDITOR}
712 END;
713 END;
714 END;
715
716PROCEDURE TForm13.SetNewValue(datatype:Word; offset:LongWord; value:String);
717 VAR
718 data:Tdata;
719 value_int:LongWord;
720 value_float:Single;
721 i:Word;
722 BEGIN
723 CASE datatype OF
724 1..4: BEGIN
725 value_int:=StrToInt(value);
726 SetLength(data,datatype);
727 FOR i:=0 TO datatype-1 DO BEGIN
728 data[i]:=value_int MOD 256;
729 value_int:=value_int DIV 256;
730 END;
731 END;
732 5..8: BEGIN
733 value_int:=StrToInt('$'+value);
734 SetLength(data,datatype-4);
735 FOR i:=0 TO datatype-5 DO BEGIN
736 data[i]:=value_int MOD 256;
737 value_int:=value_int DIV 256;
738 END;
739 END;
740 9: BEGIN
741 value_float:=StrToFloat(value);
742 data:=Encode_Float(value_float);
743 END;
744 10: BEGIN
745 value_int:=BinToInt(value);
746 SetLength(data,1);
747 data[0]:=value_int;
748 END;
749 10000..65535: BEGIN
750 SetLength(data,datatype-10000);
751 FOR i:=1 TO datatype-10000 DO BEGIN
752 IF i<=Length(value) THEN
753 data[i-1]:=Ord(value[i])
754 ELSE
755 data[i-1]:=0;
756 END;
757 END;
758 END;
759 FOR i:=0 TO High(data) DO BEGIN
760 IF hex.Data[offset+i]<>data[i] THEN hex.ByteChanged[offset+i]:=True;
761 hex.Data[offset+i]:=data[i];
762 END;
763 hex.Modified:=True;
764 hexChange(Self);
765 hex.Repaint;
766 END;
767
768PROCEDURE TForm13.value_viewerDblClick(Sender: TObject);
769 VAR
770 offset:LongWord;
771 datatype:Word;
772 objectname:String;
773 value:String;
774 BEGIN
775 IF (value_viewer.Col=1) AND (Length(value_viewer.Cells[1,value_viewer.Row])>0) THEN BEGIN
776 offset:=hex.SelStart;
777 IF value_viewer.Cells[0,value_viewer.Row]='1 byte, unsigned' THEN
778 datatype:=1;
779 IF value_viewer.Cells[0,value_viewer.Row]='2 bytes, unsigned' THEN
780 datatype:=2;
781 IF value_viewer.Cells[0,value_viewer.Row]='4 bytes, unsigned' THEN
782 datatype:=4;
783 IF value_viewer.Cells[0,value_viewer.Row]='Bitset' THEN
784 datatype:=10;
785 IF value_viewer.Cells[0,value_viewer.Row]='Float' THEN
786 datatype:=9;
787 IF value_viewer.Cells[0,value_viewer.Row]='Selected length' THEN
788 Exit;
789 IF value_viewer.Cells[0,value_viewer.Row]='String' THEN BEGIN
790 IF hex.SelCount>0 THEN
791 datatype:=10000+hex.SelCount
792 ELSE
793 datatype:=10000+Length(value_viewer.Cells[1,value_viewer.Row]);
794 END;
795 objectname:='';
796 value:=GetValue(datatype,offset);
797 Form12.MakeVarInput(objectname,offset,datatype,value,Self);
798 END;
799 END;
800
801PROCEDURE TForm13.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
802 BEGIN
803 IF (Shift=[ssCtrl]) AND (Key=83) THEN
804 IF hex.Modified THEN
805 IF NOT Save THEN
806 Exit;
807 END;
808
809END.
Note: See TracBrowser for help on using the repository browser.