高手请问,在DBImage中如何清除载入到DBImage中的图像?用什么方法呢?谢谢!(50分)

  • 主题发起人 主题发起人 isapple
  • 开始时间 开始时间
I

isapple

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(]高手请问,在DBImage中如何清除载入到DBImage中的图像?用什么方法呢?谢谢!
 
DBImage是和数据库关联的,除非你断开连接,或清掉数据库中该字段内容。
 
这是仅仅擦除DBIMAGE中的图象.不影响数据库.(因为你没有将数据库放在编辑状态).不是楼上
说的要断开.可以在内存中擦除.
procedure TForm1.Button1Click(Sender: TObject);
var value:TPicture;
begin
Value:=TPicture.Create;
dbimage1.Picture.Assign(Value);
Value.Free;
end;

要影响数据库的话.可以把上面VALUE的值传给字段就可以了.
就是在前面EDIT数据库.

 
刚才试了一下,确实不必断开。
DBImage1.Picture.Assign(nil);
 
TO P-FTP:
你要将指针复制只需要:
DBIMAGE1.PICTURE:=NIL;
你以上的做法有资源泄漏的嫌疑.
 
请先了解一下ASSIGN跟=的区别.
 
为什么我不用:DBIMAGE1.PICTURE:=VALUE呢??这就是区别.
 
谢谢大侠们的赐教!!!本人还有这们的一个问题,如果我需要用DBImage来载入JPG格式的
图片,就会发现能储存起来,可是就是当再用DBImage来连接该字段时就显示不出图片来,
到底是为什么呢?我已经在USES中加入了JPEG。谢谢!
 
你是用的什么数据库,是用LOADFROMFILE载入吗?把相关的贴出来看看.我试试.
 
在TDBImage的Picture属性赋什的时候,Assign和:=没有什么区别,用:=赋值的时候,是给TDBImage的Picture属性,程序自动调用这个属性的写方法:SetPicture,
你看看一看DBCtrls单元的这个类的这个方法的源码就知道没有区别了.
因为DBImage控件本身不支持除BMP之外的其他图片格式.当然不能显示了,不仅不能显示,你的JPG图片根本没有保存到数据库中.
如果要用JPG图片,就不要用DBImage.
 
另外无论是:=还是Assign,只要对Picture作了修改,如果没有断开与数据库的连接,程序会自动地Post到数据集中.你可以看看DBCtrls单元中DBImage类的FPicture的OnChange事件就知道了!
 
用:=赋的值是指针的值.在内存中可能两个指针指向同一片区域.但实例就只有一份.
用ASSIGN就是在内存中复制另外一份一模一样的实例.你看看ASSIGN的实现就知道了.
 
把格式在内存中转化一下就可以了.
 
to aizb:
实践一下再说吧.把激活ONCHANGE的事件看一次吧.别停留在ONCHANGE的表面.
 
以下是TPicture的部分实现,看了看,Assign(nil)并无不妥吧。
procedure TPicture.Assign(Source: TPersistent);
begin
if Source = nil then
SetGraphic(nil)
else if Source is TPicture then
SetGraphic(TPicture(Source).Graphic)
else if Source is TGraphic then
SetGraphic(TGraphic(Source))
else
inherited Assign(Source);
end;
procedure TPicture.SetGraphic(Value: TGraphic);
var
NewGraphic: TGraphic;
begin
NewGraphic := nil;
if Value <> nil then
begin
NewGraphic := TGraphicClass(Value.ClassType).Create;
NewGraphic.Assign(Value);
NewGraphic.OnChange := Changed;
NewGraphic.OnProgress := Progress;
end;
try
FGraphic.Free; //DBImage的Picture占用的内存在这里释放
FGraphic := NewGraphic; //这里NewGraphic是nil
Changed(Self);
except
NewGraphic.Free;
raise;
end;
end;
还请sunziqi指教。
 
[red]to sunziqi[/red]
if OpenPictureDialog.Execute then
DBImage.Picture.LoadFromFile(OpenPictureDialog.FileName);
 
对了,我用的是BDE的数据库。还有就是说,因为BMP的体积确实有点大,所以我才想把JPG
存入数据库的念头,这样的话,要用什么数据库呢?还有需要哪些控件呢?谢谢你们的支
持!
 
to p-ftp:
你看看SETGRAPHIC的实现.再看看我的实现.FAINT.
Assing是为TPersistent类实现的.在复杂的数据类型中.=在很大部分就是指针的复制.非实例的复制.


 
to sunziqi:
澄清一下,我并没有用:=赋值。我认为根据实现,用Assign(nil)比赋一个空图
至少还节省操作吧。SETGRAPHIC的实现中并没有禁止输入参数为nil吧。
 
有两种方法可以实现在用JPEG还用DBIMAGE的方法.其实都一样.把文件名换成OPENDIALOG的文件
名称.
这是第一种方法可以载入JPEG(用剪贴板,记得USES CLIPBRD,JPEG):
procedure TForm1.Button2Click(Sender: TObject);
var Jpegimage:TJpegimage;
bitmap:Tbitmap;
AData:Cardinal;
APalette:HPalette;
AFormat:Word;
begin
bitmap:=TBitmap.Create;
jpegimage:=Tjpegimage.Create;
Jpegimage.LoadFromFile('E:/NoUse/001.jpg');
bitmap.Assign(Jpegimage);
bitmap.SaveToClipboardFormat(AFormat,Adata,APalette);
ClipBoard.SetAsHandle(AFormat,AData);
dbimage1.Picture.LoadFromClipboardFormat(AFormat,Adata,Apalette);
bitmap.Free;
jpegimage.Free;
end;

这是第二种方法(USES JPEG)最简单:
procedure TForm1.Button3Click(Sender: TObject);
var Jpegimage:TJpegimage;
Bitmap:Tbitmap;
begin
Jpegimage:=TJpegimage.Create;
bitmap:=Tbitmap.Create;
Jpegimage.LoadFromFile('E:/NoUse/001.jpg');
Bitmap.Assign(Jpegimage);
dbimage1.Picture.Bitmap.Assign(bitmap);
Bitmap.Free;
jpegimage.Free;
end;
 
后退
顶部