Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с TStream 
V
    Опции темы
chip_and_dayl
Дата 14.7.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Есть следующий код

Код

Var   
    inStream, outStream: TMemoryStream;
    Level: TcompLevel;
begin

    inStream:=TMemoryStream.Create;
    outStream:=TMemoryStream.Create;

    Memo1.Lines.SaveToStream(inStream);
    inStream.Position:=0;

    Level:= clMax;

    with TCompressionStream.Create(TCompressionLevel(Level), outStream) do
    try
      CopyFrom(inStream, inStream.Size);
    finally
      Free;
    end;

    outStream.Position:=0;
    Memo2.Lines.LoadFromStream(outStream);


После того, как происходит загрузка данных в Мемо2

Код

Memo2.Lines.LoadFromStream(outStream);

, то данные попадают не все. Где-то половина. 

Если написать вместо
Memo2.Lines.LoadFromStream(outStream);   =       outStream.SaveToFile('f.txt');
то данные сохраняются полностью.

Вопрос, как сделать, чтобы после выполнения Memo2.Lines.LoadFromStream(outStream); в Мемо2 были записаны все данные!?!

З. Ы. С потоками не работал, поэтому не ругайте


Это сообщение отредактировал(а) chip_and_dayl - 14.7.2010, 19:10


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Демо
Дата 14.7.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(chip_and_dayl @  14.7.2010,  19:09 Найти цитируемый пост)
 with TCompressionStream.Create(TCompressionLevel(Level), outStream) do


А что, у тебя в результате выполнения этой операции текстовые данные остаются в OutStream?
TMemo преднахначен для отображения текстовых данных.


--------------------
    
PM MAIL ICQ Skype   Вверх
chip_and_dayl
Дата 14.7.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Цитата(Демо @  14.7.2010,  19:54 Найти цитируемый пост)
А что, у тебя в результате выполнения этой операции текстовые данные остаются в OutStream?

Ну, они формируются в OutStream. Если б их там не было, то после выполнения outStream.SaveToFile('f.txt'); файл был бы пуст. А так я сверяю что у меня, если сохранять в файл с тем, что если грузить в Мемо "содержимое" outStream, результат выходит, что в Мемо не попала половина данных.

Цитата

TMemo преднахначен для отображения текстовых данных.


Та знаю. Но в программе он предназначен для другого. Вот теперь так и сяк его склеиваю 

Это сообщение отредактировал(а) chip_and_dayl - 14.7.2010, 20:51


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Демо
Дата 14.7.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(chip_and_dayl @  14.7.2010,  19:09 Найти цитируемый пост)
CopyFrom(inStream, inStream.Size);


Что происходит при вызове метода CopyFrom?



--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 15.7.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А какой смысл грузить в мемо бинарные данные?
На первом же #0 символе хвост будет отрезан.
Это ж винда. Здесь нулевой символ означает конец текста.
Мемо предназначено только для вывода текста.
PM MAIL   Вверх
chip_and_dayl
Дата 15.7.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Демо
Копируются данные с одного потока в другой в сжатом виде. Это так мне подсказывает здравый смысл :)


Snowy
Согласен, смысла нет. Мемо используется для загрузки кода активации, для этого достаточно вызвать метод Load. Дальше содержимое Мемо (Memo.Lines.Text) передается в ф-цию кодирования, которая кодирует его собственно и приводит к Base64, пот ом это все передает в виде строки объекту для работы с хмл файлом.

Теперь возникла необходимость, перед тем как кодировать, еще сжать строку.

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

Может это все не логично, но...

Добавлено через 2 минуты и 8 секунд
Спасибо всем, а Snowy еще за ответ в чем же проблема

Не буду ничего мудрить, буду разбираться в TStream


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Snowy
Дата 16.7.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



замени outstream на TStringStream.
Тогда ты сможешь взять string прямо из него.
Либо вручную загнать стрим в стринг и отдать кодировщику:
Код

var
  s: string;
  ms: TMemoryStream;
begin
  .......
  SetLength(s, ms.Size); ms.Read(s[1], ms.Size); // загрузили стрим в стринг
ну и дальше передаёшь этот стринг своему кодировщику
PM MAIL   Вверх
Демо
Дата 16.7.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(chip_and_dayl @  15.7.2010,  21:53 Найти цитируемый пост)
Копируются данные с одного потока в другой в сжатом виде. Это так мне подсказывает здравый смысл smile


Ну так тебе сразу же было сказано, что TMemo для текстовых данных предназначен.


Цитата(chip_and_dayl @  15.7.2010,  21:53 Найти цитируемый пост)
Для решения этого, чтобы не вникать сильно в класс TStream, было решено сделать вот таким не хитрим сопсобом. ТО беж передавать в ф-цию ссылку на мемо, потом содержимое мемо грузить в потом и передавать ф-ции сжатия.


Не всегда простой путь является правильным. smile 


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0907 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.