Q&A

  • tprinter]tprinter 사용하여 이미지 출력시....에러 질문임다.


고수님들 안녕하십니까...



이번의 질문은 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 에러를 말이죠...



정말 난감하네요...



일주일째 잡고 있다 이제서야 질문을 하니 고수님들의 조언을 기다리는 순서만이 마지막으로 남은 기회임다.



고수님들 도와주세요....



0  COMMENTS