Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > О работе с файлами.


Автор: Alkash 5.7.2004, 10:12
Вообщем задача такая- есть файл с расширением .cfg , как его просканировать на наличие определённых строк, если они есть - то добавить к ним значение из edit1, если строки нету - то добавить её целиком.И ещё, как поставить в edit ограничение на вводимое число?
Заранее благодарен.

Автор: Guest 5.7.2004, 12:47
1.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 s, test: string;
 F: TextFile;
begin
 test := 'test';
 AssignFile(F, 'c:\1.txt');
 Reset(F);
 repeat
   Readln(F, S);
   if s = test then
     begin
       s := s + ' ' + Edit1.Text;
       Write(F, s);
     end
   else
     begin
       s := test + Edit1.Text;
       Write(F, s);
     end;
 until EOF(f);
 CloseFile(F);
end;

Или что то в этом роде, просто делфи под рукой нету.

2.
Не используй едит, лучше SpinEdit, он красивше!!!

Автор: Albinos_x 5.7.2004, 17:04
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: Приведённый пример ищет заданную пользователем строку(байт) в любом файле

Автор: Pakshin A. S. 5.7.2004, 22:22
А RichEdit? Там вроде есть возможность поиска...

Автор: Guest 6.7.2004, 03:56
Pakshin A. S.
Не нужна возможность поиска.
Он не хочет искать в ричьедит-те, он хочет строки сравнивать!!!!

2Albinos_x
Ок, "+" -к тебе!Ё!!!!!

Автор: Albinos_x 7.7.2004, 20:25
biggrin.gif biggrin.gif biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)