delphi 中TMemoryStream类的具体用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 中TMemoryStream类的具体用法相关的知识,希望对你有一定的参考价值。

var
mystream:TmemoryStream;
TmpStr:string;
MyStream:=TMemoryStream.Create;
TmpStr:=Edit2.Text;
try
MyStream.Write(TmpStr[1],Length(edit2.text));//z这里不懂 怎么不能直接用tmpsrt字符变量
NMudp1.sendstream(Mystream);
finally
具体问题是上面的 mysrteam 的write方法为什么 要用TmpStr[1],不能直接用tmpsrt
还有就是 MyStream.Write(TmpStr[1],Length(edit2.text))
这句执行的目的是什么 返回什么 把什么给了什么

参考技术A 用TmpStr[1]是因为DELPHI字符串类型的原因,因为长字符串中,TmpStr是代表的字符串存储的地址,而TmpStr[1]就是字符串第一个字符的位置,我是这么理解的。所以要用TmpStr[1]。
delphi的帮助中对TmemoryStream的write方法是这样描述的:
Writes Count bytes from Buffer to the current position in the memory buffer and updates the current position by Count bytes.

Delphi syntax:

function Write(const Buffer; Count: Longint): Longint; override;

C++ syntax:

virtual int __fastcall Write(const void *Buffer, int Count);

Description

Use Write to insert Count bytes into the memory buffer of the memory stream, starting at the current position. Write will increase the size of the memory buffer, if necessary, to accommodate the data being written in. If the current position is not the end of the memory buffer, Write will overwrite the data following the current position.

Write updates the Size property to Position + Count, and sets the Position property to the new value of Size. Thus, any data that was stored in the memory stream in the Count bytes after the current position is lost when calling Write.

Write always writes the Count bytes in the Buffer, unless there is a memory failure. Thus, for TMemoryStream, Write is equivalent to the WriteBuffer method.

All other data-writing methods of a memory stream (WriteBuffer, WriteComponent) call Write to do the actual writing.
---------------------
MyStream.Write(TmpStr[1],Length(edit2.text)) 是把TmpStr串中的内容写到MyStream内存流里面,Length(edit2.text)是写入的字符数本回答被提问者采纳

Delphi如何从URL获取图片

【中文标题】Delphi如何从URL获取图片【英文标题】:How to get images from URL in Delphi 【发布时间】:2010-11-16 16:36:42 【问题描述】:

我正在寻找显示如何将图像从 URL 拉入 Delphi TImage 组件的任何代码示例。

谢谢,

【问题讨论】:

【参考方案1】:

借助 TMemoryStream 和 Indy 组件。

uses
  GIFImg;

procedure TForm1.btn1Click(Sender: TObject);
var
  MS : TMemoryStream;
  GIf: TGIFImage;
begin
  MS := TMemoryStream.Create;
  GIf := TGIFImage.Create;
  try
    IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS);
    Ms.Seek(0,soFromBeginning);       
    Gif.LoadFromStream(MS);
    img1.Picture.Assign(GIF);

  finally
    FreeAndNil(GIF);
    FreeAndNil(MS);
  end;
end;

【讨论】:

您甚至可以不使用 TGifImage 而使用 img1.Picture.LoadFromStream(MS); 警告: 如果TIdHTTP.Get 中存在异常,则此代码将释放未初始化的GIF 变量。如果您没有在之前进入相应的“try”部分进行初始化,请不要在“finally”部分中使用变量。 不,拉斯,你不能那样做。 TPicture.LoadFromStream 受保护,不公开。而且它只是调用Bitmap.LoadFromStream,所以它无论如何也不知道如何加载GIF数据。 谢谢 Rob,我很着急,特别是 Gif 方面,我希望将 Stream 直接存储到 TImage 中,但发现它不可用。 Mohammed,该代码适用于您发布的 GIF。我很感激。我无法使用 JPEG(我使用 D2009)。我在上面发布了我的代码。任何建议将不胜感激谢谢,克里斯又名格林纳【参考方案2】:

代码也适用于 JPEG。

【讨论】:

添加“使用JPEG”,我用GIF单元制作了我的例子,你需要使用Jpeg一个。 绿色,你没有使用正确的Get方法。如果你想让它填充一个流,你需要记住将流作为参数传递。 Get 的单参数版本将资源内容作为函数返回值中的字符串返回。 是的,Rob,我发现了我的错误。再次感谢大家的帮助。 您应该编辑您的第一篇文章或将 cmets 添加到相关答案中。【参考方案3】:

对于this project,我使用了 Indy 组件(如第一响应),但使用线程内的代码。用于下载大图像或大量图像。您可以在链接中看到项目的完整说明(西班牙语但您可以使用自动翻译)。

在这种情况下,我用它来下载所有图像from this page。 这里我使用了另一个组件IdSSL:TIdSSLIOHandlerSocket,这是访问 https url 所必需的;如果您必须访问 http,则不需要它。

TDownImageThread的代码是(加了英文cmets):

  : Clase para descargar una imagen y almacenarla en disco.
  : Class to download image and save to disk
  TDownImageThread = class(TThread)
  private
    FURLImage: string;
    FPathImage: string;
    FFileNameImage: string;
    // Internas
    ImageName: string;
    PathURL: string;
    // Componente
    idH:TidHTTP;
    IdSSL:TIdSSLIOHandlerSocket;
  public
    // redefinir métodos  // redefine methods
    constructor  Create(AURL:string; AOutPathImages:string);
    destructor Destroy; override;
    procedure Execute; override;
    : URL de la imagen a descargar. //   URL to download
    property URLImage:string read FURLImage write FURLImage;
    : Path de disco local donde voy a almacenar la imagen.
    : Local path to save the images
    property PathImage:string read FPathImage;
    : Nombre completa (path+Nombre) de la imagen almacenada en disco local
    : complete name (path+name) of loval image
    property FileNameImage:string read FFileNameImage;
  end;



....


 TDownImageThread 
constructor TDownImageThread.Create(AURL, AOutPathImages: string);
var
  URI:TidURI;
begin

  // crear el thread suspendido  // Create suspended thread
  inherited Create(True);
  // Parámetros: URL y dir de salida   // Params URL and output dir.
  Self.FURLImage := AURL;
  Self.FPathImage := AOutPathImages;
  // Crear con URL    // create with URL 
  URI := TidURI.Create(AURL);
  try
    ImageName := URI.Document;
    PathURL := URI.Path;
  finally
    URI.Free;
  end;
end;

destructor TDownImageThread.Destroy;
begin
  inherited;
end;

//: recupara la imagen y la guarda en disco
procedure TDownImageThread.Execute();
var
  Stream:TFileStream;
  IdH:TidHTTP;
  IdSSL:TIdSSLIOHandlerSocket;
  path:string;
  dir:string;
begin
  // Directorio de salida  // output directory
  dir := AnsiReplaceText(PathURL, '/', STR_EMPTY);
  // Nombre vacío  // empty name
  if (ImageName = STR_EMPTY) then begin
    Exit;
  end;
  // Path de salida     // output path
  path := IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage) +
           dir) + ImageName;
  // Crearlo por si no existe    // create it if not exist
  ForceDirectories(ExtractFilePath(path));
  try
    // Stream para la imagen    // Stream for the image
    Stream  := TFileStream.Create(path, fmCreate);
    try
      // Crear componente para acceder   /// Create the component in runtime
      IdH := TidHttp.Create(nil);
      IdH.ReadTimeout := 30000;
      // necessary to use HTTPS
      IdSSL := TIdSSLIOHandlerSocket.Create(nil);
      IdH.IOHandler := IdSSL;
      IdSSL.SSLOptions.Method := sslvTLSv1;
      IdSSL.SSLOptions.Mode := sslmUnassigned;
      idH.HandleRedirects := True;
      IdH.RedirectMaximum := 3;

      // proteccion
      try
        // Obtener la imagen   // get the image
        IdH.Get(Trim( FURLImage), Stream);
      except
        // Error al descargar la imagen   
        //..  Volcarlo al log
      end;
    finally
      // Liberar    // Free component
      idH.Free;
      // IdSSL.Free;
      Stream.Free;
    end;
    // Path de salida     // output path
    FFileNameImage := path;
  except
    // error al crear el fichero  // error on create file
    //...  Log
  end;
end;

要使用它,调用类似这样:

// Crear un nuevo thread para descargar la imagen
// Create a new thread  LINK+output path
th := TDownImageThread.Create(mmLinks.Lines[i], pathImages);
// Procedimiento de retorno al finalizar
// procedure to return on thread finalize
th.OnTerminate := TerminateThread;
th.Resume;

【讨论】:

【参考方案4】:

最好使用此功能进行下载:

function DownloadFile(Url, DestFile: string): Boolean;
begin
   try
     Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0;
   except
     Result := False;
   end;
end;

【讨论】:

以上是关于delphi 中TMemoryStream类的具体用法的主要内容,如果未能解决你的问题,请参考以下文章

关于 Delphi 中流的使用 用 TFileStream(文件流) 读写

Delphi TMemoryStream写入到字符串和字符串写入到流

关于 Delphi 中流的使用 用 TMemoryStream(内存流) 入门

delphi save .dfm to .txt

Delphi如何从URL获取图片

delphi indy10 无法接收中文