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

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