Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как быстро поместить содержимое Query в Memo


Автор: Garyck 26.1.2009, 21:48
Здравствуйте, товарищи!
Хочу обратиться к вам за помощью. У меня есть проблема над которой я последнее время безуспешно бьюсь. smile 

В общем задачка такая:
Есть БД InterBase
C помощью TIBQuery к ней сделан запрос, например SELECT Name FROM Mans (около 4000 записей)
Нужно поместить содержимое в обычный компонент MEMO.

Первым делом я решил его в лоб, т.е.:
Код

while not IBQuery1.Eof do
 begin
   Memo1.Strings.Add(IBQuery1.FieldsByName('Name').AsString;
   IBQuery1.Next
 end;

Но запрос выполняется недопустимо медленно (порядка 40 секунд)

Потом решил с помощью Query1.BatchOutput записать запрос в текстовый файл, а потом этот файл загрузить в Memo.LoadFromFile.
И все стало на свои места, запрос выполняется порядка 2-3 секунд smile 

Но все-таки последний вариант не очень эстетичен, т.к. создается лишний файл, потом его нужно будет не забыть удалить,
после проведения нужных операций.

Кто-нибудь может подсказать как сделать это по-другому, например через TStream? smile


Автор: Akella 27.1.2009, 09:19
Код

Memo1.lines.BeginUpdate;

твой код

Memo1.lines.EndUpdate;

Автор: jsa 27.1.2009, 09:21
Цитата(Garyck @  27.1.2009,  02:48 Найти цитируемый пост)
Но запрос выполняется недопустимо медленно (порядка 40 секунд)Потом решил с помощью Query1.BatchOutput записать запрос в текстовый файл, а потом этот файл загрузить в Memo.LoadFromFile.И все стало на свои места, запрос выполняется порядка 2-3 секунд 

чето бред какой-то, не может Batch так повлиять на скорость, может быть на этапе добавление в memo возникают тормоза при отрисовке, еще поверю
попробуй BeginUpdate, EndUpdate

Код

Memo1.Lines.BeginUpdate;
while not IBQuery1.Eof do
 begin
   Memo1.Lines.Add(IBQuery1.FieldsByName('Name').AsString);
   IBQuery1.Next
 end;
Memo1.Lines.EndUpdate;


Добавлено через 1 минуту и 4 секунды
не успел smile 

Автор: Frees 27.1.2009, 09:44
Цитата(jsa @  27.1.2009,  11:21 Найти цитируемый пост)
попробуй BeginUpdate, EndUpdate

и еще
Код

Memo1.WordWrap := false;
Memo1.Lines.BeginUpdate;
....

Автор: Garyck 27.1.2009, 22:17
Спасибо Всем Огромное за Помощь! smile 
Действительно вся проблема была в обновлении экрана и выполнении кода OnChange.
Кароче, BeginUpdate, EndUpdate - рулит! smile 
 smile 

Автор: morpheyushka 28.1.2009, 18:57
Цитата(Garyck @  27.1.2009,  22:17 Найти цитируемый пост)
Кароче, BeginUpdate, EndUpdate - рулит! 

Кто бы сомневался smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)