📄 childfrm.pas
字号:
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 + -