Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как перевести данные из TStrings в TMemoryStream?


Delpher-X

Вопрос

У меня есть следующий код, который передает данные из потока в объект типа TStrings: 

var
F : TMemoryStream;

S : TStrings;

begin
F := TMemoryStream.Create;
S := TStringList.Create;
F.LoadFromFile('C:/File.jpg');
S.LoadFromStream(F);

Из TMemoryStream в TStrings все передается нормально. Однако - как обратно? Как снова преобразовать объект TString в поток данных, дабы снова можно было бы сохранить его в полноценный файл? 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

ваш пример у меня вызывает вопрос - откуда у вас в jpg файле строки, которые вы так лихо загружаете в TStrings?

и что вам мешает сделать просто S.LoadFromFile() ??

более того, и SaveToFile тоже есть. Вполне полноценный

ну и предполагается что оф справка должна быть изучена ДО вопросов на форуме

http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TStrings_Methods

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
7 часов назад, krapotkin сказал:

и что вам мешает сделать просто S.LoadFromFile() ??

более того, и SaveToFile тоже есть. Вполне полноценный

Нет, мне нужно именно из потока. А потом, чтобы снова загрузить в поток. 

7 часов назад, krapotkin сказал:

ваш пример у меня вызывает вопрос - откуда у вас в jpg файле строки, которые вы так лихо загружаете в TStrings?

Ну, любой файл, это ведь строки бинарного кода, не так ли? 

Ссылка на комментарий
  • 0

Вы вообще не читаете? я и ссылку дал. LoadFromStream находится прямо рядом с LoadFromFile. Мы, надеюсь, о Stream говорим, когда имеем в виду "поток" ?

 

И файл это никакие не строки бинарного кода. Это полная чушь.  Файл это просто сырые данные, набор байтов.

А строки как таковые - это понятие, которое вводится специально, с описанием, что имеется в виду, в каком формате хранится, и как с этим работать.

Так что нет. Совсем нет.

Ссылка на комментарий
  • 0
28 минут назад, krapotkin сказал:

Вы вообще не читаете? я и ссылку дал. LoadFromStream находится прямо рядом с LoadFromFile. Мы, надеюсь, о Stream говорим, когда имеем в виду "поток" ?

Тут вот какое дело: я хочу разрезать stream для передачи его по кусочку в формате data. А потом, в точке доставки, снова склеить и перегнать в stream. 

Ссылка на комментарий
  • 0

по какому протоколу? голый TCP? 

Передавать вы все равно будете скорее всего либо TStream либо TBytes.

Если у вас есть TStream, то вам нужно его часть скопировать в другой TStream, и его отослать. Опять же в документации http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TStream.CopyFrom

То же самое можно сказать и насчет TBytes http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TStream.ReadBuffer

Играйтесь на здоровье. Но реализация собственного протокола обмена это всегда гораздо больший геморрой, чем например использование http

Ну и конечно TStrings тут вообще никаким боком...

Ссылка на комментарий
  • 0
5 часов назад, krapotkin сказал:

по какому протоколу? голый TCP? 

Это не важно. 

 

5 часов назад, krapotkin сказал:

Если у вас есть TStream, то вам нужно его часть скопировать в другой TStream, и его отослать. 

У меня такая ситуация, что я не могу отсылать TStream'ы. Data могу, а Stream - не проходит. 

Ссылка на комментарий
  • 0
В 10.05.2021 в 22:09, Delpher-X сказал:

Из TMemoryStream в TStrings все передается нормально. Однако - как обратно? Как снова преобразовать объект TString в поток данных, дабы снова можно было бы сохранить его в полноценный файл? 

  SaveToStream не подходит?)

если грузить jpeg в tstringlist а потом через text выбирать куски и передавать, то с вероятностью 99.9999% на той стороне ничего не соберется, будут большие потери данных. так как в тексте будут отсутствовать комбинации байтов для которых нет символов. 

сколько годиков гению программирования интересно?)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Похожий контент

    • Автор Delpher-X
      Итак, у меня была Delphi 10.3 Community Editon, которой я пользовался год. Затем, бесплатная лицензия истекла и я поставил себе новую Community Edition - на этот раз, версию 10.4. Однако она оказалась полным отстоем - ничего нового и интересного в ней нет, а вот целая куча нужных вещей оказалась выпилена (включая то, что многие старые компоненты больше не работают). 
      А посему у меня вопрос - как реанимировать установленную у меня Delphi 10.3, как продлить ее Community Edition лицензию? 
    • Автор Yaugenka
      В компанию требуется опытный разработчик, который готов присоединиться к команде для разработки крупного проекта в области Blockchain-технологий, распределенных систем и криптографии. Зп от 150 000 до 200 000 ₽. Удаленная работа.

      Обязанности:

      - Работа с криптографическими алгоритмами, blockchain технологиями
      - Разработка программного обеспечения на Delphi
      - Участие в разработке блокчейн проекта нового поколения
      - Разработка, поддержка и развитие серверных функций системы на основе Blockchain
      - Отладка, анализ производительности оптимизация ПО;
      - Проектирование и разработка архитектуры разрабатываемых решений;

      Требования:

      - Опыт разработки ПО от 5 лет;
      - Плюс: Понимание принципов работы публичных и закрытых блокчейнов (Ethereum/Solidity, Bitcoin, Quorum)
      - Знание принципов ООП и шаблонов проектирования;
      - Опыт работы с системами контроля версий ПО (Git)
      - Уверенное владение языком программирования Delphi, средой разработки embarcadero
      - Знание английского языка на уровне чтения технической литературы;

      Условия:

      - Участие в интересном и масштабном проекте
      - Дружный коллектив;
      - Возможности развития и обучения

      Бонусы
      Бонусы по итогам года.

      О нас:
      Мы компания новаторов и энтузиастов в сфере блокчейн и криптовалют.
      https://career.habr.com/vacancies/1000074707

      Контакт для обратной связи: hr@relictum.pro
    • Автор Delpher-X
      Итак, как добавить в приложение проверку наличия соединения с Интернетом? Я всегда пользовался кодом: 
      var NetControl : DWORD; begin NetControl := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; Result := InternetGetConnectedState(@NetControl, 0); end; Однако здесь он явно не подходит, так как предназначен для Windows, а меня интересует Android. Я пробовал использовать компонент IdIPWatch, но он все время верещал о том что Интернета нет, несмотря на то что смартфон был вполне подключен к сети. 
    • Автор Delpher-X
      Вопрос: как спрятать главную форму приложения в FMX? В VCL это делается просто - Project>View Source>вписываешь в открывшемся окне Application.ShowMainForm := False, однако в FMX такой фокус не прокатывает, там просто свойства такого нет - ShowMainForm. Как же быть? 
    • Автор Delpher-X
      Пытаюсь программно добавить в своем проекте компонент IdFTP: 
      FTPBot : TIdFTP; FTPBot := TIdFTP.Create(); FTPBot.Name := 'FTPGhost'; FTPBot.Passive := True; FTPBot.Host := ''; FTPBot.Username := ''; FTPBot.Password := ''; Код компилируется нормально. 
      Однако, когда я пытаюсь обратиться к свойству TransferType полученного объекта: 
      FTPBot.TransferType.ftBinary; Программа при компиляции вылетает с ошибкой, утверждает что нельзя так писать. В чем дело? 
    • Автор Delpher-X
      Я обратил внимание, что если в VCL цвет формы, а также некоторых других компонентов можно менять, то в FMX это сделать нельзя - доступен только дефолтно-серый, во всяком случае, при компиляции под Android. Есть ли какие-то способы это поправить? 
    • Автор Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • Автор Вадим Смоленский
      Туплю, не могу понять, как именно нужно клонировать объект. Пишу так:
      Button2:=FMX.Types.TFmxObject.Clone(Button1); Delphi ругается, говорит: This form of method call only allowed for class methods or constructor.

      Что делаю не так?
    • Автор Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • Автор Delpher-X
      У меня есть код, который должен скачивать файл с сайта: 
      var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.  
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...