source: oup/releases/0.28a/Unit8_binedit.pas@ 477

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