델파이 (RAD Studio)에서 프로젝트를 만들고 있습니다. 일부 행에는 데이터베이스 테이블에 저장된 이미지가 있습니다. 런타임에 이미지를 추출하고 (TMemoryStream의 Array를 사용하고있는) 이미지를 frxReport에 표시하고 싶습니다.런타임에 데이터베이스에서 TMemoryStream에 여러 이미지를 저장하고 나중에 추출하는 방법
내 코드
공공 변수은 TStream은
로 선언 다음과 같이Stream2 : Array of TStream; i,k: integer
코드 세그먼트 MainForm에 배치하고 frxReport을 보여줄 것으로 예상된다보기 버튼을 클릭 이벤트에 대한.
`
procedure TFrmMain.btnViewClick(Sender: TObject);
begin
i := 0;
k := 0;
UniTable1.SQL.Text := 'Select * from userplays order by id';
UniTable1.Execute;
rowcount := UniTable1.RecordCount;
SetLength(myid, rowcount);
SetLength(mydesc, rowcount);
SetLength(myimg, rowcount);
SetLength(Stream2, rowcount);
while not UniTable1.Eof do
begin
try
Stream2[k] := TMemoryStream.Create;
myid[k] := UniTable1.FieldByName('id').Value;
Stream2[k] := UniTable1.CreateBlobStream(TBlobField(UniTable1.FieldByName('image')), bmRead);
mydesc[k] := UniTable1.FieldByName('description').Value;
UniTable1.Next;
inc(k);
finally
//Stream2[k].Free;
end;
end;
frxUserDataSet1.RangeEnd := reCount;
frxUserDataSet1.RangeEndCount := rowcount;
frxReport1.ShowReport;
i := 0;
end;
`
그러나이 방법 Stream2 어레이에 대한 이미지를로드하지 않는다. 친절하게 방법을 알려 procedure TFrmMain.frxReport1GetValue(const VarName: string; var Value: Variant);
`
Graphic := TJPEGImage.Create;
Graphic.LoadFromStream(Stream2[j]);
TfrxPictureView(frxreport1.FindObject('Picture1')).Picture.Graphic := Graphic;
` 에서 frxRaport에 표시 할 JPEGImage 배열이 다음 사용 된 경우, 그러나 그것은 문제가 될 것 JPEGImage의 배열을 사용하는 옵션이 있습니다 이 작업을 수행.
정확히 델파이 버전은 무엇입니까 ??? 내 제안 : 일부 파일 컨테이너를 사용하십시오 : .TAR 또는 .ZIP 또는 무엇이든 - 파일을 넣은 다음 파일을 데이터베이스 BLOB에 저장하십시오. 예를 들어 Delphi XE2에서는 디스크를 건드리지 않고도 TStream을 통해 메모리 내장 ZIP을 만들 수 있습니다. 그래서 당신은 직접적으로 많은 파일을 포함하기 위해 TMemoryStream 또는 TBLobStream을 사용할 수 있습니다. –
델파이 버전 XE-3 –
을 사용하고 있습니다. 그 방법은 당신을 위해 가야하고, 스트림을 통해 메모리 내 지퍼를 만들어 DB에 저장하는 방법입니다. 아주 먼 코드지만 몇 가지 클래스 메서드를 언급 https://github.com/the-Arioch/avemey.com/blob/master/zexmlss/src/zeZippyXE2.pas –