Код | begin {Если файл очень большой, то его бессмысленно сразу весь загружать в прогу, т.к. может даже не хватить памяти для этого. Будем загружать его по кусочкам} Caption := 'Редактор двоичных файлов - ' + OpenDialog1.FileName; MaxLineCount := (Memo.Height div Memo.Font.Size) * 60 div 100 - 1; fSize := FileSize(OpenDialog1.FileName); // Определяем размер файла
ScrollBar1.Enabled := True; ScrollBar1.PageSize := 1; ScrollBar1.LargeChange := 1; ScrollBar1.Max := 100; // Вычисляем характеристики ScrollBar if (fSize div 16 - (MaxLineCount - 2)) > 1 then begin ScrollBar1.Max := fSize div 16 - (MaxLineCount - 2); ScrollBar1.PageSize := MaxLineCount div ScrollBar1.Max; ScrollBar1.LargeChange := MaxLineCount - 1; end else begin ScrollBar1.Max := 1; ScrollBar1.PageSize := 1; ScrollBar1.LargeChange := 1; ScrollBar1.Enabled := False; end; ScrollBar1.Position := 0; ScrollBar1Change(Sender); end;
|
Код | var Fs: TFileStream; StartByte: Integer; BytesCount, MaxBytesCount: Integer; Ar: array[1..1000] of Byte; S, STxt: string; I: Integer; C: Byte; Pos: Integer; LastAdr: Integer; begin // По позиции ползунка определяем, с какой строки надо начать // считывание инфы из файла
if ScrollBar1.Max = 1 then StartByte := 0 else StartByte := ScrollBar1.Position * 16 - 16; MaxBytesCount := MaxLineCount * 16; if fSize - StartByte >= MaxBytesCount then BytesCount := MaxBytesCount else BytesCount := fSize - StartByte;
MemSelStart := Memo.SelStart; Memo.Clear; Fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); Fs.Seek(StartByte, soFromBeginning); Pos := Fs.Position; Fs.Read(Ar, BytesCount); Fs.Free;
C := 0; LastAdr := 0;
// Цикл заполнения окна Memo for I := 1 to BytesCount do begin Inc(C); S := S + IntToHex(Ar[I], 2) + ' '; if (Ar[I] = 0) or (Ar[I] = $09) or (Ar[I] = $0D) or (Chr(Ar[I]) = '') then STxt := STxt + Chr($10) else STxt := STxt + Chr(Ar[I]);
if C = 8 then S[Length(S)] := '|';
if (C = 16) then begin Inc(Pos, C); Memo.Lines.Append(IntToHex(Pos - 16, 8) + ': ' + S + '| ' + STxt); S := ''; STxt := ''; C := 0; LastAdr := Pos; end;
if (I = BytesCount) and (C > 0) then begin while Length(S) < 48 do S := S + ' '; Memo.Lines.Append(IntToHex(LastAdr, 8) + ': ' + S + '| ' + STxt); Break; end; // if end; // for if MemSelStart > Length(Memo.Text) - 80 then MemSelStart := Length(Memo.Text) - 80; Memo.SelStart := MemSelStart; end;
|
Код | var FS: TFileStream; B: Byte; begin if LabeledEditHEX.Text = '' then Exit; B := Strtoint('$' + LabeledEditHEX.Text); FS := TFileStream.Create(OpenDialog1.FileName, fmOpenWrite); FS.Seek(StatusBar1.Tag, soFromBeginning); FS.Write(B, 1); FS.Free; ScrollBar1Change(Sender); end;
|
|