Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.05.2014, 19:26
Virus191288 Virus191288 вне форума
Прохожий
 
Регистрация: 24.08.2009
Сообщения: 2
Репутация: 10
По умолчанию объединение TMemoryStream

Добрый день. Проблема следующая:
Хочу объединить 3 TMemoryStream, сохранить, загрузить и разделить.
Что я делаю
Гружу в стримы информацию из memo, затем объединяю и на этом моменте получаю кучу ошибок

вот то что сделал сейчас

Код:
private
    AStream, BStream, CStream,ResultStream: TMemoryStream;
    procedure CompressFiles(ResStream: TMemoryStream);     


procedure StringToStream(const AString: string; Stream: TMemoryStream);
begin
  Stream:=TMemoryStream.Create;
  Stream.Write(AString[1], Length(AString));
end;   

procedure TForm1.CompressStream(ResStream: TMemoryStream);
var   outfile: TMemoryStream;
  compr : TMemoryStream;
  i,l,b : Integer;
  s : String;
begin

    outFile := TMemoryStream.Create;
    try       { отмечаем количество файлов }
      l := 3;
      outfile.Write(l,SizeOf(l));


          s := 'AStream';
          l := Length(s);
          outfile.Write(l,SizeOf(l));
          outfile.Write(s[1],l);           { размер стрима }
          l := AStream.Size;
          outfile.Write(l,SizeOf(l));           {упаковываем файл и сохраняем во временный файл}
          outfile.LoadFromStream(AStream);
           // outfile.SaveToFile('mestream');


          AStream.Free;

//
    finally
      outfile.Free;
    end;         
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StringToStream(memo1.Text, AStream);
  StringToStream(memo2.Text, BStream);
  StringToStream(memo3.Text, CStream);
  Button2.Enabled:=true;
  Button3.Enabled:=true;
end; 

procedure TForm1.Button2Click(Sender: TObject);
begin
  CompressStream(ResultStream);
end; 


Уже 3 раз начинаю писать этот код и все время натыкаюсь на проблемы, кто может подсказать что не так и как это можно сделать(и если не сложно помочь с исходником)?

Последний раз редактировалось Virus191288, 12.05.2014 в 19:29.
Ответить с цитированием
  #2  
Старый 13.05.2014, 00:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Virus191288
Добрый день. Проблема следующая:
Хочу объединить 3 TMemoryStream, сохранить, загрузить и разделить.
Что я делаю
Гружу в стримы информацию из memo, затем объединяю и на этом моменте получаю кучу ошибок
Во-первых вот здесь:
Код:
procedure StringToStream(const AString: string; Stream: TMemoryStream);
begin
  Stream:=TMemoryStream.Create;
  Stream.Write(AString[1], Length(AString));
end;  
Сделай вот так:
Код:
procedure StringToStream(const AString: string; var Stream: TMemoryStream);
Тогда указатели на созданные объекты класса TMemoryStream будут попадать в соответствующие глобальные переменные (AStream, BStream и CStream).

Во-вторых... эээ... это наверное неполные исходники? Вот в этом методе:
Код:
procedure TForm1.CompressStream(ResStream: TMemoryStream);
указан параметр ResStream который нигде по коду больше не используется.
Ответить с цитированием
  #3  
Старый 13.05.2014, 23:12
Virus191288 Virus191288 вне форума
Прохожий
 
Регистрация: 24.08.2009
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо за подсказку на я уже все сделал. Вот пример:
Код:
unit Unit1;

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Menus;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    Memo5: TMemo;
    Memo6: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    AStream, BStream, CStream,ResultStream,newstream: TMemoryStream;
    ArrStream: Array of TMemoryStream;
    procedure DecompressStream(childstream:TMemoryStream;var ResStream:TMemoryStream; nl:Boolean = false);
    procedure CompressStream(var childstream : array of TMemoryStream; const FText: Array of String; var  ResStream:TMemoryStream);
    function StreamToString(Stream: TStream): String;
    procedure StringToStream(const AString: string; var Stream: TMemoryStream);
    procedure StringsToArray(const AArray : Array of String; var BArray : Array of String);
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

function TForm1.StreamToString(Stream: TStream): String;
var
   SL:TStringList;
begin
     SL:=TStringList.Create;
     stream.Position := 0;
     SL.LoadFromStream(stream);
     result:=SL.Text;
     SL.Free;
end;

procedure TForm1.StringToStream(const AString: string; var Stream: TMemoryStream);
begin
  Stream.Write(AString[1], Length(AString));
end;



procedure TForm1.DecompressStream(childstream:TMemoryStream;var ResStream:TMemoryStream; nl:Boolean = false);
var
   outfile : TMemoryStream;
  i,l,c : Integer;
  s:string;
begin
  //restart
  if nl then
    childstream.Position := 0;

 childstream.Read(l,SizeOf(l));       //read stream

 ResStream := TMemoryStream.create;    //copy to new stream
 ResStream.CopyFrom(childstream,l);
end;

procedure TForm1.CompressStream(var childstream : array of TMemoryStream; const  FText: Array of String; var ResStream:TMemoryStream);
var
  i,DataSize : Integer;
  s : String;
begin
    for i:= 0 to Length(childstream)-1 do begin

      if text<>'' then begin
         childstream[i]:=TMemoryStream.Create;
         StringToStream(FText[i], childstream[i]);
      end;
           { размер стрима }
    DataSize := childstream[i].Size;
    ResStream.Write(DataSize,SizeOf(DataSize));
          {упаковываем файл и сохраняем во временный файл}
    ResStream.CopyFrom(childstream[i], 0);

    childstream[i].Free;
    end;


end;

procedure TForm1.StringsToArray(const AArray : Array of String; var BArray : Array of String);
var I:Integer;
begin
 for i:=0 to Length(AArray)-1 do
   BArray[i] :=AArray[i];
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  ResultStream:=TMemoryStream.Create;

  SetLength(ArrStream,3);
  CompressStream(ArrStream, [memo1.Text, memo2.Text, memo3.Text], ResultStream);
  ResultStream.SaveToFile(ExtractFileDir(ParamStr(0))+'/11.srt');
  Button3.Enabled:=true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 DecompressStream(ResultStream,AStream,true);
 memo4.text:=StreamToString(AStream);
 DecompressStream(ResultStream,BStream,false);
 memo5.text:=StreamToString(BStream);
 DecompressStream(ResultStream,CStream,false);
 memo6.text:=StreamToString(CStream);
end;

end.
п.с. каждый раз узнаю что-то новое, например что в процедуру можно передать элементы в виде масива))
п.п.с. код сложный и скорее всего кривой
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter