source: oup/current/Tools/RawEdit.pas@ 69

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