⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childfrm.pas

📁 === === === MiniHex 1.61 源程序说明 ============================== “$(MiniHex)Source”目录中的所有
💻 PAS
📖 第 1 页 / 共 4 页
字号:
      FillDataInspector;
    end;
  finally
    DataStream.Free;
  end;
end;

//-----------------------------------------------------------------------------
// 描述: 将数据写入磁盘逻辑扇区
// 参数:
//   Drive       - 驱动器(如 'C', 'D')
//   SectorStart - 起始扇区号(0-based)
//-----------------------------------------------------------------------------
function TChildForm.SaveToLogicSector(Drive: Char; SectorStart: Integer): Boolean;
var
  SectorCount: Integer;
  DataStream: TMemoryStream;
begin
  SectorCount := HexEdit.DataSize div DiskIO.BytesPerSector;
  DataStream := TMemoryStream.Create;
  try
    DataStream.SaveToStream(DataStream);
    Result := DiskIOObject.WriteLogicalSector(Drive, SectorStart, SectorCount, DataStream);
  finally
    DataStream.Free;
  end;
end;

procedure TChildForm.ReDraw;
begin
  InitEditorAppearance;
  HexEdit.Invalidate;
end;

procedure TChildForm.FillDataInspector;
var
  ValuePtr: Pointer;
  MaxByte: Integer;
begin
  if not DataInspForm.Visible then Exit;
  ValuePtr := HexEdit.DataAddr + HexEdit.Offset;
  MaxByte := HexEdit.DataSize - HexEdit.Offset;
  DataInspForm.SetData(ValuePtr, MaxByte);
end;

procedure TChildForm.SearchText;
begin
  SearchTextItemClick(nil);
end;

procedure TChildForm.GotoAddress;
begin
  GotoOffsetActionExecute(nil);
end;

procedure TChildForm.Undo;
begin
  HexEdit.Undo;
  AdjustUndoRedoEnabled;
end;

procedure TChildForm.Redo;
begin
  HexEdit.Redo;
  AdjustUndoRedoEnabled;
end;

procedure TChildForm.FormCreate(Sender: TObject);
begin
  FFileName := SDefaultFileName;
  FIsNewDoc := True;
  FShowing := True;
  AdjustUndoRedoEnabled;
  AdjustClipboardEnabled;
  AdjustBlockEnabled;
  InitEditorAppearance;
  MainForm.ChildOpenNotify(Self);
end;

procedure TChildForm.FormActivate(Sender: TObject);
begin
  FillDataInspector;
  AdjustUndoRedoEnabled;
  AdjustClipboardEnabled;
  AdjustBlockEnabled;
  if FShowing then
  begin
    InitBounds;
    FShowing := False;
  end;
  MainForm.ChildActiveNotify(Self);
end;

procedure TChildForm.FormShow(Sender: TObject);
begin
//
end;

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  MainForm.ChildCloseNotify(Self);
end;

procedure TChildForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
  R: Integer;
begin
  CanClose := True;
  if HexEdit.Modified then
  begin
    BringToFront;
    R := MsgBox('数据已被修改,是否保存?', MB_YESNOCANCEL + MB_ICONQUESTION + MB_DEFBUTTON1);
    if R = ID_YES then
      if not Save then CanClose := False;
    if R = ID_CANCEL then
      CanClose := False;
  end;
end;

procedure TChildForm.UndoActionExecute(Sender: TObject);
begin
  Undo;
end;

procedure TChildForm.RedoActionExecute(Sender: TObject);
begin
  Redo;
end;

procedure TChildForm.CopyActionExecute(Sender: TObject);
begin
  HexEdit.CopyToClipboard;
  AdjustClipboardEnabled;
end;

procedure TChildForm.CutActionExecute(Sender: TObject);
begin
  HexEdit.CutToClipboard;
  AdjustClipboardEnabled;
end;

procedure TChildForm.PasteActionExecute(Sender: TObject);
begin
  HexEdit.PasteFromClipboard;
  AdjustClipboardEnabled;
end;

procedure TChildForm.SelAllActionExecute(Sender: TObject);
begin
  HexEdit.SelectAll;
end;

procedure TChildForm.ChgLenActionExecute(Sender: TObject);
var
  BufSize: Integer;
begin
  BufSize := HexEdit.DataSize;
  if ShowSetSizeForm(BufSize, '修改长度', '新的长度(字节):') then
  begin
    HexEdit.DataSize := BufSize;
  end;
end;

procedure TChildForm.InsCharActionExecute(Sender: TObject);

  procedure InsertChar(Ch: Char; Count: Integer);
  var
    S: string;
  begin
    S := StringOfChar(Ch, Count);
    HexEdit.InsertData(HexEdit.Offset, S[1], Count, True);
  end;

  procedure InsertRandomChar(StartVal, EndVal, Count: Integer);
  var
    S: string;
    I: Integer;
  begin
    Randomize;
    SetLength(S, Count);
    for I := 1 to Count do
      S[I] := Chr(Random(EndVal - StartVal + 1) + StartVal);
    HexEdit.InsertData(HexEdit.Offset, S[1], Count, True);
  end;

var
  FormData: TInsCharData;
begin
  if ShowInsCharForm(FormData) then
  begin
    if FormData.Fixed then
      InsertChar(Char(FormData.FixValue), FormData.Count)
    else
      InsertRandomChar(FormData.RndFromVal, FormData.RndToVal, FormData.Count);
  end;
end;

procedure TChildForm.WriteBlockActionExecute(Sender: TObject);
var
  SaveDialog: TSaveDialog;
  FileStream: TFileStream;
  FileName: string;
begin
  if not CheckSelExists then Exit;

  SaveDialog := TSaveDialog.Create(Self);
  try
    SaveDialog.Title := '写块至文件';
    SaveDialog.Filter := '所有文件(*.*)|*.*';
    SaveDialog.Options := SaveDialog.Options + [ofOverwritePrompt];
    if SaveDialog.Execute then
    begin
      FileName := SaveDialog.FileName;
      try
        FileStream := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
        try
          FileStream.Write((HexEdit.DataAddr + HexEdit.SelStart)^, HexEdit.SelLength);
        finally
          FileStream.Free;
        end;
      except
        raise;
        MsgBox('无法写块至文件,请检查磁盘是否可写!', MB_OK + MB_ICONERROR);
      end;
    end;
  finally
    SaveDialog.Free;
  end;
end;

procedure TChildForm.DeleteBlockActionExecute(Sender: TObject);
begin
  if HexEdit.SelLength = 0 then Exit;

  if HexEdit.SelLength = HexEdit.DataSize then
  begin
    MsgBox('不能删除整个缓冲区。');
    Exit;
  end;

  HexEdit.DeleteSelection(True);
  ShowStatusInfo;
  FillDataInspector;
end;

procedure TChildForm.FillBlockActionExecute(Sender: TObject);
var
  FormData: TFillBlockData;
  S: string;
  I, Count: Integer;
begin
  if not CheckSelExists then Exit;

  if ShowFillBlockForm(FormData) then
  begin
    Count := HexEdit.SelLength;
    if FormData.Fixed then
    begin
      S := StringOfChar(Chr(FormData.FixValue), Count);
    end else
    begin
      Randomize;
      SetLength(S, Count);
      for I := 1 to Count do
        S[I] := Chr(Random(FormData.RndToVal - FormData.RndFromVal + 1) + FormData.RndToVal);
    end;
    HexEdit.ModifyData(HexEdit.SelStart, S[1], Count, True);

    ShowStatusInfo;
    FillDataInspector;
  end;
end;

procedure TChildForm.DefBlockActionExecute(Sender: TObject);
var
  FormData: TDefBlockData;
begin
  FormData.StartOffset := HexEdit.SelStart;
  FormData.EndOffset := HexEdit.SelStart + HexEdit.SelLength - 1;
  if ShowDefBlockForm(FormData) then
  begin
    HexEdit.SelStart := FormData.StartOffset;
    HexEdit.SelLength := FormData.EndOffset - FormData.StartOffset + 1;
    ShowStatusInfo;
  end;
end;

procedure TChildForm.AdjustBlockActionExecute(Sender: TObject);
var
  FormData: TAdjBlockData;
  SelStart, SelEnd: Integer;
begin
  if not CheckSelExists then Exit;

  if ShowAdjBlockForm(FormData) then
  begin
    SelStart := HexEdit.SelStart;
    SelEnd := HexEdit.SelStart + HexEdit.SelLength - 1;

    if FormData.AdjPos then
    begin
      if FormData.PosDire = 0 then
      begin
        Dec(SelStart, FormData.PosDist);
        Dec(SelEnd, FormData.PosDist);
      end else
      begin
        Inc(SelStart, FormData.PosDist);
        Inc(SelEnd, FormData.PosDist);
      end;
    end else
    begin
      if FormData.SizeStartDire = 0 then
        Dec(SelStart, FormData.SizeStartDist)
      else
        Inc(SelStart, FormData.SizeStartDist);
      if FormData.SizeEndDire = 0 then
        Dec(SelEnd, FormData.SizeEndDist)
      else
        Inc(SelEnd, FormData.SizeEndDist);
    end;
    if SelStart < 0 then SelStart := 0;
    if SelEnd < 0 then SelEnd := 0;
    if SelStart >= HexEdit.DataSize then SelStart := HexEdit.DataSize - 1;
    if SelEnd >= HexEdit.DataSize then SelEnd := HexEdit.DataSize - 1;

    HexEdit.SelStart := SelStart;
    HexEdit.SelLength := SelEnd - SelStart + 1;

    ShowStatusInfo;
  end;
end;

procedure TChildForm.GotoOffsetActionExecute(Sender: TObject);
var
  FormData: TGotoOffsetData;
  Rate, Offset: Integer;
begin
  Rate := 1;
  Offset := 0;
  if ShowGotoOffsetForm(FormData) then
  begin
    case FormData.OffUnit of
      0: Rate := 1;
      1: Rate := 2;
      2: Rate := 4;
    end;
    case FormData.Relative of
      0: Offset := FormData.Offset * Rate;
      1: Offset := HexEdit.Offset + FormData.Offset * Rate;
      2: Offset := HexEdit.Offset - FormData.Offset * Rate;
      3: Offset := HexEdit.DataSize - 1 - FormData.Offset * Rate;
    end;
    HexEdit.Offset := Offset;
  end;
end;

procedure TChildForm.EditConvCharsetItemClick(Sender: TObject);

  procedure TransCharsetRange(Offset, Count: Integer; FromType, ToType: TCharsetType);
  var
    CurPtr: PChar;
    S: string;
  begin
    if FromType = ToType then Exit;
    CurPtr := HexEdit.DataAddr + Offset;

    SetLength(S, Count);
    Move(CurPtr^, S[1], Count);
    TranslateBufferToAnsi(FromType, @S[1], @S[1], Count);
    TranslateBufferFromAnsi(ToType, @S[1], @S[1], Count);
    HexEdit.ModifyData(Offset, S[1], Count, True);
  end;

var
  FormData: TConvChrsetData;
  StartOffset, Count: Integer;
begin
  if ShowConvChrsetForm(FormData) then
  begin
    if FormData.OnlyBlock then
    begin
      if not CheckSelExists then Exit;
      StartOffset := HexEdit.SelStart;
      Count := HexEdit.SelLength;
    end else
    begin
      StartOffset := 0;
      Count := HexEdit.DataSize;
    end;
    TransCharsetRange(StartOffset, Count, FormData.FromType, FormData.ToType);

    ShowStatusInfo;
    FillDataInspector;
  end;
end;

procedure TChildForm.EditConvCryptItemClick(Sender: TObject);

  procedure TransCryptRange(Offset, Count: Integer; const Password: string;
    Encrypt: Boolean);
  const
    MaxKeySize = 256;
  var
    Gost: TGost;
    Key: array[0..MaxKeySize-1] of Byte;
    S: string;
    CurPtr: PChar;
  begin
    CurPtr := HexEdit.DataAddr + Offset;

    SetLength(S, Count);
    Move(CurPtr^, S[1], Count);

    FillChar(Key[0], MaxKeySize, 0);
    StrLCopy(@Key[0], PChar(Password), MaxKeySize);
    Gost := TGost.Create(@Key[0]);
    if Encrypt then
      Gost.GostEncryptCFB(@S[1], @S[1], Count)
    else
      Gost.GostDecryptCFB(@S[1], @S[1], Count);
    Gost.Free;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -