Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Ускорение процесса добавления текста в TStrings   Найти похожие ветки 

 
Virtukon   (2006-01-17 18:40) [0]

Есть несколько кусков текста в разных TStrings. Необходимо объединить их в одном TStrings. Когда текст имеет размер порядка 1 метра процесс объединения растягивается на довольно длительное время... А у меня есть необходимость оперировать и с 10 метровыми текстами. Что нибудь здесь можно предпринять? Есть советы? Как оптимальнее всего объединить эти тексты?


 
Джо ©   (2006-01-17 19:01) [1]

10 Мб текста — это пустяки.
Покажи, как ты с ним работаешь.


 
Virtukon   (2006-01-17 19:13) [2]

к примеру:

var
 strlist1, strlist2, strlist3: TStrings;
begin
 strlist1:=TStringList.Create;
 strlist2:=TStringList.Create;
 strlist3:=TStringList.Create;

 strlist1.loadfromfile("filename1");
 strlist2.loadfromfile("filename2");

 strlist3.append(strlist1.text);
 strlist3.append(strlist2.text);

 strlist1.free;
 strlist2.free;
 strlist3.free;
end;


 
Джо ©   (2006-01-17 19:20) [3]

Используй
StrList3.AddStrings (StrList1);
StrList3.AddStrings (StrList2);


Или такую схему с TMemoryStrem:

procedure TForm1.Button1Click(Sender: TObject);
var
 List1,
 List2,
 List3: TStrings;
 Stream: TMemoryStream;
begin
 Screen.Cursor := crHourGlass;
 try
   List1 := TStringList.Create;
   try
     List2 := TStringList.Create;
     try
       //List1.LoadFromFile("d:\1.txt"); // 10 Mb
       //List2.LoadFromFile("d:\2.txt"); // 10 Mb

       List3 := TStringList.Create;
       try
         Stream := TMemoryStream.Create;
         try
           // сбрасываем все в стрим
           List1.SaveToStream (Stream);
           List2.SaveToStream (Stream);

           Stream.Position := 0;

           // читаем из стрима
           List3.LoadFromStream (Stream);

           //List3.SaveToFile("d:\3.txt");
         finally
           Stream.Free;
         end;

       finally
         List3.Free;
       end;

     finally
       List2.Free;
     end;
   finally
     List1.Free;
   end;

 finally
   Screen.Cursor := crDefault;
 end
end;


 
Джо ©   (2006-01-17 19:30) [4]

Для упрощения вызовов можно сделать такие две процедуры, потестируй, что быстрее выходит:

procedure AppendStrings (Dest: TStrings; Source: array of TStrings);
var
 I: Integer;
begin
 for I := Low (Source) to High (Source) do
   Dest.AddStrings(Source[I]);
end;

procedure ReplaceStrings (Dest: TStrings; Source: array of TStrings);
var
 I: Integer;
 Stream: TMemoryStream;
begin
 Stream := TMemoryStream.Create;
 try
   for I := Low (Source) to High (Source) do
     Source[I].SaveToStream(Stream);
   Stream.Position := 0;
   Dest.LoadFromStream(Stream);
 finally
   Stream.Free;
 end
end;

Вызов по схеме:

 AppendStrings (StrList3, [StrList1,StrList2]);



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1137829673
Baraka
2006-01-21 10:47
2006.02.05
Инсталятор


6-1130721966
MRAk
2005-10-31 04:26
2006.02.05
Узнать процент отправки


1-1135797029
deamon_t
2005-12-28 22:10
2006.02.05
Алгоритм захвата экрана


15-1137099274
Jolik
2006-01-12 23:54
2006.02.05
Кто напишет компоненту за деньги?


2-1137570298
md
2006-01-18 10:44
2006.02.05
double to string