Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.043 c
2-1172237689
Аликъ
2007-02-23 16:34
2007.03.18
Адрес


15-1171729161
ProgRAMmer Dimonych
2007-02-17 19:19
2007.03.18
Подскажите новичку


4-1162781388
Коля
2006-11-06 05:49
2007.03.18
SendTo в PopupMenu?


2-1171876396
Прохожев Максим
2007-02-19 12:13
2007.03.18
Количество строк в проекте


15-1172060034
Prohodil Mimo
2007-02-21 15:13
2007.03.18
А портит ли мобила дискету, если находится рядом? :о)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский