var sL: TStringList;..., а если его поделить на 2 - получишь количество фрагментов текста. Естественно, если внутри фрагмента может быть перевод строки, то придется чуть-чуть изменить алгоритм:
begin
sL := TStringList.Create;
try
sL.LoadFromFile('t.txt');
ShowMessage(IntToStr(sl.Count)); // <--- ... вычисляется вот так ...
finally
sL.Free;
end;
end;
sL := TStringList.Create; // Создаем СтрингЛист
try
sL.LoadFromFile('t.txt'); // читаем текст в Стринглист
// при этом всё, что до первого перевода строки будет записано в первую строку СтрингЛиста,
// после первого, но до второго - во вторую строку СтрингЛиста и т.д.
// Т.е., текст разбивается по строкам...
cnt := 0; // Обнуляем счетчик
for i := 0 to sL.Count - 1 do // Проходим по всем строкам СтрингЛиста и проверяем их содержимое
// если попытка перевести содержимое строки в число (TryStrToInt делает именно это)
// удачна (функция TryStrToInt вернула True), значит это - метка, и счетчик меток увеличиваем
// В случае неудачной попытки перевода в число TryStrToInt вернет False, а раз нельзя перевести
// что-то в число, то это "что-то" не может быть меткой, это фрагмент текста
if TryStrToInt(sL.Strings[i], value) Then Inc(cnt);
ShowMessage(IntToStr(cnt)); // Показываем, чего насчитали
finally
sL.Free; // Удаляем СтрингЛист полностью, он нам не нужен больше
end;
sL := TStringList.Create; //совсем непонятное действие)))
try // что это за оператор???
sL.LoadFromFile('t.txt'); //загружаем в переменную sL весь текст из файла T.txt
cnt := 0; // целочисленной переменной cnt даем значение 0
for i := 0 to sL.Count - 1 do // делаем какой-то цикл
if TryStrToInt(sL.Strings[i], value) Then Inc(cnt); // это чо?
ShowMessage(IntToStr(cnt)); // ну здесь понятно, выводим значение переменной cnt во внешнее окошечко
finally
sL.Free; // Удаляем текст из текстовой переменной sL?
end;
procedure TForm1.Button1Click;
begin
begin
// первый фрагмент
end;
begin
// второй фрагмент
end;
end;
procedure TForm1.Button2Click(Sender: TObject);Переменная P должна содержать номер фрагмента, который ищется. Единственное, о чем ты должна позаботиться - это о том, что такой фрагмент действительно есть, P не должно быть больше числа фрагментов в файле. Мой код не проверяет этот случай. Хочешь - дописывай проверку сама, я этого делать не буду.
var
sL, sL2: TStringList;
i, value, p: integer;
begin
sL := TStringList.Create;
try
sL.LoadFromFile('t.txt'); // Получаем текст, разбитый на строки
sL2 := TStringList.Create; // создаем доп. СтрингЛист
try
p := 5; // Будем искать в файле фрагмент № 5 !!!
i := 0; // Начиная с нулевой строки sL проходим ...
while p > 0 do begin
// Пока не дойдем до числа, являющегося меткой
// нужного нам фрагмента, проверяем строки ...
if TryStrToInt(sL.Strings[i], value) then begin
dec(p); // Очередная метка? Уменьшаем P ...
end;
inc(i); // следующая строка СтрингЛиста
end;
// Все, раз мы здесь - то нашли уже метку нужного фрагмента,
// теперь надо считать во второй СтрингЛист все строки ДО
// очередной, следующей метки (или до конца sL, смотря что
// случится раньше).
while (i < sL.Count) and (not TryStrToInt(sL.Strings[i], value)) do
begin
sL2.Add(sL.Strings[i]); inc(i); // Не метка? Добавляем в sL2
end;
// Ну, этого можно было и не делать, я просто отобразил
// полученный фрагмент в Memo
Memo1.Lines.Assign(sL2);
finally
sL2.Free; // Все, больше sL2 не нужен ...
end;
finally
sL.Free; // sL тоже ...
end;
end;
unit Unit1;Если что непонятно - спрашивай...
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Save: TButton;
Random: TButton;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
procedure SaveClick(Sender: TObject);
procedure RandomClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;
procedure TForm1.RandomClick(Sender: TObject);
var
SL: TStringList;
num: Integer;
begin
SL := TStringList.Create;
try
if OpenDialog1.Execute() then begin
SL.LoadFromFile(OpenDialog1.FileName);
num := System.Random(SL.Count);
Memo1.Text := StringReplace(SL.Strings[num], '<br>', #13#10, [rfReplaceAll]);
end;
finally
SL.Free
end;
end;
procedure TForm1.SaveClick(Sender: TObject);
var
f: TextFile;
begin
if SaveDialog1.FileName = '' then begin
if not SaveDialog1.Execute() then Exit;
end;
AssignFile(f, SaveDialog1.FileName);
try
Append(f);
except
Rewrite(f);
end;
WriteLn(f, StringReplace(Memo1.Text, #13#10, '<br>', [rfReplaceAll]));
CloseFile(f);
end;
end.