source: oup/releases/0.28a/Unit13_rawedit.pas@ 979

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