存取JPG到数据库中的组件 :DBJPEG(100分)

  • 主题发起人 主题发起人 lishding
  • 开始时间 开始时间
L

lishding

Unregistered / Unconfirmed
GUEST, unregistred user!
我想自已写一个 存取JPG到数据库中的组件,已基本完工,
但安装后,碰到以下问题:
  
  DBJPEG1联上数据后,数据集打开,关闭,或滚动,DBJPEG1的内容不
跟着更新,就和 数据集用了 DisableControls 的效果一样,
但把联着相同数据源的DBGrid的任一列的宽度调整一下就可正常使用.


完整代码如下:(复制到Delphi中就可用了,我用的是D6)

unit PowBitBtn;

interface

uses
Windows, Messages, SysUtils, Classes, StdCtrls, Graphics, Controls,
ExtCtrls, DB, DbCtrls, Variants,Jpeg;

type
TJPGFieldDataLink=class;

{ 显示JPEG的数据组件 }
TDBJPEG = class(TImage)
private
FDataLink: TJPGFieldDataLink;
function GetDataSource: TDataSource;
procedure SetDataSource(Value: TDataSource);
function GetDataField: String;
procedure SetDataField(const value:String);
protected
{ Protected declarations }
procedure DoUpdateImage;
procedure OnDataChange(Sender:TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
// procedure dbClick; override;
published
property DataSource: TDataSource read GetDataSource write SetDataSource;
property DataField: string read GetDataField write SetDataField;
end;



{ TJPGFieldDataLink }
TJPGFieldDataLink = class(TFieldDataLink)
private
FDBJPEG: TDBJPEG;
protected
procedure ActiveChanged; override;
procedure RecordChanged(Field: TField); override;
procedure FocusControl(Field: TFieldRef); override;
procedure UpdateData; override;
procedure DataSetScrolled(Distance:Integer); override;
public
constructor Create(DBJPEG: TDBJPEG);
destructor Destroy; override;
end;

procedure Register;

implementation


procedure Register;
begin
RegisterComponents('MyPackage', [TPowBitBtn,TDBJPEG]);
end;


{*********************** 显示JPEG的数据组件 ********************}
constructor TDBJPEG.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDataLink := TJPGFieldDataLink.Create(Self);
DataSource:=nil;
DataField:='';
Center:=True;
end;

destructor TDBJPEG.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;

function TDBJPEG.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;

procedure TDBJPEG.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
OnDataChange(self);
if Value <> nil then Value.FreeNotification(Self);
end;

function TDBJPEG.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;

procedure TDBJPEG.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
OnDataChange(self)
end;
{ 更新图片 }
procedure TDBJPEG.DoUpdateImage;
var BloField:TBlobField;
Strm:TMemoryStream;
JPG:TJPEGImage;
begin
if not Assigned(FDataLink.DataSet) then
exit;
if not (FDataLink.Field is TBlobField) then
exit;
if not(FDataLink.Editing) then
exit;

BloField:=FDataLink.Field as TBlobField;
Strm:=TMemoryStream.create();
JPG:=TJPEGImage.create();
try
if (Picture=nil) or (Picture.Graphic=Nil) then
BloField.Clear()
else
begin
JPG.Assign(Picture.Graphic);
JPG.SaveToStream(Strm);
Strm.position:=0;
BloField.loadFromStream(Strm);
end;
Finally
Strm.Free();
JPG.Free();
end;
end;
{ 显示图片 }
procedure TDBJPEG.OnDataChange(Sender:TObject);
var BloField:TBlobfield;
Strm:TMemoryStream;
Jpeg:TJPEGImage;
begin
if not(Assigned(FDataLink.DataSet)) then
exit;
if not(FDataLink.Field is TBlobField) then
exit;
if not(FDataLink.Active) then
begin
Picture:=nil;
exit;
end;

BloField:=FDataLink.Field as TBlobField;
Try
Strm:=TMemoryStream.Create();
Jpeg:=TJPEGImage.Create();
BloField.SaveToStream(Strm);
if not(strm.Size=0) then
begin
Strm.Position:=0;
Jpeg.LoadFromStream(Strm);
Picture.Assign(Jpeg);
end
else
Picture:=nil;
Finally
Strm.Free();
Jpeg.Free();
end;
end;


{****************** TJPGFieldDataLink *****************}
constructor TJPGFieldDataLink.Create(DBJPEG: TDBJPEG);
begin
inherited Create;
FDBJPEG := DBJPEG;
// VisualControl := True;
end;

destructor TJPGFieldDataLink.Destroy;
begin
FDBJPEG := nil;
inherited Destroy;
end;

procedure TJPGFieldDataLink.ActiveChanged ;
begin
if FDBJPEG<>nil then FDBJPEG.OnDataChange(self);
end;

procedure TJPGFieldDataLink.RecordChanged(Field: TField) ;
begin
if (FDBJPEG<>nil) then
FDBJPEG.OnDataChange(Self);
end;

procedure TJPGFieldDataLink.UpdateData;
begin
if FDBJPEG<>nil then FDBJPEG.DoUpdateImage;
end;

procedure TJPGFieldDataLink.FocusControl(Field: TFieldRef);
begin
if FDBJPEG<>nil then FDBJPEG.OnDataChange(self);
end;

procedure TJPGFieldDataLink.DataSetScrolled(Distance:Integer);
begin
if FDBJPEG<>nil then FDBJPEG.OnDataChange(self);
end;


end.


 
有人帮忙吗?
 
思路不错,我也不知道问题在哪了,明天我抽时间帮你找,但是我也是菜。

:)
 
对了,你可以看vcl里的dbimg的啊,看看差在哪?
 
请各位大佬帮帮手啊!
 
这句话产生不不更新:
if not(FDataLink.Editing) then
exit;
应为:
if FDataLik.Editing then exit;
就行了。
 
我找到原因,但不知如何处理:

{ 显示图片 }
procedure TDBJPEG.OnDataChange(Sender:TObject);
var BloField:TBlobfield;
Strm:TMemoryStream;
Jpeg:TJPEGImage;
begin
if not(Assigned(FDataLink.DataSet)) then  exit;

{原因在下面这行,不管是什么类型的字段,它都退出}
if not(FDataLink.Field is TBlobField) then exit;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if not(FDataLink.Active) then
begin
Picture:=nil;
exit;
end;
 
兄弟,我现在还在用D5呀。[:(]
 
没人知道还是不愿意回答? 现在的大富翁。。。
 
真不想打击你。
http://codecentral.borland.com/codecentral/ccweb.exe/download?id=15936

我已经用上啦。挺好的。
 
to:三代坦克
mail 给我,有源码就给分!
 
http://codecentral.borland.com/codecentral/ccweb.exe/download?id=15936
这就是下载地址啊!你不能访问国外么?
 
算了,才12k。你说你的email地址。我给你发吧。
 
谢谢,货到付款!:)
lishding@163.net
 
已经发了。希望对你有用
我给163.net发信总是出错。希望这次是可以的。
另外,我upload到
http://delphi.mychangshu.com 中了。你可以去查查。“三代坦克”发的。在数据库类。
 
谢谢啦,但能否帮我看看上面的程序?解决后另送分!:)
 
果然没发成功。你到http://delphi.mychangshu.com 自己去down吧。
sina.com.
邮件无法发送到您指定的地址中。
在邮件传输过程中由于外部的无法避免的错误导致邮件无法送达。

<lishding@163.net>:
Connected to 202.108.255.239 but sender was rejected.
远程主机回应:550 <sandaitanke@sina.com>: Invalid User

--- 附件中的内容是原信件的一份拷贝
 
阿哦也不懂这个问题啊。我对控件编程没有研究。期待高手吧。我也学学。
 
后退
顶部