使用OpenDialog出现“句柄无效”

lightdc4 2013-11-19 03:05:58
因为要频繁地打开文件保存到数据库,所以用久了就会突然显示“句柄无效”,这是什么情况?

procedure Button1Click(Sender: TObject);
var
i : integer;
begin

OpenDialogFilter := '*.jpg|*.jpg';
OpenDialogFileName := '';
OpenDialogExecute;

if OpenDialogFiles.Count = 0 then
exit;

with aqrecordphotos do
begin
for i := 0 to OpenDialogFiles.Count - 1 do
begin
append;
tblobField(findfield('Photo')).LoadFromFile(OpenDialogFiles.Strings[i]);
tblobField(findfield('smallphoto')).LoadFromStream(ZoomJpgFrmFile(OpenDialogFiles.Strings[i]));
post;
end;
end;

end;

function ZoomJpgFrmFile(vFileName: String): TStream;
var
Jpg : TJpegImage;
Bmp : TBitmap;
const
SPercent : single = 0.1;
begin

jpg := TJpegImage.Create;
Bmp := TBitmap.Create;

jpg.loadfromfile(vfilename);

bmp := jpg2bmp(jpg);
if bmp.Width * SPercent <= 100 then
bmp := zoombmp(bmp,100,trunc(100 / bmp.Width * bmp.Height))
else
bmp := zoombmp(bmp,trunc(bmp.Width * spercent),trunc(bmp.Height * spercent));
jpg := bmp2jpg(bmp,100);

result := TMemoryStream.Create;
jpg.SaveToStream(result);
jpg.free;
bmp.Free;

end;

function Jpg2Bmp(Jpg: TJpegImage): TBitmap;
begin

Result := nil;
if Assigned(Jpg) then
begin
Result := TBitmap.Create;
Jpg.DIBNeeded; {Key method...}
Result.Assign(Jpg); {It‖s all folks...}
end;

end;

function ZoomBmp(vImage: TBitmap; dWidth,
dHeight: Integer): TBitmap;
var
ori: TBitmap;
dispositivo_o, dispositivo_d: HDC;
pepito: HBitmap;
begin

ori := Tbitmap.Create;
result := TBItmap.Create;
ori.handle := vImage.handle;
result.width := dWidth;
result.height := dHeight;
dispositivo_o := CreateCompatibleDC(0);
dispositivo_d := CreateCompatibleDC(0);
SelectObject(dispositivo_o, ori.handle);
pepito := SelectObject(dispositivo_d, result.handle);
SetStretchBltMode(dispositivo_d, STRETCH_HALFTONE);
StretchBlt(dispositivo_d, 0, 0, dWidth, dHeight, dispositivo_o, 0, 0, ori.width, ori.height, SRCCOPY);
SelectObject(dispositivo_d, pepito);
ori.Free;
DeleteObject(pepito);
DeleteDC(dispositivo_o);
DeleteDC(dispositivo_d);

end;

function Bmp2Jpg(Bmp: TBitmap; Quality: Integer): TJpegImage;
begin

Result := nil;
if Assigned(Bmp) then
begin
Result := TJpegImage.Create;
Result.Assign(Bmp); {It‖s all folks...}
Result.CompressionQuality := Quality;
Result.JPEGNeeded; {Key method...}
Result.Compress;
end;

end;
...全文
255 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
单步一下就知道了
lightdc4 2013-11-22
  • 打赏
  • 举报
回复
引用 2 楼 sololie 的回复:
你就不能try catch 一下看看是哪里蹦出那玩意来的
catch? 不是except吗,我在测试期间没有任何问题的,只在运行的机子上有问题,而且还不是每次都出现的,我自己测试了N次都没问题,这才郁闷啊。
lightdc4 2013-11-22
  • 打赏
  • 举报
回复
引用 4 楼 linuxpingwangping 的回复:
应该错在图片转换
能具体一点吗?
  • 打赏
  • 举报
回复
应该错在图片转换
sololie 2013-11-21
  • 打赏
  • 举报
回复
你就不能try catch 一下看看是哪里蹦出那玩意来的
雄牛 2013-11-21
  • 打赏
  • 举报
回复
界面相关的资源没有释放

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧