1. Небольшой пример:
| Цитата | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Spin, StdCtrls, Buttons;
type TForm1 = class(TForm) // радиокнопка "поиск по строке" RadioButton1: TRadioButton; Label1: TLabel; // радиокнопка "Поиск по байту" RadioButton2: TRadioButton; // кнопка выбора файла, где будем производить поиск SpeedButton1: TSpeedButton; OpenDialog1: TOpenDialog; // суда вводим строку, которую ищем Edit1: TEdit; // суда вводим байт который ищем (от 0 до 255) SpinEdit1: TSpinEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; // суда выводим результаты поиска // адрес в шестнадцатеричном виде Memo1: TMemo; // кнопка "поиск" SpeedButton2: TSpeedButton; // кнопка "выход" SpeedButton3: TSpeedButton; Label5: TLabel; Label6: TLabel; Label7: TLabel; procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; FN:String; implementation
{$R *.dfm}
// Событие выбора радиокнопки "Строка" procedure TForm1.RadioButton1Click(Sender: TObject); begin // делаю поле ввода строки доступным Edit1.Enabled:=true; // делаю поле ввода байта недоступным SpinEdit1.Enabled:=false; end;
// Событие выбора радиокнопки "Байт" procedure TForm1.RadioButton2Click(Sender: TObject); begin // делаю поле ввода строки недоступным Edit1.Enabled:=false; // делаю поле ввода байта недоступным SpinEdit1.Enabled:=true; end;
// событие нажатия кнопки "Выбрать файл" procedure TForm1.SpeedButton1Click(Sender: TObject); begin // запускаю диалог выбора файла // одновременно проверяю запустился ли он if OpenDialog1.Execute then // если запустился begin // запоминаю имя выбранного файла FN:=OpenDialog1.FileName; // делаю кнопку Поиск доступной SpeedButton2.Enabled:=true; // показываю в заголовке имя файла Caption:='Finder - '+FN; end; end;
// событие нажатия на кнопку "Выход" procedure TForm1.SpeedButton3Click(Sender: TObject); begin // закрываю программу Application.Terminate; end;
// событин нажатия на кнопку "Поиск" procedure TForm1.SpeedButton2Click(Sender: TObject); var f:file of byte; find,findF:byte; index,size:integer; addres,stroka,strokaf:string; dlstr,i:byte; begin // очищаю поле вывода адресов найденного (поле "результаты поиска") Memo1.Clear; // обнуляю индикатор текущего адреса в файле index:=0; // привязываю файл к переменной AssignFile(f,fn); // открываю файл Reset(f); // проверяю выбранный вид поиска if RadioButton1.Checked then // если по строке begin // читаю строку в переменную из поля ввода stroka:=Edit1.Text; // вычисляю размер введёной строки dlstr:=length(stroka); // вычисляю размер файла size:=filesize(f); // задаю диапазон поиска size:=size-dlstr+1; // открываю цикл с предусловием // пока позиция не равна диапазону while index<>size do begin // очищаю строку читаемоу из файла strokaf:=''; // открываю цикл по длине строки for i:=1 to dlstr do begin // читаю байт из файла Read(f,findf); // формирую строку strokaf:=strokaf+Chr(findf); end; // сравниваю полученную строку с заданной if stroka=strokaf then // если строки равны begin // получаю адрес местонахождения // начала строки в шестнадцатеричном виде addres:='Ox'+IntToHex(index,0); // вывожу полученный адрес в поле "Результаты поиска" Memo1.Lines.Add(addres); end; // получаю адрес начала поиска // следующей строки index:=index+1; // перевожу позицию по полученному адресу Seek(f,index); end; end // если выбран вид поиска не по строке else begin // читаю заданный байт find:=SpinEdit1.Value; // открываю цикл с предусловием // пока не конец файла while not EOF(F) do begin // читаю байт из файла Read(f,findf); // сравниваю полученный байт с исходным if find=findf then // если байты равны begin // получаю адрес местонахождения // байта в шестнадцатеричном виде addres:='Ox'+IntToHex(index,0); // // вывожу полученный адрес в поле "Результаты поиска" Memo1.Lines.Add(addres); end; // прибавляю счетчик на 1 // (получаю следующий адресс позиции) index:=index+1; end; end; // закрываю открытый файл CloseFile(f); // Вывожу сообщение об окончании поиска MessageDlg('Поиск завершен',mtInformation,[mbOk],0); end;
end.
|
Переделай его, как тебе нужно. строку можно добавить командой WriteLn(f, s), где f - файловая переменная.
2. смотри предыдущее сообщение Добавлено @ 17:08 ps: Приведённый пример ищет заданную пользователем строку(байт) в любом файле |