Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 16:00   #1
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию StreameFile

Помогите ускорить загрузку из файла (весит файл 1й- 3мб и 2й - 5мб) в мемо, есть какие то варианты

вот мой код

Код:
procedure TBaseFormUchitel.Button1Click(Sender: TObject);
var
Stream:TFileStream;
 s:array[0..$1FF]of char;
 i,j:Dword;
Text:String;
begin
f := TFileStream.Create(ExtractFilePath(Application.ExeName)+'Data\Base.txt', fmOpenRead);
i:=round(Stream.Size/$1FF);
for j:=0 to i do
 begin
 Stream.Read(s,$1FF);
 Text:=Text+s;
 ProgressBar1.Position:=round((j/i)*100);
 application.ProcessMessages;
 end;
 Stream.Free;
   Memo_List.Lines.text:=text;
end;
casio23 вне форума Ответить с цитированием
Старый 17.02.2011, 16:38   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) а что за бред у Вас написан? Почему переменная Stream только объявляется, а создаётся переменная f которая не описана?!
это специальная версия для форума, как я понимаю?

2) через банальный ТСтринглист пробовали грузить?
Код:
var TS : TStringList;
begin
   TS := TStringList.Create();
   TS.LoadFromFile(ExtractFilePath(Application.ExeName)+'Data\Base.txt');
   ShowMessage('Всё загружено!') ;
   FreeAndNil(TS);
end;
3) почему не читаете целиком файл в переменную Text
примерно так:
Код:
var
   AllText : string;
...
   Stream := TFileStream.Create(ExtractFilePath(Application.ExeName)+'Data\Base.txt',  fmOpenRead or fmShareDenyNone);

   SetLength(AllText, Stream.Size);
   Stream.Read(AllText[1], Stream.Size);
   ShowMessage('Всё загружено!') ;
   ...
4) И ещё, очень подозреваю, что затык по времени у Вас происходит в момент записи этого текста в Memo_List!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.02.2011, 07:53   #3
Ghost of Night
Форумчанин
 
Аватар для Ghost of Night
 
Регистрация: 08.08.2010
Сообщений: 371
По умолчанию

Зачем TStringList??
Код:
Memo_List.Lines.LoadFromFile(ExtractFilePath(Application.ExeName)+'Data\Base.txt');
Так быстрее будет
Хакинг - не преступление, а способ выживания.
Ghost of Night вне форума Ответить с цитированием
Старый 18.02.2011, 08:11   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Зачем TStringList??
...
Так быстрее будет
Гарантирую - НЕ БУДЕТ!

Вопрос, конечно, что дальше с полученным текстом делать. Если результат РЕАЛЬНО нужно иметь в Memo - тогда Ваш способ будет удобнее и быстрее.
Если же он в Мемо, т.к. автор задачи просто хотел увидеть, что грузится - то тогда способ с переменной будет на порядки быстрее!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.02.2011, 13:49   #5
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Гарантирую - НЕ БУДЕТ!

Вопрос, конечно, что дальше с полученным текстом делать. Если результат РЕАЛЬНО нужно иметь в Memo - тогда Ваш способ будет удобнее и быстрее.
Если же он в Мемо, т.к. автор задачи просто хотел увидеть, что грузится - то тогда способ с переменной будет на порядки быстрее!
да мне нужно загрузить в мемо текст, но если файл весит больше 2 мб то Memo_List.Lines.LoadFromFile(Extrac tFilePath(Application.ExeName)+'Dat a\Base.txt'); - грузит долговато, вот поэтому я и спрашиваю совета через что будет быстрее загрузить файл в мемо?

и еще а как сделать прогресс загрузки к моему примеру то что Вы написали? чтобы работал прогресс и с маленькими(например 10kb) файлами и с большими(например 3Mb)?

Последний раз редактировалось Stilet; 19.02.2011 в 09:07.
casio23 вне форума Ответить с цитированием
Старый 18.02.2011, 16:02   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Грузить файл побайтово в память при этом показывать прогрессбар, а потом уже (после загрузки в память) отобразить в TMemo
FaTaL вне форума Ответить с цитированием
Старый 18.02.2011, 16:28   #7
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

а почему когда файл пустой выдает ошибку вот
код
Код:
Stream := TFileStream.Create(OpenDialog.FilName,fmOpenRead);
                   Reader := TReader.Create(Stream, $FF);
                   Reader.ReadListBegin;
                   Memo_List.Lines.Clear;
                    while not Reader.EndOfList do
                      Memo_List.Lines.Add(Reader.ReadString);
                      Reader.ReadListEnd;
                      Reader.Destroy;
                      Stream.Destroy;
Цитата:
Сообщение от FaTaL Посмотреть сообщение
Грузить файл побайтово в память при этом показывать прогрессбар, а потом уже (после загрузки в память) отобразить в TMemo
у меня не получается, можно пример

Цитата:
Сообщение от casio23 Посмотреть сообщение
у меня не получается, можно пример
я вот сделал но не пойму почему progressbar не работает? файл загружается

код

Код:
 canceled := True;

   Memo_List.Clear;
    ProgressBar1.Max := GetFileSize(Put);
    ProgressBar1.Position:=0;

      AssignFile(BaseFile,Put);
      reset(BaseFile);
      c := 0; b := 0;


      while not eof(BaseFile) do
       begin
        inc(c);
        readln(BaseFile,s);
           b := b + length(s) + 2;

          if (c mod 1000) = 0 then
           begin
            ProgressBar1.Position := b;
            Application.ProcessMessages;
             if canceled then
               break;
       end;
           Memo_List.Lines.Add(s);
       end;
          CloseFile(BaseFile);

Последний раз редактировалось Stilet; 19.02.2011 в 09:08.
casio23 вне форума Ответить с цитированием
Старый 18.02.2011, 20:32   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

мое мнение, в мемо быстрее не загрузишь.
максимум что можно сделать это сначало в TMemoryStream перегнать файл, а потом с памяти грузить.(или в строку весь файл)
ЗЫ: естественно лимит на размер файла есть.

практически все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.02.2011, 20:52   #9
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

Цитата:
Сообщение от casio23 Посмотреть сообщение
я вот сделал но не пойму почему progressbar не работает? файл загружается

код

Код:
 canceled := True;

   Memo_List.Clear;
    ProgressBar1.Max := GetFileSize(Put);
    ProgressBar1.Position:=0;

      AssignFile(BaseFile,Put);
      reset(BaseFile);
      c := 0; b := 0;


      while not eof(BaseFile) do
       begin
        inc(c);
        readln(BaseFile,s);
           b := b + length(s) + 2;

          if (c mod 1000) = 0 then
           begin
            ProgressBar1.Position := b;
            Application.ProcessMessages;
             if canceled then
               break;
       end;
           Memo_List.Lines.Add(s);
       end;
          CloseFile(BaseFile);
подскажите в чем ошибка
casio23 вне форума Ответить с цитированием
Старый 19.02.2011, 15:16   #10
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

вопрос решен
casio23 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц