source: oup/_old_/Tools/RawEdit.pas@ 128

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