MS-SQL 서버에서 TQuery를 이용해 불러온 Image Field를 TImage 컴퍼넌트 보여주려 하는데
잘 안되네요... 모가 빠졌나요? 아님 다른 방법이라도 알려주세여~
아래의 두가지 방법으로 시도해봤는데 모두
에러가 발생하네요
'JPEG error #53'
물론 uses 절에 jpeg 추가했습니다.
**방법1**************************************************************
procedure TFrmbEmpImageEntry.Query;
var
jpg_face : TJPEGImage;
jpgStream : TStream;
begin
try
MsgDisplay(msg_query_on, 0);
//기본 정보
QueryEmpInfo.Close;
QueryEmpInfo.ParamByName('EmpID1').AsString := Copy(EditEmpID.Text, 1, 1);
QueryEmpInfo.ParamByName('EmpID2').AsString := Copy(EditEmpID.Text, 2, 2);
QueryEmpInfo.ParamByName('EmpID3').AsString := Copy(EditEmpID.Text, 4, 3);
QueryEmpInfo.Open;
jpg_face := TJPEGImage.Create;
jpgStream := TStream.Create;
jpgStream := QueryEmpInfo.CreateBlobStream(QueryEmpInfo.FieldByName('photo'), bmRead);
try
jpg_face.LoadFromStream(jpgStream);
ImageEmpFace.Picture.Assign(jpg_face);
finally
jpg_face.Free;
jpgStream.Free;
end;
MsgDisplay(msg_query_succ_fmt, [QueryEmpInfo.RecordCount], 5);
except
on E: Exception do
begin
MsgClear;
MsgBox(msg_query_fail, E.Message, MB_OK+MB_ICONHAND+MB_APPLMODAL);
end;
end;
end;
**방법2*********************************************************************
procedure TFrmbEmpImageEntry.Query;
var
jpg_face : TJPEGImage;
jpgStream : TStream;
Buffer : PChar; //그림이 저장될 메모리를 가진 포인터
MemSize : Integer; //그림이 저장될 메모리 크기
begin
try
MsgDisplay(msg_query_on, 0);
//기본 정보
QueryEmpInfo.Close;
QueryEmpInfo.ParamByName('EmpID1').AsString := Copy(EditEmpID.Text, 1, 1);
QueryEmpInfo.ParamByName('EmpID2').AsString := Copy(EditEmpID.Text, 2, 2);
QueryEmpInfo.ParamByName('EmpID3').AsString := Copy(EditEmpID.Text, 4, 3);
QueryEmpInfo.Open;
jpg_face := TJPEGImage.Create;
jpgStream := TStream.Create;
jpgStream := QueryEmpInfo.CreateBlobStream(QueryEmpInfo.FieldByName('photo'), bmRead);
//이미지를 읽기 위해 BLOBStream을 생성
MemSize := jpgStream.Size; //그림이 저장될 공간의 크기
Inc(MemSize); //Null 값을 저장하기 위해 1 증가
Buffer := AllocMem(MemSize); //포인터에 메모리 할당
try
jpgStream.Read(Buffer^, MemSize); //BLOBStream의 Buffer에서 MemoSize만큼 읽어 들인다.
jpgStream.Position := 0; //BLOBStream의 처음 위치로 이동
jpg_face := TJPEGImage.Create; //TJPEGImage 생성
try
jpg_face.LoadFromStream(jpgStream); //TJPEGImage에 BLOBStream을 Load
ImageEmpFace.Picture.Assign(jpg_face); //TImage에 TJPEGImage 할당
finally
jpg_face.Free; //사용한 메모리 반환
jpgStream.Free;
end;
finally
FreeMem(Buffer, MemSize); //사용한 메모리 반환
end;
MsgDisplay(msg_query_succ_fmt, [QueryEmpInfo.RecordCount], 5);
except
on E: Exception do
begin
MsgClear;
MsgBox(msg_query_fail, E.Message, MB_OK+MB_ICONHAND+MB_APPLMODAL);
end;
end;
end;