unit ValueEdit;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CrossEdit, Math;

type
  TForm_ValueEdit = class(TForm)
    group:      TGroupBox;
    btn_ok:     TButton;
    btn_cancel: TButton;
    lbl_current: TLabel;
    edit_current: TEdit;
    lbl_new:    TLabel;
    lbl_offset: TLabel;
    lbl_datatype: TLabel;
    edit_offset: TEdit;
    edit_datatype: TEdit;
    procedure btn_cancelClick(Sender: TObject);
    procedure btn_okClick(Sender: TObject);
    procedure MakeVarInput(objectname: String; offset: Integer;
      datatype: Word; current: String; caller: TObject);
    procedure FormCreate(Sender: TObject);
  private
  public
    edit_new:   TCrossEdit;
  end;

var
  Form_ValueEdit: TForm_ValueEdit;


implementation

uses BinEdit, RawEdit, DatStructureLoader, Main;

{$R *.dfm}

var
  caller_win_dat: TForm_BinEdit;
  caller_win_raw: TForm_RawEdit;
  _datatype: Word;
  _offset: Integer;




procedure TForm_ValueEdit.MakeVarInput(objectname: String; offset: Integer;
  datatype: Word; current: String; caller: TObject);
begin
  caller_win_dat := nil;
  caller_win_raw := nil;
  if Pos('rawedit', TComponent(caller).Name) > 0 then
    caller_win_raw := TForm_RawEdit(caller)
  else
    caller_win_dat := TForm_BinEdit(caller);
  Form_Main.Enabled := False;
  Self.Visible := True;
  group.Caption := 'Edit value';
  _datatype := datatype;
  _offset := offset;
  if Length(objectname) > 0 then
    group.Caption := group.Caption + ' for ' + objectname;
  edit_offset.Text := '0x' + IntToHex(offset, 8);
  edit_datatype.Text := GetDataType(datatype);
  edit_current.Text := current;
  edit_new.EditType := etString;
  edit_new.Text := '';
  edit_new.MaxLength := 0;
  edit_new.Max := 0;
  edit_new.BorderStyle := bsSingle;
  Self.Width := 300;
  case datatype of
    1..4:
    begin
      edit_new.EditType := etUnsignedInt;
      edit_new.LimitCheck := True;
      edit_new.Max := Int(Power(256, datatype)) - 1;
    end;
    5..8:
    begin
      edit_new.MaxLength := 2 * (datatype - 4);
      edit_new.EditType  := etHex;
    end;
    9:
    begin
      edit_new.EditType   := etFloat;
      edit_new.LimitCheck := False;
    end;
    10:
    begin
      edit_new.EditType   := etBinary;
      edit_new.LimitCheck := False;
      edit_new.MaxLength  := 8;
    end;
    13..16:
    begin
      Exit;
      edit_new.EditType := etInteger;
      edit_new.LimitCheck := True;
      edit_new.Max := Int((Power(256, datatype - 13)) / 2) - 1;
      edit_new.Min := 1 - Int((Power(256, datatype - 13)) / 2) - 1;
    end;
    10000..65535:
    begin
      edit_new.EditType := etString;
      edit_new.LimitCheck := False;
      edit_new.MaxLength := datatype - 10000;
      Self.Width := 700;
    end;
  end;
  edit_new.Text := current;
  edit_new.SetFocus;
  edit_new.SelectAll;
end;




procedure TForm_ValueEdit.btn_okClick(Sender: TObject);
begin
  if not edit_new.NoValidValue then
  begin
    Form_Main.Enabled := True;
    Self.Visible  := False;
    if caller_win_dat = nil then
      caller_win_raw.SetNewValue(_datatype, _offset, edit_new.Text)
    else
      caller_win_dat.SetNewValue(_datatype, _offset, edit_new.Text);
  end;
end;




procedure TForm_ValueEdit.FormCreate(Sender: TObject);
begin
  DecimalSeparator := '.';
  edit_new := TCrossEdit.Create(Self);
  with edit_new do
  begin
    Left := 88;
    Top := 88;
    Width := 203;
    Height := 18;
    Anchors := [akLeft, akTop, akRight];
    AutoSize := False;
    BorderStyle := bsNone;
    Color := clWhite;
    Font.Charset := DEFAULT_CHARSET;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'Tahoma';
    Font.Style := [];
    HideSelection := False;
    ParentFont := False;
    TabOrder := 5;
    Text := '0000';
    FocusAlignment := taLeftJustify;
    NoFocusAlignment := taLeftJustify;
    Precision := 15;
    Decimals := 14;
    FocusWidthInc := 0;
    EditType := etHex;
    NextDialogOnEnter := True;
    DialogOnCursorKeys := True;
    NextPriorStep := 1;
    AutoFocus := False;
    LimitCheck := True;
    Max := 2147483647.000000000000000000;
    FocusColor := clWhite;
    NoFocusColor := clWhite;
    ErrorColor := clRed;
    StringCharSet := scFull;
  end;
  Self.InsertControl(edit_new);
end;

procedure TForm_ValueEdit.btn_cancelClick(Sender: TObject);
begin
  Form_Main.Enabled := True;
  Self.Visible  := False;
end;

end.
