Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Вниз

RichEdit или Memo! Как загружать фалы больших размеров только для 


Kurt   (2002-04-08 10:14) [0]

RichEdit или Memo! Как загружать файлы больших размеров в эти компоненты только для чтения, чтоб максимально быстро?
А то существуюшие просмотрщики (например в Far, Windows Commander и т.п.) это делают достаточно быстро. Как такого достигнуть?
Помогите плиз!



gek   (2002-04-08 10:25) [1]

В memo > 32 kb не загрузишь
В Rich около 200 кб (точно не помню)

Метод LoadFromFile



Kurt   (2002-04-08 11:19) [2]

Да ты чяго!:-) я в мемо загружал около 20 Мегабайт и усе работало, просто на "слабых" машинах это не катило и я воспользовался RichEdit, все получилось, но скоростью явно не удволетворен. А про метод LoadFromFile знаю:-) Просто вопрос именно о скорости...



gek   (2002-04-08 11:31) [3]

> Kurt (08.04.02 11:19)

я не знаю что и как ты грузишь в memo
Насчет 20 Мегабайт большие сомнения

А вот и help
Under Win 9x, there is a limit of 64k of text for this control.

Может сначала почитать надо, прежде чем ерунду писать



Kurt   (2002-04-08 15:01) [4]

У меня Windows2000. Так вот, ты сам попробуй и увидешь, что можно загрузить. Я же тоже тебе не от балды пишу, а уже сам на своем опыте.
Да и суть не в этом. Мне именно скорость загрузки и открытия для чтения важна!



gek   (2002-04-08 15:19) [5]

Может под Windows2000 и так приду домой посмотрю.

Насчет скорости
тогда чисто опытным путем LoadFromStream или LoadFromFile



Kurt   (2002-04-08 15:22) [6]

Кстати, тут проверил и под 98 покатило, только иной раз глючит со скролингом.



Виктор Щербаков   (2002-04-08 15:29) [7]

Под 2000 действительно ограничения 32 кб нет. Даже в блокноте можно очень большие файлы смотреть.
А насчет скорости, идея простая:
делай через проецируемый файл. Работать с файлом будешь как со строкой в памяти, а свопом будет управлять ОС.



Kurt   (2002-04-08 15:32) [8]

gek! А поподробнее расскажи плиз как с LoadFromStream работать, а то найти инфы в литературе не могу. просто до этого не использовал.

Виктор! А поподробнее расписать можно, а то че-то как-то не дошло:-). Заранее благодарен!



Виктор Щербаков   (2002-04-08 15:47) [9]

Открываем файл с помощью функции CreateFile.
Вызываем CreateFileMapping, для создания проецируемого файла.
Отображаем его в память с помощью MapViewOfFile. Эта функция возвращает адрес проекции файла. Получив его, можно работать с отображенным файлом, как с обычным участком памяти, т.е. выводить его содержимое в виде текста в эл. управления и т.д.
Именно этот метод даст требуемую скорость и простоту.

Упомянутые просмотрщики не читают весь файл целиком в память, а только ту его часть, которая в данный момент нужна для отображения.



Kurt   (2002-04-08 15:59) [10]

Виктор! Большое спасибо!
Только можешь для полной ясности написать пример кода, как вот этот участок памяти отобразить в виде текста в нужную компоненту (Мемо допустим).....
А так большущее спасибо. Теперь стало ясно немного.



Kurt   (2002-04-08 16:00) [11]

И напоследок не подскажите как c помощью LoadFromStream загрузить файл в компоненту. плиз!



Alx2   (2002-04-08 16:09) [12]


SourceHFILE := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ,
Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
If SourceHFILE = INVALID_HANDLE_VALUE Then exit;
fileSize := GetFileSize(SourceHFILE, Nil);
If fileSize = 0 Then
Begin
CloseHandle(SourceHFILE);
exit;
End;
SourcehFileMap := CreateFileMapping(SourceHFILE, Nil, PAGE_READONLY, 0, fileSize, Nil);
CloseHandle(SourceHFILE);
If SourcehFileMap = 0 Then exit;
SourcepvFile := MapViewOfFile(SourcehFileMap, FILE_MAP_READ, 0, 0, 0); // Вот это место теперь - Pointer на проекцию файла.
If SourcepvFile = Nil Then
Begin
CloseHandle(SourcehFileMap);
exit;
End;

А смотреть его можно, как обычный участок памяти.
Например, подсчитать кол-во пробелов:
Var ch : ^Char;
begin
...........
Ch := SourcePvFile;
Count := 0;
For K := 1 To fileSize Do
Begin
If Ch^ =" " Then inc(Count);
inc(Ch);
End;
end;



Kurt   (2002-04-08 16:13) [13]

А вывести этот участок памяти в Меmo допустим? и чтоб двигаясь по Мemo все подгружалось и т.п.?



Kurt   (2002-04-08 17:32) [14]

АУ! помогите плиз до конца!



Kurt   (2002-04-08 17:55) [15]

Alx2! Виктор! а как вот не целиком читая файл из памяти, загрузить его в Memo (richEdit)???



Kurt   (2002-04-08 17:56) [16]

Alx2! Виктор! а как вот не целиком читая файл из памяти, загрузить его в Memo (richEdit)??? ну плодгружая по надобности...



Alx2   (2002-04-09 10:00) [17]

>а как вот не целиком читая файл из памяти, загрузить его
>в Memo (richEdit)??? ну плодгружая по надобности...
Конкретнее. Что непонятно?



Anatoly Podgoretsky   (2002-04-09 10:54) [18]

Наверно не знаком с методами TRixhEdit и справки нет



Kurt   (2002-04-10 10:20) [19]

Ну получил я указатель в памяти на файл. Дальше как мне не целиком подгружая по надобности загружать в Memo (RichEdit)?

Анатолий! Что за методы, подскажи! Ты RichEdit имеешь ввиду?



Alx2   (2002-04-10 10:45) [20]

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.033 c
3-69665           Nikols                2002-04-03 10:00  2002.04.22  
Подскажите компоненты для доступа к локальным таблицам без BDE.


1-69889           RAVEN                 2002-04-09 11:44  2002.04.22  
TBitmap в компонентах


3-69748           AndreyP               2002-04-02 14:38  2002.04.22  
Добавление вычисляемого поля


3-69695           mrl                   2002-03-30 14:48  2002.04.22  
Фильтрация в Delphi


3-69718           Nickolaus             2002-03-29 22:41  2002.04.22  
Как