Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2009, 20:14   #1
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию Delphi: Создание Hex-блокнота

Пытаюсь написать шестнадцатиричный блокнот, даже немного сообразил как это сделать, но в силу того, что я написал достаточно кривой код программа сообщает о том что файл не найден.
Подскажите пожалуйста, как мне более правильней написать эту процедуру. Вот мой кривой код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f: file of byte;
b: byte;
s: string;
begin
RichEdit1.Clear;
s:= OpenTextFileDialog1.FileName;
assignfile(f, 's');
reset(f);
while not eof(f) do
begin
RichEdit1.Lines.LoadFromFile(OpenTextFileDialog1.FileName);
read(f, b);
RichEdit1.Text := RichEdit1.Text+IntToHex(b, 2) + ' ';
end;
CloseFile(f);
end;
В общем нужно загрузить файл в TRichEdit в шестнадцатиричном виде, но мне это пока не удается.

Последний раз редактировалось Stilet; 03.08.2009 в 09:10.
Ser11 вне форума Ответить с цитированием
Старый 02.08.2009, 22:54   #2
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Ну все ясно! Зачем вы каждый раз грузите файл (RichEdit1.Lines.LoadFromFile(OpenT e xtFileDialog1.FileName); )?
Уберите его вообще.
Для этого лучше использовать файловые потоки:
Код:
 
var Stream: TFileStream; 
buf:byte;  
i:int64;
begin 
 if Not OpenDlg.Execute then Exit;  
 Stream:=TFileStream.Create(OpenDlg.FileName, fmOpenRead); 
 Stream.Seek(0,soFromBeginning); 
 i:=0;
 while i<Stream.Size do
   begin
     Stream.Read(buf,SizeOf(buf));
     RichEdit1.Text:= RichEdit1.Text+IntToHex(buf, 2) + ' ';
     inc(i);
   end;
end
Вот как-то так
P.S. i - нужно будет вам в дальнейшем, для расчета адресации. Удачи
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 03.08.2009, 09:01   #3
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

Большое спасибо, код отлично работает.

А к примеру Notepad++ в каком формате отображает данные? В обычном TMemo и TRichEdit видны не все символы
Ser11 вне форума Ответить с цитированием
Старый 03.08.2009, 09:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А к примеру Notepad++ в каком формате отображает данные?
Ты имеешь ввиду шестнадцатиричное отображение? Так эо можно и в обычном Мемо замутить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.08.2009, 10:05   #5
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А также есть куча функций для работы с файлами по его хендлу в модуле SysUtils,
такие как FileOpen и.т.д.
VintProg вне форума Ответить с цитированием
Старый 03.08.2009, 10:26   #6
Ser11
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 13
По умолчанию

Цитата:
Ты имеешь ввиду шестнадцатиричное отображение? Так эо можно и в обычном Мемо замутить.
Да, вот как раз я это и имел в виду. Не дадите ли подсказку как это реализовать в Мемо?
Цитата:
А также есть куча функций для работы с файлами по его хендлу в модуле SysUtils
Об этом я тоже хотел бы узнать, но не нашел этот файл.
У меня стоит делфи2009. Я слышал что в делфи7 демо-программы есть, даже блокнот, но папки с примерами я не нашел.
Ser11 вне форума Ответить с цитированием
Старый 03.08.2009, 11:09   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Отчего же нет? Этоне сложно:
Код:
var
 i:byte;
 f:file of byte;
begin
Memo1.WordWrap:=true;Memo1.Lines.Clear;
 assignfile(f,'unit1.pas');reset(f);
  while not eof(f) do begin
   read(f,i);
   Memo1.Lines.Text:=Memo1.Lines.Text+format('%x',[i])+' ';
  end;
 CloseFile(f);
end;
Вот пожалуйста. Файл считается и проинтерпретируется в HEX коды.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.08.2009, 11:09   #8
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Если ты хочешь сделать красивый HEX редактор, лучше используй компонент StringGrid. С ним легко работать, и обрабатывать данные.
Мой измененный код будет выглядеть так:
Код:
var Stream: TFileStream; 
buf:byte;  
i,j:int64;
begin 
 if Not OpenDlg.Execute then Exit;  
 Stream:=TFileStream.Create(OpenDlg.FileName, fmOpenRead); 
 Stream.Seek(0,soFromBeginning); 
 i:=0;
 j:=0;
 while i<Stream.Size do
   begin
     Stream.Read(buf,SizeOf(buf));
     StringGrid.Cells[j,i]:=IntToHex(buf, 2);
     inc(j);
     if (j<StringGrid.ColCount) then
      begin
       inc(i);
       j:=0;
       StringGrid.RowCount:=i;
      end;
   end;
end
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Номера строк для блокнота __@cmd@__ Общие вопросы Delphi 1 02.02.2009 09:09
Взлом двухразового блокнота ANTI1 Общие вопросы Delphi 1 10.11.2008 18:00
Исходник блокнота AngelOfDeath Общие вопросы Delphi 7 12.04.2008 20:38