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

Вниз

Memo.Lines.AddStrings долго отображает если много строк.   Найти похожие ветки 

 
Kolan ©   (2007-02-25 15:36) [0]

Здравствуйте,
 MemoryMapMemo.Lines.AddStrings(FCurrentMapStrings)
Довольно долго они грузятся если строк больше 10000.

Можно ли усткорить?


 
Palladin ©   (2007-02-25 15:51) [1]

Можно - отказаться от TMemo... медленное оно при больших объемах...


 
Kolan ©   (2007-02-25 15:55) [2]

«[1] Palladin ©   (25.02.07 15:51)
Можно — отказаться от TMemo&#133 медленное оно при больших
объемах&#133»

Ну а чем заменить Рич эдит еще медленее(имхо). А TListBox — работать неудобно(копировать например).


 
MBo ©   (2007-02-25 16:01) [3]

BeginUpdate используй


 
Kolan ©   (2007-02-25 16:07) [4]

Так?
procedure TMainForm.ShowMemoryMapClick(Sender: TObject);
begin
 if Assigned(FCurrentMapStrings) then
 begin
   MemoryMapMemo.Lines.BeginUpdate;
   MemoryMapMemo.Lines.AddStrings(FCurrentMapStrings);
   MemoryMapMemo.Lines.EndUpdate;
 end;
end;


На глаз помогло не сильно. В районе трёх секунд получается что с BeginUpdate что без. Мож не так делаю что-то?


 
Palladin ©   (2007-02-25 16:14) [5]

:)
а теперь смотри
фокус-покус


Var
m:TMemoryStream;

Begin
m:=TMemoryStream.Create;
Try
 Memo1.Lines.SaveToStream(m);
 ss.SaveToSream(m); // ss:TStringList с твоей кучей строк
 m.Seek(0,soFromBeginning);
 Memo1.Lines.LoadFromStream(m);
Finally
 m.Free;
End;
End;


 
Palladin ©   (2007-02-25 16:15) [6]


> MBo ©   (25.02.07 16:01) [3]

А оно при AddStrings уже делает BeginUpdate, так же как и LockWindowUpdate мало чем помагает... а фокус с потоком очень очень :)


 
Kolan ©   (2007-02-25 16:39) [7]

"фокус-покус"

Да побыстрее(раза в два). :)


 
koha ©   (2007-02-25 20:23) [8]

А вот еще не менне быстрый способ равный предыдущему Palladin ©   (25.02.07 16:14) [5] только без промежуточного TMemoryStream, ведь методы копирования будут одоху...ны.

Var  Lst: TStrings;
//....
Memo1.Text:=Lst.GetText;


 
koha ©   (2007-02-25 20:46) [9]

Протестировал на техте в 21970 строк 3 раза
результаты составили:
Metod 1 = 5922  mc.
Metod 2 = 1391  mc.
Metod 3 = 1375  mc.

metods:
1)
 Memo1.Lines.BeginUpdate;
 Memo1.Lines.AddStrings(Lst);
 Memo1.Lines.EndUpdate;

2)
MStrm.Seek(0,soFromBeginning);
Memo1.Lines.LoadFromStream(MStrm);

3)
Memo1.Text:=Lst.GetText;


 
Palladin ©   (2007-02-25 20:59) [10]


> koha ©   (25.02.07 20:46) [9]

ты эта... голова дум дум делай иногда... AddStrings далеко не Text:=


 
koha ©   (2007-02-25 21:15) [11]


> AddStrings далеко
> не Text:=


- Как не странно, а результат тот же.


 
Palladin ©   (2007-02-25 21:26) [12]


> koha ©   (25.02.07 21:15) [11]

Это не странно, это твое не понимание того, что AddStrings добавляет к существующему, а Text:= заменяет существующее.


 
koha ©   (2007-02-25 21:41) [13]

В таком случае пардонте, нужно использовать:

Lst: TStrings;
Memo1.Lines.Add(Lst.GetText)

И работать будет, даже, быстреее.


 
Palladin ©   (2007-02-25 21:51) [14]

Да, ты прав... Можно и просто Lst.Text...
Вобщем, мораль... AddStrings контролам - зло...


 
Kolan ©   (2007-02-25 21:57) [15]

Да, мне вобще то этого:
Memo1.Text:=Lst.GetText;
хватило&#133

А чем GetText лучьше Text? По скорости незаметил&#133


 
Kolan ©   (2007-02-25 21:59) [16]

Пробовал на файле ~67000 строк. Получилось ~5 сек.


 
Palladin ©   (2007-02-25 22:01) [17]

Да вобщем то ничем... Одно и тоже...


 
koha ©   (2007-02-25 22:02) [18]

И вообще изначально я имел ввиду "методы копирования" самого класса.
В недрах класса все способы копирования сводятся к одной или нескольким процедурам или функциям: Так зачем промежуточный класс использовать когда можно использовать самую основообразующую (элементарную) и самую быструю процедуру (функцию) в данном случае самая элементарная это

function TStrings.Add(const S: string): Integer;
begin
 Result := GetCount;
 Insert(Result, S);
end;
 

которая используется почти в всех методах класса и не посредственно в методе (напрямую) Memo1.Lines.Add();

И необходимо использовать элементарную Функцию у Lst: TStrings;  

function TStrings.GetText: PChar;
begin
 Result := StrNew(PChar(GetTextStr));
end;


GetTextStr - при помощи этой функции класс отдает данные куда угодно и
Встрим и Memo1.Lines.Add и  Memo1.Text т.д и т.п.


 
Kolan ©   (2007-02-25 22:06) [19]

«[18] koha ©   (25.02.07 22:02)»

Выходит Text лучьше так как:
GetText:
Result := StrNew(PChar(GetTextStr));

А текст сразу:
property Text: string read GetTextStr write SetTextStr;

Но это фигня, благодарю за обсуждение, воппрос задал не зря :)


 
Palladin ©   (2007-02-25 22:28) [20]

ээ... парни... :) не экономте на спичках... бо пожирание времени и ресурсов происходит именно при передаче контролу информации...


 
koha ©   (2007-02-25 22:32) [21]


> Kolan ©   (25.02.07 22:06) [19]
> «[18] koha ©   (25.02.07 22:02)»Выходит Text лучьше так
> как:GetText:Result := StrNew(PChar(GetTextStr));А текст
> сразу: property Text: string read GetTextStr write SetTextStr;
>


- Memo1.Lines.Add(Lst.Text); наверное это будет самое быстрое.

- Чем проще, тем лучше!

P.S. Как мы любим придумывать сложное - это закостинелость ума.



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

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

Наверх




Память: 0.51 MB
Время: 0.057 c
1-1169635673
iviom
2007-01-24 13:47
2007.03.18
Как получить событие DblClick именно по ячейке?


6-1159770522
Виктор 5
2006-10-02 10:28
2007.03.18
не работает InternetSetFilePointer


6-1160120554
SergeySP
2006-10-06 11:42
2007.03.18
Удалить подвисшее соединение.


15-1171961362
magisrtu
2007-02-20 11:49
2007.03.18
Скажите,


1-1169113346
MegaVolt
2007-01-18 12:42
2007.03.18
Как в OwnerDraw режиме ListView задать высоту строк?