Форум: "Начинающим";
Текущий архив: 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… медленное оно при больших
объемах…»
Ну а чем заменить Рич эдит еще медленее(имхо). А 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;
хватило…
А чем GetText лучьше Text? По скорости незаметил…
← →
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.49 MB
Время: 0.037 c