고수님들 안녕하십니까...
이번의 질문은 tprinter를 이용하여 db에 저장된 것을 Query로 불러들여 출력을
하고자 하는데 이미지출력시 이해가 가지 않는 부분이 있어 이렇게 질문을 드리고자
합니다.
아래의 소스를 보시고 왜 그런것인지 설명좀 부탁드리고요...
procedure Tfrm_jass130f.prtClick(Sender: TObject);
var n : integer;
begin
lbl_msg.font.color := clnavy;
lbl_msg.caption := '출력중입니다. 잠시 기다리세요....!';
frm_jass130f.enabled := false;
n := 0;
for m := 1 to sgrid.rowcount-1 do begin
if sgrid.Cells[0,m] <> 'Y' then begin
inc(n);
continue;
end;
jsym := copy(sgrid.Cells[1,m],1,7); // 검색키값(조회년월)
seq := copy(sgrid.cells[1,m],9,3); // 검색키값(순서)
try
printer.Orientation := poportrait;
Printer.beginDoc;
full_box; // 전체 테두리 출력..
이부분 => qry_display; // data 를 조회한다.
부터 prt_display; // data 를 출력한다.
{ 그림의 유/무를 쿼리 }
query6.close;
query6.ParamByName('date').asstring := jsym;
query6.ParamByName('seq').asstring := seq;
query6.open;
{ 이미지 출력한다. }
if (not query6.fieldbyname('dr_image_j').isnull)
and (not query6.fieldbyname('dr_image_h').isnull) then
img_flag := 1
else if (not query6.fieldbyname('dr_image_j').isnull) then
img_flag := 2
else if (not query6.fieldbyname('dr_image_h').isnull) then
img_flag := 3
else img_flag := 0;
if img_flag <> 0 then
img_display; /// 이미지 출력하는 부분임다.
{...} /// 아래에 이어서 보임다.
printer.EndDoc;
except
showmessage('Error-출력할 수 없습니다.');
frm_jass130f.enabled := true;
exit;
end;
end;
frm_jass130f.enabled := true;
{선택을 않하고 출력 버튼을 클릭할 경우}
if n = (m-1) then begin
lbl_msg.font.color := clred;
lbl_msg.caption := '한건 이상 선택하세요...';
end
else begin
lbl_msg.font.color := clnavy;
lbl_msg.caption := '정상적으로 출력되었읍니다.';
end;
end;
procedure Tfrm_jass130f.img_display;
var bstream_j, bstream_h : Tstream;
myjpg_j, myjpg_h : TJpegimage;
mybmp_j, mybmp_h : TBitmap;
data_j,data_h : array[0..15] of char;
r_j, r_h : Trect;
begin
r_j.Left :=7*txt_w; r_j.top := 57 *txt_h; r_j.Right := 54*txt_w; r_j.Bottom := 75 *txt_h; // 개선전 이미지 위치값..
r_h.Left :=56*txt_w; r_h.top := 57 *txt_h; r_h.Right := 105*txt_w; r_h.Bottom := 75 *txt_h; // 개선후 이미지 위치값..
{img_flag로 이미지를 출력한다. 1:개선전/후 이미지 출력 2:개선전이미지출력
3: 개선후 이미지 출력 }
case img_flag of
1 : begin
try
bstream_j := query6.createblobstream(query6.fieldbyname('dr_image_j'), bmread);
bstream_j.read(data_j, 16); bstream_j.position := 0;
if (data_j[6] = 'J') and (data_j[7]='F') and (data_j[8]='I') and (data_j[9]='F') then begin
myjpg_j := TJpegimage.create;
myjpg_j.loadfromstream(bstream_j);
mybmp_j := TBitmap.create;
mybmp_j.Assign(myjpg_j);
image1.Picture.assign(mybmp_j);
mybmp_j.Free;
myjpg_j.Free;
bstream_j.Free;
end
else begin
mybmp_j := TBitmap.create;
mybmp_j.loadfromstream(bstream_j);
image1.Picture.assign(mybmp_j);
mybmp_j.Free;
bstream_j.Free;
end;
except
showmessage('개선전 이미지 에러');
end;
{개선후 이미지}
try
bstream_h := query6.createblobstream(query6.fieldbyname('dr_image_h'), bmread);
bstream_h.read(data_h, 16); bstream_h.position := 0;
if (data_h[6] = 'J') and (data_h[7]='F') and (data_h[8]='I') and (data_h[9]='F') then begin
myjpg_h := TJpegimage.create;
myjpg_h.loadfromstream(bstream_h);
mybmp_h := TBitmap.create;
mybmp_h.Assign(myjpg_h);
image2.Picture.assign(mybmp_h);
mybmp_h.Free;
myjpg_h.Free;
bstream_h.Free;
end
else begin
mybmp_h := TBitmap.create;
mybmp_h.loadfromstream(bstream_h);
image2.Picture.assign(mybmp_h);
mybmp_h.Free;
bstream_h.Free;
end;
except
showmessage('개선전 이미지 에러');
end;
printer.Canvas.TextOut(23* txt_w, 55 *txt_h, '< 그림 >');
printer.Canvas.StretchDraw(r_j, image1.Picture.bitmap); ---| 이렇게
printer.Canvas.StretchDraw(r_j, image1.Picture.bitmap); ---| 두번을
적어야
출력이됩니다.
printer.Canvas.TextOut(73* txt_w, 55 *txt_h, '< 그림 >');
printer.Canvas.StretchDraw(r_h, image2.Picture.bitmap);
printer.Canvas.StretchDraw(r_h, image2.Picture.bitmap);
showmessage('byte---check');
end; // 1 : ~ end;
2 : begin
bstream_j := query6.createblobstream(query6.fieldbyname('dr_image_j'), bmread);
try
bstream_j.read(data_j, 16); bstream_j.position := 0;
if (data_j[6] = 'J') and (data_j[7]='F') and (data_j[8]='I') and (data_j[9]='F') then begin
myjpg_j := TJpegimage.create;
myjpg_j.loadfromstream(bstream_j);
mybmp_j := TBitmap.create;
mybmp_j.Assign(myjpg_j);
image1.Picture.assign(mybmp_j);
mybmp_j.Free;
myjpg_j.Free;
bstream_j.Free;
end
else begin
mybmp_j := TBitmap.create;
mybmp_j.loadfromstream(bstream_j);
image1.Picture.assign(mybmp_j);
mybmp_j.Free;
bstream_j.Free;
end;
except
showmessage('개선전 이미지 에러');
end;
printer.Canvas.TextOut(23* txt_w, 55 *txt_h, '< 그림 >');
printer.Canvas.StretchDraw(r_j, image1.Picture.bitmap);
printer.Canvas.StretchDraw(r_j, image1.Picture.bitmap);
end; // 2 : ~ end;
end; // case ~ end;
end;
위의 소스중 이미지를 두번이나
printer.Canvas.StretchDraw 를 호출하였을 시에만 정상적으로 출력이 되나
또 다른 에러를 유발시키더군요...
access viallration 에러를 말이죠...
정말 난감하네요...
일주일째 잡고 있다 이제서야 질문을 하니 고수님들의 조언을 기다리는 순서만이 마지막으로 남은 기회임다.
고수님들 도와주세요....