Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Memo.Lines.AddStrings долго отображает если много строк.


Страницы:   1 2

Kolan ©   (2007-02-25 15:36:00) 

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

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


koha   (2007-02-25 22:32:00) [1]


> 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. Как мы любим придумывать сложное - это закостинелость ума.


Palladin   (2007-02-25 22:28:00) [2]

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


Kolan   (2007-02-25 22:06:00) [3]

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

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

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

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


koha   (2007-02-25 22:02:00) [4]

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

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 т.д и т.п.


Palladin   (2007-02-25 22:01:00) [5]

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


Kolan   (2007-02-25 21:59:00) [6]

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


Kolan   (2007-02-25 21:57:00) [7]

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

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


Palladin   (2007-02-25 21:51:00) [8]

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


koha   (2007-02-25 21:41:00) [9]

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

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

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


Palladin   (2007-02-25 21:26:00) [10]


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

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


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


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


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


Palladin   (2007-02-25 20:59:00) [12]


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

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


koha   (2007-02-25 20:46:00) [13]

Протестировал на техте в 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;


koha   (2007-02-25 20:23:00) [14]

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

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


Kolan   (2007-02-25 16:39:00) [15]

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

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


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


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

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


Palladin   (2007-02-25 16:14:00) [17]

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


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;


Kolan   (2007-02-25 16:07:00) [18]

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


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


MBo   (2007-02-25 16:01:00) [19]

BeginUpdate используй


Kolan   (2007-02-25 15:55:00) [20]

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо