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

Last change on this file since 74 was 72, 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{
388 value_viewer.ColCount := 2;
389 value_viewer.RowCount := 8;
390}
391 value_viewer.FixedRows := 1;
392 value_viewer.Cells[0, 0] := 'Type';
393 value_viewer.Cells[1, 0] := 'Value';
394 value_viewer.Cells[0, 1] := '1 byte, unsigned';
395 value_viewer.Cells[0, 2] := '2 bytes, unsigned';
396 value_viewer.Cells[0, 3] := '4 bytes, unsigned';
397 value_viewer.Cells[0, 4] := 'Bitset';
398 value_viewer.Cells[0, 5] := 'Float';
399 value_viewer.Cells[0, 6] := 'String';
400 value_viewer.Cells[0, 7] := 'Selected length';
401 value_viewer.ColWidths[0] := 100;
402 //
403 value_viewer.Font.Charset := AppSettings.CharSet;
404 //
405end;
406
407
408
409
410function TForm_RawEdit.Save: Boolean;
411var
412 mem: TMemoryStream;
413 Data: Tdata;
414 i: LongWord;
415begin
416 case MessageBox(Self.Handle, PChar('Save changes to .raw-part of file ' +
417 OniDataConnection.GetFileInfo(fileid).FileName + '?'), PChar('Data changed...'),
418 MB_YESNOCANCEL) of
419 idYes:
420 begin
421 mem := TMemoryStream.Create;
422 hex.SaveToStream(mem);
423 mem.Seek(0, soFromBeginning);
424 SetLength(Data, mem.Size);
425 mem.Read(Data[0], mem.Size);
426 mem.Free;
427 OniDataConnection.UpdateRawFile(fileid_opened, dat_offset_opened,
428 Length(Data), @Data[0]);
429 hex.Modified := False;
430 for i := 0 to hex.Datasize - 1 do
431 hex.ByteChanged[i] := False;
432 Result := True;
433 end;
434 idNo:
435 Result := True;
436 idCancel:
437 begin
438 Result := False;
439 end;
440 end;
441end;
442
443
444
445
446procedure TForm_RawEdit.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
447begin
448 if hex.Modified then
449 begin
450 if not Save then
451 CanClose := False;
452 end;
453end;
454
455
456
457
458procedure TForm_RawEdit.panel_contentResize(Sender: TObject);
459begin
460 if fileid >= 0 then
461 value_viewer.ColWidths[1] := value_viewer.Width - value_viewer.ColWidths[0] - 50;
462end;
463
464
465
466
467procedure TForm_RawEdit.hexChange(Sender: TObject);
468begin
469 ClearValues;
470 if hex.DataSize > 0 then
471 begin
472{ WriteStructureInfos(GetStructureInfoId(GetFileInfo(fileid).Extension));
473 WriteValues;
474} end;
475end;
476
477
478
479
480procedure TForm_RawEdit.hexKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
481var
482 temps: String;
483begin
484 if (Shift = [ssCtrl]) and (Key = Ord('C')) then
485 begin
486 if hex.SelCount > 0 then
487 begin
488 if hex.InCharField then
489 Clipboard.AsText := hex.SelectionAsText
490 else
491 Clipboard.AsText := hex.SelectionAsHex;
492 end;
493 end;
494 if (Shift = [ssCtrl]) and (Key = Ord('V')) then
495 begin
496{ temps:=Clipboard.AsText;
497 IF hex.SelStart+Length(temps)>hex.DataSize THEN
498 SetLength(temps, hex.DataSize-hex.SelStart);
499 hex.Sel
500 hex.SelCount:=Length(temps);
501 hex.ReplaceSelection(temps,Length(temps));
502} end;
503end;
504
505
506
507
508procedure TForm_RawEdit.hexSelectionChanged(Sender: TObject);
509var
510 selstart: Integer;
511 i, j: Word;
512begin
513{ FOR i:=1 TO structs.RowCount-1 DO BEGIN
514 FOR j:=0 TO structs.ColCount-1 DO BEGIN
515 structs.CellColors[j,i]:=clWhite;
516 structs.CellFontColors[j,i]:=clBlack;
517 END;
518 END;
519} if hex.DataSize > 0 then
520 begin
521{ selstart:=hex.SelStart;
522 IF GetStructureInfoId(GetFileInfo(fileid).Extension)>=0 THEN BEGIN
523 WITH structure_infos[GetStructureInfoId(GetFileInfo(fileid).Extension)] DO BEGIN
524 FOR i:=0 TO High(entries) DO BEGIN
525 IF ((selstart-entries[i].offset)<GetTypeDataLength(entries[i].datatype)) AND ((selstart-entries[i].offset)>=0) THEN BEGIN
526 FOR j:=0 TO structs.ColCount-1 DO BEGIN
527 structs.CellColors[j,i+1]:=clBlue;
528 structs.CellFontColors[j,i+1]:=clWhite;
529 END;
530 structs.Row:=i+1;
531 END;
532 END;
533 END;
534 END;
535} WriteValues;
536 end;
537end;
538
539
540
541
542
543procedure TForm_RawEdit.btn_exportClick(Sender: TObject);
544var
545 fs: TFileStream;
546begin
547 saved.Filter := 'Files of matching extension (*.' + OniDataConnection.GetFileInfo(
548 fileid).Extension + ')|*.' + OniDataConnection.GetFileInfo(fileid).Extension +
549 '|All files|*.*';
550 saved.DefaultExt := OniDataConnection.GetFileInfo(fileid).Extension;
551 if saved.Execute then
552 begin
553 fs := TFileStream.Create(saved.FileName, fmCreate);
554 hex.SaveToStream(fs);
555 fs.Free;
556 end;
557end;
558
559
560
561
562procedure TForm_RawEdit.btn_importClick(Sender: TObject);
563var
564 Data: Tdata;
565 fs: TFileStream;
566begin
567 opend.Filter := 'Files of matching extension (*.' + OniDataConnection.GetFileInfo(
568 fileid).Extension + ')|*.' + OniDataConnection.GetFileInfo(fileid).Extension +
569 '|All files|*.*';
570 if opend.Execute then
571 begin
572 fs := TFileStream.Create(opend.FileName, fmOpenRead);
573 if fs.Size <> hex.DataSize then
574 begin
575 ShowMessage('Can''t import ' + ExtractFilename(opend.FileName) +
576 ', file has to have same size as file in .dat.' + CrLf +
577 'Size of file in .dat: ' + FormatFileSize(hex.datasize) + CrLf +
578 'Size of chosen file: ' + FormatFileSize(fs.Size));
579 end
580 else
581 begin
582 hex.LoadFromStream(fs);
583 hex.Modified := True;
584 end;
585 fs.Free;
586 end;
587end;
588
589
590
591
592procedure TForm_RawEdit.value_viewer_contextPopup(Sender: TObject);
593var
594 i: Byte;
595begin
596 for i := 0 to value_viewer_context.Items.Count - 1 do
597 value_viewer_context.Items.Items[i].Visible := False;
598 with value_viewer do
599 begin
600 if (Col = 1) and (Row > 0) and (Length(Cells[Col, Row]) > 0) then
601 begin
602 if Pos(' byte', Cells[0, Row]) = 2 then
603 begin
604 value_viewer_context.Items.Find('Copy to &clipboard').Visible := True;
605 value_viewer_context.Items.Find('Copy to clipboard (as &dec)').Visible := True;
606 value_viewer_context.Items.Find('Copy to clipboard (as &hex)').Visible := True;
607 end;
608 if Pos('Float', Cells[0, Row]) = 1 then
609 value_viewer_context.Items.Find('Copy to clipboard (as &float)').Visible := True;
610 if Pos('Bitset', Cells[0, Row]) = 1 then
611 value_viewer_context.Items.Find(
612 'Copy to clipboard (as &bitset)').Visible := True;
613 if Pos('String', Cells[0, Row]) = 1 then
614 value_viewer_context.Items.Find(
615 'Copy to clipboard (as &string)').Visible := True;
616 if Pos('Selected length', Cells[0, Row]) = 1 then
617 value_viewer_context.Items.Find('Copy to &clipboard').Visible := True;
618 end;
619 end;
620end;
621
622
623
624
625procedure TForm_RawEdit.value_viewerMouseDown(Sender: TObject; Button: TMouseButton;
626 Shift: TShiftState; X, Y: Integer);
627var
628 ACol, ARow: Integer;
629begin
630 if Button = mbRight then
631 begin
632 value_viewer.MouseToCell(x, y, ACol, ARow);
633 if ARow > 0 then
634 begin
635 value_viewer.Col := ACol;
636 value_viewer.Row := ARow;
637 end;
638 end;
639end;
640
641
642
643
644procedure TForm_RawEdit.value_viewer_context_copyClick(Sender: TObject);
645var
646 i: Byte;
647 Name: String;
648 Value: LongWord;
649begin
650 Name := TMenuItem(Sender).Name;
651 if Pos('asstring', Name) > 0 then
652 begin
653 Clipboard.AsText := value_viewer.Cells[value_viewer.Col, value_viewer.Row];
654 end
655 else if Pos('asfloat', Name) > 0 then
656 begin
657 Clipboard.AsText := value_viewer.Cells[value_viewer.Col, value_viewer.Row];
658 end
659 else if Pos('asbitset', Name) > 0 then
660 begin
661 Clipboard.AsText := value_viewer.Cells[value_viewer.Col, value_viewer.Row];
662 end
663 else if (Pos('ashex', Name) > 0) or (Pos('asdec', Name) > 0) then
664 begin
665 if value_viewer.Cells[0, value_viewer.Row] = '1 byte, unsigned' then
666 begin
667 if ((hex.SelCount = 1) or (hex.SelCount = 0)) and not
668 ((hex.SelStart + 1) > hex.DataSize) then
669 Value := hex.Data[hex.SelStart];
670 end;
671 if value_viewer.Cells[0, value_viewer.Row] = '2 bytes, unsigned' then
672 begin
673 if ((hex.SelCount = 2) or (hex.SelCount = 0)) and not
674 ((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
678 begin
679 if ((hex.SelCount = 4) or (hex.SelCount = 0)) and not
680 ((hex.SelStart + 4) > hex.DataSize) then
681 Value := hex.Data[hex.SelStart] + hex.Data[hex.SelStart + 1] * 256 +
682 hex.Data[hex.SelStart + 2] * 256 * 256 + hex.Data[hex.SelStart + 3] * 256 * 256 * 256;
683 end;
684 if Pos('asdec', Name) > 0 then
685 begin
686 Clipboard.AsText := IntToStr(Value);
687 end
688 else
689 begin
690 if value_viewer.Cells[0, value_viewer.Row] = '1 byte, unsigned' then
691 Clipboard.AsText := '0x' + IntToHex(Value, 2);
692 if value_viewer.Cells[0, value_viewer.Row] = '2 bytes, unsigned' then
693 Clipboard.AsText := '0x' + IntToHex(Value, 4);
694 if value_viewer.Cells[0, value_viewer.Row] = '4 bytes, unsigned' then
695 Clipboard.AsText := '0x' + IntToHex(Value, 8);
696 end;
697 end
698 else
699 begin
700 Clipboard.AsText := value_viewer.Cells[value_viewer.Col, value_viewer.Row];
701 end;
702end;
703
704
705
706
707procedure TForm_RawEdit.SetNewValue(datatype: Word; offset: LongWord; Value: String);
708var
709 Data: Tdata;
710 value_int: LongWord;
711 value_float: Single;
712 i: Word;
713begin
714 case datatype of
715 1..4:
716 begin
717 value_int := StrToInt(Value);
718 SetLength(Data, datatype);
719 for i := 0 to datatype - 1 do
720 begin
721 Data[i] := value_int mod 256;
722 value_int := value_int div 256;
723 end;
724 end;
725 5..8:
726 begin
727 value_int := StrToInt('$' + Value);
728 SetLength(Data, datatype - 4);
729 for i := 0 to datatype - 5 do
730 begin
731 Data[i] := value_int mod 256;
732 value_int := value_int div 256;
733 end;
734 end;
735 9:
736 begin
737 value_float := StrToFloat(Value);
738 Data := Encode_Float(value_float);
739 end;
740 10:
741 begin
742 value_int := BinToInt(Value);
743 SetLength(Data, 1);
744 Data[0] := value_int;
745 end;
746 10000..65535:
747 begin
748 SetLength(Data, datatype - 10000);
749 for i := 1 to datatype - 10000 do
750 begin
751 if i <= Length(Value) then
752 Data[i - 1] := Ord(Value[i])
753 else
754 Data[i - 1] := 0;
755 end;
756 end;
757 end;
758 for i := 0 to High(Data) do
759 begin
760 if hex.Data[offset + i] <> Data[i] then
761 hex.ByteChanged[offset + i] := True;
762 hex.Data[offset + i] := Data[i];
763 end;
764 hex.Modified := True;
765 hexChange(Self);
766 hex.Repaint;
767end;
768
769
770
771
772procedure TForm_RawEdit.value_viewerDblClick(Sender: TObject);
773var
774 offset: LongWord;
775 datatype: Word;
776 objectname: String;
777 Value: String;
778begin
779 if (value_viewer.Col = 1) and (Length(value_viewer.Cells[1, value_viewer.Row]) > 0) then
780 begin
781 offset := hex.SelStart;
782 if value_viewer.Cells[0, value_viewer.Row] = '1 byte, unsigned' then
783 datatype := 1;
784 if value_viewer.Cells[0, value_viewer.Row] = '2 bytes, unsigned' then
785 datatype := 2;
786 if value_viewer.Cells[0, value_viewer.Row] = '4 bytes, unsigned' then
787 datatype := 4;
788 if value_viewer.Cells[0, value_viewer.Row] = 'Bitset' then
789 datatype := 10;
790 if value_viewer.Cells[0, value_viewer.Row] = 'Float' then
791 datatype := 9;
792 if value_viewer.Cells[0, value_viewer.Row] = 'Selected length' then
793 Exit;
794 if value_viewer.Cells[0, value_viewer.Row] = 'String' then
795 begin
796 if hex.SelCount > 0 then
797 datatype := 10000 + hex.SelCount
798 else
799 datatype := 10000 + Length(value_viewer.Cells[1, value_viewer.Row]);
800 end;
801 objectname := '';
802 Value := GetValue(datatype, offset);
803 Form_ValueEdit.MakeVarInput(objectname, offset, datatype, Value, Self);
804 end;
805end;
806
807
808
809
810procedure TForm_RawEdit.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
811begin
812 if (Shift = [ssCtrl]) and (Key = 83) then
813 if hex.Modified then
814 if not Save then
815 Exit;
816end;
817
818begin
819 AddToolListEntry('rawedit', 'Binary .raw-Editor', '');
820end.
Note: See TracBrowser for help on using the repository browser.