TMemoryStream의 상속 관계는 다음과 같습니다.
TObject
|
TStream
|
TCustomMemoryStream
|
TMemoryStream
TMemoryStream을 사용하는 방법은 무엇입니까?
실제로 TmemoryStream은 TStream과 동일하게 사용됩니다.
특정 속성과 메소드에 대해서는 도움말을 참조하세요.
예는 다음과 같습니다.
메모리에서 직접 비트맵을 읽고 쓰려면 어떻게 해야 합니까?
TmemoryStream이 많은 도움이 됩니다
var
BitmapMemoryStream:TMemoryStream;
비트맵1:TB비트맵;
PROcedure TForm.Button1Click(Sender:TObject);
시작하다
BitmapmemroyStream:=TmemoryStream.Create file://메모리스트림 생성;
Bitmap1:=TBitmap.Create;
노력하다
Bitmap1.LoadFromFile('d:Bitmap1.bmp');
제외하고
ShowMessage('LoadFile bitmap1.bmp 오류');
끝;
끝;
절차 TForm.Button2Click(Sneder:Tobject);
시작하다
할당된 경우(비트맵1) 다음
Bitmap1.SaveToStream(BitmapmemoryStream);
끝;
절차 TForm.Button3Click(Sender:TObject);
시작하다
BitmapMemoryStream<>nil이면
시작하다
노력하다
BitmapMemroyStream.SaveToFile('Bitmap1.str'); file://메모리 스트림 저장, 크기 및
파일://Bitmap1.bmp 동일
제외하고
showmessage('액세스 메모리에 오류가 발생했습니다!');
끝;
끝;
끝;
절차 TForm.Button4Click(Sender:TObject);
var
버퍼:문자 배열[0..53];
시작하다
할당된 경우(BitmapMemroyStream) 다음
노력하다
BitmapMemroyStream.Seek(0,soFromBeginning);
BitmapMemoryStream.Read(Buffer,54);
Buffer[0]='B'이고 Buffer[1]='M'이면 file://메모리 내용을 다시 씁니다.
시작하다
BitmapMemoryStream.Seek(0,soFromBeginning);
BitmapmemoryStream.Write('ICE',3);
Button3Click(Sender);//다시 작성된 내용을 파일에 씁니다.
끝;
제외하고
ShowMessage('액세스 시 오류 memroyStream');
끝;
끝;
TMemoryStream을 사용하여 메모리를 읽고 쓰는 것이 얼마나 편리한지 알 수 있습니다. 물론 먼저 Bitmap을 빌드할 필요는 없습니다.
LoadFromFile을 사용하여 파일을 직접 부팅할 수 있지만, 다른 메모리 스트림의 경우 위의 방법을 사용할 수 있습니다.
위의 내용은 단지 소개에 불과합니다. 다른 기능에 대해서는 도움말을 읽고 직접 알아보세요.
다른 스트리밍 개체도 많이 있으며 모두 거의 동일하므로 모두 사용할 수 있습니다!
스트림의 내용을 클립보드에 쓰고 처리하는 방법
이 기술은 Delphi의 클립보드 클래스 구현을 참조하여 수행됩니다. 스트림의 내용을 클립보드에 넣습니다.
먼저 RegisterClipboardFormat() 함수를 사용하여 자신만의 형식을 등록하세요.
그런 다음 다음 세 단계를 수행하십시오.
1. 콘텐츠 스트림을 생성하고 여기에 콘텐츠를 씁니다.
2. 글로벌 콘텐츠 영역을 생성하고 스트림의 콘텐츠를 작성합니다.
3. ClipBoard.SetAsHandle()을 호출하여 클립보드에 내용을 씁니다.
클립보드에 콘텐츠 쓰기
var
hbuf :THandle;
bufptr : 포인터;
mstream: TMemoryStream;
시작하다
mstream := TMemoryStream.Create;
노력하다
{-- 스트림 처리를 위한 코드 --}
hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
노력하다
bufptr := GlobalLock(hbuf);
노력하다
Move(mstream.Memory^, bufptr^, mstream.size);
Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
마지막으로
GlobalUnlock(hbuf);
끝;
제외하고
글로벌프리(hbuf);
들어올리다;
끝;
마지막으로
mstream.Free;
끝;
끝;
해당 작업은 데이터를 읽을 때 할당된 글로벌 버퍼를 해제하지 않도록 주의하시기 바랍니다.
복사하여 나중에 처리해야 합니다.
클립보드 내용 읽기
var
hbuf :THandle;
bufptr : 포인터;
mstream: TMemoryStream;
시작하다
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
hbuf <> 0이면 시작
bufptr := GlobalLock(hbuf);
bufptr <> nil이면 시작됩니다.
노력하다
mstream := TMemoryStream.Create;
노력하다
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
mstream.Position := 0;
{-- 스트림 처리를 위한 코드 --}
마지막으로
mstream.Free;
끝;
마지막으로
GlobalUnlock(hbuf);
끝;
끝;
끝;
끝;
TStream을 사용하여 Dephi에서 데이터를 읽고 쓰는 팁
스트리밍 데이터에 대한 작업을 지원하기 위해 추상 데이터 유형 TStream이 Dephi에 제공됩니다. 이러한 데이터는 일반적으로 파일, 데이터베이스, 메모리 개체, OLE 개체 등에서 가져옵니다. TStream은 데이터를 읽고 쓰는 통합되고 간결한 방법을 제공합니다. 일반적인 상황에서는 TStream 클래스를 직접 사용할 필요가 없으며 스트리밍 데이터의 읽기 및 쓰기는 VCL 컨트롤의 메서드에 캡슐화됩니다. 그러나 이러한 방법이 우리의 요구 사항을 충족할 수 없는 경우 데이터 읽기 및 쓰기를 수동으로 제어해야 합니다.
1. TStream의 일반적으로 사용되는 메서드 및 속성:
---- 1. 함수 읽기(var Buffer; Count: Longint): Longint virtual;
---- 2. 함수 쓰기(const Buffer; 개수: Longint): Longint virtual;
---- 3. 함수 탐색(오프셋: Longint; 원본: Word): Longint;
---- 4. 부동산 위치: Longint;
---- 5. 속성 크기: Longint
---- 읽기, 쓰기 및 탐색은 모두 순수 가상 함수로서 데이터 읽기, 쓰기 및 위치 지정을 위한 추상 메서드를 제공합니다. Read 메서드는 Stream에서 Buffer로 데이터를 읽고, Write 메서드는 반대 작업을 구현합니다. 반환 값은 읽고 쓴 데이터의 실제 크기를 나타냅니다. Seek는 스트림에서 데이터 포인터를 이동하는 방법을 제공합니다. 매개변수 Origin은 soFromBeginning, soFromCurrent 및 soFromEnd의 세 가지 값을 가질 수 있습니다. Offset은 오프셋이고 반환 값은 현재 스트림 데이터 포인터의 위치입니다.
---- 위치는 스트림의 데이터 포인터 위치를 나타냅니다. 이 속성은 실제로 Seek 메서드를 호출하여 구현되므로 실제로 사용하는 것이 더 편리합니다. Size 속성은 현재 스트림의 크기를 나타냅니다. 다른 스트림의 경우 읽기 전용인 경우도 있습니다.
2. 스트림 데이터 읽기 및 쓰기.
---- 1. SaveToStream(Stream: TStream) file://클래스의 데이터를 스트림의 현재 위치에 씁니다.
---- 2. LoadFromStream(Stream: TStream) file://현재 위치에서 Stream의 데이터를 읽습니다.
---- 실제 사용에서는 기본적으로 위의 두 가지 기능만 사용하면 됩니다.
3. 예시
----TStream의 상속 트리 다이어그램은 그림 1(생략)에 나와 있습니다. 실제 사용에서는 TFileStream, TMemoryStream 및 TblobStream이 더 일반적으로 사용됩니다. 구체적인 사용법을 설명하기 위해 이 세 가지 스트림을 예로 들어 보겠습니다.
---- Form1 양식을 만들고 btnRead, btnInvert, btnSave 세 개의 버튼과 파일 열기 대화 상자 OpenDialog1 및 데이터 컨트롤 DataSource1, Table1, 테스트를 배치합니다.
---- Dephi에서 제공하는 Database Desktop을 사용하여 test 테이블을 생성합니다. 테이블에 Image라는 필드가 있고 데이터베이스 파일 이름은 test.db로 저장됩니다. TDatabase 컨트롤 dbTest, TTable 컨트롤 Table1, DataSource 컨트롤 DataSource1 및 TDBNavigator 컨트롤 DBNavigator1을 폼에 배치합니다. Desktop에서 방금 생성한 데이터베이스에 dbTest를 연결하고, Table1의 TableName 속성을 test.db로 설정하고, DataSource1의 DataSet 속성을 Table1로 설정하고, DBNavigator1의 DataSource 속성을 DataSource1로 설정하고, 처음 4개의 VisibleButtons 속성을 TRUE로 설정합니다. 그리고 데이터베이스가 처음부터 열려 있도록 dbtest의 Connected를 TRUE로 설정하고 Table1의 Active 속성을 TRUE로 설정한다.
----이벤트 코드는 다음과 같이 작성됩니다.
---- 1. btnRead의 클릭 이벤트, 여기서는 TFileStream의 사용법을 보여줍니다.
var
MS: TFileStream;
시작하다
OpenDialog1.Execute이면
시작하다
MS:=TFileStream.Create
(OpenDialog1.파일이름, fmOpenRead);
Image1.Picture.Bitmap.LoadFromStream(MS);
MS.무료;
끝;
끝;
---- 2. btnInvert의 클릭 이벤트는 TMemoryStream의 사용법을 보여줍니다. 이미지의 색상을 반전시키는 간단한 기능인 반전 기능이 사용됩니다(트루 컬러 이미지에만 유효함). 처리된 이미지 데이터 블록에 대한 포인터를 반환합니다.
var
중
S: TMemoryStream;
p이미지: 포인터;
시작하다
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.위치:=0;
pImage:=Invert(MS.Memory, MS.size);
file://Memory 속성은 실제 메모리 블록에 대한 포인터입니다.
MS.Write(pImage^,MS.size);
MS.위치:=0;
file://의 이전 코드 줄은 포인터를 스트림의 끝으로 이동하므로 재설정해야 합니다.
Image1.Picture.Bitmap.LoadFromStream(MS);
FreeMem(p이미지);
MS.무료;
끝;
반전 기능은 다음과 같습니다.
함수 TForm1.Invert
(p이미지: 포인터; 크기: 정수): 포인터;
var
pData, pMem: PChar;
i: 정수;
시작하다
pMem:=AllocMem(크기);
CopyMemory(pMem,pImage,size);
pData:=pMem+54;
i:=0 ~ size-54-1의 경우 do
시작하다
pData^:=Char(정수 아님(pData^));
pData:=pData+1;
끝;
결과:=pMem;
끝;
---- 1. btnSave의 클릭 이벤트는 Stream의 데이터를 데이터베이스에 쓰는 TMemoryStream의 또 다른 사용법을 보여줍니다.
var
MS: TMemoryStream;
시작하다
MS:=TMemoryStream.create;
Image1.Picture.Bitmap.SaveToStream(MS);
MS.위치:=0;
표1.추가;
file://데이터베이스에 레코드를 추가합니다.
TBlobField(테이블1.FieldbyName
('이미지')).LoadFromStream(MS);
Table1.포스트;
file://데이터베이스에 업데이트를 씁니다.
끝;
---- 4. DBNavigator1의 Click 이벤트는 TBlobStream의 사용법을 보여주며, 데이터베이스의 이미지 데이터를 읽기 위해 쓰기와 다른 방법을 사용합니다.
var
MS: T스트림;
시작하다
Table1을 사용하면
MS:=CreateBlobStream
(FieldbyName('이미지'),bmRead);
이미지1.그림.비트맵.
LoadFromStream(MS);
MS.무료;
끝;
이 글을 읽어주셔서 감사합니다. 사용할 포인트가 부족해서 포인트를 모아서 사용해야 합니다. 이 글이 도움이 되었다고 생각하시면 저에게 투표해 주세요. 감사합니다.