Frip Nown |
Отправлено: 28.01.2007, 06:16 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
Нужно в Memo руками загрузить текст из файла (метод LoadFromFile() не применим). Я читаю файл (вполне быстро), обрабатываю текст как мне нужно (тоже шустро получается), и делаю так:
mmData->Lines->Text=asData;
Вот эта строчка дико все тормозит. Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает. Метод LoadFromFile() грузит текст практически моментально, значит выход есть. Какой? |
|
nawok78 |
Отправлено: 29.01.2007, 08:29 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 115
|
А сперва сделать LoadFromFile — потом над ним издеваться? |
|
Grigoriy |
Отправлено: 29.01.2007, 19:50 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE (Frip Nown @ 28.01.2007, 06:16) | Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает.
|
Дает.
CODE |
char* cp = Edit1->Text.c_str();
|
И вообще, интересно, какая потребность загружать 1 MB текста в Memo ?
Этот текст нужно будет весь просматривать ?
|
|
Romikgy |
Отправлено: 29.01.2007, 20:35 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
QUOTE (Frip Nown @ 28.01.2007, 05:16) | Нужно в Memo руками загрузить текст из файла (метод LoadFromFile() не применим). Я читаю файл (вполне быстро), обрабатываю текст как мне нужно (тоже шустро получается), и делаю так:
mmData->Lines->Text=asData;
Вот эта строчка дико все тормозит. Подозреваю, проблема в типе AnsiString, но напрямую к массиву байт этот тип доступа не дает. Метод LoadFromFile() грузит текст практически моментально, значит выход есть. Какой? |
а что есть asData ? |
|
Frip Nown |
Отправлено: 29.01.2007, 21:39 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
QUOTE | А сперва сделать LoadFromFile — потом над ним издеваться? | Настоящие герои всегда идут в обход =).
Обрабатывать посимвольно Ansi строку длинной в мегабайт будет долго — это я точно знаю. А если взять из нее указатель на символьный массив, придется его после обработки опять вгрузить в Memo — я вернусь к тому, с чего начал.
QUOTE | Дает:
char* cp = Edit1->Text.c_str(); | c_str() — Функция, которая копирует символьный массив в новое место памяти и возвращает на него указатель. Это копия, к оригинальной строке получить доступ, по моему, нельзя.
QUOTE | И вообще, интересно, какая потребность загружать 1 MB текста в Memo ?
Этот текст нужно будет весь просматривать ? |
Реально тексты чаще будут маленькие, но возможны и мегабайтные, и трехмегабайтные, и вообще =). Имхо, программа должна в любом случае работать быстро. Тем более, если она может работать быстро.
AnsiString. Или char*. Что угодно, это не принципиально. Вообще, конечный продукт метода обработки информации — символьный массив. |
|
Grigoriy |
Отправлено: 30.01.2007, 00:04 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE (Frip Nown @ 29.01.2007, 21:39) | c_str() — Функция, которая копирует символьный массив в новое место памяти и возвращает на него указатель. Это копия, к оригинальной строке получить доступ, по моему, нельзя. |
Нет, это указатель на оригинальную нуль-терминальную строку AnsiString-а.
Чтобы быстрее обработать строку — выделяем блок в памяти для результатирующей строки и в этот блок записываем..., а читаем... с исходной строки.
Можно заранее установить требуемый размер строки AnsiString его методом SetLength
Отредактировано Grigoriy — 30.01.2007, 00:06
|
|
Frip Nown |
Отправлено: 30.01.2007, 01:46 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 3
|
QUOTE | выделяем блок в памяти для результатирующей строки и в этот блок записываем..., а читаем... с исходной строки. | И что потом с этим новым блоком делаем? Как его привязать к анси строке? Собственно, уже не важно, но мне все равно интересно.
Моя проблема разрешилась весьма, э... неожиданно. Помогли танцы с бубном =).
У Memo есть такое свойвто — ParentFont. По умолчанию должно быть true, но у меня за каким-то чертом поменялось на false. И вот пока оно было false, memo работало медленно (грузило тестовый текст за 14.52сек). Как только я поменял ParentFont на true, тестовый текст начал грузится за 0.67. Такая вот, оптимизация одним движением руки =).
P.S. Всем спасибо!
Отредактировано Frip Nown — 30.01.2007, 01:48 |
|